Gate calendar sync workers by tenant entitlement
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user