Beispiel #1
0
    def __call__(self):
        """ Process the relation for campaign items. """
        redirect_url = self.context.absolute_url()
        items = self.request.form.get('items',[])
        if not items:
            IStatusMessage(self.request).add(_(u'We have problems processing '
                              'your request. Not items found.'), type='error')
            return self.request.RESPONSE.redirect(redirect_url)

        my_uid = IUUID(self.context)

        for item in items:
            campaign = uuidToObject(item['uid'])
            existing_relations = campaign.getRawCampaign_items()
            if item.get('enabled',False):
                if my_uid not in existing_relations:
                    IStatusMessage(self.request).add(_(u'Item added to campaign.'))
                    existing_relations.append(my_uid)
            else:
                if my_uid in existing_relations:
                    IStatusMessage(self.request).add(_(u'Item removed from campaign.'))
                    existing_relations.remove(my_uid)
            campaign.setCampaign_items(existing_relations)

        return self.request.RESPONSE.redirect(redirect_url)
Beispiel #2
0
    def generateCampaign(self):
        """By calling mailchimp API creates a campaign and redirects
        user to the proper URL."""
        mailchimp = getUtility(IMonkeyLocator)
        form = self.request.form
        subject = form.get('campaign_title')
        list_id = form.get('list')
        template_id = form.get('template')
        description = form.get('campaign_description')
        title = form.get('campaign_title')

        content = self.generateCampaignContent(objs=form.get('items'), **form)
        if not content:
            IStatusMessage(self.request).add(_(u'Couldn\'t generate campaign items.'))
            raise Redirect,\
                self.request.response.redirect('%s/campaign_wizard' % \
                                                  self.context.absolute_url())
        try:
            campaign_id = mailchimp.createCampaign(subject=subject,
                                          list_id=list_id,
                                          title='%s %s' % (title, description),
                                          content=content,
                                          template_id=template_id,
                                          campaign=self.context)
            self.addLastCampaign(campaign_id, title)
            IStatusMessage(self.request).add(_(u'Mailchimp campaign created.'))
            return self.request.response.redirect(
                                 '%s/@@campaign_created?id=%s' % \
                                 (self.context.absolute_url(), campaign_id))
        except MailChimpException, e:
            IStatusMessage(self.request).add(e, type='error')
            raise Redirect,\
                self.request.response.redirect(self.context.absolute_url())
    def __call__(self):
        """ Process the relation for campaign items. """
        redirect_url = self.context.absolute_url()
        items = self.request.form.get('items', [])
        if not items:
            IStatusMessage(self.request).add(_(
                u'We have problems processing '
                'your request. Not items found.'),
                                             type='error')
            return self.request.RESPONSE.redirect(redirect_url)

        my_uid = IUUID(self.context)

        for item in items:
            campaign = uuidToObject(item['uid'])
            existing_relations = campaign.getRawCampaign_items()
            if item.get('enabled', False):
                if my_uid not in existing_relations:
                    IStatusMessage(self.request).add(
                        _(u'Item added to campaign.'))
                    existing_relations.append(my_uid)
            else:
                if my_uid in existing_relations:
                    IStatusMessage(self.request).add(
                        _(u'Item removed from campaign.'))
                    existing_relations.remove(my_uid)
            campaign.setCampaign_items(existing_relations)

        return self.request.RESPONSE.redirect(redirect_url)
Beispiel #4
0
class AddForm(AddForm):
    fields = field.Fields(IMailChimpPortlet)
    fields['text'].widgetFactory = WysiwygFieldWidget
    label = _(u"Add MailChimp Portlet")
    description = _(u"This portlet displays a subscription form for a " +
                    u"MailChimp newsletter.")

    def create(self, data):
        return Assignment(**data)
Beispiel #5
0
class HeaderTitle(Slot):
    name = _(u'header_title')
    template = ViewPageTemplateFile("header-title.pt")

    def render(self, objs=None, **kw):
        if kw.get('campaign_description'):
            return self.template(description=kw['campaign_description'])
Beispiel #6
0
class HeaderNumber(Slot):
    name = _(u'header_number')
    template = ViewPageTemplateFile("header-number.pt")

    def render(self, objs=None, **kw):
        if kw.get('campaign_number'):
            return self.template(number=kw['campaign_number'])
Beispiel #7
0
class CampaignTitle(Slot):
    name = _(u'campaign_title')
    template = ViewPageTemplateFile("campaign-title.pt")

    def render(self, objs=None, **kw):
        if kw.get('campaign_title'):
            return self.template(title=kw['campaign_title'])
Beispiel #8
0
class PreHeaderContent(Slot):
    name = _(u'preheader_content')
    template = ViewPageTemplateFile("preheader_content.pt")

    def render(self, objs=None, **kw):
        if kw.get('campaign_description'):
            return self.template(description=kw['campaign_description'])
Beispiel #9
0
        def walk(items, result, parent):
            for item in items:
                collection = []
                if COLLECTION and IContentListingObject.providedBy(item):
                    item = item.getObject()
                elif IATTopic.providedBy(item):
                    collection = item.queryCatalog(b_size=100, full_objects=True)
                elif COLLECTION and ICollection.providedBy(item):
                    collection = item.getQuery()

                if collection:
                    result[item.title_or_id()] = []
                    walk(collection, result, item.title_or_id())
                else:
                    # add only published items
                    if wft.getInfoFor(item, "review_state") != "published":
                        IStatusMessage(self.request).\
                        add(_(u'Some of the items in your list are private. '
                               'They were not included in the wizard - '
                               'MailChimp supports only published content.'),
                            type='error')
                        continue

                    result[parent].append({'uid': IUUID(item),
                                           'title': item.title_or_id()})
            return result
Beispiel #10
0
class IMailchimpSlot(Interface):
    """A mapping between mailchimp slot and Plone content rendering."""

    name = schema.TextLine(title=_(u"Mailchimp slot name"), required=True)

    def render(objs=None, **kw):
        """Calls IMailchimpSlotRenderer to generate HTML for slot"""
Beispiel #11
0
        def walk(items, result, parent):
            for item in items:
                collection = []
                if COLLECTION and IContentListingObject.providedBy(item):
                    item = item.getObject()
                elif IATTopic.providedBy(item):
                    collection = item.queryCatalog(b_size=100,
                                                   full_objects=True)
                elif COLLECTION and ICollection.providedBy(item):
                    collection = item.getQuery()

                if collection:
                    result[item.title_or_id()] = []
                    walk(collection, result, item.title_or_id())
                else:
                    # add only published items
                    if wft.getInfoFor(item, "review_state") != "published":
                        IStatusMessage(self.request).\
                        add(_(u'Some of the items in your list are private. '
                               'They were not included in the wizard - '
                               'MailChimp supports only published content.'),
                            type='error')
                        continue

                    result[parent].append({
                        'uid': IUUID(item),
                        'title': item.title_or_id()
                    })
            return result
Beispiel #12
0
 def addLastCampaign(self, campaign_id, title):
     if campaign_id:
         if not title:
             title = _(u'Unknown campaign title')
         ann = IAnnotations(self.context)
         ann[LAST_CAMPAIGN] = PersistentDict()
         ann[LAST_CAMPAIGN]['id'] = campaign_id
         ann[LAST_CAMPAIGN]['title'] = title
         ann[LAST_CAMPAIGN]['date'] = DateTime()
Beispiel #13
0
 def addLastCampaign(self, campaign_id, title):
     if campaign_id:
         if not title:
             title = _(u'Unknown campaign title')
         ann = IAnnotations(self.context)
         ann[LAST_CAMPAIGN] = PersistentDict()
         ann[LAST_CAMPAIGN]['id'] = campaign_id
         ann[LAST_CAMPAIGN]['title'] = title
         ann[LAST_CAMPAIGN]['date'] = DateTime()
Beispiel #14
0
class INewsletterSubscribe(Interface):

    email = schema.TextLine(title=_(u"Email address"),
                            description=_(
                                u"help_email",
                                default=u"Please enter your email address."),
                            required=True,
                            constraint=validate_email)

    email_type = schema.Choice(
        title=_(u"Mail format"),
        vocabulary="redturtle.monkey.vocabularies.EmailType",
        description=_(
            u"help_email_type",
            default=u"Please choose type of newsletter you wish to receive."),
        default="text",
        required=False,
    )

    list_id = schema.TextLine(title=_(u"List ID"), required=True)
class MonkeySettingsEditForm(controlpanel.RegistryEditForm):

    schema = IMonkeySettings
    label = _(u"MailChimp settings")
    description = ""

    def updateFields(self):
        super(MonkeySettingsEditForm, self).updateFields()

    def updateWidgets(self):
        super(MonkeySettingsEditForm, self).updateWidgets()
Beispiel #16
0
    def generateCampaign(self):
        """By calling mailchimp API creates a campaign and redirects
        user to the proper URL."""
        mailchimp = getUtility(IMonkeyLocator)
        form = self.request.form
        subject = form.get('campaign_title')
        list_id = form.get('list')
        template_id = form.get('template')
        description = form.get('campaign_description')
        title = form.get('campaign_title')

        content = self.generateCampaignContent(objs=form.get('items'), **form)

        if not content:
            IStatusMessage(self.request).add(
                _(u'Couldn\'t generate campaign items.'))
            raise Redirect,\
                self.request.response.redirect('%s/campaign_wizard' % \
                                                  self.context.absolute_url())

        try:
            campaign_id = mailchimp.createCampaign(subject=subject,
                                                   list_id=list_id,
                                                   title='%s %s' %
                                                   (title, description),
                                                   content=content,
                                                   template_id=template_id)
            self.addLastCampaign(campaign_id, title)
            IStatusMessage(self.request).add(_(u'Mailchimp campaign created.'))
            return self.request.response.redirect(
                                    '%s/@@campaign_created?id=%s' % \
                                    (self.context.absolute_url(), campaign_id))
        except Exception, e:
            IStatusMessage(self.request).add(e, type='error')
            raise Redirect,\
                self.request.response.redirect(self.context.absolute_url())
Beispiel #17
0
class IMailChimpPortlet(IPortletDataProvider):

    name = schema.TextLine(title=_(u'Title'),
                           description=_(u'Title of the portlet'))

    list_id = schema.Choice(
        title=_(u'Available lists'),
        description=_(u'Select list to subscribe to.'),
        required=True,
        vocabulary='redturtle.monkey.vocabularies.AllCampaignLists')

    custom_css = schema.TextLine(
        title=_(u'Custom css'),
        required=False,
        description=_(u'Custom css class for portlet wrapper'))

    text = schema.Text(title=_(u"Text"),
                       description=_(u"The text to render"),
                       required=False)
Beispiel #18
0
class IMonkeySettings(Interface):
    """Global mailchimp settings. This describes records stored in the
    configuration registry and obtainable via plone.registry.
    """

    api_key = schema.TextLine(
        title=_(u"MailChimp API Key"),
        description=_(
            u"help_api_key",
            default=u"Enter in your MailChimp key here (.e.g. " +
            u"'8b785dcabe4b5aa24ef84201ea7dcded-us4'). Log into " +
            u"mailchimp.com, go to account -> extras -> API Keys & " +
            u"Authorized Apps and copy the API Key to this field."),
        default=u"",
        required=True)

    from_email = schema.TextLine(
        title=_(u"Email from address"),
        description=_(u"help_from_email",
                      default=u"Please enter FROM email address."),
        required=True,
        constraint=validate_email)

    from_name = schema.TextLine(title=_(u"Email from name"),
                                description=_(
                                    u"help_from_name",
                                    default=u"Please enter FROM email name."),
                                required=True)

    @invariant
    def valid_api_key(data):
        if len(data.api_key) == 0:
            return
        mailchimp = MailChimp(data.api_key)
        try:
            return mailchimp.ping()
        except:
            raise Invalid(u"Your MailChimp API key is not valid. Please go " +
                          u"to mailchimp.com and check your API key.")
Beispiel #19
0
class Body(Slot):
    name = _(u'main_body')
Beispiel #20
0
 def name(self):
     return self.data.name or _(u"Subscribe to newsletter")
Beispiel #21
0
 def title(self):
     return _(u"MailChimp")
Beispiel #22
0
class EditForm(EditForm):
    fields = field.Fields(IMailChimpPortlet)
    fields['text'].widgetFactory = WysiwygFieldWidget
    label = _(u"Edit MailChimp Portlet")
    description = _(u"This portlet displays a subscription form for a " +
                    u"MailChimp newsletter.")
Beispiel #23
0
from Products.ATContentTypes.content.base import ATContentTypeSchema
from Products.ATContentTypes.content import schemata
from archetypes.referencebrowserwidget import ReferenceBrowserWidget

from redturtle.monkey import _
from redturtle.monkey.config import PROJECTNAME
from redturtle.monkey.interfaces import ICampaign

LAST_CAMPAIGN = 'redturtle.monkey.last_campaign'

CampaignSchema = ATContentTypeSchema.copy() + atapi.Schema((
    atapi.StringField(
        'campaign_api_key',
        storage=atapi.AnnotationStorage(),
        widget=atapi.StringWidget(
            label=_(u"Campaign API key"),
            description=_(u"Custom Mailchimp API key for this campaign"),
        ),
    ),
    atapi.StringField(
        'campaign_from_email',
        storage=atapi.AnnotationStorage(),
        widget=atapi.StringWidget(
            label=_(u"Campaign FROM email"),
            description=_(u"Custom Mailchimp FROM email for this campaign"),
        ),
    ),
    atapi.StringField(
        'campaign_from_name',
        storage=atapi.AnnotationStorage(),
        widget=atapi.StringWidget(
Beispiel #24
0
 def title(self):
     return _(u"Add item to campaign")
Beispiel #25
0
class NotAnEmailAddress(schema.ValidationError):
    __doc__ = _(u"Invalid email address")
Beispiel #26
0
 def title(self):
     return _(u"MailChimp")
 def title(self):
     return _(u"Office information portlet")
    def handleApply(self, action):
        data, errors = self.extractData()
        if 'email' in data:
            mailchimp = getUtility(IMonkeyLocator)

            # Retrieve list_id either from a hidden field in the form or fetch
            # the first list from mailchimp.
            if 'list_id' in data:
                list_id = data['list_id']
            else:
                list_id = ''

            # Use email_type if one is provided by the form, if not choose the
            # default email type from the control panel settings.
            if 'email_type' in data:
                email_type = data['email_type']
            else:
                email_type = None
            # Subscribe to MailChimp list
            try:
                mailchimp.subscribe(
                    list_id=list_id,
                    email_address=data['email'],
                    merge_vars=data,
                    email_type=email_type,
                )
            except MailChimpException, error:
                if error.code == 214:
                    error_msg = _(
                        u"mailchimp_error_msg_already_subscribed",
                        default=u"Could not subscribe to newsletter. "
                                u"The email '${email}' is already subscribed.",
                        mapping={
                            u"email": data['email']
                        }
                    )
                    translated_error_msg = self.context.translate(error_msg)
                    raise WidgetActionExecutionError(
                        'email',
                        Invalid(translated_error_msg)
                    )
                elif error.code == 220:
                    error_msg = _(
                        u"mailchimp_error_msg_banned",
                        default=u"Could not subscribe to newsletter. "
                                u"The email '${email}' has been banned.",
                        mapping={
                            u"email": data['email']
                        }
                    )
                    translated_error_msg = self.context.translate(error_msg)
                    raise WidgetActionExecutionError(
                        'email',
                        Invalid(translated_error_msg)
                    )
                else:
                    error_msg = _(
                        u"mailchimp_error_msg",
                        default=u"Could not subscribe to newsletter. "
                                u"Please contact the site administrator: "
                                u"'${error}'",
                        mapping={
                            u"error": error
                        }
                    )
                    translated_error_msg = self.context.translate(error_msg)
                    raise ActionExecutionError(
                        Invalid(translated_error_msg)
                    )

            IStatusMessage(self.context.REQUEST).addStatusMessage(_(
                u"We have to confirm your email address. In order to " +
                u"finish the newsletter subscription, click on the link " +
                u"inside the email we just send you."),
                type="info"
            )
            self.request.response.redirect('%s/@@newsletter_subscribed' % self.context.absolute_url())
Beispiel #29
0
 def title(self):
     return _(u"Office information portlet")
Beispiel #30
0
 def name(self):
     return self.data.name or _(u"Subscribe to newsletter")
Beispiel #31
0
class Header(Slot):
    name = _(u'main_primopiano')
Beispiel #32
0
class NewsletterSubscriberForm(extensible.ExtensibleForm, form.Form):
    fields = field.Fields(INewsletterSubscribe)
    ignoreContext = True
    label = _(u"Subscribe to newsletter")

    def updateActions(self):
        super(NewsletterSubscriberForm, self).updateActions()
        self.actions['subscribe'].addClass('context')

    def updateFields(self):
        super(NewsletterSubscriberForm, self).updateFields()
        self.fields['email_type'].widgetFactory = \
            RadioFieldWidget

    def updateWidgets(self):
        super(NewsletterSubscriberForm, self).updateWidgets()
        # Retrieve the list id either from the request/form or fall back to
        # the default_list setting.
        list_id = self.portlet.list_id
        self.widgets['list_id'].mode = HIDDEN_MODE
        self.widgets['list_id'].value = list_id

    @button.buttonAndHandler(_(u"subscribe_to_newsletter_button",
                               default=u"Subscribe"),
                             name='subscribe')
    def handleApply(self, action):
        data, errors = self.extractData()
        if 'email' in data:
            mailchimp = getUtility(IMonkeyLocator)

            # Retrieve list_id either from a hidden field in the form or fetch
            # the first list from mailchimp.
            if 'list_id' in data:
                list_id = data['list_id']
            else:
                list_id = ''

            # Use email_type if one is provided by the form, if not choose the
            # default email type from the control panel settings.
            if 'email_type' in data:
                email_type = data['email_type']
            else:
                email_type = None
            # Subscribe to MailChimp list
            try:
                mailchimp.subscribe(
                    list_id=list_id,
                    email_address=data['email'],
                    merge_vars=data,
                    email_type=email_type,
                )
            except Exception, error:
                if error.code == 214:
                    error_msg = _(
                        u"mailchimp_error_msg_already_subscribed",
                        default=u"Could not subscribe to newsletter. "
                        u"The email '${email}' is already subscribed.",
                        mapping={u"email": data['email']})
                    translated_error_msg = self.context.translate(error_msg)
                    raise WidgetActionExecutionError(
                        'email', Invalid(translated_error_msg))
                elif error.code == 220:
                    error_msg = _(
                        u"mailchimp_error_msg_banned",
                        default=u"Could not subscribe to newsletter. "
                        u"The email '${email}' has been banned.",
                        mapping={u"email": data['email']})
                    translated_error_msg = self.context.translate(error_msg)
                    raise WidgetActionExecutionError(
                        'email', Invalid(translated_error_msg))
                else:
                    error_msg = _(
                        u"mailchimp_error_msg",
                        default=u"Could not subscribe to newsletter. "
                        u"Please contact the site administrator: "
                        u"'${error}'",
                        mapping={u"error": error})
                    translated_error_msg = self.context.translate(error_msg)
                    raise ActionExecutionError(Invalid(translated_error_msg))

            IStatusMessage(self.context.REQUEST).addStatusMessage(
                _(u"We have to confirm your email address. In order to " +
                  u"finish the newsletter subscription, click on the link " +
                  u"inside the email we just send you."),
                type="info")
            self.request.response.redirect('%s/@@newsletter_subscribed' %
                                           self.context.absolute_url())
Beispiel #33
0
    def handleApply(self, action):
        data, errors = self.extractData()
        if 'email' in data:
            mailchimp = getUtility(IMonkeyLocator)

            # Retrieve list_id either from a hidden field in the form or fetch
            # the first list from mailchimp.
            if 'list_id' in data:
                list_id = data['list_id']
            else:
                list_id = ''

            # Use email_type if one is provided by the form, if not choose the
            # default email type from the control panel settings.
            if 'email_type' in data:
                email_type = data['email_type']
            else:
                email_type = None
            # Subscribe to MailChimp list
            try:
                mailchimp.subscribe(
                    list_id=list_id,
                    email_address=data['email'],
                    merge_vars=data,
                    email_type=email_type,
                )
            except Exception, error:
                if error.code == 214:
                    error_msg = _(
                        u"mailchimp_error_msg_already_subscribed",
                        default=u"Could not subscribe to newsletter. "
                        u"The email '${email}' is already subscribed.",
                        mapping={u"email": data['email']})
                    translated_error_msg = self.context.translate(error_msg)
                    raise WidgetActionExecutionError(
                        'email', Invalid(translated_error_msg))
                elif error.code == 220:
                    error_msg = _(
                        u"mailchimp_error_msg_banned",
                        default=u"Could not subscribe to newsletter. "
                        u"The email '${email}' has been banned.",
                        mapping={u"email": data['email']})
                    translated_error_msg = self.context.translate(error_msg)
                    raise WidgetActionExecutionError(
                        'email', Invalid(translated_error_msg))
                else:
                    error_msg = _(
                        u"mailchimp_error_msg",
                        default=u"Could not subscribe to newsletter. "
                        u"Please contact the site administrator: "
                        u"'${error}'",
                        mapping={u"error": error})
                    translated_error_msg = self.context.translate(error_msg)
                    raise ActionExecutionError(Invalid(translated_error_msg))

            IStatusMessage(self.context.REQUEST).addStatusMessage(
                _(u"We have to confirm your email address. In order to " +
                  u"finish the newsletter subscription, click on the link " +
                  u"inside the email we just send you."),
                type="info")
            self.request.response.redirect('%s/@@newsletter_subscribed' %
                                           self.context.absolute_url())
Beispiel #34
0
from archetypes.referencebrowserwidget import ReferenceBrowserWidget

from redturtle.monkey import  _
from redturtle.monkey.config import PROJECTNAME
from redturtle.monkey.interfaces import ICampaign


LAST_CAMPAIGN = 'redturtle.monkey.last_campaign'


CampaignSchema = ATContentTypeSchema.copy() + atapi.Schema((

    atapi.StringField('campaign_api_key',
        storage=atapi.AnnotationStorage(),
        widget=atapi.StringWidget(
            label=_(u"Campaign API key"),
            description=_(u"Custom Mailchimp API key for this campaign"),
        ),
    ),

    atapi.StringField('campaign_from_email',
        storage=atapi.AnnotationStorage(),
        widget=atapi.StringWidget(
            label=_(u"Campaign FROM email"),
            description=_(u"Custom Mailchimp FROM email for this campaign"),
        ),
    ),

    atapi.StringField('campaign_from_name',
        storage=atapi.AnnotationStorage(),
        widget=atapi.StringWidget(
 def title(self):
     return _(u"Add item to campaign")