def handleSubscribe(self, action):
        """ This form should be used for anonymous subscribers only (not for portal users currently) """
        context = self.context
        data, errors = self.extractData()
        ptool = getToolByName(self.context, "plone_utils")
        level = "info"
        msg = ""
        res = None
        if context.subscription_require_tos:
            if not data.get("tos"):
                msg = _(u"You must accept terms of service")

        if not msg:
            subs = getMultiAdapter((self.context, self.request), interface=IGazetteSubscription)
            if "email" in data:
                res = subs.subscribe(
                    data["email"], data["fullname"], providers=data["providers"], salutation=data["salutation"]
                )
            else:
                msg = _(u"Invalid form data.")
                level = "error"

            if res == config.ALREADY_SUBSCRIBED:
                msg = _(u"This subscription already exists.")
                ptool.addPortalMessage(msg, level)
            elif res == config.WAITING_FOR_CONFIRMATION:
                msg = _(u"Subscription confirmation email has been sent. Please follow instruction in the email.")
                ptool.addPortalMessage(msg, level)
                self.request.response.redirect(self.context.absolute_url())
    def __call__(self):
        result = []
        if self.request.get('form.submitted') == '1':
            query = {}
            fulltext = self.request.get('fulltext', '')
            if fulltext:
                query['SearchableText'] = fulltext
            active = self.request.get('active', '')
            if active == '1':
                query['active'] = True
            elif active == '0':
                query['active'] = False
            result = self.search(**query)
        if self.request.get('form.import.submitted') == '1':
            fp = self.request.get('subscribers')
            putil = getToolByName(self.context, 'plone_utils')
            book = xlrd.open_workbook(filename=fp.filename, file_contents=fp.read())
            sh = book.sheet_by_index(0)
            valid = 0
            invalid = 0
            duplicates = 0
            if sh.nrows > 0:
                email = sh.row(0)[0].value
                if putil.validateSingleEmailAddress(email):
                    start = 0
                else:
                    start = 1
                soup = getSoup(self.context, config.SUBSCRIBERS_SOUP_ID)
                for rx in range(start, sh.nrows):
                    # [text:u'*****@*****.**', text:u'Test 2', empty:'', empty:'', empty:'']
                    row = sh.row(rx)
                    email = row[0].value.strip()
                    fullname = row[1].value.strip()
                    if putil.validateSingleEmailAddress(email):
                        if not [r for r in soup.lazy(email=email)]:
                            # subscribe (don't try to pair with portal users)
                            s = Subscriber(email=email, fullname=fullname, active=True)
                            soup.add(s)
                            valid += 1
                        else:
                            duplicates += 1
                    else:
                        invalid += 1
                putil.addPortalMessage(_("Imported subscribers: ${imported}, Invalid: ${invalid}, Duplicates: ${duplicates}", mapping={'imported': valid, 'duplicates': duplicates, 'invalid': invalid}))
            else:
                putil.addPortalMessage(_("XLS file is empty"))

        return self.template(searchresults=result)
示例#3
0
    def send_gazette(self):
        context = aq_inner(self.context)
        parent = aq_parent(context)
        now = datetime.now()
        CheckAuthenticator(self.request)
        ptool = getToolByName(self.context, 'plone_utils')
        soup = getSoup(self.context, config.SUBSCRIBERS_SOUP_ID)
        providers = self._providers()
        subject = context.Title()

        url = parent.absolute_url() + '/subscription?uuid=%(uuid)s'
        footer_text = parent.footer.output.replace('${url}', '$url')
        footer_text = footer_text.replace('$url', url)
        count = 0
        text = context.text.output + '\n'
        for p in providers:
            text += p.get_gazette_text(parent, context)

        for s in soup.query(active=True):
            # returns email and fullname taken from memberdata if s.username is set and member exists
            subscriber_info = s.get_info(context)
            footer = footer_text % subscriber_info
            mail_text = ""
            if subscriber_info['salutation']:
                mail_text += "%s<br /><br />" % subscriber_info['salutation']
            mail_text += "%s------------<br />%s" % (text, footer)
            try:
                if utils.send_mail(context, None, subscriber_info['email'], subscriber_info['fullname'], subject, mail_text):
                    count += 1
            except (SMTPException, SMTPRecipientsRefused):
                pass
        context.sent_at = now
        parent.most_recent_issue = context
        ptool.addPortalMessage(_(u'Gazette has been sent to $count recipients', mapping={'count': count}))
        self.request.response.redirect(context.absolute_url())
 def deactivate(self, key):
     """ """
     if not key:
         raise Forbidden("Authenticator is invalid.")
     ptool = getToolByName(self.context, "plone_utils")
     # get subscriber by key
     soup = getSoup(self.context, config.SUBSCRIBERS_SOUP_ID)
     results = [r for r in soup.query(key=key)]
     if len(results) != 1:
         ptool.addPortalMessage(_(u"Invalid key"))
     else:
         s = results[0]
         s.active = False
         s.key = u""
         soup.reindex([s])
         ptool.addPortalMessage(_(u"Your subscription has been successfully deactivated."))
     self.request.response.redirect(self.context.absolute_url())
 def handleUnsubscribe(self, action):
     """ This form should be used for anonymous subscribers only (not for portal users currently) """
     data, errors = self.extractData()
     ptool = getToolByName(self.context, "plone_utils")
     if "email" in data:
         subs = getMultiAdapter((self.context, self.request), interface=IGazetteSubscription)
         res = subs.unsubscribe(data["email"])
         if res == config.ALREADY_UNSUBSCRIBED:
             ptool.addPortalMessage(_(u"You are not subscribed."))
         elif res == config.WAITING_FOR_CONFIRMATION:
             ptool.addPortalMessage(
                 _(u"Unsubscribe confirmation email has been sent. Please follow instruction in the email.")
             )
         elif res == config.NO_SUCH_SUBSCRIPTION:
             ptool.addPortalMessage(_(u"Such subscription does not exist."))
     else:
         ptool.addPortalMessage(_(u"Invalid form data. Email is missing."), "error")
     self.request.response.redirect(self.context.absolute_url())
 def search(self, **query):
     soup = getSoup(self.context, config.SUBSCRIBERS_SOUP_ID)
     result = []
     ACTIVE = _(u'label_yes', default=u'Yes')
     INACTIVE = _(u'label_no', default=u'No')
     if query:
         rows = soup.query(**query)
     else:
         # all records
         rows = soup.data.values()
     for row in rows:
         result.append(dict(
             fullname=row.fullname,
             email=row.email,
             active=row.active and ACTIVE or INACTIVE,
             username=row.username,
             uuid=row.uuid,
         ))
     return result
    def handleUpdate(self, action):
        data, errors = self.extractData()
        ptool = getToolByName(self.context, 'plone_utils')

        subs = getMultiAdapter((self.context, self.request), interface=IGazetteSubscription)
        uuid = data['uuid']
        del data['uuid']
        subs.update(uuid, **data)
        ptool.addPortalMessage(_(u'The subscription has been updated.'))
        self.request.response.redirect(self.action + '?uuid=' + uuid)
示例#8
0
 def test_send(self):
     context = aq_inner(self.context)
     parent = aq_parent(context)
     email = parent.test_mail
     ptool = getToolByName(self.context, 'plone_utils')
     if not email:
         ptool.addPortalMessage(_(u'No test email set. Please check Gazette folder settings.'), 'error')
     else:
         text = context.text.output + '\n'
         providers = self._providers()
         for p in providers:
             text += p.get_gazette_text(parent, context)
         subject = context.Title()
         url = parent.absolute_url() + '/subscription?uuid='  # NOT SET - just testing
         footer_text = parent.footer.output.replace('${url}', '$url')
         footer_text = footer_text.replace('$url', url)
         footer = footer_text
         mail_text = "%s------------<br />%s" % (text, footer)
         try:
             utils.send_mail(context, None, email, 'Tester', subject, mail_text)
         except (SMTPException, SMTPRecipientsRefused):
             pass
         ptool.addPortalMessage(_(u'Gazette test has been sent to $email', mapping={'email': email}))
     self.request.response.redirect(context.absolute_url())
def validateEmail(value):
    if value and not checkEmail(value):
        raise Invalid(_(u"Invalid email format"))
    return True
 def validateInvariants(data):
     if data.auto_providers or data.auto_optional_providers:
         ap = set(data.auto_providers)
         aop = set(data.auto_optional_providers)
         if not aop.issubset(ap):
             raise Invalid(_(u"Optional providers list must to be a subset of providers list."))
示例#11
0
def validateAccept(value):
    if not (value is True):
        raise Invalid(_(u"You must accept terms of service"))
    return True
 def deactivation_mail(self, subscriber):
     mail_text = IStringInterpolator(self.context)(self.deactivation_template(key=subscriber.key))
     subject = _(u"Please confirm deactivation of your subscription")
     utils.send_mail(self.context, None, subscriber.email, subscriber.fullname, subject, mail_text)