Esempio n. 1
0
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 []
Esempio n. 2
0
    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()
Esempio n. 3
0
    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"))