generated from westfarn/web_django_template
59 lines
1.6 KiB
Python
59 lines
1.6 KiB
Python
"""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
|