def _assemble_messages(channel_paths, newsletter_uid, newsletter_path, include_collector_items, override_vars=None): if override_vars is None: override_vars = {} queued = 0 site = getSite() request = site.REQUEST uid_catalog = getToolByName(site, 'uid_catalog', None) newsletter_item = uid_catalog(UID=newsletter_uid) if not newsletter_item: message = "There was a problem in dispatching newsletters. %s was not found and this queue will be deleted." % newsletter_path logger.warning(message) IStatusMessage(site.REQUEST).add(message, "warning") return _(u"0 messages queued for delivery. Item '${newsletter_path}' not found.", mapping=dict(newsletter_path=newsletter_path)) # raise KeyError('Newsletter not found') context = newsletter_item[0].getObject() for path in channel_paths: channel = site.restrictedTraverse(path) assembler = collective.singing.interfaces.IMessageAssemble(channel) queued += assembler( request, (FullFormatWrapper(context),), include_collector_items, override_vars) if channel.scheduler is not None and include_collector_items: channel.scheduler.triggered_last = datetime.datetime.now() return _(u"${queued} message(s) queued for delivery.", mapping=dict(queued=queued))
def handle_preview(self, action): data, errors = self.extractData() if errors: self.status = form.EditForm.formErrorsMessage return channel = data['channel'] include_collector_items = data['include_collector_items'] address = data['address'] if not address: self.status = _(u"The address to send the preview to is missing.") return queued = 0 assembler = collective.singing.interfaces.IMessageAssemble(channel) assembler.update_cue = False subs = channel.subscriptions.query(key=address) for sub in subs: msg = assembler.render_message( self.request, sub, (FullFormatWrapper(self.context.context),), include_collector_items, self.get_override_vars()) if msg is not None: queued += 1 self.status = _( u"${num} message(s) queued.", mapping=dict(num=queued))
def __call__(self, name=None, include_collector_items=False, override_vars=None): # deactivate diazo - we style our newsletters without it self.request.response.setHeader('X-Theme-Disabled', 'True') if override_vars is None: override_vars = '{}' try: include_collector_items = int(include_collector_items) except ValueError: include_collector_items = False if IChannel.providedBy(self.context): channel = self.context items = () else: assert name is not None channel = lookup(name) items = (FullFormatWrapper(self.context), ) sub = PreviewSubscription(channel) # We don't want to commit a transaction just for the preview; # this would happen if we were to simply add and remove from # the queue. sp = transaction.savepoint() message = IMessageAssemble(channel).render_message( self.request, sub, items, bool(include_collector_items), eval(override_vars)) if message is None: IStatusMessage(self.request).addStatusMessage( _(u"No items found.")) return self.request.response.redirect(self.context.absolute_url()) # pull message out of hat channel.queue[message.status].pull(-1) # rollback savepoint sp.rollback() # walk message, decoding HTML payload for part in message.payload.walk(): if part.get_content_type() == 'text/html': html = part.get_payload(decode=True) break else: raise ValueError("Message does not contain a 'text/html' part.") return self.template(content=html, title=channel.title)
def _assemble_messages(channel_paths, context_path, include_collector_items, override_vars=None): if override_vars is None: override_vars = {} queued = 0 site = getSite() request = site.REQUEST context = site.restrictedTraverse(context_path) for path in channel_paths: channel = site.restrictedTraverse(path) assembler = collective.singing.interfaces.IMessageAssemble(channel) queued += assembler( request, (FullFormatWrapper(context),), include_collector_items, override_vars) if channel.scheduler is not None and include_collector_items: channel.scheduler.triggered_last = datetime.datetime.now() return "%s message(s) queued for delivery." % queued
def __call__(self): rc = getToolByName(getSite(), 'reference_catalog') return FullFormatWrapper(rc.lookupObject(self.uid))