from typing import Literal from ninja import Schema class AnalyticsPointSchema(Schema): label: str value: int | float class AnalyticsPointGroupSchema(Schema): top_items: list[AnalyticsPointSchema] other_count: int = 0 total_count: int = 0 class AnalyticsTrendPointSchema(Schema): date: str label: str value: int | float class AnalyticsRegistrationStatusSchema(Schema): status: str label: str value: int class AnalyticsTopEventSchema(Schema): id: int title: str slug: str attendees: int capacity: int | None = None fill_rate: float | None = None revenue: int = 0 class AnalyticsPostPopularitySchema(Schema): id: int title: str slug: str likes: int saves: int comments: int class AnalyticsPostPopularityGroupSchema(Schema): top_items: list[AnalyticsPostPopularitySchema] other_count: int = 0 total_count: int = 0 class AnalyticsTopPostSchema(AnalyticsPostPopularitySchema): score: int class AnalyticsSummarySchema(Schema): total_users: int verified_users: int total_events: int total_registrations: int total_revenue: int total_discount: int published_posts: int total_likes: int total_saves: int total_comments: int class AnalyticsUsersSchema(Schema): signup_trend: list[AnalyticsTrendPointSchema] by_major: list[AnalyticsPointSchema] by_university: list[AnalyticsPointSchema] by_year: list[AnalyticsPointSchema] class AnalyticsEventsSchema(Schema): registration_status: list[AnalyticsRegistrationStatusSchema] by_major: list[AnalyticsPointSchema] by_university: list[AnalyticsPointSchema] top_events: list[AnalyticsTopEventSchema] registration_trend: list[AnalyticsTrendPointSchema] class AnalyticsRevenueSchema(Schema): trend: list[AnalyticsTrendPointSchema] by_event: list[AnalyticsPointSchema] payment_status: list[AnalyticsRegistrationStatusSchema] total_paid: int total_discount: int total_base: int class AnalyticsBlogSchema(Schema): totals: dict[str, int] post_popularity: list[AnalyticsPostPopularitySchema] top_posts: list[AnalyticsTopPostSchema] activity_trend: list[dict[str, int | str]] by_category: list[AnalyticsPointSchema] by_tag: list[AnalyticsPointSchema] class AnalyticsAchievementsSchema(Schema): distinct_participants: int learning_hours: float published_content: int community_engagement: int class AnalyticsFiltersSchema(Schema): date_from: str | None = None date_to: str | None = None event_id: int | None = None granularity: Literal["day", "week", "month"] class AdminDashboardAnalyticsSchema(Schema): filters: AnalyticsFiltersSchema summary: AnalyticsSummarySchema users: AnalyticsUsersSchema events: AnalyticsEventsSchema revenue: AnalyticsRevenueSchema blog: AnalyticsBlogSchema achievements: AnalyticsAchievementsSchema class AnalyticsEventOptionSchema(Schema): value: str label: str description: str | None = None class AnalyticsEventOptionsSchema(Schema): count: int results: list[AnalyticsEventOptionSchema] class UserAnalyticsSummarySchema(Schema): total_users: int verified_users: int unverified_users: int profile_completion_rate: float class UserAnalyticsSchema(Schema): filters: AnalyticsFiltersSchema summary: UserAnalyticsSummarySchema signup_trend: list[AnalyticsTrendPointSchema] by_major: AnalyticsPointGroupSchema by_university: AnalyticsPointGroupSchema by_year: AnalyticsPointGroupSchema class EventAnalyticsFiltersSchema(Schema): date_from: str | None = None date_to: str | None = None event_id: int | None = None class EventAnalyticsSummarySchema(Schema): total_events: int total_registrations: int distinct_participants: int total_revenue: int total_discount: int total_base: int learning_hours: float class AnalyticsTopEventGroupSchema(Schema): top_items: list[AnalyticsTopEventSchema] other_count: int = 0 total_count: int = 0 class EventAnalyticsSchema(Schema): filters: EventAnalyticsFiltersSchema summary: EventAnalyticsSummarySchema registration_status: list[AnalyticsRegistrationStatusSchema] payment_status: list[AnalyticsRegistrationStatusSchema] attendee_by_major: AnalyticsPointGroupSchema attendee_by_university: AnalyticsPointGroupSchema registration_trend: list[AnalyticsTrendPointSchema] revenue_trend: list[AnalyticsTrendPointSchema] revenue_by_event: AnalyticsPointGroupSchema top_events: AnalyticsTopEventGroupSchema class BlogAnalyticsFiltersSchema(Schema): date_from: str | None = None date_to: str | None = None class BlogAnalyticsSummarySchema(Schema): published_posts: int total_likes: int total_saves: int total_comments: int community_engagement: int class BlogAnalyticsSchema(Schema): filters: BlogAnalyticsFiltersSchema summary: BlogAnalyticsSummarySchema activity_trend: list[dict[str, int | str]] post_popularity: AnalyticsPostPopularityGroupSchema top_posts: list[AnalyticsTopPostSchema] by_category: AnalyticsPointGroupSchema by_tag: AnalyticsPointGroupSchema