]>
us-delaporte.pagekite.me Git - matrix-fridge-bot.git/blob - matrix_fridge_bot/db.py
eb414a4a8404dde8aa95a69b0ba275d862d84aa2
3 from datetime
import datetime
as dt
4 from datetime
import timedelta
6 from sqlmodel
import Field
, Session
, SQLModel
, create_engine
, select
, text
10 # - [ ] reminder to eat recent food
11 # - [ ] reminder to toss old food
13 DATE_FORMAT
= '%A, %Y-%m-%d'
19 return dt
.now().strftime(DATE_FORMAT
)
21 logger
= logging
.getLogger(__name__
)
22 logging
.basicConfig(filename
=f
'matrix-{MODULE}-bot.log', encoding
='utf-8', level
=logging
.DEBUG
)
23 logging
.getLogger('nio').setLevel(logging
.WARNING
)
24 logging
.getLogger('asyncio').setLevel(logging
.WARNING
)
25 logging
.getLogger('invoke').setLevel(logging
.WARNING
)
27 class Food(SQLModel
, table
=True):
28 id: int |
None = Field(default
=None, primary_key
=True)
29 name
: str = Field(default
=None, unique
=True)
30 added_date
: dt
= Field(default_factory
=lambda: dt
.now())
33 added
= self
.added_date
.strftime(DATE_FORMAT
)
34 return f
'{self.name} ({added})'
37 def __init__(self
, db_file
):
40 logger
.debug(f
'DB file: {db_file}')
41 self
.engine
= self
.get_engine()
43 def get_db_file(self
):
47 return create_engine(f
"sqlite:///{self.file}")
50 SQLModel
.metadata
.create_all(self
.engine
)
54 stale
= dt
.now() - timedelta(STALE_DAYS
)
55 logger
.debug(f
'Stale date is {stale}')
60 with Session(self
.engine
) as session
:
61 stale_dt
= Data
.get_stale()
62 cmd
= select(Food
).where(Food
.added_date
> stale_dt
)
63 results
= session
.exec(cmd
).all()
64 logger
.debug(f
'List restuls are {str(results)}')
66 results
.append('Nothing Found')
72 with Session(self
.engine
) as session
:
73 stale_dt
= Data
.get_stale()
74 cmd
= select(Food
).where(Food
.added_date
<= stale_dt
)
75 results
= session
.exec(cmd
).all()
77 results
.append('Nothing Found')
82 def filter(self
, term
):
84 for item
in self
.list():
92 with Session(self
.engine
) as session
:
96 return f
'Added {name}.'
98 return f
'Unable to add {name}. May be duplicate.'
101 def get_food(session
, food
):
102 cmd
= select(Food
).filter(Food
.name
.ilike(f
'%{food}%'))
103 return session
.exec(cmd
).one()
105 def remove(self
, name
):
106 # TODO: Tag as tossed or eaten
107 with Session(self
.engine
) as session
:
108 item
= Data
.get_food(session
, name
)
110 return f
'Not found: {name}'
116 return f
'Removed item {name}'
117 except Exception as ex
:
118 return f
'Unable to remove item mark chore as done: {ex}'