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)
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)
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."))
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)