Removes unnecessary FK from Rules __init__

The FK are correctly initialized when the rules are created as part of
the base category/tag.
Also removes the name from the CategorySchedule, same logic applies.
This commit is contained in:
Luís Murta 2023-05-12 20:01:32 +01:00
parent 729e15d4e8
commit 42d84b02f4
Signed by: satprog
GPG Key ID: 169EF1BBD7049F94
3 changed files with 32 additions and 33 deletions

View File

@ -263,7 +263,6 @@ class Category(Base, Serializable, repr=False):
for rule in self.rules: for rule in self.rules:
rules.append( rules.append(
{ {
"name": rule.name,
"start": rule.start, "start": rule.start,
"end": rule.end, "end": rule.end,
"description": rule.description, "description": rule.description,
@ -277,7 +276,6 @@ class Category(Base, Serializable, repr=False):
schedule = None schedule = None
if self.schedule: if self.schedule:
schedule = { schedule = {
"name": self.schedule.name,
"period": self.schedule.period.name if self.schedule.period else None, "period": self.schedule.period.name if self.schedule.period else None,
"period_multiplier": self.schedule.period_multiplier, "period_multiplier": self.schedule.period_multiplier,
"amount": self.schedule.amount, "amount": self.schedule.amount,
@ -367,7 +365,6 @@ class Tag(Base, Serializable):
for rule in self.rules: for rule in self.rules:
rules.append( rules.append(
{ {
"name": rule.tag,
"start": rule.start, "start": rule.start,
"end": rule.end, "end": rule.end,
"description": rule.description, "description": rule.description,
@ -405,7 +402,7 @@ class SchedulePeriod(enum.Enum):
class CategorySchedule(Base): class CategorySchedule(Base):
__tablename__ = "category_schedules" __tablename__ = "category_schedules"
name: Mapped[catfk] = mapped_column(primary_key=True) name: Mapped[catfk] = mapped_column(primary_key=True, init=False)
period: Mapped[Optional[SchedulePeriod]] period: Mapped[Optional[SchedulePeriod]]
period_multiplier: Mapped[Optional[int]] period_multiplier: Mapped[Optional[int]]
amount: Mapped[Optional[int]] amount: Mapped[Optional[int]]
@ -418,17 +415,17 @@ class Link(Base):
link: Mapped[idfk] = mapped_column(primary_key=True) link: Mapped[idfk] = mapped_column(primary_key=True)
class Rule(Base, init=False): class Rule(Base):
__tablename__ = "rules" __tablename__ = "rules"
id: Mapped[idpk] = mapped_column(init=False) id: Mapped[idpk] = mapped_column(init=False)
start: Mapped[Optional[dt.date]] start: Mapped[Optional[dt.date]] = mapped_column(default=None)
end: Mapped[Optional[dt.date]] end: Mapped[Optional[dt.date]] = mapped_column(default=None)
description: Mapped[Optional[str]] description: Mapped[Optional[str]] = mapped_column(default=None)
regex: Mapped[Optional[str]] regex: Mapped[Optional[str]] = mapped_column(default=None)
bank: Mapped[Optional[str]] bank: Mapped[Optional[str]] = mapped_column(default=None)
min: Mapped[Optional[money]] min: Mapped[Optional[money]] = mapped_column(default=None)
max: Mapped[Optional[money]] max: Mapped[Optional[money]] = mapped_column(default=None)
type: Mapped[str] = mapped_column(init=False) type: Mapped[str] = mapped_column(init=False)
@ -437,10 +434,6 @@ class Rule(Base, init=False):
"polymorphic_on": "type", "polymorphic_on": "type",
} }
def __init__(self, **kwargs: Any) -> None:
for k, v in kwargs.items():
setattr(self, k, v)
def matches(self, t: BankTransaction) -> bool: def matches(self, t: BankTransaction) -> bool:
valid = None valid = None
if self.regex: if self.regex:
@ -478,16 +471,12 @@ class CategoryRule(Rule):
primary_key=True, primary_key=True,
init=False, init=False,
) )
name: Mapped[catfk] name: Mapped[catfk] = mapped_column(init=False)
__mapper_args__ = { __mapper_args__ = {
"polymorphic_identity": "category_rule", "polymorphic_identity": "category_rule",
} }
def __init__(self, name: str, **kwargs: Any) -> None:
super().__init__(**kwargs)
self.name = name
class TagRule(Rule): class TagRule(Rule):
__tablename__ = "tag_rules" __tablename__ = "tag_rules"
@ -498,12 +487,10 @@ class TagRule(Rule):
primary_key=True, primary_key=True,
init=False, init=False,
) )
tag: Mapped[str] = mapped_column(ForeignKey(Tag.name, ondelete="CASCADE")) tag: Mapped[str] = mapped_column(
ForeignKey(Tag.name, ondelete="CASCADE"), init=False
)
__mapper_args__ = { __mapper_args__ = {
"polymorphic_identity": "tag_rule", "polymorphic_identity": "tag_rule",
} }
def __init__(self, name: str, **kwargs: Any) -> None:
super().__init__(**kwargs)
self.tag = name

View File

@ -9,13 +9,13 @@ categorygroup1 = CategoryGroup("group#1")
category1 = Category( category1 = Category(
"cat#1", "cat#1",
"group#1", "group#1",
rules=[CategoryRule("cat#1", description="desc#1", max=Decimal(0))], rules=[CategoryRule(description="desc#1", max=Decimal(0))],
) )
category2 = Category( category2 = Category(
"cat#2", "cat#2",
"group#1", "group#1",
rules=[CategoryRule("cat#1", description="desc#1", max=Decimal(0))], rules=[CategoryRule(description="desc#1", max=Decimal(0))],
) )
tag_1 = Tag("tag#1", rules=[TagRule("tag#1", description="desc#1", max=Decimal(0))]) tag_1 = Tag("tag#1", rules=[TagRule(description="desc#1", max=Decimal(0))])

View File

@ -56,7 +56,9 @@ class TestTransform:
for t in transactions: for t in transactions:
assert not t.category assert not t.category
rules = [CategoryRule("null", bank="Bank#1")] rule = CategoryRule(bank="Bank#1")
rule.name = "null"
rules = [rule]
categorizer: Transformer = Nullifier(rules) categorizer: Transformer = Nullifier(rules)
transactions = categorizer.transform(transactions) transactions = categorizer.transform(transactions)
@ -64,7 +66,9 @@ class TestTransform:
for t in transactions: for t in transactions:
assert not t.category assert not t.category
rules.append(CategoryRule("null", bank="Bank#2")) rule = CategoryRule(bank="Bank#2")
rule.name = "null"
rules.append(rule)
categorizer = Nullifier(rules) categorizer = Nullifier(rules)
transactions = categorizer.transform(transactions) transactions = categorizer.transform(transactions)
@ -79,7 +83,11 @@ class TestTransform:
for t in transactions: for t in transactions:
assert not t.category assert not t.category
categorizer: Transformer = Tagger(mock.tag_1.rules) rules = mock.tag_1.rules
for rule in rules:
rule.tag = mock.tag_1.name
categorizer: Transformer = Tagger(rules)
transactions = categorizer.transform(transactions) transactions = categorizer.transform(transactions)
for t in transactions: for t in transactions:
@ -93,7 +101,11 @@ class TestTransform:
for t in transactions: for t in transactions:
assert not t.category assert not t.category
categorizer: Transformer = Categorizer(mock.category1.rules) rules = mock.category1.rules
for rule in rules:
rule.name = mock.category1.name
categorizer: Transformer = Categorizer(rules)
transactions = categorizer.transform(transactions) transactions = categorizer.transform(transactions)
for t in transactions: for t in transactions: