Initial commit

This commit is contained in:
ai_ml_operations
2026-08-27 04:17:34 -07:00
commit 3a14bfb996
297 changed files with 32710 additions and 0 deletions
+58
View File
@@ -0,0 +1,58 @@
"""Register portal nav, dashboard widgets, and due-work dispatch."""
from django.utils import timezone
from core.registry import (
register_dashboard_collector,
register_dispatcher,
register_feature,
register_portal_nav,
)
def register() -> None:
register_feature("directmail")
register_portal_nav(
section="directmail",
label="Direct mail",
url_name="directmail:campaign_list",
group="Outreach",
order=30,
)
register_portal_nav(
section="postcard",
label="Postcard design",
url_name="directmail:postcard_designer",
group="Outreach",
order=31,
)
register_dashboard_collector(_dashboard)
register_dispatcher(_dispatch_due)
def _dashboard(request) -> dict:
from directmail.models import Campaign
upcoming = list(
Campaign.objects.exclude(
status__in=[Campaign.Status.COMPLETED, Campaign.Status.CANCELLED]
).order_by("scheduled_for", "-created_at")[:5]
)
return {"upcoming_directmail": upcoming}
def _dispatch_due() -> int:
from directmail.models import Message
from directmail.tasks import send_campaign_message
now = timezone.now()
enqueued = 0
for message in Message.objects.filter(
status=Message.Status.SCHEDULED,
scheduled_for__lte=now,
).iterator():
message.status = Message.Status.QUEUED
message.save(update_fields=["status", "updated_at"])
send_campaign_message.enqueue(message_id=str(message.pk))
enqueued += 1
return enqueued