123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- import itertools
- import urwid
- from app import COPYRIGHT
- from app.db_utils import QueryManager
- from app.activities import (
- show_or_exit,
- ActivityManager,
- )
- from app.activities.PriceCheck import PriceCheck
- try:
- from db_credentials import HOST, PASSWORD
- host = f'host={HOST}'
- password = f'password={PASSWORD}'
- except:
- host = ''
- password = ''
- try:
- import psycopg2
- import os
- user = os.getenv('USER')
- conn = psycopg2.connect(f"{host} dbname=das user={user} {password}")
- cur = conn.cursor()
- except:
- print('Failed to set up db connection. Entering Mock mode')
- exit(1)
-
- palette = [
- ('banner', 'light gray', 'dark red'),
- ('streak', 'light gray', 'black'),
- ('bg', 'dark red', 'black'),
- ('badge', 'light gray', 'black'),
- ('badge_green', 'light green', 'black',),
- ('badge_red', 'light red', 'black',),
- ]
- top_pane = [
- 'clear',
- 'exit',
- 'sort',
- ]
- left_pane = [
- 'product',
- 'organic',
- ]
- badge = [
- 'rating',
- 'spread',
- 'marker',
- ]
- right_pane = [
- 'unit',
- 'quantity',
- 'price',
- ]
- bottom_pane = [
- 'dbview',
- ]
- inputs = filter(
- lambda x: x is not None and x not in ('rating','spread', 'marker', 'div'),
- itertools.chain(
- left_pane, right_pane
- )
- )
- display_map = {
- 'price': lambda x: f"{x:.4f}",
- 'quantity': lambda x: f"{x:.2f}",
- 'organic': lambda x: "true" if x else "false",
- }
- display = lambda data, name: display_map[name](data) if name in display_map else data
- def _apply_choice_callback(activity_manager, base, name, widget, value):
- activity = activity_manager.get(base)
- activity.apply_choice(name, widget, value)
- activity_manager.show(activity.update())
- def _autocomplete_callback(activity_manager, query_manager, name, data, open_pop_up_cb):
- options = query_manager.unique_suggestions(name, **data)
- if len(options) > 0:
- open_pop_up_cb(options)
- class GroceryPriceCheck(urwid.WidgetPlaceholder):
- def __init__(self, activity_manager):
- super().__init__(urwid.SolidFill(u'/'))
- self.activity_manager = activity_manager
- price_check = self.activity_manager.get('price_check')
- self.activity_manager.show(self)
- self.activity_manager.show(price_check)
- cur.execute("BEGIN")
- activity_manager = ActivityManager()
- query_manager = QueryManager(cur, display)
- activity_manager.create(PriceCheck, 'price_check',
- query_manager, inputs, top_pane, left_pane, right_pane, bottom_pane, badge,
- lambda name, data, open_pop_up_cb: _autocomplete_callback(activity_manager, query_manager, name, data, open_pop_up_cb),
- lambda name, widget, value: _apply_choice_callback(activity_manager, 'price_check', name, widget, value))
- app = GroceryPriceCheck(activity_manager)
- loop = urwid.MainLoop(app, palette, unhandled_input=show_or_exit, pop_ups=True)
- loop.run()
- cur.close()
- conn.close()
|