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)
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)
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)
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'])
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'])
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'])
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'])
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
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"""
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
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()
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()
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())
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)
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.")
class Body(Slot): name = _(u'main_body')
def name(self): return self.data.name or _(u"Subscribe to newsletter")
def title(self): return _(u"MailChimp")
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.")
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(
def title(self): return _(u"Add item to campaign")
class NotAnEmailAddress(schema.ValidationError): __doc__ = _(u"Invalid email address")
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())
class Header(Slot): name = _(u'main_primopiano')
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())
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())
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(