diff --git a/src/api/handlers/campaign.py b/src/api/handlers/campaign.py index fb5ea35b3..a1f15a85d 100644 --- a/src/api/handlers/campaign.py +++ b/src/api/handlers/campaign.py @@ -651,8 +651,8 @@ def add_campaign_technology_event(self, request): context: Context = request.context args: dict = context.args - self.validator.expect("campaign_technology_id", str, is_required=False) - self.validator.expect("event_ids", list, is_required=False) + self.validator.expect("campaign_technology_ids", "str_list", is_required=True) + self.validator.expect("event_ids", list, is_required=True) args, err = self.validator.verify(args) if err: return err diff --git a/src/api/store/campaign.py b/src/api/store/campaign.py index 6c5890c9a..e4d16d72b 100644 --- a/src/api/store/campaign.py +++ b/src/api/store/campaign.py @@ -804,40 +804,46 @@ def list_campaign_partners(self, context: Context, args): except Exception as e: capture_message(str(e), level="error") return None, CustomMassenergizeError(e) - + def add_campaign_technology_event(self, context: Context, args): try: - campaign_technology_id = args.pop("campaign_technology_id", None) + campaign_technology_ids = args.pop("campaign_technology_ids", None) event_ids = args.pop("event_ids", None) - - created_list = [] - - if not campaign_technology_id: - return None, CustomMassenergizeError("campaign_technology_id is required!") - campaign_tech = CampaignTechnology.objects.filter(id=campaign_technology_id).first() - if not campaign_tech: - return None, CustomMassenergizeError("campaignTechnology with id not found!") - + + data_to_return = [] + + if not campaign_technology_ids: + return None, CustomMassenergizeError("campaign_technology_ids is required!") + if not event_ids: return None, CustomMassenergizeError("event_ids is required!") + campaign_techs = CampaignTechnology.objects.filter(id__in=campaign_technology_ids) + + if not campaign_techs: + return None, CustomMassenergizeError("No campaignTechnology found!") + if not context.user_is_super_admin: - if context.user_email != campaign_tech.campaign.owner.email: - campaign_manager = CampaignManager.objects.filter(user__id=context.user_id,campaign__id=campaign_tech.campaign.id, is_deleted=False) + campaign = campaign_techs.first().campaign + if context.user_email != campaign.owner.email: + campaign_manager = CampaignManager.objects.filter(user__id=context.user_id,campaign__id=campaign.id, is_deleted=False) if not campaign_manager: - return None, CustomMassenergizeError("Not authorized to add event") - - for event_id in event_ids: - event = Event.objects.filter(id=event_id).first() - if event: - campaign_event, _ = CampaignTechnologyEvent.objects.get_or_create(campaign_technology=campaign_tech, event=event, is_deleted=False) - created_list.append(campaign_event.simple_json()) - - return created_list, None + return None, CustomMassenergizeError("Unauthorized to add event") + + all_events = Event.objects.filter(id__in=event_ids) + + combinations = [(campaign_tech, event) for campaign_tech in campaign_techs for event in all_events] + + for campaign_tech, event in combinations: + campaign_event, _ = CampaignTechnologyEvent.objects.get_or_create(campaign_technology=campaign_tech, event=event, is_deleted=False) + data_to_return.append(campaign_event.simple_json()) + + return data_to_return, None + except Exception as e: capture_message(str(e), level="error") return None, CustomMassenergizeError(e) - + def generate_campaign_link(self, context: Context, args): try: campaign_id = args.pop("campaign_id", None) @@ -1388,17 +1394,20 @@ def list_campaign_communities_events(self, context: Context, args): return None, CustomMassenergizeError("campaign_id is required!") communities = CampaignCommunity.objects.filter(campaign__id=campaign_id, is_deleted=False) events = [] - for community in communities: - events.extend(Event.objects.filter(community__id=community.community.id, is_deleted=False, is_published=True)) + community_ids = communities.values_list('community__id', flat=True) + + events.extend(Event.objects.filter(community__id__in=community_ids, is_deleted=False, is_published=True, end_date_and_time__gte=datetime.now())) + to_return = [] for event in events: + community = communities.filter(community__id=event.community.id).first() obj = { "id": event.id, "name": event.name, "community":{ "id": event.community.id, "name": event.community.name, - "alias": communities.filter(campaign__id=campaign_id, community__id=event.community.id).first().alias + "alias": community.alias if community else None } } to_return.append(obj) diff --git a/src/api/tests/test_campaigns.py b/src/api/tests/test_campaigns.py index 9ca362f91..a93497a9d 100644 --- a/src/api/tests/test_campaigns.py +++ b/src/api/tests/test_campaigns.py @@ -618,7 +618,7 @@ def test_delete_campaign_technology_comment(self): self.assertEqual(response['success'], True) def test_add_campaign_technology_event(self): - payload = {"campaign_technology_id": self.CAMPAIGN_TECHNOLOGY.id, "event_ids": [self.event_1.id],} + payload = {"campaign_technology_ids": [self.CAMPAIGN_TECHNOLOGY.id], "event_ids": [self.event_1.id],} Console.header("Testing the campaigns.technology.events.add endpoint") signinAs(self.client, self.SADMIN) response = self.make_request("campaigns.technology.events.add", payload)