Added tag cubicweb-debian-version-3.10.1-1 for changeset 3abb41c47925
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr## This file is part of CubicWeb.## CubicWeb is free software: you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation, either version 2.1 of the License, or (at your option)# any later version.## CubicWeb is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License along# with CubicWeb. If not, see <http://www.gnu.org/licenses/>."""some views to handle notification on data changes"""__docformat__="restructuredtext en"_=unicodefromitertoolsimportrepeatfromlogilab.common.textutilsimportnormalize_textfromlogilab.common.deprecationimportclass_renamed,class_moved,deprecatedfromcubicweb.selectorsimportyesfromcubicweb.viewimportComponentfromcubicweb.mailimportNotificationView,SkipEmailfromcubicweb.server.hookimportSendMailOpclassRecipientsFinder(Component):"""this component is responsible to find recipients of a notification by default user's with their email set are notified if any, else the default email addresses specified in the configuration are used """__regid__='recipients_finder'__select__=yes()user_rql=('Any X,E,A WHERE X is CWUser, X in_state S, S name "activated",''X primary_email E, E address A')defrecipients(self):mode=self._cw.vreg.config['default-recipients-mode']ifmode=='users':execute=self._cw.executedests=[(u.cw_adapt_to('IEmailable').get_email(),u.property_value('ui.language'))foruinexecute(self.user_rql,build_descr=True).entities()]elifmode=='default-dest-addrs':lang=self._cw.vreg.property_value('ui.language')dests=zip(self._cw.vreg.config['default-dest-addrs'],repeat(lang))else:# mode == 'none'dests=[]returndests# abstract or deactivated notification views and mixin ########################classNotificationView(NotificationView):"""overriden to delay actual sending of mails to a commit operation by default """defsend_on_commit(self,recipients,msg):SendMailOp(self._cw,recipients=recipients,msg=msg)send=send_on_commitclassStatusChangeMixIn(object):__regid__='notif_status_change'msgid_timestamp=Truemessage=_('status changed')content=_("""%(user)s changed status from <%(previous_state)s> to <%(current_state)s> for entity'%(title)s'%(comment)surl: %(url)s""")################################################################################ Actual notification views. ## ## disable them at the recipients_finder level if you don't want them ################################################################################# XXX should be based on dc_title/dc_description, no?classContentAddedView(NotificationView):"""abstract class for notification on entity/relation all you have to do by default is : * set id and __select__ attributes to match desired events and entity types * set a content attribute to define the content of the email (unless you override call) """__abstract__=True__regid__='notif_after_add_entity'msgid_timestamp=Falsemessage=_('new')content="""%(title)s%(content)surl: %(url)s"""defcontext(self,**kwargs):entity=self.cw_rset.get_entity(self.cw_rowor0,self.cw_color0)content=entity.printable_value(self.content_attr,format='text/plain')ifcontent:contentformat=getattr(entity,self.content_attr+'_format','text/rest')# XXX don't try to wrap rest until we've a proper transformation (see# #103822)ifcontentformat!='text/rest':content=normalize_text(content,80)returnsuper(ContentAddedView,self).context(content=content,**kwargs)defsubject(self):entity=self.cw_rset.get_entity(self.cw_rowor0,self.cw_color0)returnu'%s #%s (%s)'%(self._cw.__('New %s'%entity.e_schema),entity.eid,self.user_data['login'])defformat_value(value):ifisinstance(value,unicode):returnu'"%s"'%valuereturnvalueclassEntityUpdatedNotificationView(NotificationView):"""abstract class for notification on entity/relation all you have to do by default is : * set id and __select__ attributes to match desired events and entity types * set a content attribute to define the content of the email (unless you override call) """__abstract__=True__regid__='notif_entity_updated'msgid_timestamp=Falsemessage=_('updated')no_detailed_change_attrs=()content="""Properties have been updated by %(user)s:%(changes)surl: %(url)s"""defcontext(self,**kwargs):context=super(EntityUpdatedNotificationView,self).context(**kwargs)changes=self._cw.transaction_data['changes'][self.cw_rset[0][0]]_=self._cw._formatted_changes=[]entity=self.cw_rset.get_entity(self.cw_rowor0,self.cw_color0)forattr,oldvalue,newvalueinsorted(changes):# check current user has permission to see the attributerschema=self._cw.vreg.schema[attr]ifrschema.final:rdef=entity.e_schema.rdef(rschema)ifnotrdef.has_perm(self._cw,'read',eid=self.cw_rset[0][0]):continue# XXX suppose it's a subject relation...elifnotrschema.has_perm(self._cw,'read',fromeid=self.cw_rset[0][0]):continueifattrinself.no_detailed_change_attrs:msg=_('%s updated')%_(attr)elifoldvaluenotin(None,''):msg=_('%(attr)s updated from %(oldvalue)s to %(newvalue)s')%{'attr':_(attr),'oldvalue':format_value(oldvalue),'newvalue':format_value(newvalue)}else:msg=_('%(attr)s set to %(newvalue)s')%{'attr':_(attr),'newvalue':format_value(newvalue)}formatted_changes.append('* '+msg)ifnotformatted_changes:# current user isn't allowed to see changes, skip this notificationraiseSkipEmail()context['changes']='\n'.join(formatted_changes)returncontextdefsubject(self):entity=self.cw_rset.get_entity(self.cw_rowor0,self.cw_color0)returnu'%s #%s (%s)'%(self._cw.__('Updated %s'%entity.e_schema),entity.eid,self.user_data['login'])fromcubicweb.hooks.notificationimportRenderAndSendNotificationViewfromcubicweb.mailimportparse_message_idNormalizedTextView=class_renamed('NormalizedTextView',ContentAddedView)RenderAndSendNotificationView=class_moved(RenderAndSendNotificationView)parse_message_id=deprecated('parse_message_id is now defined in cubicweb.mail')(parse_message_id)