price_check.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #!/usr/bin/python3
  2. #
  3. # Copyright (c) Daniel Sheffield 2021
  4. #
  5. # All rights reserved
  6. #
  7. # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
  8. import itertools
  9. import urwid
  10. from app import COPYRIGHT
  11. from app.db_utils import QueryManager
  12. from app.activities import (
  13. show_or_exit,
  14. ActivityManager,
  15. )
  16. from app.activities.PriceCheck import PriceCheck
  17. try:
  18. from db_credentials import HOST, PASSWORD
  19. host = f'host={HOST}'
  20. password = f'password={PASSWORD}'
  21. except:
  22. host = ''
  23. password = ''
  24. try:
  25. import psycopg2
  26. import os
  27. user = os.getenv('USER')
  28. conn = psycopg2.connect(f"{host} dbname=das user={user} {password}")
  29. cur = conn.cursor()
  30. except:
  31. print('Failed to set up db connection. Entering Mock mode')
  32. exit(1)
  33. #from mock import *
  34. palette = [
  35. ('banner', 'light gray', 'dark red'),
  36. ('streak', 'light gray', 'black'),
  37. ('bg', 'dark red', 'black'),
  38. ('badge', 'light gray', 'black'),
  39. ('badge_green', 'light green', 'black',),
  40. ('badge_red', 'light red', 'black',),
  41. ]
  42. top_pane = [
  43. 'clear',
  44. 'exit',
  45. 'sort',
  46. ]
  47. left_pane = [
  48. 'product',
  49. 'organic',
  50. ]
  51. badge = [
  52. 'rating',
  53. 'spread',
  54. 'marker',
  55. ]
  56. right_pane = [
  57. 'unit',
  58. 'quantity',
  59. 'price',
  60. ]
  61. bottom_pane = [
  62. 'dbview',
  63. ]
  64. inputs = filter(
  65. lambda x: x is not None and x not in ('rating','spread', 'marker', 'div'),
  66. itertools.chain(
  67. left_pane, right_pane
  68. )
  69. )
  70. display_map = {
  71. 'price': lambda x: f"{x:.4f}",
  72. 'quantity': lambda x: f"{x:.2f}",
  73. 'organic': lambda x: "true" if x else "false",
  74. }
  75. display = lambda data, name: display_map[name](data) if name in display_map else data
  76. def _apply_choice_callback(activity_manager, base, name, widget, value):
  77. activity = activity_manager.get(base)
  78. activity.apply_choice(name, widget, value)
  79. activity_manager.show(activity.update())
  80. def _autocomplete_callback(activity_manager, query_manager, name, data, open_pop_up_cb):
  81. options = query_manager.unique_suggestions(name, **data)
  82. if len(options) > 0:
  83. open_pop_up_cb(options)
  84. class GroceryPriceCheck(urwid.WidgetPlaceholder):
  85. def __init__(self, activity_manager):
  86. super().__init__(urwid.SolidFill(u'/'))
  87. self.activity_manager = activity_manager
  88. price_check = self.activity_manager.get('price_check')
  89. self.activity_manager.show(self)
  90. self.activity_manager.show(price_check)
  91. cur.execute("BEGIN")
  92. activity_manager = ActivityManager()
  93. query_manager = QueryManager(cur, display)
  94. activity_manager.create(PriceCheck, 'price_check',
  95. query_manager, inputs, top_pane, left_pane, right_pane, bottom_pane, badge,
  96. lambda name, data, open_pop_up_cb: _autocomplete_callback(activity_manager, query_manager, name, data, open_pop_up_cb),
  97. lambda name, widget, value: _apply_choice_callback(activity_manager, 'price_check', name, widget, value))
  98. app = GroceryPriceCheck(activity_manager)
  99. loop = urwid.MainLoop(app, palette, unhandled_input=show_or_exit, pop_ups=True)
  100. loop.run()
  101. cur.close()
  102. conn.close()