def send_notification_mail(self, entry): context = aq_inner(self.context) urltool = getToolByName(context, 'portal_url') plone_utils = getToolByName(context, 'plone_utils') portal = urltool.getPortalObject() send_to_address = portal.getProperty('email_from_address') subject = _(u"New guestbook entry") encoding = portal.getProperty('email_charset') message_tpl = _(u"Name: {name}\nEmail: {mail}\nHomepage: {homepage}\nModeration state: {moderation_state}\nIP: {ip}\n\n{text}") message = MIMEText(message_tpl.format( name=entry.author, mail=entry.email_address, homepage=entry.homepage_address, moderation_state=moderation_states.getTerm(entry.moderation_state).title, ip=entry.ip, text=entry.message ), "text", encoding) message['To'] = send_to_address message['From'] = send_to_address message['Subject'] = subject try: host = getToolByName(self, 'MailHost') result = host.send(str(message)) except ConflictError: raise except: # TODO Too many things could possibly go wrong. So we catch all. exception = plone_utils.exceptionString() message = _(u'Unable to send mail: ${exception}', mapping={u'exception' : exception}) plone_utils.addPortalMessage(message, 'error')
def __call__(self): context = aq_inner(self.context) postback = True form = self.request.form message_ids = form.get('messages', []) if form.get('form.button.Delete', False): context.manage_delObjects(ids=message_ids) confirm = _(u"The marked entries have been deleted.") IStatusMessage(self.request).addStatusMessage(confirm, type='info') postback = False if form.get('form.button.Publish', False): for id in message_ids: if context.hasObject(id): message = context[id] message.moderation_state = 'published' message.reindexObject(idxs=["moderation_state"]) postback = False if form.get('form.button.Spam', False): for id in message_ids: if context.hasObject(id): message = context[id] message.moderation_state = 'spam' message.reindexObject(idxs=["moderation_state"]) postback = False if postback: return self.template() else: self.request.response.redirect(self.context.absolute_url()) return ''
def action_send(self, action): context = aq_inner(self.context) data, errors = self.extractData() if len(errors) > 0: return '' entry = createContentInContainer(context, 'sbo.inkstain.guestbookentry', entry_date=datetime.datetime.today(), author=data['name'], email_address=data['email_address'], homepage_address=data['homepage_address'], message=data['message'], moderation_state='pending', ip=get_ip(self.request) ) self.send_notification_mail(entry) confirm = _(u"Thank you for your guestbook entry! It will be published after moderation.") IStatusMessage(self.request).addStatusMessage(confirm, type='info') self.request.response.redirect(context.absolute_url()) return ''
class NotAnHomepageUrl(schema.ValidationError): __doc__ = _(u"Invalid homepage address") check_homepage_url = re.compile(r"https?\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?").match def validate_homepage_url(value): if not check_homepage_url(value): raise NotAnHomepageUrl(value) return True moderation_states = SimpleVocabulary( [ SimpleTerm(value=u"pending", title=_(u"Pending review")), SimpleTerm(value=u"published", title=_(u"Published")), SimpleTerm(value=u"spam", title=_(u"Spam")), ] ) class IGuestbookEntry(Interface): entry_date = schema.Datetime(title=_(u"Date of the entry"), required=True, readonly=True) author = schema.TextLine(title=_(u"Your name"), required=True) email_address = schema.ASCIILine( title=_(u"Your email address"), description=_(u"Won't be published."), required=True, constraint=validate_email )