Exemple #1
0
        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"))
Exemple #2
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"))