示例#1
0
    def api(self, **kwargs):
        api_key = self.get_api_key()

        if api_key:
            api = greatape.MailChimp(api_key)

            def api(api=api, **kwargs):
                logger.info("mailchimp(%s)" %
                            (", ".join("%s=%r" % item
                                       for item in kwargs.items())))

                try:
                    return api(**kwargs)
                except greatape.MailChimpError, exc:
                    # http://apidocs.mailchimp.com/api/1.3/exceptions.field.php
                    if exc.code <= 0:
                        logger.critical(exc.msg)
                    elif exc.code < 120:
                        logger.warn(exc.msg)
                    elif exc.code < 200:
                        logger.info(exc.msg)
                except TypeError, exc:
                    logger.warn(exc.msg)

                return ()
 def api(api=api, **kwargs):
     try:
         return api(**kwargs)
     except greatape.MailChimpError, exc:
         # http://apidocs.mailchimp.com/api/1.3/exceptions.field.php
         if exc.code <= 0:
             logger.critical(exc)
         elif exc.code < 120:
             logger.warn(exc)
         elif exc.code < 200:
             logger.info(exc)
示例#3
0
def check_api_key(api_key):
    if not api_key:
        return True

    api = greatape.MailChimp(api_key)

    try:
        api(method="ping")
    except greatape.MailChimpError:
        pass
    except ValueError, exc:
        logger.warn(exc)
def check_api_key(api_key):
    if not api_key:
        return True

    api = greatape.MailChimp(api_key)

    try:
        api(method="ping")
    except greatape.MailChimpError:
        pass
    except ValueError, exc:
        logger.warn(exc)
示例#5
0
            def api(api=api, **kwargs):
                logger.info("mailchimp(%s)" % (", ".join(
                    "%s=%r" % item for item in kwargs.items())))

                try:
                    return api(**kwargs)
                except greatape.MailChimpError, exc:
                    # http://apidocs.mailchimp.com/api/1.3/exceptions.field.php
                    if exc.code <= 0:
                        logger.critical(exc.msg)
                    elif exc.code < 120:
                        logger.warn(exc.msg)
                    elif exc.code < 200:
                        logger.info(exc.msg)
示例#6
0
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        settings = IFeedSettings(self.context)
        api_key = settings.mailchimp_api_key

        try:
            list_id = self.context.mailinglist

            email = data['email']
            name = data['name']
            interests = data['interests']

            if api_key:
                api = greatape.MailChimp(api_key, debug=False)

                # Negotiate language
                language = negotiate(self.request)

                # Split full name into first (given) and last name.
                fname, lname = queryUtility(
                    INameSplitter, name=language, default=GenericNameSplitter
                    ).split_name(name)

                try:
                    result = api(
                        method="listSubscribe", id=list_id,
                        email_address=email,
                        update_existing=True,
                        replace_interests=False,
                        merge_vars={
                            'FNAME': fname.encode('utf-8'),
                            'LNAME': lname.encode('utf-8'),
                            'GROUPINGS': [
                                dict(
                                    id=grouping_id,
                                    groups=",".join(
                                        group.\
                                        encode('utf-8').\
                                        replace(',', '\\,')
                                        for group in group_names
                                        ),
                                    )
                                for (grouping_id, group_names) in
                                create_groupings(interests).items()
                                ]
                            },
                        )
                except greatape.MailChimpError, exc:
                    logger.warn(exc.msg)
                else:
                    if result:
                        return IStatusMessage(self.request).addStatusMessage(
                            _(u"Thank you for signing up. We'll send you a "
                              u"confirmation message by e-mail shortly."),
                            "info"
                            )

            IStatusMessage(self.request).addStatusMessage(
                _(u"An error occurred while processing your "
                  u"request to sign up for ${email}. "
                  u"Please try again!", mapping={'email': email}),
                "error")
示例#7
0
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        settings = IFeedSettings(self.context)
        api_key = settings.mailchimp_api_key
        next_url = self.nextURL()

        try:
            list_id = (data.pop('list_id', None)
                       or self.getContent().mailinglist)
            try:
                name = data.pop('name')
            except KeyError:
                name = ''
            email = data.pop('email')
            interests = data.pop('interests')

            content = self.getContent()

            preselected = getattr(content, 'preselected_interest_groups', None)
            if preselected:
                if not interests:
                    interests = preselected
                else:
                    interests = interests + preselected

            if api_key:
                api = greatape.MailChimp(api_key, debug=False)

                # Negotiate language
                language = negotiate(self.request)

                # Split full name into first (given) and last name.
                try:
                    fname, lname = queryUtility(
                        INameSplitter,
                        name=language,
                        default=GenericNameSplitter).split_name(name)
                except AttributeError:
                    fname, lname = u'', u''

                # Log subscription attempt.
                logger.info(("listSubscribe(%r, %r, %r, %r)" %
                             (list_id, email, fname, lname)).encode('utf-8'))

                merge_vars = {
                    'FNAME':
                    fname.encode('utf-8'),
                    'LNAME':
                    lname.encode('utf-8'),
                    'GROUPINGS': [
                        dict(
                            id=grouping_id,
                            groups=",".join(
                                group.encode('utf-8').replace(',', '\\,')
                                for group in group_names),
                        ) for (grouping_id, group_names
                               ) in create_groupings(interests).items()
                    ]
                }

                for name, value in data.items():
                    if value is not None:
                        merge_vars[name.upper()] = value.encode('utf-8')

                try:
                    result = api(method="listSubscribe",
                                 id=list_id,
                                 email_address=email,
                                 update_existing=True,
                                 replace_interests=False,
                                 merge_vars=merge_vars)
                except greatape.MailChimpError, exc:
                    logger.warn(exc.msg)

                    # ... is not a valid interest grouping id for the list
                    if exc.code == 270:
                        return IStatusMessage(self.request).addStatusMessage(
                            _(u"There was a problem signing you up for "
                              u"the selected interest groups. This could "
                              u"mean that the subscription service is "
                              u"configured incorrectly. Please contact "
                              u"the webmaster."),
                            "error",
                        )
                else:
                    if result:
                        next_url += ('?' in next_url and '&'
                                     or '?') + 'success=yes'

                        return IStatusMessage(self.request).addStatusMessage(
                            _(u"Thank you for signing up. We'll send you a "
                              u"confirmation message by e-mail shortly."),
                            "info")

            IStatusMessage(self.request).addStatusMessage(
                _(
                    u"An error occurred while processing your "
                    u"request to sign up for ${email}. "
                    u"Please try again!",
                    mapping={'email': email}), "error")
示例#8
0
    def createCampaign(self,
                       api_key,
                       method,
                       subject,
                       create_draft,
                       schedule,
                       rendered,
                       next_url,
                       segment_opts={}):
        try:
            if not rendered.strip():
                IStatusMessage(self.request).addStatusMessage(
                    _(u"No content found; newsletter not created."), "info")

                return

            if api_key:
                api = greatape.MailChimp(api_key, debug=False)

                try:
                    for entry in api(method="lists"):
                        if entry['id'] == self.context.mailinglist:
                            break
                    else:
                        IStatusMessage(self.request).addStatusMessage(
                            _(u"Mailinglist not found."), "error")

                        return

                    if self.context.template:
                        section = 'html_%s' % self.context.section
                    else:
                        section = 'html'

                    args = {}

                    args['method'] = method
                    args['type'] = 'regular'
                    args['content'] = {section: rendered}
                    if segment_opts:
                        args['segment_opts'] = segment_opts

                    options = {}
                    options['subject'] = subject.encode("utf-8") or \
                        entry['default_subject']
                    options['from_email'] = entry['default_from_email']
                    options['from_name'] = \
                        entry['default_from_name'].encode("utf-8")
                    options['to_email'] = 0
                    options['list_id'] = self.context.mailinglist
                    options['template_id'] = self.context.template or None
                    options['generate_text'] = True

                    args['options'] = options

                    result = api(**args)

                    if result:
                        if not create_draft:
                            if schedule:
                                # Apply local time zone to get GMT
                                schedule = schedule + datetime.timedelta(
                                    seconds=time.timezone)

                                # Format time
                                schedule_time = time.strftime(
                                    "%Y-%m-%d %H:%M:%S",
                                    schedule.utctimetuple())

                                schedule = api(
                                    method="campaignSchedule",
                                    cid=result,
                                    schedule_time=schedule_time,
                                )

                                if not schedule:
                                    IStatusMessage(
                                        self.request
                                    ).addStatusMessage(
                                        _(u"Campaign created, but not scheduled."
                                          ), "error")

                                    return
                            else:
                                api(method="campaignSendNow", cid=result)

                        next_url = self.context.portal_url() + \
                            "/@@chimpfeed-content?cid=%s" % result

                except greatape.MailChimpError, exc:
                    IStatusMessage(self.request).addStatusMessage(
                        _(u"Unable to process request: ${message}",
                          mapping={'message': exc.msg}), "error")
                    logger.warn(exc.msg)
                    logger.warn(pprint.pformat(args))
                    return

                return bool(result)
        finally:
            self.request.response.redirect(next_url)
示例#9
0
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        settings = IFeedSettings(self.context)
        api_key = settings.mailchimp_api_key
        next_url = self.nextURL()

        try:
            list_id = (
                data.pop('list_id', None) or
                self.getContent().mailinglist
            )
            try:
                name = data.pop('name')
            except KeyError:
                name = ''
            email = data.pop('email')
            interests = data.pop('interests')

            content = self.getContent()

            preselected = getattr(content, 'preselected_interest_groups', None)
            if preselected:
                if not interests:
                    interests = preselected
                else:
                    interests = interests + preselected

            if api_key:
                api = greatape.MailChimp(api_key, debug=False)

                # Negotiate language
                language = negotiate(self.request)

                # Split full name into first (given) and last name.
                try:
                    fname, lname = queryUtility(
                        INameSplitter, name=language,
                        default=GenericNameSplitter
                        ).split_name(name)
                except AttributeError:
                    fname, lname = u'', u''

                # Log subscription attempt.
                logger.info(("listSubscribe(%r, %r, %r, %r)" % (
                    list_id, email, fname, lname)).encode('utf-8'))

                merge_vars = {
                    'FNAME': fname.encode('utf-8'),
                    'LNAME': lname.encode('utf-8'),
                    'GROUPINGS': [
                        dict(
                            id=grouping_id,
                            groups=",".join(
                                group.
                                encode('utf-8').
                                replace(',', '\\,')
                                for group in group_names
                            ),
                        )
                        for (grouping_id, group_names) in
                        create_groupings(interests).items()
                    ]
                }

                for name, value in data.items():
                    if value is not None:
                        merge_vars[name.upper()] = value.encode('utf-8')

                try:
                    result = api(
                        method="listSubscribe", id=list_id,
                        email_address=email,
                        update_existing=True,
                        replace_interests=False,
                        merge_vars=merge_vars
                    )
                except greatape.MailChimpError, exc:
                    logger.warn(exc.msg)

                    # ... is not a valid interest grouping id for the list
                    if exc.code == 270:
                        return IStatusMessage(self.request).addStatusMessage(
                            _(u"There was a problem signing you up for "
                              u"the selected interest groups. This could "
                              u"mean that the subscription service is "
                              u"configured incorrectly. Please contact "
                              u"the webmaster."),
                            "error",
                        )
                else:
                    if result:
                        next_url += ('?' in next_url
                                     and '&' or '?') + 'success=yes'

                        return IStatusMessage(self.request).addStatusMessage(
                            _(u"Thank you for signing up. We'll send you a "
                              u"confirmation message by e-mail shortly."),
                            "info"
                        )

            IStatusMessage(self.request).addStatusMessage(
                _(u"An error occurred while processing your "
                  u"request to sign up for ${email}. "
                  u"Please try again!", mapping={'email': email}),
                "error")
示例#10
0
    def createCampaign(self, api_key, method, subject,
                       create_draft, schedule, rendered, next_url,
                       segment_opts={}):
        try:
            if not rendered.strip():
                IStatusMessage(self.request).addStatusMessage(
                    _(u"No content found; newsletter not created."),
                    "info"
                )

                return

            if api_key:
                api = greatape.MailChimp(api_key, debug=False)

                try:
                    for entry in api(method="lists"):
                        if entry['id'] == self.context.mailinglist:
                            break
                    else:
                        IStatusMessage(self.request).addStatusMessage(
                            _(u"Mailinglist not found."),
                            "error"
                        )

                        return

                    if self.context.template:
                        section = 'html_%s' % self.context.section
                    else:
                        section = 'html'

                    args = {}

                    args['method'] = method
                    args['type'] = 'regular'
                    args['content'] = {section: rendered}
                    if segment_opts:
                        args['segment_opts'] = segment_opts

                    options = {}
                    options['subject'] = subject.encode("utf-8") or \
                        entry['default_subject']
                    options['from_email'] = entry['default_from_email']
                    options['from_name'] = \
                        entry['default_from_name'].encode("utf-8")
                    options['to_email'] = 0
                    options['list_id'] = self.context.mailinglist
                    options['template_id'] = self.context.template or None
                    options['generate_text'] = True

                    args['options'] = options

                    result = api(**args)

                    if result:
                        if not create_draft:
                            if schedule:
                                # Apply local time zone to get GMT
                                schedule = schedule + datetime.timedelta(
                                    seconds=time.timezone
                                )

                                # Format time
                                schedule_time = time.strftime(
                                    "%Y-%m-%d %H:%M:%S", schedule.utctimetuple()
                                )

                                schedule = api(
                                    method="campaignSchedule",
                                    cid=result,
                                    schedule_time=schedule_time,
                                )

                                if not schedule:
                                    IStatusMessage(self.request).addStatusMessage(
                                        _(u"Campaign created, but not scheduled."),
                                        "error"
                                    )

                                    return
                            else:
                                api(method="campaignSendNow",
                                    cid=result)

                        next_url = self.context.portal_url() + \
                            "/@@chimpfeed-content?cid=%s" % result

                except greatape.MailChimpError, exc:
                    IStatusMessage(self.request).addStatusMessage(
                        _(u"Unable to process request: ${message}",
                          mapping={'message': exc.msg}), "error"
                    )
                    logger.warn(exc.msg)
                    logger.warn(pprint.pformat(args))
                    return

                return bool(result)
        finally:
            self.request.response.redirect(next_url)