"""helper functions for application hooks:organization: Logilab:copyright: 2001-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr"""__docformat__="restructuredtext en"fromsmtplibimportSMTPfromthreadingimportLockfromcubicwebimportRepositoryErrorfromcubicweb.server.poolimportOperation,SingleLastOperationdefentity_name(session,eid):"""return the "name" attribute of the entity with the given eid"""returnentity_attr(session,eid,'name')defentity_attr(session,eid,attr):"""return an arbitrary attribute of the entity with the given eid"""rset=session.execute('Any N WHERE X eid %%(x)s, X %s N'%attr,{'x':eid},'x')returnrset[0][0]defrproperty(session,rtype,eidfrom,eidto,rprop):rschema=session.repo.schema[rtype]subjtype=session.describe(eidfrom)[0]objtype=session.describe(eidto)[0]returnrschema.rproperty(subjtype,objtype,rprop)defcheck_internal_entity(session,eid,internal_names):"""check that the entity's name is not in the internal_names list. raise a RepositoryError if so, else return the entity's name """name=entity_name(session,eid)ifnameininternal_names:raiseRepositoryError('%s entity can\'t be deleted'%name)returnnamedefget_user_sessions(repo,ueid):forsessioninrepo._sessions.values():ifueid==session.user.eid:yieldsession# mail related ################################################################SMTP_LOCK=Lock()classSendMailOp(SingleLastOperation):def__init__(self,session,msg=None,recipients=None,**kwargs):# may not specify msg yet, as# `cubicweb.sobjects.supervision.SupervisionMailOp`ifmsgisnotNone:assertrecipientsself.to_send=[(msg,recipients)]else:assertrecipientsisNoneself.to_send=[]super(SendMailOp,self).__init__(session,**kwargs)defregister(self,session):previous=super(SendMailOp,self).register(session)ifprevious:self.to_send=previous.to_send+self.to_senddefcommit_event(self):self.repo.threaded_task(self.sendmails)defsendmails(self):server,port=self.config['smtp-host'],self.config['smtp-port']SMTP_LOCK.acquire()try:try:smtp=SMTP(server,port)exceptException,ex:self.exception("can't connect to smtp server %s:%s (%s)",server,port,ex)returnheloaddr='%s <%s>'%(self.config['sender-name'],self.config['sender-addr'])formsg,recipientsinself.to_send:try:smtp.sendmail(heloaddr,recipients,msg.as_string())exceptException,ex:self.exception("error sending mail to %s (%s)",recipients,ex)smtp.close()finally:SMTP_LOCK.release()# state related ###############################################################defprevious_state(session,eid):"""return the state of the entity with the given eid, usually since it's changing in the current transaction. Due to internal relation hooks, the relation may has been deleted at this point, so we have handle that """foreidfrom,rtype,eidtoinreversed(session.query_data('pendingrelations',())):ifrtype=='in_state'andeidfrom==eid:rset=session.execute('Any S,N WHERE S eid %(x)s, S name N',{'x':eidto},'x')returnrset.get_entity(0,0)rset=session.execute('Any S,N WHERE X eid %(x)s, X in_state S, S name N',{'x':eid},'x')ifrset:returnrset.get_entity(0,0)