backend/models/dtos/stats_dto.py (122 lines of code) (raw):

from schematics import Model from schematics.types import StringType, IntType, FloatType, BooleanType, DateType from schematics.types.compound import ListType, ModelType from backend.models.dtos.mapping_dto import TaskHistoryDTO, TaskStatusDTO class UserContribution(Model): """ User contribution for a project """ username = StringType() mapping_level = StringType(serialized_name="mappingLevel") picture_url = StringType(serialized_name="pictureUrl") mapped = IntType() validated = IntType() total = IntType() mapped_tasks = ListType(IntType, serialized_name="mappedTasks") validated_tasks = ListType(IntType, serialized_name="validatedTasks") name = StringType() date_registered = DateType(serialized_name="dateRegistered") class ProjectContributionsDTO(Model): """ DTO for all user contributions on a project """ def __init__(self): super().__init__() self.user_contributions = [] user_contributions = ListType( ModelType(UserContribution), serialized_name="userContributions" ) class Pagination(Model): """ Properties for paginating results """ def __init__(self, paginated_result): """ Instantiate from a Flask-SQLAlchemy paginated result""" super().__init__() self.has_next = paginated_result.has_next self.has_prev = paginated_result.has_prev self.next_num = paginated_result.next_num self.page = paginated_result.page self.pages = paginated_result.pages self.prev_num = paginated_result.prev_num self.per_page = paginated_result.per_page self.total = paginated_result.total has_next = BooleanType(serialized_name="hasNext") has_prev = BooleanType(serialized_name="hasPrev") next_num = IntType(serialized_name="nextNum") page = IntType() pages = IntType() prev_num = IntType(serialized_name="prevNum") per_page = IntType(serialized_name="perPage") total = IntType() class ProjectActivityDTO(Model): """ DTO to hold all project activity """ def __init__(self): super().__init__() self.activity = [] pagination = ModelType(Pagination) activity = ListType(ModelType(TaskHistoryDTO)) class ProjectLastActivityDTO(Model): """ DTO to hold latest status from project activity """ def __init__(self): super().__init__() self.activity = [] activity = ListType(ModelType(TaskStatusDTO)) class OrganizationProjectsStatsDTO(Model): draft = IntType() published = IntType() archived = IntType() class OrganizationTasksStatsDTO(Model): ready = IntType() locked_for_mapping = IntType(serialized_name="lockedForMapping") locked_for_validation = IntType(serialized_name="lockedForValidation") mapped = IntType() validated = IntType() invalidated = IntType() badimagery = IntType(serialized_name="badImagery") class OrganizationStatsDTO(Model): projects = ModelType(OrganizationProjectsStatsDTO) active_tasks = ModelType(OrganizationTasksStatsDTO, serialized_name="activeTasks") class OrganizationListStatsDTO(Model): def __init__(self, row): super().__init__() self.organisation = row[0] self.projects_created = row[1] organisation = StringType() projects_created = IntType(serialized_name="projectsCreated") class CampaignStatsDTO(Model): def __init__(self, row): super().__init__() self.campaign = row[0] self.projects_created = row[1] campaign = StringType() projects_created = IntType(serialized_name="projectsCreated") class HomePageStatsDTO(Model): """ DTO for stats we want to display on the homepage """ def __init__(self): super().__init__() self.organisations = [] self.campaigns = [] mappers_online = IntType(serialized_name="mappersOnline") total_area = IntType(serialized_name="totalArea") tasks_mapped = IntType(serialized_name="tasksMapped") tasks_validated = IntType(serialized_name="tasksValidated") total_mappers = IntType(serialized_name="totalMappers") total_validators = IntType(serialized_name="totalValidators") total_projects = IntType(serialized_name="totalProjects") total_mapped_area = FloatType(serialized_name="totalMappedArea") total_validated_area = FloatType(serialized_name="totalValidatedArea") total_organisations = IntType(serialized_name="totalOrganisations") total_campaigns = IntType(serialized_name="totalCampaigns") # avg_completion_time = IntType(serialized_name='averageCompletionTime') organisations = ListType(ModelType(OrganizationListStatsDTO)) campaigns = ListType(ModelType(CampaignStatsDTO)) class TaskStats(Model): """ DTO for tasks stats for a single day """ date = DateType(required=True) mapped = IntType(serialized_name="mapped") validated = IntType(serialized_name="validated") bad_imagery = IntType(serialized_name="badImagery") class GenderStatsDTO(Model): """ DTO for genre stats of users.""" male = IntType() female = IntType() prefer_not = IntType(serialized_name="preferNotIdentify") self_describe = IntType(serialized_name="selfDescribe") class UserStatsDTO(Model): """ DTO for user stats.""" total = IntType() beginner = IntType() intermediate = IntType() advanced = IntType() contributed = IntType() email_verified = IntType(serialized_name="emailVerified") genders = ModelType(GenderStatsDTO) class TaskStatsDTO(Model): """ Contains all tasks stats broken down by day""" def __init__(self): super().__init__() self.stats = [] stats = ListType(ModelType(TaskStats), serialized_name="taskStats")