213 lines
5.3 KiB
Python
213 lines
5.3 KiB
Python
from typing import Literal
|
|
|
|
from ninja import Schema
|
|
|
|
|
|
class AnalyticsPointSchema(Schema):
|
|
label: str
|
|
value: int | float
|
|
|
|
|
|
class AnalyticsPointGroupSchema(Schema):
|
|
items: list[AnalyticsPointSchema]
|
|
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):
|
|
items: list[AnalyticsPostPopularitySchema]
|
|
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
|