def submit(self): Form.submit(self) extension = CampaignMonitorExtension.instance cmlist = self.data["list"] email = self.data["email"].encode("utf-8") name = self.data.get("name") name = name.encode("utf-8") if name else "" api = CampaignMonitorApi(extension.api_key, extension.client_id) try: user_subscribed = api.subscribers_get_is_subscribed( cmlist.list_id, email) except CampaignMonitorApi.CampaignMonitorApiException: user_subscribed = False # Obtain custom fields new_custom_fields = self.custom_fields if user_subscribed: response = api.subscribers_get_single_subscriber( cmlist.list_id, email) subscriber = response.get("Subscribers.GetSingleSubscriber") custom_fields = subscriber[0].get("CustomFields") else: custom_fields = {} custom_fields.update(**new_custom_fields) # Encode custom fields encoded_custom_fields = {} for key, value in custom_fields.items(): encoded_key = (key.encode("utf-8") if isinstance(key, unicode) else key) encoded_value = (value.encode("utf-8") if isinstance( value, unicode) else value) encoded_custom_fields[encoded_key] = encoded_value try: api.subscriber_add_and_resubscribe(cmlist.list_id, email, name, encoded_custom_fields) except CampaignMonitorApi.CampaignMonitorApiException: # TODO: Capture the error code and show the correct message self.campaign_monitor_errors = True else: if user_subscribed and cmlist.confirmation_success_page: uri = self.get_confirmation_uri(cmlist, email=email, name=name, **encoded_custom_fields) elif not user_subscribed and cmlist.pending_page: uri = self.get_pending_uri(cmlist, email=email, name=name, **encoded_custom_fields) else: uri = self.get_default_uri(cmlist, email=email, name=name, **encoded_custom_fields) raise cherrypy.HTTPRedirect(uri.encode("utf-8"))
def resubscribe(self, email): extension = CampaignMonitorExtension.instance api = CampaignMonitorApi(extension.api_key, extension.client_id) lists = api.client_get_lists() resubscribed_lists = 0 cm_context = {"email": email, "lists": []} for i, list in enumerate(lists): try: response = api.subscribers_get_single_subscriber( list.get("ListID"), email.encode("utf-8")) except CampaignMonitorApi.CampaignMonitorApiException: continue else: subscriber = response.get("Subscribers.GetSingleSubscriber") name = subscriber[0].get("Name") date = subscriber[0].get("Date") state = subscriber[0].get("State") cm_context["lists"].append({ "list_id": list.get("ListID"), "name": name, "state": state, "date": date }) if state == "Unsubscribed": date = datetime.strptime(date, '%Y-%m-%d %H:%M:%S') now = datetime.now() diff = now - date if date > now or diff.seconds < self.max_seconds: custom_fields = subscriber[0].get("CustomFields") # Encode custom fields encoded_custom_fields = {} for key, value in custom_fields.items(): encoded_key = (key.encode("utf-8") if isinstance( key, unicode) else key) encoded_value = (value.encode("utf-8") if isinstance(value, unicode) else value) encoded_custom_fields[encoded_key] = encoded_value cm_context["lists"][i].update( **encoded_custom_fields) try: # Resubscribe resubscribed_lists += 1 api.subscriber_add_and_resubscribe( list.get("ListID"), email.encode("utf-8"), name.encode("utf-8") if name else name, encoded_custom_fields) except CampaignMonitorApi.CampaignMonitorApiException: self.campaign_monitor_errors = True uri = None if resubscribed_lists == 0: uri = self.get_subscription_uri(**cm_context) else: uri = self.get_pending_uri(**cm_context) if uri is None: uri = get_current_website().home.get_uri() raise cherrypy.HTTPRedirect(uri.encode("utf-8"))