sobjects/email.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Tue, 22 Dec 2009 21:02:37 +0100
branchstable
changeset 4195 86dcaf6bb92f
parent 3248 db09803df8b2
child 4212 ab6573088b4a
permissions -rw-r--r--
closes #601987 1) sqlutils.restore_from_file have to use its confirm argument when a command fail, to propose to continue there (this can't be handled by the caller) 2) source.restore method hence needs to take this confirmation callback as argument 3) properly fix places where 'drop' was given instead of 'confirm'

"""hooks to ensure use_email / primary_email relations consistency

: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"

from cubicweb.server.hooksmanager import Hook
from cubicweb.server.pool import PreCommitOperation
from cubicweb.server.repository import ensure_card_respected

class SetUseEmailRelationOp(PreCommitOperation):
    """delay this operation to commit to avoid conflict with a late rql query
    already setting the relation
    """
    rtype = 'use_email'
    fromeid = toeid = None # make pylint happy

    def condition(self):
        """check entity has use_email set for the email address"""
        return not self.session.unsafe_execute(
            'Any X WHERE X eid %(x)s, X use_email Y, Y eid %(y)s',
            {'x': self.fromeid, 'y': self.toeid}, 'x')

    def precommit_event(self):
        session = self.session
        if self.condition():
            # we've to handle cardinaly by ourselves since we're using unsafe_execute
            # but use session.execute and not session.unsafe_execute to check we
            # can change the relation
            ensure_card_respected(session.execute, session,
                                  self.fromeid, self.rtype, self.toeid)
            session.unsafe_execute(
                'SET X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % self.rtype,
                {'x': self.fromeid, 'y': self.toeid}, 'x')

class SetPrimaryEmailRelationOp(SetUseEmailRelationOp):
    rtype = 'primary_email'

    def condition(self):
        """check entity has no primary_email set"""
        return not self.session.unsafe_execute(
            'Any X WHERE X eid %(x)s, X primary_email Y',
            {'x': self.fromeid}, 'x')


class SetPrimaryEmailHook(Hook):
    """notify when a bug or story or version has its state modified"""
    events = ('after_add_relation',)
    accepts = ('use_email',)

    def call(self, session, fromeid, rtype, toeid):
        subjtype = session.describe(fromeid)[0]
        eschema = self.vreg.schema[subjtype]
        if 'primary_email' in eschema.subject_relations():
            SetPrimaryEmailRelationOp(session, vreg=self.vreg,
                                      fromeid=fromeid, toeid=toeid)

class SetUseEmailHook(Hook):
    """notify when a bug or story or version has its state modified"""
    events = ('after_add_relation',)
    accepts = ('primary_email',)

    def call(self, session, fromeid, rtype, toeid):
        subjtype = session.describe(fromeid)[0]
        eschema = self.vreg.schema[subjtype]
        if 'use_email' in eschema.subject_relations():
            SetUseEmailRelationOp(session, vreg=self.vreg,
                                  fromeid=fromeid, toeid=toeid)