|
@@ -9,13 +9,18 @@ import time
|
|
import itertools
|
|
import itertools
|
|
import sys
|
|
import sys
|
|
import urwid
|
|
import urwid
|
|
-from app.db_utils import QueryManager
|
|
|
|
|
|
+from app.db_utils import (
|
|
|
|
+ NON_IDENTIFIER_COLUMNS,
|
|
|
|
+ QueryManager,
|
|
|
|
+ get_insert_product_statement
|
|
|
|
+)
|
|
from app.widgets import (
|
|
from app.widgets import (
|
|
|
|
+ NewProduct,
|
|
SuggestionPopup,
|
|
SuggestionPopup,
|
|
- ActivityManager,
|
|
|
|
)
|
|
)
|
|
from app.activities import (
|
|
from app.activities import (
|
|
show_or_exit,
|
|
show_or_exit,
|
|
|
|
+ ActivityManager,
|
|
)
|
|
)
|
|
from app.activities.TransactionEditor import TransactionEditor
|
|
from app.activities.TransactionEditor import TransactionEditor
|
|
|
|
|
|
@@ -75,24 +80,57 @@ display_map = {
|
|
}
|
|
}
|
|
display = lambda data, name: display_map[name](data) if name in display_map else data
|
|
display = lambda data, name: display_map[name](data) if name in display_map else data
|
|
|
|
|
|
-def _apply_choice_callback(activity_manager, name, widget, value):
|
|
|
|
- txn = activity_manager.get('transaction')
|
|
|
|
- txn.apply_choice(name)(widget, value)
|
|
|
|
- activity_manager.show(txn.update())
|
|
|
|
|
|
+def _apply_choice_callback(activity_manager, base, name, widget, value):
|
|
|
|
+ base = activity_manager.get(base)
|
|
|
|
+ base.apply_choice(name)(widget, value)
|
|
|
|
+ activity_manager.show(base.update())
|
|
|
|
|
|
-def _show_suggestions_callback(activity_manager, name, options):
|
|
|
|
- txn = activity_manager.get('transaction')
|
|
|
|
|
|
+def _show_suggestions_callback(activity_manager, base, name, options):
|
|
|
|
+ cur = activity_manager.current()
|
|
activity_manager.show(
|
|
activity_manager.show(
|
|
activity_manager.create(SuggestionPopup, None,
|
|
activity_manager.create(SuggestionPopup, None,
|
|
- txn.original_widget, name, options,
|
|
|
|
- lambda w,x: _apply_choice_callback(activity_manager, name, w, x),
|
|
|
|
- lambda: activity_manager.show(txn.update())
|
|
|
|
|
|
+ cur, name, options,
|
|
|
|
+ lambda w,x: _apply_choice_callback(activity_manager, base, name, w, x),
|
|
|
|
+ lambda: activity_manager.show(cur)
|
|
))
|
|
))
|
|
|
|
|
|
-def _autocomplete_callback(activity_manager, query_manager, name, data):
|
|
|
|
|
|
+def _insert_new_product_callback(activity_manager, query_manager, product, category, group):
|
|
|
|
+ activity_manager.app.log.write(
|
|
|
|
+ '{};\n'.format(get_insert_product_statement(product, category, group)))
|
|
|
|
+ query_manager.insert_new_product(product, category, group)
|
|
|
|
+ activity_manager.show(activity_manager.get('transaction').update())
|
|
|
|
+
|
|
|
|
+def _new_product_callback(
|
|
|
|
+ activity_manager: ActivityManager,
|
|
|
|
+ query_manager: QueryManager,
|
|
|
|
+ name: str, data: dict
|
|
|
|
+):
|
|
|
|
+ cur = activity_manager.current()
|
|
|
|
+ txn : TransactionEditor = activity_manager.get('transaction')
|
|
|
|
+ activity_manager.show(
|
|
|
|
+ activity_manager.create(NewProduct, 'new_product',
|
|
|
|
+ query_manager, cur, name, txn.data,
|
|
|
|
+ lambda t: _autocomplete_callback(activity_manager, query_manager, 'new_product', t, data),
|
|
|
|
+ txn.apply_changes,
|
|
|
|
+ lambda product, category, group: _insert_new_product_callback(
|
|
|
|
+ activity_manager, query_manager, product, category, group),
|
|
|
|
+ lambda: activity_manager.show(cur)
|
|
|
|
+ )
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+def _autocomplete_callback(
|
|
|
|
+ activity_manager: ActivityManager,
|
|
|
|
+ query_manager: QueryManager,
|
|
|
|
+ base: str,
|
|
|
|
+ name: str, data: dict
|
|
|
|
+):
|
|
options = query_manager.unique_suggestions(name, **data)
|
|
options = query_manager.unique_suggestions(name, **data)
|
|
if len(options) > 0:
|
|
if len(options) > 0:
|
|
- _show_suggestions_callback(activity_manager, name, options)
|
|
|
|
|
|
+ _show_suggestions_callback(activity_manager, base, name, options)
|
|
|
|
+ elif len(options) == 0 and activity_manager.current() is not activity_manager.get('new_product'):
|
|
|
|
+ if name in ('product', 'category', 'group'):
|
|
|
|
+ _new_product_callback(activity_manager, query_manager, name, data)
|
|
|
|
+
|
|
|
|
|
|
def _save_and_clear_callback(activity_manager):
|
|
def _save_and_clear_callback(activity_manager):
|
|
txn = activity_manager.get('transaction')
|
|
txn = activity_manager.get('transaction')
|
|
@@ -170,12 +208,12 @@ class GroceryTransactionEditor(urwid.WidgetPlaceholder):
|
|
cur.execute("BEGIN")
|
|
cur.execute("BEGIN")
|
|
|
|
|
|
activity_manager = ActivityManager()
|
|
activity_manager = ActivityManager()
|
|
-query_manager = QueryManager(activity_manager, cur, display)
|
|
|
|
|
|
+query_manager = QueryManager(cur, display)
|
|
|
|
|
|
activity_manager.create(TransactionEditor, 'transaction',
|
|
activity_manager.create(TransactionEditor, 'transaction',
|
|
query_manager, cols, grid_layout, side_pane, bottom_pane,
|
|
query_manager, cols, grid_layout, side_pane, bottom_pane,
|
|
lambda: _save_and_clear_callback(activity_manager),
|
|
lambda: _save_and_clear_callback(activity_manager),
|
|
- lambda name, data: _autocomplete_callback(activity_manager, query_manager, name, data))
|
|
|
|
|
|
+ lambda name, data: _autocomplete_callback(activity_manager, query_manager, 'transaction', name, data))
|
|
|
|
|
|
app = GroceryTransactionEditor(activity_manager, cur, log)
|
|
app = GroceryTransactionEditor(activity_manager, cur, log)
|
|
|
|
|