#!/usr/bin/python3 # # Copyright (c) Daniel Sheffield 2021 # # All rights reserved # # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY 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) #from mock import * 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()