Skip to content

Commit 94872a5

Browse files
committed
Remove priority as required field for category match rules
1 parent da9ebe8 commit 94872a5

File tree

7 files changed

+22
-28
lines changed

7 files changed

+22
-28
lines changed

thebook/bookkeeping/admin.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ class CategoryAdmin(admin.ModelAdmin): ...
4949
@admin.register(CategoryMatchRule)
5050
class CategoryMatchRuleAdmin(admin.ModelAdmin):
5151
list_display = [
52-
"priority",
5352
"pattern",
5453
"category",
5554
]

thebook/bookkeeping/management/commands/set_category_to_uncategorized_transactions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class Command(BaseCommand):
88

99
def handle(self, *args, **options):
1010
uncategorized_transactions = Transaction.objects.filter(category__isnull=True)
11-
category_match_rules = CategoryMatchRule.objects.order_by("priority")
11+
category_match_rules = CategoryMatchRule.objects.all()
1212

1313
for transaction in uncategorized_transactions:
1414
transaction.categorize(rules=category_match_rules)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Generated by Django 5.2.10 on 2026-02-13 20:22
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("bookkeeping", "0019_document_content_type_document_object_id_and_more"),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name="categorymatchrule",
15+
name="priority",
16+
),
17+
]

thebook/bookkeeping/models.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ def __str__(self):
113113

114114

115115
class CategoryMatchRule(models.Model):
116-
priority = models.IntegerField(unique=True)
117116
pattern = models.CharField(max_length=512)
118117
category = models.ForeignKey("bookkeeping.Category", on_delete=models.CASCADE)
119118
value = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
@@ -131,7 +130,7 @@ class CategoryMatchRule(models.Model):
131130
tags = models.CharField(max_length=512, blank=True, null=True)
132131

133132
def __str__(self):
134-
return f"{self.pattern} ({self.priority})"
133+
return f"{self.pattern}"
135134

136135
class Meta:
137136
constraints = [
@@ -282,7 +281,7 @@ def has_documents(self):
282281

283282
def categorize(self, rules=None):
284283
if rules is None:
285-
rules = CategoryMatchRule.objects.order_by("priority")
284+
rules = CategoryMatchRule.objects.all()
286285

287286
for rule in rules:
288287
self, applied = rule.apply_rule(self)

thebook/bookkeeping/tests/models/test_category_match_rules.py

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,16 @@ def category():
1212
return Category.objects.create(name="Test Category")
1313

1414

15-
def test_priority_must_be_unique(db, category):
16-
_ = CategoryMatchRule.objects.create(
17-
priority=100, pattern="test_pattern", category=category
18-
)
19-
with pytest.raises(IntegrityError):
20-
CategoryMatchRule.objects.create(
21-
priority=100, pattern="another_pattern", category=category
22-
)
23-
24-
2515
def test_when_value_is_provided_comparison_function_is_also_required(db, category):
2616
with pytest.raises(IntegrityError):
2717
_ = CategoryMatchRule.objects.create(
28-
priority=100, pattern="pattern", category=category, value=Decimal("42.0")
18+
pattern="pattern", category=category, value=Decimal("42.0")
2919
)
3020

3121

3222
def test_when_comparison_function_is_provided_value_is_also_required(db, category):
3323
with pytest.raises(IntegrityError):
3424
_ = CategoryMatchRule.objects.create(
35-
priority=100,
3625
pattern="pattern",
3726
category=category,
3827
comparison_function="EQ",
@@ -42,7 +31,6 @@ def test_when_comparison_function_is_provided_value_is_also_required(db, categor
4231
def test_valid_when_comparison_function_and_value_are_provided(db, category):
4332
try:
4433
category_match_rule = CategoryMatchRule.objects.create(
45-
priority=100,
4634
pattern="pattern",
4735
category=category,
4836
value=Decimal("42.0"),
@@ -63,7 +51,6 @@ def test_valid_when_comparison_function_and_value_are_provided(db, category):
6351
def test_comparison_function_must_be_a_valid_value(db, category, comparison_function):
6452
try:
6553
category_match_rule = CategoryMatchRule.objects.create(
66-
priority=100,
6754
pattern="pattern",
6855
category=category,
6956
value=Decimal("42.0"),
@@ -76,7 +63,6 @@ def test_comparison_function_must_be_a_valid_value(db, category, comparison_func
7663
def test_fail_when_comparison_function_is_not_a_valid_value(db, category):
7764
with pytest.raises(IntegrityError):
7865
_ = CategoryMatchRule.objects.create(
79-
priority=100,
8066
pattern="pattern",
8167
category=category,
8268
value=Decimal("42.0"),

thebook/bookkeeping/tests/models/test_category_match_rules__apply_rule.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def test_can_not_apply_rule_in_not_persisted_transaction(
1515
bank_fee_category,
1616
):
1717
category_rule = CategoryMatchRule.objects.create(
18-
priority=100, pattern="bank fee", category=bank_fee_category, tags="bank"
18+
pattern="bank fee", category=bank_fee_category, tags="bank"
1919
)
2020
transaction = baker.prepare(Transaction, description="bank fee")
2121
with pytest.raises(ValueError):
@@ -34,7 +34,6 @@ def test_can_not_apply_rule_in_not_persisted_transaction(
3434
)
3535
def test_apply_rule_by_regex_pattern(db, bank_fee_category, pattern, description):
3636
category_rule = CategoryMatchRule.objects.create(
37-
priority=100,
3837
pattern=pattern,
3938
category=bank_fee_category,
4039
)
@@ -60,7 +59,6 @@ def test_do_not_apply_rule_when_regex_not_a_match(
6059
db, bank_fee_category, pattern, description
6160
):
6261
category_rule = CategoryMatchRule.objects.create(
63-
priority=100,
6462
pattern=pattern,
6563
category=bank_fee_category,
6664
)
@@ -85,7 +83,6 @@ def test_apply_tags_to_matched_transactions(
8583
db, bank_fee_category, pattern, description, tags
8684
):
8785
category_rule = CategoryMatchRule.objects.create(
88-
priority=100,
8986
pattern=pattern,
9087
category=bank_fee_category,
9188
tags=tags,
@@ -122,7 +119,6 @@ def test_apply_rule_considering_value(
122119
expected_applied,
123120
):
124121
category_rule = CategoryMatchRule.objects.create(
125-
priority=100,
126122
pattern="bank fee",
127123
category=bank_fee_category,
128124
value=rule_value,

thebook/bookkeeping/tests/models/test_transaction__categorize.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ def test_transactions_description_rules_over_donation_threshold(
7171
db, mocker, settings, accountant
7272
):
7373
CategoryMatchRule.objects.create(
74-
priority=100,
7574
pattern="NOT DONATION",
7675
category=accountant,
7776
),
@@ -94,12 +93,10 @@ def test_consider_match_rule_priority_when_categorizing(
9493
db, mocker, settings, accountant, bank_fees
9594
):
9695
CategoryMatchRule.objects.create(
97-
priority=200,
9896
pattern="PAYMENT",
9997
category=accountant,
10098
)
10199
CategoryMatchRule.objects.create(
102-
priority=100,
103100
pattern="PAYMENT",
104101
category=bank_fees,
105102
)

0 commit comments

Comments
 (0)