[Zope-CMF] Re[2]: DCWorkflow + Acqusition

Victor Safronovich vsafronovich at naumen.ru
Tue Oct 11 08:52:17 EDT 2005


Hello Tres Seaver,

Tuesday, October 11, 2005, 5:52:19 PM, you wrote:

Tres, thank you for your help!
I  use  3  way  in  the future, like using CMFUID, but i have my own uids for my
objects.

Meanwhile in the begining of the '__do_something_with_my_object__' i use
try:
   aq_parent(aq_inner(my_object))._getOb(my_object.getId())
except AttributeError:
   my_object  =  my_object.getObjectByUid(my_object.getUid()) # my methods, this
                                                              # rewrapps my_object


TS> The call chain looks like:

TS>   <your code> ->
TS>     wf_tool.doActdionFor(...) ->
TS>       wf_tool._invokeWithNotification
   Yes.

TS> Both of the tool methods return the result of calling the action.  In
TS> cases where the ObjectMoved exception is raised, the exception has the
TS> "new" object wrappers available, but the tool consumes that part of the
TS> information (as you note).

>>   Or may be i use WorkflowTool wrongly.

TS> Not really;  but the tool doesn't expect that you will need reindex the
TS> object (it already does that in the new location).

TS> Here are a couple of alternate strategies:

TS>  - You could modify the workflow action's result (which is coming from
TS>    the code which actually raises the ObjectMoved exception) to include
TS>    the newly-wrapped object in the result (e.g., as a tuple with the
TS>    current result).
   Question from other topic: What doActionFor usually returns?
   
   DCWorkflowDefinition.doActionFor returns usually None, but
   DCWorkflowDefinition.wrapWorkflowMethod  returns result of the custom method.


TS>  - You could move the code in '__do_something_with_my_object__' into an
TS>    "after" script of the workflow, where it would be passed the object
TS>    in its new wrappers.
   this is usefull too, because portal_workflow do reindexObject with new dict
   that  getCatalogVariablesFor  method  returned,  but  usually  i  have  many
   ZCatalogs   that  indexed  my_object  (  though  this  fixed  by  overriding
   reindexObject method )

TS>  - You could use the CMFUID tools, and find the object in its new
TS>    location after running the workflow transition using its UID.
   the best solution :)

   Or, may be added to ImplicitAcquisionWrapper new method 'aq_rewrap'
   for example
>>> l = [1,2,3]
>>> def list_modification1(l):
        l = [3,2,1]

>>> def list_modification2(l):
        l[:] = [3,2,1]

>>> list_modification1(l)
>>> l
[1, 2, 3]
>>> list_modification2(l)
>>> l
[3, 2, 1] <-- changed the list

wrapper = ImplicitAcquisitionWrapper( obj, container )
ImplicitAcqusitionWrapper sets 2 C attributes

  self->obj=obj;
  self->container=container;

and  ImplicitAcqusitionWrapper.aq_rewrap( self, container )  sets  new container to
self->container.
And use aq_rewrap instead of ObjectMoved.getNewObject.

Is this usefull, and do i need to send this to zope-dev at zope.org?

-- 
Best regards,
 Victor Safronovich
 NauMen.NauDoc.SoftwareDeveloper  http://www.naumen.ru



More information about the Zope-CMF mailing list