X-Git-Url: https://us-delaporte.pagekite.me/gitweb/matrix-shop-bot.git/blobdiff_plain/5014c979631941a7086c2c266320d5f3d390991a..refs/heads/main:/matrix_shop_bot/db.py diff --git a/matrix_shop_bot/db.py b/matrix_shop_bot/db.py index 9d40236..cf75f84 100644 --- a/matrix_shop_bot/db.py +++ b/matrix_shop_bot/db.py @@ -1,6 +1,7 @@ import logging import os from datetime import datetime as dt +from datetime import timedelta from decimal import Decimal from typing import List @@ -50,7 +51,7 @@ class PreferStore(SQLModel, table=True): store_id: int | None = Field(default=None, foreign_key="store.id", primary_key=True) def _get_item_zone(item_name, session) -> str: - zone = session.exec(select(ItemZone).where(ItemZone.name == item_name)).first() + zone = session.exec(select(ItemZone).where(func.lower(item_name).contains(func.lower(ItemZone.name)))).first() if zone: return zone.zone return 'No Zone Assigned' @@ -66,11 +67,12 @@ def _get_pretty_shopping_list(store_id, session) -> List[str]: zones = {} for item in items: - zone = _get_item_zone(item.name, session) + zone = str(_get_item_zone(item.name, session)).title() # Title Case if not zone in zones: zones[zone] = [] - zones[zone].append(str(item)) + zones[zone].append(str(item).title()) for zone in zones: + zones[zone].sort() results.append(f' ### {zone}') for item in zones[zone]: results.append(item) @@ -103,6 +105,12 @@ def _get_with_id(cls, item_id): def _get_with_name(cls, name): return select(cls).where(func.lower(cls.name) == func.lower(name)) +def _rename(cls, session, old, new) -> bool: + with session: + record = session.exec(_get_with_name(cls, old)).first() + record.name = new + session.commit() + return True class Data(): def __init__(self, db_file=None): @@ -114,6 +122,14 @@ class Data(): self.engine = self.get_engine() self.last_store_id = None + def rename_store(self, old, new): + with Session(self.engine) as session: + return _rename(Store, session, old, new) + + def rename_item(self, old, new): + with Session(self.engine) as session: + return _rename(Item, session, old, new) + def _set_pref_store_id(self, store_id): with Session(self.engine) as session: prefs = session.exec(select(PreferStore)).all() @@ -190,10 +206,15 @@ class Data(): return ['Success'] def list_purchases(self, store_name): + '''List unique purchases at store in the past 90 days''' with Session(self.engine) as session: - cmd = select(PurchaseRecord).where(func.lower(PurchaseRecord.store) == func.lower(store_name)) + recent = dt.now() - timedelta(days=90) + cmd = select(PurchaseRecord).where(func.lower(PurchaseRecord.store) == func.lower(store_name)).where(PurchaseRecord.purchase_date > recent) records = session.exec(cmd).all() - return records + bought = set() + for item in records: + bought.add(item.name) + return list(bought) def purchase_items(self, item_ids): results = [] @@ -290,6 +311,34 @@ class Data(): def setup(self): SQLModel.metadata.create_all(self.engine) + with Session(self.engine) as session: + # Add some obvious store zones by default + DEFAULT_ZONES = { + 'Bakery': ['bread', 'cake', 'cookie', 'muffin', 'pie'], + 'Baking': ['flour', 'sugar'], + 'Books': ['book'], + 'Clothes': ['bra', 'coat', 'jacket', 'panties', 'pants', 'shirt', 'shorts', 'socks', 'sweater', 'underwear'], + 'Cooler': ['butter', 'cream', 'eggs', 'juice', 'milk', 'tea'], + 'Deli': ['beef', 'chicken', 'salmon', 'steak', 'turkey'], + 'Movies': ['movie', 'DVD'], + 'Music': ['cd', 'album'], + 'Produce': ['carrot', 'cucumber', 'greens', 'lettuce'], + 'Shoes': ['shoe'], + 'Television': ['tv', 'season'], + } + for zone in DEFAULT_ZONES: + logging.debug(f'Adding default items for {zone}') + for item in DEFAULT_ZONES[zone]: + try: + logging.debug(f'Attempt adding {item} to {zone}...') + new = ItemZone(name=item, zone=zone) + session.add(new) + session.commit() + logging.debug(f'Success adding {item} to {zone}...') + except Exception as ex: + session.rollback() + logging.debug(f'Failed adding {item} to {zone}: {ex}') + return 'Success'