--- a/hooks/workflow.py Tue Sep 11 22:32:01 2012 +0200
+++ b/hooks/workflow.py Mon Sep 17 17:48:55 2012 +0200
@@ -1,4 +1,4 @@
-# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
#
# This file is part of CubicWeb.
@@ -18,12 +18,12 @@
"""Core hooks: workflow related hooks"""
__docformat__ = "restructuredtext en"
+_ = unicode
from datetime import datetime
-from yams.schema import role_name
-from cubicweb import RepositoryError, ValidationError
+from cubicweb import RepositoryError, validation_error
from cubicweb.predicates import is_instance, adaptable
from cubicweb.server import hook
@@ -92,9 +92,8 @@
if mainwf.eid == self.wfeid:
deststate = mainwf.initial
if not deststate:
- qname = role_name('custom_workflow', 'subject')
- msg = session._('workflow has no initial state')
- raise ValidationError(entity.eid, {qname: msg})
+ msg = _('workflow has no initial state')
+ raise validation_error(entity, {('custom_workflow', 'subject'): msg})
if mainwf.state_by_eid(iworkflowable.current_state.eid):
# nothing to do
return
@@ -119,9 +118,8 @@
outputs = set()
for ep in tr.subworkflow_exit:
if ep.subwf_state.eid in outputs:
- qname = role_name('subworkflow_exit', 'subject')
- msg = self.session._("can't have multiple exits on the same state")
- raise ValidationError(self.treid, {qname: msg})
+ msg = _("can't have multiple exits on the same state")
+ raise validation_error(self.treid, {('subworkflow_exit', 'subject'): msg})
outputs.add(ep.subwf_state.eid)
@@ -137,13 +135,12 @@
wftr = iworkflowable.subworkflow_input_transition()
if wftr is None:
# inconsistency detected
- qname = role_name('to_state', 'subject')
- msg = session._("state doesn't belong to entity's current workflow")
- raise ValidationError(self.trinfo.eid, {'to_state': msg})
+ msg = _("state doesn't belong to entity's current workflow")
+ raise validation_error(self.trinfo, {('to_state', 'subject'): msg})
tostate = wftr.get_exit_point(forentity, trinfo.cw_attr_cache['to_state'])
if tostate is not None:
# reached an exit point
- msg = session._('exiting from subworkflow %s')
+ msg = _('exiting from subworkflow %s')
msg %= session._(iworkflowable.current_workflow.name)
session.transaction_data[(forentity.eid, 'subwfentrytr')] = True
iworkflowable.change_state(tostate, msg, u'text/plain', tr=wftr)
@@ -186,9 +183,8 @@
try:
foreid = entity.cw_attr_cache['wf_info_for']
except KeyError:
- qname = role_name('wf_info_for', 'subject')
- msg = session._('mandatory relation')
- raise ValidationError(entity.eid, {qname: msg})
+ msg = _('mandatory relation')
+ raise validation_error(entity, {('wf_info_for', 'subject'): msg})
forentity = session.entity_from_eid(foreid)
# see comment in the TrInfo entity definition
entity.cw_edited['tr_count']=len(forentity.reverse_wf_info_for)
@@ -201,13 +197,13 @@
else:
wf = iworkflowable.current_workflow
if wf is None:
- msg = session._('related entity has no workflow set')
- raise ValidationError(entity.eid, {None: msg})
+ msg = _('related entity has no workflow set')
+ raise validation_error(entity, {None: msg})
# then check it has a state set
fromstate = iworkflowable.current_state
if fromstate is None:
- msg = session._('related entity has no state')
- raise ValidationError(entity.eid, {None: msg})
+ msg = _('related entity has no state')
+ raise validation_error(entity, {None: msg})
# True if we are coming back from subworkflow
swtr = session.transaction_data.pop((forentity.eid, 'subwfentrytr'), None)
cowpowers = (session.user.is_in_group('managers')
@@ -219,47 +215,42 @@
# no transition set, check user is a manager and destination state
# is specified (and valid)
if not cowpowers:
- qname = role_name('by_transition', 'subject')
- msg = session._('mandatory relation')
- raise ValidationError(entity.eid, {qname: msg})
+ msg = _('mandatory relation')
+ raise validation_error(entity, {('by_transition', 'subject'): msg})
deststateeid = entity.cw_attr_cache.get('to_state')
if not deststateeid:
- qname = role_name('by_transition', 'subject')
- msg = session._('mandatory relation')
- raise ValidationError(entity.eid, {qname: msg})
+ msg = _('mandatory relation')
+ raise validation_error(entity, {('by_transition', 'subject'): msg})
deststate = wf.state_by_eid(deststateeid)
if deststate is None:
- qname = role_name('to_state', 'subject')
- msg = session._("state doesn't belong to entity's workflow")
- raise ValidationError(entity.eid, {qname: msg})
+ msg = _("state doesn't belong to entity's workflow")
+ raise validation_error(entity, {('to_state', 'subject'): msg})
else:
# check transition is valid and allowed, unless we're coming back
# from subworkflow
tr = session.entity_from_eid(treid)
if swtr is None:
- qname = role_name('by_transition', 'subject')
+ qname = ('by_transition', 'subject')
if tr is None:
- msg = session._("transition doesn't belong to entity's workflow")
- raise ValidationError(entity.eid, {qname: msg})
+ msg = _("transition doesn't belong to entity's workflow")
+ raise validation_error(entity, {qname: msg})
if not tr.has_input_state(fromstate):
- msg = session._("transition %(tr)s isn't allowed from %(st)s") % {
- 'tr': session._(tr.name), 'st': session._(fromstate.name)}
- raise ValidationError(entity.eid, {qname: msg})
+ msg = _("transition %(tr)s isn't allowed from %(st)s")
+ raise validation_error(entity, {qname: msg}, {
+ 'tr': tr.name, 'st': fromstate.name}, ['tr', 'st'])
if not tr.may_be_fired(foreid):
- msg = session._("transition may not be fired")
- raise ValidationError(entity.eid, {qname: msg})
+ msg = _("transition may not be fired")
+ raise validation_error(entity, {qname: msg})
deststateeid = entity.cw_attr_cache.get('to_state')
if deststateeid is not None:
if not cowpowers and deststateeid != tr.destination(forentity).eid:
- qname = role_name('by_transition', 'subject')
- msg = session._("transition isn't allowed")
- raise ValidationError(entity.eid, {qname: msg})
+ msg = _("transition isn't allowed")
+ raise validation_error(entity, {('by_transition', 'subject'): msg})
if swtr is None:
deststate = session.entity_from_eid(deststateeid)
if not cowpowers and deststate is None:
- qname = role_name('to_state', 'subject')
- msg = session._("state doesn't belong to entity's workflow")
- raise ValidationError(entity.eid, {qname: msg})
+ msg = _("state doesn't belong to entity's workflow")
+ raise validation_error(entity, {('to_state', 'subject'): msg})
else:
deststateeid = tr.destination(forentity).eid
# everything is ok, add missing information on the trinfo entity
@@ -307,20 +298,18 @@
iworkflowable = entity.cw_adapt_to('IWorkflowable')
mainwf = iworkflowable.main_workflow
if mainwf is None:
- msg = session._('entity has no workflow set')
- raise ValidationError(entity.eid, {None: msg})
+ msg = _('entity has no workflow set')
+ raise validation_error(entity, {None: msg})
for wf in mainwf.iter_workflows():
if wf.state_by_eid(self.eidto):
break
else:
- qname = role_name('in_state', 'subject')
- msg = session._("state doesn't belong to entity's workflow. You may "
- "want to set a custom workflow for this entity first.")
- raise ValidationError(self.eidfrom, {qname: msg})
+ msg = _("state doesn't belong to entity's workflow. You may "
+ "want to set a custom workflow for this entity first.")
+ raise validation_error(self.eidfrom, {('in_state', 'subject'): msg})
if iworkflowable.current_workflow and wf.eid != iworkflowable.current_workflow.eid:
- qname = role_name('in_state', 'subject')
- msg = session._("state doesn't belong to entity's current workflow")
- raise ValidationError(self.eidfrom, {qname: msg})
+ msg = _("state doesn't belong to entity's current workflow")
+ raise validation_error(self.eidfrom, {('in_state', 'subject'): msg})
class SetModificationDateOnStateChange(WorkflowHook):