NewProduct.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #
  2. # Copyright (c) Daniel Sheffield 2022 - 2022
  3. #
  4. # All rights reserved
  5. #
  6. # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
  7. from collections import OrderedDict
  8. import urwid
  9. from app.activities import ActivityManager
  10. from app.db_utils import NON_IDENTIFIER_COLUMNS, QueryManager
  11. from ..widgets import AutoCompleteEdit, AutoCompletePopUp
  12. class NewProduct(urwid.Overlay):
  13. def __init__(self,
  14. activity_manager: ActivityManager,
  15. query_manager: QueryManager,
  16. under, name, data,
  17. autocomplete_cb, change_cb, apply_cb, esc_cb,
  18. ):
  19. self.esc_cb = esc_cb
  20. self.under = under
  21. self._data = data
  22. self.query_manager = query_manager
  23. self.name = name
  24. title = urwid.Text('Enter Product Info', align='center')
  25. self.fields = OrderedDict()
  26. for f in ('product', 'category', 'group'):
  27. w = AutoCompleteEdit(('bg', f))
  28. self.fields[f] = w
  29. w.set_edit_text(data[f])
  30. urwid.connect_signal(w, 'change', lambda w, v: change_cb(w.name, v))
  31. urwid.connect_signal(w, 'apply', lambda w, name: autocomplete_cb(w, name, self.data))
  32. ok = urwid.Button('Done', on_press=lambda _: apply_cb(**self.data))
  33. body = urwid.AttrMap(urwid.ListBox(urwid.SimpleListWalker([
  34. urwid.Padding(
  35. urwid.Pile([
  36. #urwid.Divider(),
  37. urwid.AttrMap(title, 'banner'),
  38. #urwid.Divider(),
  39. *[urwid.AttrMap(urwid.LineBox(urwid.AttrMap(
  40. AutoCompletePopUp(
  41. v,
  42. self.apply_choice,
  43. lambda: activity_manager.show(self.update())
  44. ),'streak'), title=k.title(), title_align='left'), 'bg'
  45. ) for k,v in self.fields.items()],
  46. urwid.Divider(),
  47. urwid.AttrMap(ok, 'bg'),
  48. ], focus_item=2),
  49. align='center', left=1, right=1,
  50. )
  51. ])), 'banner')
  52. super().__init__(urwid.AttrMap(body, 'bg'), under,
  53. align='center', width=('relative', 40),
  54. valign='middle', height=13,
  55. min_width=20)
  56. @property
  57. def data(self):
  58. return dict([(k,v) for k,v in self._data.items() if k in ('product', 'category', 'group')])
  59. def apply_choice(self, name, value):
  60. self._data.update({
  61. name: value
  62. })
  63. for k,v in self.data.items():
  64. if k == name or v:
  65. continue
  66. options = self.query_manager.unique_suggestions(k, exclude=[self.name, *NON_IDENTIFIER_COLUMNS], **self.data)
  67. if len(options) == 1 and k != 'ts':
  68. self._data.update({
  69. k: list(options)[0]
  70. })
  71. def update(self):
  72. for k, v in self.data.items():
  73. self.fields[k].set_edit_text(v)
  74. return self
  75. def keypress(self, size, key):
  76. if key == 'esc':
  77. self.esc_cb()
  78. return
  79. if key == 'tab':
  80. return super().keypress(size, 'down')
  81. elif key == 'shift tab':
  82. return super().keypress(size, 'up')
  83. return super().keypress(size, key)