예제 #1
0
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))
예제 #2
0
    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))
예제 #3
0
    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)
예제 #4
0
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
예제 #5
0
 def __call__(self):
     rc = getToolByName(getSite(), 'reference_catalog')
     return FullFormatWrapper(rc.lookupObject(self.uid))