def list_lists(): cm = CampaignMonitorApi(settings.CAMPAIGN_MONITOR_KEY, settings.CAMPAIGN_MONITOR_CLIENT) try: return cm.client_get_lists() except CampaignMonitorApi.CampaignMonitorApiException, e: print e.message return []
def synchronize_lists(self, restricted=False): """Synchronizes the list of Lists of the given Campaign Monitor account with the site's database. The method queries Campaing Monitor API, retrieving the list of Lists for the indicated account and comparing it with the set of already known Lists (from previous executions of this method). The local database will be updated as follows: * Lists declared by Campaing Monitor that are not present in the database will generate new instances. * Lists that exist on both ends will be updated with the data provided by the Campaing Monitor service (only non editable members will be updated, so that data entered by users in the backoffice is preserved). * Lists that were instantiated in a previous run but which have been deleted at the Campaign Monitor side will be removed from the database. @param restricted: Indicates if access control should be applied to the operations performed by the method. @type restricted: bool """ from campaign_monitor_api import CampaignMonitorApi from cocktail.controllers import context from cocktail.controllers.location import Location from woost.extensions.campaignmonitor.campaignmonitorlist import \ CampaignMonitorList if restricted: user = get_current_user() api = CampaignMonitorApi(self.api_key, self.client_id) remote_lists = set() for list_data in api.client_get_lists(): list_id = list_data["ListID"] cmlist = CampaignMonitorList.get_instance(list_id=list_id) remote_lists.add(list_id) # Check permissions if restricted and not user.has_permission( CreatePermission if cmlist is None else ModifyPermission, target=(cmlist or CampaignMonitorList)): continue # Create new lists if cmlist is None: cmlist = CampaignMonitorList() cmlist.insert() cmlist.list_id = list_id self.lists.append(cmlist) # Modify new or updated lists with remote data cmlist.title = list_data.get("Name") list_detail_data = api.list_get_detail(list_id) # Modify remote lists with page urls def absolute_uri(publishable, *args, **kwargs): location = Location.get_current_host() location.path_info = context["cms"].uri( publishable, *args, **kwargs) return str(location) if cmlist.unsubscribe_page: unsubscribe_page = "%s?user=[email]" % absolute_uri( cmlist.unsubscribe_page) else: unsubscribe_page = list_detail_data.get("UnsubscribePage") if cmlist.confirmation_success_page: confirmation_success_page = absolute_uri( cmlist.confirmation_success_page) else: confirmation_success_page = list_detail_data.get( "ConfirmationSuccessPage") api.list_update(list_id, list_detail_data.get("Title"), unsubscribe_page, list_detail_data.get("ConfirmOptIn"), confirmation_success_page) # Delete lists that have been deleted from the user account missing_lists = CampaignMonitorList.select( CampaignMonitorList.list_id.not_one_of(remote_lists), ) if restricted: missing_lists.add_filter( PermissionExpression(user, DeletePermission)) missing_lists.delete_items()
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"))