Commands:
help - show this help
+ extra.help - show extended help
add - add an item to shop for
- add-store - add a store
- assign-item-to-store ITEM_ID STORE_ID - plan to shop for at store for item
+ add.store - add a store
assign ITEM_ID - assign item to last used store id
buy - mark item as purchased
clear STORE_ID - clear all purchased items for STORE_ID from database
- clear-all STORE_ID - clear **all** items for STORE_ID from database
list - re-show list from last used store
- list-for-store STORE_ID - list all items assigned to store
- list-stores - list all stores
- unsorted - list all items not assigned to any store
- remove-item ITEM_ID - remove a shopping item from the datatbase
- remove-store STORE_ID - remove a store from the datatbase (requires clearing the list first)
+ stores - list all stores
+ shop.at STORE_ID - list all items assigned to store and use this store for future commands
+ '''
+ extended_help = '''
+ assign.item.to.store ITEM_ID STORE_ID - plan to shop for at store for item
+ clear.all STORE_ID - clear **all** items for STORE_ID from database
+ remove.item ITEM_ID - remove a shopping item from the datatbase
+ remove.store STORE_ID - remove a store from the datatbase (requires clearing the list first)
setup - run one time database setup
+ unsorted - list all items not assigned to any store
+
'''
if match.command('setup'):
result = Data().setup()
return [result]
- if match.command('list-stores'):
+ if match.command('stores'):
items = Data().get_stores()
results = ['List of Stores']
for item in items:
results.append(str(item))
return results
- if match.command('add-store'):
+ if match.command('add.store'):
new = ' '.join(match.args()[1:])
result = Data().add_store(new)
return [f'Store added with id {result}']
- if match.command('assign-item-to-store'):
+ if match.command('assign.item.to.store'):
item_id = int(match.args()[1])
store_id = int(match.args()[2])
Data().assign_store(item_id, store_id)
self.last_store_id = None
return ['Success']
- if match.command('clear-all'):
+ if match.command('clear.all'):
store_id = ' '.join(match.args()[1:])
Data().clear_list(store_id, clear_all=True)
return ['Success']
- if match.command('list-for-store'):
+ if match.command('shop.at'):
store_id = ' '.join(match.args()[1])
items = Data().get_shopping_list_for_store(store_id)
results = ['Shopping List']
results.append(str(item))
return results
- if match.command('remove-item'):
+ if match.command('remove.item'):
item_id = ' '.join(match.args()[1:])
Data().remove_item(item_id)
return ['Success']
- if match.command('remove-store'):
+ if match.command('remove.store'):
store_id = ' '.join(match.args()[1:])
Data().remove_store(store_id)
return ['Success']
+
+ if match.command('extra.help'):
+ return [extended_help]
+
return [do_shop.__doc__]
async def shop_bot(room, message, bot):
from sqlmodel import Field, Session, SQLModel, create_engine, select, text, Relationship
+from sqlite3 import IntegrityError
+
MODULE='shop'
DATE_FORMAT = '%Y-%m-%d'
return pref.store_id
def _add_with_name(self, cls, name):
- id = -1
- with Session(self.engine) as session:
- new = cls(name=name)
- session.add(new)
- session.commit()
- id = new.id
- return id
+ item_id = -1
+ try:
+ with Session(self.engine) as session:
+ new = cls(name=name)
+ session.add(new)
+ session.commit()
+ item_id = new.id
+ except:
+ # duplicate add
+ # recover by returning the item_id
+ item = session.exec(select(Item).where(Item.name == name)).first()
+ item_id = item.id
+
+ return item_id
def add_store(self, name):
store_id = self._add_with_name(Store, name)
return store_id
def add_item(self, name):
- item_id = self._add_with_name(Item, name)
- store_id = self._get_pref_store_id()
- self.assign_store(item_id, store_id)
+ names = name.split(',')
+ for name in names:
+ item_id = self._add_with_name(Item, name.strip())
+ store_id = self._get_pref_store_id()
+ self.assign_store(item_id, store_id)
return item_id
def assign_last_store(self, item_id):
with Session(self.engine) as session:
store = session.exec(_get_with_id(Store, store_id)).first()
item = session.exec(_get_with_id(Item, item_id)).first()
- item.stores.append(store)
- session.commit()
+ try:
+ item.stores.append(store)
+ session.commit()
+ except:
+ pass # Already assigned
return ['Success']
def purchase_item(self, item_id):