"""Schemas for communications-related endpoints.""" from datetime import datetime from typing import Optional from ninja import ModelSchema, Schema from apps.blog.api.schemas import AuthorSchema from apps.communications.models import Announcement, PushNotificationDevice class AnnouncementSchema(ModelSchema): author: AuthorSchema content_html: str deliver_in_app: bool deliver_sms: bool in_app_sent: bool sms_sent: bool class Config: model = Announcement model_fields = [ "id", "title", "content", "announcement_type", "priority", "is_published", "publish_date", "target_audience", "created_at", "updated_at", ] @staticmethod def resolve_content_html(obj): return obj.content_html @staticmethod def resolve_deliver_in_app(obj): return obj.send_email @staticmethod def resolve_deliver_sms(obj): return obj.send_push @staticmethod def resolve_in_app_sent(obj): return obj.email_sent @staticmethod def resolve_sms_sent(obj): return obj.push_sent class AnnouncementListSchema(Schema): id: int title: str content: str announcement_type: str priority: str author: AuthorSchema is_published: bool publish_date: Optional[datetime] = None target_audience: str deliver_in_app: bool deliver_sms: bool created_at: datetime class AnnouncementCreateSchema(Schema): title: str content: str announcement_type: str = "general" priority: str = "normal" target_audience: str = "all" is_published: bool = False publish_date: Optional[datetime] = None deliver_in_app: bool = True deliver_sms: bool = False class AnnouncementUpdateSchema(Schema): title: Optional[str] = None content: Optional[str] = None announcement_type: Optional[str] = None priority: Optional[str] = None target_audience: Optional[str] = None is_published: Optional[bool] = None publish_date: Optional[datetime] = None deliver_in_app: Optional[bool] = None deliver_sms: Optional[bool] = None class PushDeviceSchema(ModelSchema): user: AuthorSchema class Config: model = PushNotificationDevice model_fields = ["id", "device_token", "device_type", "is_active", "created_at"] class PushDeviceCreateSchema(Schema): device_token: str device_type: str = "web" class PushDeviceUpdateSchema(Schema): is_active: bool class PushNotificationSchema(Schema): title: str body: str data: Optional[dict] = None target_audience: str = "all" class MessageResponseSchema(Schema): message: str success: bool = True class AnnouncementStatsSchema(Schema): total_announcements: int published_announcements: int draft_announcements: int urgent_announcements: int in_app_sent_count: int sms_sent_count: int