Coverage for opt/mealie/lib/python3.12/site-packages/mealie/db/models/_model_base.py: 100%
21 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
1from datetime import datetime
3from sqlalchemy import Integer
4from sqlalchemy.orm import DeclarativeBase, Mapped, declared_attr, mapped_column, synonym
5from text_unidecode import unidecode
7from ._model_utils.datetime import NaiveDateTime, get_utc_now
10class SqlAlchemyBase(DeclarativeBase):
11 id: Mapped[int] = mapped_column(Integer, primary_key=True)
12 created_at: Mapped[datetime | None] = mapped_column(NaiveDateTime, default=get_utc_now, index=True)
13 update_at: Mapped[datetime | None] = mapped_column(NaiveDateTime, default=get_utc_now, onupdate=get_utc_now)
15 @declared_attr
16 def updated_at(cls) -> Mapped[datetime | None]:
17 return synonym("update_at")
19 @classmethod
20 def normalize(cls, val: str) -> str:
21 # We cap the length to 255 to prevent indexes from being too long; see:
22 # https://www.postgresql.org/docs/current/btree.html
23 return unidecode(val).lower().strip()[:255]
26class BaseMixins:
27 """
28 `self.update` method which directly passing arguments to the `__init__`
29 """
31 def update(self, *args, **kwargs):
32 self.__init__(*args, **kwargs)
34 # sqlalchemy doesn't like this method to remove all instances of a 1:many relationship,
35 # so we explicitly check for that here
36 for k, v in kwargs.items():
37 if hasattr(self, k) and v == []:
38 setattr(self, k, v)