mirror of
https://github.com/elisiariocouto/leggen.git
synced 2025-12-13 11:22:21 +00:00
feat: improve notification filters configuration format
- Change filters config from nested dict to simple arrays - Update NotificationFilters model to use List[str] instead of Dict[str, str] - Modify notification service to handle list-based filters - Update API routes and tests for new format - Update README with new configuration example Before: [filters.case-insensitive] salary = 'salary' After: [filters] case-insensitive = ['salary', 'utility']
This commit is contained in:
committed by
Elisiário Couto
parent
bc947183e3
commit
2191fe9066
@@ -114,9 +114,9 @@ chat_id = 12345
|
|||||||
enabled = true
|
enabled = true
|
||||||
|
|
||||||
# Optional: Transaction filters for notifications
|
# Optional: Transaction filters for notifications
|
||||||
[filters.case-insensitive]
|
[filters]
|
||||||
salary = "salary"
|
case-insensitive = ["salary", "utility"]
|
||||||
bills = "utility"
|
case-sensitive = ["SpecificStore"]
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📖 Usage
|
## 📖 Usage
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from typing import Dict, Optional, List
|
from typing import Optional, List
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
@@ -21,8 +21,8 @@ class TelegramConfig(BaseModel):
|
|||||||
class NotificationFilters(BaseModel):
|
class NotificationFilters(BaseModel):
|
||||||
"""Notification filters configuration"""
|
"""Notification filters configuration"""
|
||||||
|
|
||||||
case_insensitive: Dict[str, str] = {}
|
case_insensitive: List[str] = []
|
||||||
case_sensitive: Optional[Dict[str, str]] = None
|
case_sensitive: Optional[List[str]] = None
|
||||||
amount_threshold: Optional[float] = None
|
amount_threshold: Optional[float] = None
|
||||||
keywords: List[str] = []
|
keywords: List[str] = []
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ async def get_notification_settings() -> APIResponse:
|
|||||||
if (telegram_config.get("token") or telegram_config.get("api-key"))
|
if (telegram_config.get("token") or telegram_config.get("api-key"))
|
||||||
else None,
|
else None,
|
||||||
filters=NotificationFilters(
|
filters=NotificationFilters(
|
||||||
case_insensitive=filters_config.get("case-insensitive", {}),
|
case_insensitive=filters_config.get("case-insensitive", []),
|
||||||
case_sensitive=filters_config.get("case-sensitive"),
|
case_sensitive=filters_config.get("case-sensitive"),
|
||||||
amount_threshold=filters_config.get("amount_threshold"),
|
amount_threshold=filters_config.get("amount_threshold"),
|
||||||
keywords=filters_config.get("keywords", []),
|
keywords=filters_config.get("keywords", []),
|
||||||
|
|||||||
@@ -63,14 +63,29 @@ class NotificationService:
|
|||||||
) -> List[Dict[str, Any]]:
|
) -> List[Dict[str, Any]]:
|
||||||
"""Filter transactions based on notification criteria"""
|
"""Filter transactions based on notification criteria"""
|
||||||
matching = []
|
matching = []
|
||||||
filters_case_insensitive = self.filters_config.get("case-insensitive", {})
|
filters_case_insensitive = self.filters_config.get("case-insensitive", [])
|
||||||
|
filters_case_sensitive = self.filters_config.get("case-sensitive", [])
|
||||||
|
|
||||||
for transaction in transactions:
|
for transaction in transactions:
|
||||||
description = transaction.get("description", "").lower()
|
description = transaction.get("description", "")
|
||||||
|
description_lower = description.lower()
|
||||||
|
|
||||||
# Check case-insensitive filters
|
# Check case-insensitive filters
|
||||||
for _filter_name, filter_value in filters_case_insensitive.items():
|
for filter_value in filters_case_insensitive:
|
||||||
if filter_value.lower() in description:
|
if filter_value.lower() in description_lower:
|
||||||
|
matching.append(
|
||||||
|
{
|
||||||
|
"name": transaction["description"],
|
||||||
|
"value": transaction["transactionValue"],
|
||||||
|
"currency": transaction["transactionCurrency"],
|
||||||
|
"date": transaction["transactionDate"],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
break
|
||||||
|
|
||||||
|
# Check case-sensitive filters
|
||||||
|
for filter_value in filters_case_sensitive:
|
||||||
|
if filter_value in description:
|
||||||
matching.append(
|
matching.append(
|
||||||
{
|
{
|
||||||
"name": transaction["description"],
|
"name": transaction["description"],
|
||||||
|
|||||||
@@ -188,7 +188,8 @@ class TestConfig:
|
|||||||
"""Test filters configuration access."""
|
"""Test filters configuration access."""
|
||||||
custom_config = {
|
custom_config = {
|
||||||
"filters": {
|
"filters": {
|
||||||
"case-insensitive": {"salary": "SALARY", "bills": "BILL"},
|
"case-insensitive": ["salary", "utility"],
|
||||||
|
"case-sensitive": ["SpecificStore"],
|
||||||
"amount_threshold": 100.0,
|
"amount_threshold": 100.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -197,5 +198,7 @@ class TestConfig:
|
|||||||
config._config = custom_config
|
config._config = custom_config
|
||||||
|
|
||||||
filters = config.filters_config
|
filters = config.filters_config
|
||||||
assert filters["case-insensitive"]["salary"] == "SALARY"
|
assert "salary" in filters["case-insensitive"]
|
||||||
|
assert "utility" in filters["case-insensitive"]
|
||||||
|
assert "SpecificStore" in filters["case-sensitive"]
|
||||||
assert filters["amount_threshold"] == 100.0
|
assert filters["amount_threshold"] == 100.0
|
||||||
|
|||||||
Reference in New Issue
Block a user