mirror of
https://git.hiabuto.net/C3MA/CCMA.git
synced 2026-07-03 12:10:05 +02:00
fix: preflight member records before rules
This commit is contained in:
@@ -10,7 +10,7 @@ from pathlib import Path
|
||||
from typing import Any
|
||||
from uuid import uuid4
|
||||
|
||||
from ccma.domain.models import ContributionData, HousekeeperFinding
|
||||
from ccma.domain.models import HousekeeperFinding
|
||||
from ccma.rules.api import RuleAction, RuleContext
|
||||
from ccma.rules.loader import LoadedRule, load_rules
|
||||
from ccma.services.intervals import AnniversaryInterval, parse_anniversary_intervals
|
||||
@@ -67,13 +67,14 @@ class Housekeeper:
|
||||
|
||||
rules = load_rules(self.repository.root)
|
||||
repository_config = self.repository.get_configuration()
|
||||
for member in self.repository.list_members():
|
||||
for member_id in self.repository.list_member_ids():
|
||||
try:
|
||||
contributions = self.repository.get_contributions(member.member_id)
|
||||
contributions_error = None
|
||||
member, contributions = self.repository.preflight_member_record(member_id)
|
||||
except RepositoryError as exc:
|
||||
contributions = ContributionData()
|
||||
contributions_error = str(exc)
|
||||
self._refresh_record_integrity_task(items, member_id, str(exc), run_id, now)
|
||||
successful_scopes.add(("member-record-check", member_id))
|
||||
continue
|
||||
successful_scopes.add(("member-record-check", member_id))
|
||||
for rule in rules:
|
||||
scope = (rule.rule_id, member.member_id)
|
||||
try:
|
||||
@@ -83,7 +84,6 @@ class Housekeeper:
|
||||
today=current_date,
|
||||
settings=self.settings,
|
||||
repository_config=repository_config,
|
||||
contributions_error=contributions_error,
|
||||
)
|
||||
actions = rule.evaluate(context)
|
||||
if not isinstance(actions, list):
|
||||
@@ -126,6 +126,43 @@ class Housekeeper:
|
||||
write_json_atomic(self.state_path, working)
|
||||
return _open_findings(working["items"])
|
||||
|
||||
@staticmethod
|
||||
def _refresh_record_integrity_task(
|
||||
items: dict[str, dict[str, Any]],
|
||||
member_id: str,
|
||||
detail: str,
|
||||
run_id: str,
|
||||
now: str,
|
||||
) -> None:
|
||||
key = f"member-record-check:{member_id}:invalid-record"
|
||||
item = items.get(key, {})
|
||||
was_resolved = item.get("status") == "resolved"
|
||||
item.update(
|
||||
{
|
||||
"key": key,
|
||||
"rule_id": "member-record-check",
|
||||
"rule_file": "<preflight>",
|
||||
"rule_source": "housekeeper",
|
||||
"member_id": member_id,
|
||||
"action": "task",
|
||||
"status": "open",
|
||||
"severity": "error",
|
||||
"code": "invalid_member_record",
|
||||
"title": f"Mitgliederakte {member_id}: Daten beschädigt",
|
||||
"detail": f"{detail}. Für diese Akte wurden keine Regeln ausgeführt.",
|
||||
"due_date": None,
|
||||
"first_seen_run": item.get("first_seen_run", run_id),
|
||||
"first_seen_at": item.get("first_seen_at", now),
|
||||
"last_seen_run": run_id,
|
||||
"last_seen_at": now,
|
||||
"seen_count": int(item.get("seen_count", 0)) + 1,
|
||||
"reopened_count": int(item.get("reopened_count", 0)) + (1 if was_resolved else 0),
|
||||
"resolved_run": None,
|
||||
"resolved_at": None,
|
||||
}
|
||||
)
|
||||
items[key] = item
|
||||
|
||||
def _apply_action(
|
||||
self,
|
||||
items: dict[str, dict[str, Any]],
|
||||
|
||||
Reference in New Issue
Block a user