[index page] move workflow entity types to the 'system' entities
"""various library content hooks:organization: Logilab:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses"""__docformat__="restructuredtext en"fromdatetimeimportdatetimefromcubicwebimportRepositoryErrorfromcubicweb.common.uilibimportsoup2xhtmlfromcubicweb.server.hooksmanagerimportHookfromcubicweb.server.poolimportPreCommitOperationclassSetModificationDateOnStateChange(Hook):"""update entity's modification date after changing its state"""events=('after_add_relation',)accepts=('in_state',)defcall(self,session,fromeid,rtype,toeid):iffromeidinsession.transaction_data.get('neweids',()):# new entity, not neededreturnentity=session.entity_from_eid(fromeid)try:entity.set_attributes(modification_date=datetime.now(),_cw_unsafe=True)exceptRepositoryError,ex:# usually occurs if entity is coming from a read-only source# (eg ldap user)self.warning('cant change modification date for %s: %s',entity,ex)classAddUpdateCWUserHook(Hook):"""ensure user logins are stripped"""events=('before_add_entity','before_update_entity',)accepts=('CWUser',)defcall(self,session,entity):if'login'inentityandentity['login']:entity['login']=entity['login'].strip()classAutoDeleteBookmark(PreCommitOperation):beid=None# make pylint happydefprecommit_event(self):session=self.sessionifnotself.beidinsession.transaction_data.get('pendingeids',()):ifnotsession.unsafe_execute('Any X WHERE X bookmarked_by U, X eid %(x)s',{'x':self.beid},'x'):session.unsafe_execute('DELETE Bookmark X WHERE X eid %(x)s',{'x':self.beid},'x')classDelBookmarkedByHook(Hook):"""ensure user logins are stripped"""events=('after_delete_relation',)accepts=('bookmarked_by',)defcall(self,session,subj,rtype,obj):AutoDeleteBookmark(session,beid=subj)classTidyHtmlFields(Hook):"""tidy HTML in rich text strings"""events=('before_add_entity','before_update_entity')accepts=('Any',)defcall(self,session,entity):metaattrs=entity.e_schema.meta_attributes()formetaattr,(metadata,attr)inmetaattrs.iteritems():ifmetadata=='format':try:value=entity[attr]exceptKeyError:continue# no text to tidyifisinstance(value,unicode):# filter out None and Binaryifself.event=='before_add_entity':fmt=entity.get(metaattr)else:fmt=entity.get_value(metaattr)iffmt=='text/html':entity[attr]=soup2xhtml(value,session.encoding)