from typing import List from shared.query_builders.campaigns_query_builder import CampaignsQueryBuilder, DynamicFields from models.campaign import Campaign, CampaignSourceType from campaigns.schemas import CampaignListQueryParams class CampaignsListRepository: def get_filtered_campaigns_by_project( self, project_id: int, user_id: int, params: CampaignListQueryParams ) -> List[Campaign]: builder = CampaignsQueryBuilder(user_id) builder.only_approved(project_id) builder.limit_to(None) if params.freeText: builder.filtered_by_search(params.freeText) if params.earliestStartDate and params.latestEndDate: builder.filtered_by_date_range(params.earliestStartDate, params.latestEndDate) if params.territories: builder.filtered_by_territories(params.territories) builder.sort_expression = [Campaign.id] return builder.items_query().all() def get_filtered_digital_campaigns_by_project( self, project_id: int, user_id: int, params: CampaignListQueryParams ) -> List[Campaign]: builder = CampaignsQueryBuilder(user_id) builder.sort_pending_first = True builder.only_related_to_project(project_id) builder.limit_to(None) builder.set_dynamic_fields([DynamicFields.IS_PENDING]) if params.freeText: builder.filtered_by_search(params.freeText) if params.earliestStartDate and params.latestEndDate: builder.filtered_by_date_range(params.earliestStartDate, params.latestEndDate) if params.territories: builder.filtered_by_territories(params.territories) if params.isDigital: builder.filtered_by_sources(CampaignSourceType.all_external_sources()) return builder.items_query().all()