from flask import g from services.permissions.exceptions import ProjectNotFound from campaigns.permissions.exceptions import CampaignManageRestricted from campaigns.repositories.campaigns_repository import CampaignsRepository from services.permission_role_service import PermissionsByRoleService from projects.repositories.projects_repository import ProjectsRepository from typing import List class CampaignPermissions: projects_repository = ProjectsRepository() campaigns_repository = CampaignsRepository() permission_role_service = PermissionsByRoleService() def can_approve_external_campaign(self, project_id: int, campaign_uuid: str): project = self.projects_repository.get_project_by_id(project_id) if not project: raise ProjectNotFound() project_campaign = self.campaigns_repository.get_project_campaign(project_id, campaign_uuid, only_pending=True) if not project_campaign: raise CampaignManageRestricted() campaign = self.campaigns_repository.get_campaign_by_uuid(campaign_uuid) if not self.permission_role_service.is_editor_or_higher(g.user_id, project) or not campaign: raise CampaignManageRestricted() def can_approve_external_campaigns(self, project_id: int, campaign_uuids: List[str]): project = self.projects_repository.get_project_by_id(project_id) if not project: raise ProjectNotFound() project_campaigns = self.campaigns_repository.get_project_campaigns( project_id, campaign_uuids, only_pending=True ) if not project_campaigns or (len(campaign_uuids) != len(project_campaigns)): raise CampaignManageRestricted() campaigns = self.campaigns_repository.get_campaigns_by_uuids(campaign_uuids) if not self.permission_role_service.is_editor_or_higher(g.user_id, project) or not campaigns: raise CampaignManageRestricted()