From fbe6a8950fb9cd6051ab71428071b513a6974543 Mon Sep 17 00:00:00 2001 From: Diana Rita Nanyanzi <31903212+d-rita@users.noreply.github.com> Date: Thu, 19 Nov 2020 07:52:03 +0300 Subject: [PATCH] Refactor Campaign Service methods - Add separate method to get campaign organisations - Move similar methods from Campaign model to Campaign service - Add new method to return CampaignListDTO - Remove organisation detail from returned campaign --- backend/api/organisations/campaigns.py | 4 +- backend/models/postgis/campaign.py | 73 +++++------------------- backend/services/campaign_service.py | 57 +++++++++--------- backend/services/organisation_service.py | 32 +++++++++++ 4 files changed, 78 insertions(+), 88 deletions(-) diff --git a/backend/api/organisations/campaigns.py b/backend/api/organisations/campaigns.py index 79e124f790..ac5cc60698 100644 --- a/backend/api/organisations/campaigns.py +++ b/backend/api/organisations/campaigns.py @@ -52,7 +52,9 @@ def post(self, organisation_id, campaign_id): if OrganisationService.can_user_manage_organisation( organisation_id, token_auth.current_user() ): - if Campaign.campaign_organisation_exists(campaign_id, organisation_id): + if CampaignService.campaign_organisation_exists( + campaign_id, organisation_id + ): message = ( "Campaign {} is already assigned to organisation {}.".format( campaign_id, organisation_id diff --git a/backend/models/postgis/campaign.py b/backend/models/postgis/campaign.py index dbed7996e8..485b821571 100644 --- a/backend/models/postgis/campaign.py +++ b/backend/models/postgis/campaign.py @@ -52,66 +52,6 @@ def update(self, dto: CampaignDTO): self.description = dto.description if dto.description else self.description db.session.commit() - @staticmethod - def get_all_campaigns() -> CampaignListDTO: - query = Campaign.query.order_by(Campaign.name).distinct() - campaign_list_dto = CampaignListDTO() - for campaign in query: - campaign_dto = CampaignDTO() - campaign_dto.id = campaign.id - campaign_dto.name = campaign.name - - campaign_list_dto.campaigns.append(campaign_dto) - - return campaign_list_dto - - @staticmethod - def get_project_campaigns_as_dto(project_id: int) -> CampaignListDTO: - - query = ( - Campaign.query.join(campaign_projects) - .filter(campaign_projects.c.project_id == project_id) - .all() - ) - campaign_list_dto = CampaignListDTO() - for campaign in query: - campaign_dto = CampaignDTO() - campaign_dto.id = campaign.id - campaign_dto.name = campaign.name - - campaign_list_dto.campaigns.append(campaign_dto) - - return campaign_list_dto - - @staticmethod - def campaign_organisation_exists(campaign_id: int, org_id: int): - return ( - Campaign.query.join(campaign_organisations) - .filter( - campaign_organisations.c.organisation_id == org_id, - campaign_organisations.c.campaign_id == campaign_id, - ) - .one_or_none() - ) - - @staticmethod - def get_organisation_campaigns_as_dto(org_id: int) -> CampaignListDTO: - - query = ( - Campaign.query.join(campaign_organisations) - .filter(campaign_organisations.c.organisation_id == org_id) - .all() - ) - campaign_list_dto = CampaignListDTO() - for campaign in query: - campaign_dto = CampaignDTO() - campaign_dto.id = campaign.id - campaign_dto.name = campaign.name - - campaign_list_dto.campaigns.append(campaign_dto) - - return campaign_list_dto - @classmethod def from_dto(cls, dto: CampaignDTO): """ Creates new message from DTO """ @@ -133,3 +73,16 @@ def as_dto(self) -> CampaignDTO: campaign_dto.description = self.description return campaign_dto + + @staticmethod + def campaign_list_as_dto(campaigns: list) -> CampaignListDTO: + """ Converts a collection of campaigns into DTO""" + campaign_list_dto = CampaignListDTO() + for campaign in campaigns: + campaign_dto = CampaignDTO() + campaign_dto.id = campaign.id + campaign_dto.name = campaign.name + + campaign_list_dto.campaigns.append(campaign_dto) + + return campaign_list_dto diff --git a/backend/services/campaign_service.py b/backend/services/campaign_service.py index 6d7ca7419f..3fdd0ee565 100644 --- a/backend/services/campaign_service.py +++ b/backend/services/campaign_service.py @@ -41,42 +41,26 @@ def delete_campaign(campaign_id: int): def get_campaign_as_dto(campaign_id: int, user_id: int): """Gets the specified campaign""" campaign = CampaignService.get_campaign(campaign_id) + campaign_dto = CampaignDTO() campaign_dto.id = campaign.id campaign_dto.url = campaign.url campaign_dto.name = campaign.name campaign_dto.logo = campaign.logo campaign_dto.description = campaign.description - campaign_dto.organisations = [] - - orgs = ( - Organisation.query.join(campaign_organisations) - .filter(campaign_organisations.c.campaign_id == campaign.id) - .all() - ) - - for org in orgs: - if user_id != 0: - logged_in = OrganisationService.can_user_manage_organisation( - org.id, user_id - ) - else: - logged_in = False - - organisation_dto = OrganisationDTO() - - organisation_dto.organisation_id = org.id - organisation_dto.name = org.name - organisation_dto.logo = org.logo - organisation_dto.url = org.url - organisation_dto.is_manager = logged_in return campaign_dto @staticmethod def get_project_campaigns_as_dto(project_id: int) -> CampaignListDTO: """Gets all the campaigns for a specified project""" - return Campaign.get_project_campaigns_as_dto(project_id) + query = ( + Campaign.query.join(campaign_projects) + .filter(campaign_projects.c.project_id == project_id) + .all() + ) + + return Campaign.campaign_list_as_dto(query) @staticmethod def delete_project_campaign(project_id: int, campaign_id: int): @@ -90,11 +74,14 @@ def delete_project_campaign(project_id: int, campaign_id: int): @staticmethod def get_all_campaigns() -> CampaignListDTO: - """List all campaigns""" - return Campaign.get_all_campaigns() + """ Returns a list of all campaigns """ + query = Campaign.query.order_by(Campaign.name).distinct() + + return Campaign.campaign_list_as_dto(query) @staticmethod def create_campaign(campaign_dto: NewCampaignDTO): + """ Creates a new campaign """ campaign = Campaign.from_dto(campaign_dto) try: campaign.create() @@ -136,7 +123,23 @@ def create_campaign_organisation(organisation_id: int, campaign_id: int): @staticmethod def get_organisation_campaigns_as_dto(organisation_id: int) -> CampaignListDTO: """ Gets all the campaigns for a specified project """ - return Campaign.get_organisation_campaigns_as_dto(organisation_id) + query = ( + Campaign.query.join(campaign_organisations) + .filter(campaign_organisations.c.organisation_id == organisation_id) + .all() + ) + return Campaign.campaign_list_as_dto(query) + + @staticmethod + def campaign_organisation_exists(campaign_id: int, org_id: int): + return ( + Campaign.query.join(campaign_organisations) + .filter( + campaign_organisations.c.organisation_id == org_id, + campaign_organisations.c.campaign_id == campaign_id, + ) + .one_or_none() + ) @staticmethod def delete_organisation_campaign(organisation_id: int, campaign_id: int): diff --git a/backend/services/organisation_service.py b/backend/services/organisation_service.py index 8f69ec654b..c554a7eb87 100644 --- a/backend/services/organisation_service.py +++ b/backend/services/organisation_service.py @@ -8,6 +8,7 @@ ListOrganisationsDTO, UpdateOrganisationDTO, ) +from backend.models.postgis.campaign import campaign_organisations from backend.models.postgis.organisation import Organisation from backend.models.postgis.project import Project, ProjectInfo from backend.models.postgis.utils import NotFound @@ -207,3 +208,34 @@ def is_user_an_org_manager(organisation_id: int, user_id: int): user = UserService.get_user_by_id(user_id) return user in org.managers + + @staticmethod + def get_campaign_organisations_as_dto(campaign_id: int, user_id: int): + """ + Returns organisations under a particular campaign + """ + organisation_list_dto = ListOrganisationsDTO() + orgs = ( + Organisation.query.join(campaign_organisations) + .filter(campaign_organisations.c.campaign_id == campaign_id) + .all() + ) + + for org in orgs: + if user_id != 0: + logged_in = OrganisationService.can_user_manage_organisation( + org.id, user_id + ) + else: + logged_in = False + + organisation_dto = OrganisationDTO() + organisation_dto.organisation_id = org.id + organisation_dto.name = org.name + organisation_dto.logo = org.logo + organisation_dto.url = org.url + organisation_dto.is_manager = logged_in + + organisation_list_dto.organisations.append(organisation_dto) + + return organisation_list_dto