from fansifter_common.exceptions import FansifterError, ObjectNotFoundError class InvalidUrlDomainIdError(FansifterError): code = "invalid_url_domain_id" message = "Invalid url domain id" status_code = 400 class ShortenedUrlNotFoundError(ObjectNotFoundError): code = "shortened_url_not_found" message = "Shortened url not found" class InvalidShortenedUrlIdError(FansifterError): code = "invalid_shortened_url_id" message = "Invalid shortened url id" status_code = 400 class ShorteningPathIsNotAvailableError(FansifterError): code = "shortening_path_is_not_available" message = "Shortening path is not available" status_code = 400 class CampaignNotFoundError(ObjectNotFoundError): code = "campaign_not_found" message = "Campaign not found" class CampaignUniqueNameError(FansifterError): code = "campaign_unique_name" message = "Campaign with this name already exists" status_code = 400 class CampaignMustBeDraftError(FansifterError): code = "campaign_must_be_draft" message = "Campaign must be in draft status to perform this action" status_code = 400 class MalformedCampaignError(FansifterError): code = "malformed_campaign" message = "Malformed campaign" class InvalidCampaignAttachmentError(FansifterError): code = "invalid_campaign_attachment" message = "Invalid campaign attachment" status_code = 400 class CampaignAttachmentLimitExceededError(FansifterError): code = "campaign_attachment_limit_exceeded" status_code = 400 additional_properties = (("max_allowed_limit", int),) def __init__(self, max_allowed_limit: int) -> None: self.max_allowed_limit = max_allowed_limit message = ( f"The number of attachments for this text campaign exceeds the allowed limit " f"({max_allowed_limit})." ) super().__init__(message) class InvalidShortLinkTagError(FansifterError): code = "invalid_short_link_tag" message = "Invalid short link tag" status_code = 400 class PersonalizedAttributesLimitExceededError(FansifterError): code = "personalized_attributes_limit_exceeded" status_code = 400 additional_properties = (("max_allowed_limit", int),) def __init__(self, max_allowed_limit: int) -> None: self.max_allowed_limit = max_allowed_limit message = ( f"The number of personalized attributes for this text campaign exceeds the allowed limit " f"({max_allowed_limit})." ) super().__init__(message) class EmptyCampaignContentError(FansifterError): code = "empty_campaign_content" message = "Campaign content cannot be empty." status_code = 400 class CampaignSendAtMustBeFutureError(FansifterError): code = "campaign_send_at_must_be_future" message = "Campaign send at must be in the future" status_code = 400 class CampaignAlreadyQueuedError(FansifterError): code = "campaign_already_queued" message = "Campaign is already queued" status_code = 400 class CampaignMustBeScheduledError(FansifterError): code = "campaign_must_be_scheduled" message = "Campaign must be in scheduled status to perform this action" status_code = 400 class CampaignScheduleNotFoundError(ObjectNotFoundError): code = "campaign_schedule_not_found" message = "Campaign schedule not found" class CampaignAudienceRequiredError(FansifterError): code = "campaign_audience_required" message = "Campaign must have an associated audience to calculate pricing." status_code = 400 class ChannelNotAllowedInCountryError(FansifterError): code = "channel_not_allowed_in_country" status_code = 400 additional_properties = (("channel", str), ("countries", list)) def __init__(self, channel: str, countries: list[str]) -> None: self.channel = channel self.countries = countries message = ( f"Channel {channel} is not allowed in the following " f"countries: {', '.join(countries)}." ) super().__init__(message)