Gate calendar sync workers by tenant entitlement

This commit is contained in:
2026-08-04 09:29:35 +02:00
parent b4e5351b8c
commit 00add294a8
3 changed files with 115 additions and 16 deletions
+59 -15
View File
@@ -6,22 +6,66 @@ from celery import shared_task
@shared_task(name="govoplan_calendar.sync_due_caldav_sources")
def sync_due_caldav_sources_task(tenant_id: str | None = None, limit: int = 50) -> list[dict[str, object]]:
from govoplan_calendar.backend.service import sync_due_sources
from govoplan_core.core.module_entitlements import tenant_execution_scope
from govoplan_core.core.worker_runtime import build_worker_platform_registry
from govoplan_core.db.session import get_database
from govoplan_core.settings import settings
with get_database().SessionLocal() as session:
results = sync_due_sources(session, tenant_id=tenant_id, limit=limit)
registry = build_worker_platform_registry(settings)
resolver = registry.tenant_entitlement_resolver()
admissions = (
(
resolver.admission(
session,
tenant_id=tenant_id,
module_id="calendar",
work_state="accepted",
),
)
if tenant_id is not None
else resolver.active_tenant_admissions(
session,
module_id="calendar",
work_state="accepted",
)
)
payload: list[dict[str, object]] = []
for admission in admissions:
if not admission.allowed:
payload.append(
{
"tenant_id": admission.tenant_id,
"status": "operator_action_required",
"operator_action": admission.payload(),
}
)
continue
with tenant_execution_scope(
resolver,
session,
tenant_id=admission.tenant_id,
work_state="accepted",
):
results = sync_due_sources(
session,
tenant_id=admission.tenant_id,
limit=limit,
)
payload.extend(
{
"tenant_id": admission.tenant_id,
"source_id": item.source_id,
"calendar_id": item.calendar_id,
"status": item.status,
"error": item.error,
"created": item.stats.created if item.stats else 0,
"updated": item.stats.updated if item.stats else 0,
"deleted": item.stats.deleted if item.stats else 0,
"unchanged": item.stats.unchanged if item.stats else 0,
"fetched": item.stats.fetched if item.stats else 0,
}
for item in results
)
session.commit()
return [
{
"source_id": item.source_id,
"calendar_id": item.calendar_id,
"status": item.status,
"error": item.error,
"created": item.stats.created if item.stats else 0,
"updated": item.stats.updated if item.stats else 0,
"deleted": item.stats.deleted if item.stats else 0,
"unchanged": item.stats.unchanged if item.stats else 0,
"fetched": item.stats.fetched if item.stats else 0,
}
for item in results
]
return payload