From d409038072104f8bb83c5e9c5d053e046233b517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Murta?= Date: Thu, 8 Dec 2022 00:32:06 +0000 Subject: [PATCH] Adds category selector column This column indicates where has the category came from. --- .../6863dda76ea2_category_selector.py | 54 +++++++++++++++++++ pfbudget/db/model.py | 31 +++++++++++ 2 files changed, 85 insertions(+) create mode 100644 alembic/versions/6863dda76ea2_category_selector.py diff --git a/alembic/versions/6863dda76ea2_category_selector.py b/alembic/versions/6863dda76ea2_category_selector.py new file mode 100644 index 0000000..5ccac48 --- /dev/null +++ b/alembic/versions/6863dda76ea2_category_selector.py @@ -0,0 +1,54 @@ +"""Category selector + +Revision ID: 6863dda76ea2 +Revises: 83f4c9837f6e +Create Date: 2022-12-08 00:56:59.032641+00:00 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "6863dda76ea2" +down_revision = "83f4c9837f6e" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "categories_selector", + sa.Column("id", sa.BigInteger(), nullable=False), + sa.Column( + "selector", + sa.Enum( + "unknown", + "nullifier", + "vacations", + "rules", + "algorithm", + "manual", + name="selector", + schema="transactions", + inherit_schema=True, + ), + nullable=False, + ), + sa.ForeignKeyConstraint( + ["id"], + ["transactions.categorized.id"], + name=op.f("fk_categories_selector_id_categorized"), + ondelete="CASCADE", + ), + sa.PrimaryKeyConstraint("id", name=op.f("pk_categories_selector")), + schema="transactions", + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table("categories_selector", schema="transactions") + # ### end Alembic commands ### diff --git a/pfbudget/db/model.py b/pfbudget/db/model.py index be1ceaa..6bc0ef9 100644 --- a/pfbudget/db/model.py +++ b/pfbudget/db/model.py @@ -121,11 +121,18 @@ class TransactionCategory(Base): name: Mapped[str] = mapped_column(ForeignKey(Category.name)) original: Mapped[Transaction] = relationship(back_populates="category") + selector: Mapped[CategorySelector] = relationship(back_populates="category") def __repr__(self) -> str: return f"Category({self.name})" +catfk = Annotated[ + int, + mapped_column(BigInteger, ForeignKey(TransactionCategory.id, ondelete="CASCADE")), +] + + class Note(Base): __tablename__ = "notes" @@ -165,3 +172,27 @@ class CategoryRule(Base): ForeignKey(Category.name, ondelete="CASCADE"), primary_key=True ) rule: Mapped[str] = mapped_column(primary_key=True) + + +class Selector(enum.Enum): + unknown = enum.auto() + nullifier = enum.auto() + vacations = enum.auto() + rules = enum.auto() + algorithm = enum.auto() + manual = enum.auto() + + +categoryselector = Annotated[ + Selector, + mapped_column(Enum(Selector, inherit_schema=True), default=Selector.unknown), +] + + +class CategorySelector(Base): + __tablename__ = "categories_selector" + + id: Mapped[catfk] = mapped_column(primary_key=True) + selector: Mapped[categoryselector] + + category: Mapped[TransactionCategory] = relationship(back_populates="selector")