Forráskód Böngészése

add decimal utils and remove complex layout handling

Daniel Sheffield 1 éve
szülő
commit
9acffb1e9d
3 módosított fájl, 65 hozzáadás és 105 törlés
  1. 28 53
      app/activities/PriceCheck.py
  2. 22 52
      app/activities/TransactionEditor.py
  3. 15 0
      app/data/decimal_util.py

+ 28 - 53
app/activities/PriceCheck.py

@@ -4,7 +4,6 @@
 # All rights reserved
 #
 # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
-from decimal import Decimal, InvalidOperation
 from itertools import chain
 from urwid import (
     connect_signal,
@@ -19,6 +18,7 @@ from urwid import (
     Text,
 )
 
+from ..data.decimal_util import decimal_or_none
 from ..data.dataframe_util import get_caption, get_time_range, stats
 from ..widgets import (
     AutoCompleteEdit,
@@ -134,15 +134,8 @@ class PriceCheck(FocusWidget):
         organic = None if data['organic'] == 'mixed' else data['organic']
         sort = '$/unit' if self.buttons['sort_price'].state else 'ts'
         product, unit = data['product'] or None, data['unit'] or None
-        try:
-            price = Decimal(data['price'])
-        except InvalidOperation:
-            price = None
-
-        try:
-            quantity = Decimal(data['quantity'])
-        except InvalidOperation:
-            quantity = None
+        price = decimal_or_none(data['price'])
+        quantity = decimal_or_none(data['quantity'])
 
         if None in (sort, product, unit):
             self.text_fields['dbview'].set_text('')
@@ -196,21 +189,6 @@ class PriceCheck(FocusWidget):
           self.text_fields.items()
         )))
 
-        left_pane = [
-            'product',
-            'organic',
-        ]
-        badge = [
-            'rating',
-            'spread',
-            'marker',
-        ]
-        right_pane = [
-            'unit',
-            'quantity',
-            'price',
-        ]
-
         self.query_manager = query_manager
         self.organic_checkbox = self.checkboxes['organic']
         connect_signal(self.organic_checkbox, 'postchange', lambda _,v: self.update())
@@ -257,35 +235,32 @@ class PriceCheck(FocusWidget):
             ),
         })
         components = {
-          'top_pane': Columns([
-              (9, Pile([
-                 Divider(),
-                 AttrMap(self.buttons['clear'], 'streak'),
-                 Divider(),
-              ])),
-              LineBox(
-                Columns([ v for k,v in self.buttons.items() if 'sort' in k]),
-                title="Sort price by",
-                title_align='left',
-              ),
-              (9, Pile([
-                Divider(),
-                AttrMap(self.buttons['exit'], 'streak'),
-                Divider(),
-              ]))
+            'top_pane': Columns([
+                (9, Pile([
+                    Divider(),
+                    AttrMap(self.buttons['clear'], 'streak'),
+                    Divider(),
+                ])),
+                LineBox(
+                    Columns([ v for k,v in self.buttons.items() if 'sort' in k]),
+                    title="Sort price by",
+                    title_align='left',
+                ),
+                (9, Pile([
+                    Divider(),
+                    AttrMap(self.buttons['exit'], 'streak'),
+                    Divider(),
+                ]))
             ], dividechars=1),
-          'right_pane': (16, Pile(map(
-            lambda x: _widgets[x] if x is not None else Divider,
-            right_pane
-          ))),
-          'left_pane': Pile(map(
-            lambda x: _widgets[x] if x is not None else Divider,
-            left_pane
-          )),
-          'badge': Pile(map(
-            lambda x: _widgets[x] if x is not None else Divider,
-            badge
-          )),
+            'right_pane': (16, Pile([
+                _widgets[x] for x in ['unit', 'quantity', 'price']
+            ])),
+            'left_pane': Pile([
+                _widgets[x] for x in ['product', 'organic']
+            ]),
+            'badge': Pile([
+                _widgets[x] for x in ['rating', 'spread', 'marker']
+            ]),
         }
         _widgets.update({
             'graph': LineBox(

+ 22 - 52
app/activities/TransactionEditor.py

@@ -4,7 +4,6 @@
 # All rights reserved
 #
 # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
-from decimal import Decimal, InvalidOperation
 from itertools import chain
 from typing import (
     Union,
@@ -28,6 +27,7 @@ from urwid import (
     Text,
 )
 
+from ..data.decimal_util import decimal_or_none
 from ..data.dataframe_util import get_caption, get_time_range, stats
 from ..data.QueryManager import QueryManager
 from .grouped_widget_util import (
@@ -241,15 +241,8 @@ class TransactionEditor(FocusWidget):
         organic = None if data['organic'] == 'mixed' else data['organic']
         #sort = '$/unit' if self.buttons['sort_price'].state else 'ts'
         product, unit = data['product'] or None, data['unit'] or None
-        try:
-            price = Decimal(data['price'])
-        except InvalidOperation:
-            price = None
-
-        try:
-            quantity = Decimal(data['quantity'])
-        except InvalidOperation:
-            quantity = None
+        price = decimal_or_none(data['price'])
+        quantity = decimal_or_none(data['quantity'])
 
         if None in (product, unit):
             self.rating.update_rating(None, None, None, unit)
@@ -346,26 +339,7 @@ class TransactionEditor(FocusWidget):
         )))
         self.organic_checkbox = self.checkboxes['organic']
         connect_signal(self.organic_checkbox, 'postchange', lambda _,v: self.update())
-        layout = [
-            [ 'ts',          'store',     ],
-            [ 'organic',     'product',   ],
-            [ 'category',    'group',     ],
-        ]
-        side_pane = [
-            'unit',
-            'quantity',
-            'price',
-        ]
-        bottom_pane = [
-            'description',
-            'dbview',
-        ]
-        badge = [
-            'rating',
-            'spread',
-            'marker',
-        ]
-        #self.clear()
+
         _widgets = dict(chain(*list(map(lambda x: x.items(), [
                 self.edit_fields, self.text_fields, self.checkboxes
             ])
@@ -401,17 +375,15 @@ class TransactionEditor(FocusWidget):
             'bottom_button_bar': Columns(
                 [(8, self.buttons['done']), Divider(), (9, self.buttons['clear'])]
             ),
-            'badge': Pile(map(
-                lambda x: _widgets[x] if x is not None else Divider,
-                badge
-            )),
+            'badge': Pile([
+                _widgets[x] for x in ['rating', 'spread', 'marker']
+            ]),
         })
         self.components.update({
             'bottom_pane': Columns([
-                Pile(map(
-                    lambda x: _widgets[x] if x is not None else Divider(),
-                    bottom_pane
-                )),
+                Pile([
+                    _widgets[x] for x in ['description', 'dbview']
+                ]),
                 (self.graph.total_width+2, Pile([
                     LineBox(
                         AttrMap(self.components['badge'], 'badge'),
@@ -440,21 +412,19 @@ class TransactionEditor(FocusWidget):
         })
 
         self.components['side_pane'] = (12, Pile([
-            _widgets[r] if r is not None else Divider() for r in side_pane
+            _widgets[r] for r in ['unit', 'quantity', 'price']
         ]))
-        self.components['main_pane'] = []
-        for _, r in enumerate(layout):
-            col = []
-            for c in r:
-                if c is not None:
-                    if c == 'organic':
-                        continue
-                    col.append(_widgets[c])
-                else:
-                    col.append(Divider())
-            self.components['main_pane'].append(Columns(col))
-
-        self.components['main_pane'] = Pile(self.components['main_pane'])
+
+        self.components['main_pane'] = Pile([
+            Columns([
+                _widgets[c] for c in ['ts', 'store']
+            ]),
+            _widgets['product'],
+            Columns([
+                _widgets[c] for c in ['category', 'group']
+            ])
+        ])
+
         self.add_tag()
 
         widget = Pile([

+ 15 - 0
app/data/decimal_util.py

@@ -0,0 +1,15 @@
+#
+# Copyright (c) Daniel Sheffield 2023
+#
+# All rights reserved
+#
+# THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
+from decimal import Decimal, InvalidOperation
+from typing import Any
+
+
+def decimal_or_none(maybe_decimal: Any) -> Decimal:
+    try:
+        return Decimal(maybe_decimal)
+    except InvalidOperation:
+        return None