[Zope-CMF] Understanding Folders and Workflow

chris chris@palefish.co.uk
Sat, 05 Oct 2002 18:25:53 +0100


Erik Lange wrote:

> At 10:16 PM 10/4/02, Carl Rendell wrote:
>
>> A few of us have been discussing Folders and Workflow, and I'd like 
>> to get some closure on the subject.
>>
>> So far it appears that any folderish type which is governed by 
>> workflow will, on its initial workflow state change (private to 
>> published) change the allowedRolesAndUsers attribute for items within 
>> the folder's branch.
>>
>> This only occurs on the initial state transition though. Subciquent 
>> retraction/rejection and publishing does not have the same effect.
>>
>> The questions are..
>>
>> Is this a bug, or by design?
>
>
> That depends on the situation - it's all in the eye of the beholder :-)

Well I'm with Carl on this, I'm totally mystified and can't really see a 
useful scenario for the current behaviour. Workflow of folders looks 
like a distinctly sticky issue.

However as Erik points out it isn't actually necessary to solve this 
particular problem at the workflow level, it can be readily solved as a 
skin:

Erik Lange wrote:

> We've solved this in two ways:
>
> 1. A multiple publishing page, that lists all objects in a folder, 
> where you can select by check-boxes,which objects (the event, the 
> masterfile and the clips) the user wishes to publish (or retract, or 
> hide, or make visible). 


Earlier I suggested some semantics which I'd like for a workflowed folder:

chris wrote:

> 'publishing' a folder simply 'publishes' all of its children
> 'retracting' a folder similarly 'retracts' all of its children
> the 'review_state' of  the folder is then calculated on the state of 
> its children:
>  - 'published' if all children are 'published',
>  - 'private' if all children are 'private'
>  - 'mixed' otherwise.

The following achives it as a skin:

--oOo--

## Script (Python) "bulk_status_check"
def sum(a,b):
  if a=='':   return b
  elif b=='': return a
  elif a==b:  return a
  else:       return 'mixed'

state = context.portal_workflow.getInfoFor(context, 'review_state', '')

for obj in context.objectValues():
  state = sum(state, obj.bulk_status_check())

return state

--oOo--

## Script (Python) "bulk_status_modify"

##parameters= redirect=1


action = context.REQUEST.action

if redirect:
  context.REQUEST[ 'RESPONSE' ].redirect( context.absolute_url()+
    '/publish_contents_form?portal_status_message=Status+changed.')

try:
  context.portal_workflow.doActionFor(context,action,comment='changed by 
bulk_status_modify')
except:
  pass

objs = context.objectValues()
for obj in objs:
  obj.bulk_status_modify(redirect=0)

--oOo--
publish_contents_form.pt

<html xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      metal:use-macro="here/main_template/macros/master">
<body>
<div metal:fill-slot="main">
<div class="Desktop">

<h1> Publication of <span tal:replace="here/getId">Item</span>'s 
Contents</h1>
<p>This page can be used to publish, or retract all of the items in this 
folder.
Currently the items in this folder are in a
<b tal:content="here/bulk_status_check">unknown</b> review state</p>

<form method="post" action="bulk_status_modify"
      tal:attributes="action 
string:${here/absolute_url}/bulk_status_modify">
 <input type="submit" name="action" value="publish">
 <input type="submit" name="action" value="retract">
</form>

</div>
</div>
</body>
</html>

--oOo--

publish_content_form is then intended to be added as an action of Portal 
Folders, eg 'Publish Contents'

Best regards,
Chris.