[zopeorg-checkins] CVS: Products/ZopeOrg-NV - ZopeOrgWorkflow.py:1.18 __init__.py:1.19
Sidnei da Silva
sidnei at x3ng.com.br
Tue Feb 11 13:41:52 EST 2003
Update of /cvs-zopeorg/Products/ZopeOrg-NV
In directory cvs.zope.org:/tmp/cvs-serv7019
Modified Files:
ZopeOrgWorkflow.py __init__.py
Log Message:
Ouch. Forgot to commit this before going to Paris. :(
=== Products/ZopeOrg-NV/ZopeOrgWorkflow.py 1.17 => 1.18 ===
-"""
-A specialized workflow for zope.org which defines a variety of new states
-and transition conditions
-"""
-__version__='$Revision$'[11:-2]
-
-
-from Products.CMFCore.WorkflowTool import addWorkflowClass
-from Globals import InitializeClass
-from Products.CMFCore.WorkflowCore import ObjectDeleted, ObjectMoved
-from Products.CMFCore.utils import getToolByName, _checkPermission
-from Products.CMFCore.utils import _modifyPermissionMappings
-from Products.CMFDefault.DefaultWorkflow import DefaultWorkflowDefinition
-from Products.CMFDefault.Favorite import Favorite
-from Acquisition import aq_base, aq_inner, aq_parent
-from string import replace
-
-
-class ZopeOrgWorkflowDefinition( DefaultWorkflowDefinition ):
- id = 'zopeorg_workflow'
- title = 'General Zope.org Workflow'
- _isAWorkflow = 1
-
-
- def __init__(self, id):
- self.id = id
-
-
- def listObjectActions(self, info):
- '''
- Allows this workflow to
- include actions to be displayed in the actions box.
- Called only when this workflow is applicable to
- info.content.
- Returns the actions to be displayed to the user.
- '''
- if info.isAnonymous:
- return None
-
- # The following operation is quite expensive.
- # We don't need to perform it if the user
- # doesn't have the required permission.
- content = info.content
- content_url = info.content_url
- content_creator = content.Creator()
- pm = getToolByName(self, 'portal_membership')
- current_user = pm.getAuthenticatedMember().getUserName()
- review_state = self.getReviewStateOf(content)
- actions = []
-
- allow_review = _checkPermission('Review portal content', content)
- allow_request = _checkPermission('Request review', content)
- allow_change = _checkPermission('Manage properties', content)
- is_owner = current_user == content_creator
- is_sitemanager = _checkPermission('Manage portal', content)
- append_action = (lambda name, p, url=content_url, a=actions.append:
- a({'name': name,
- 'url': url + '/' + p,
- 'permissions': (),
- 'category': 'workflow'}))
-
- show_reject = 0
- show_retract = 0
- show_obsolete = 0
-
- if review_state == 'private':
- if allow_request:
- if is_sitemanager:
- append_action('Publish', 'content_publish_form')
- else:
- append_action('Submit', 'content_submit_form')
- if is_owner:
- show_obsolete = 1
-
- elif review_state == 'pending':
- if is_owner and allow_request:
- show_retract = 1
- if is_sitemanager or ( allow_review and not is_owner ):
- append_action('Publish', 'content_publish_form')
- show_reject = 1
-
- elif review_state == 'published':
- if is_owner and allow_request:
- show_retract = 1
- show_obsolete = 1
- if allow_review and not is_owner:
- show_reject = 1
-
- elif review_state == 'obsolete':
- if allow_request or allow_review:
- append_action('Restore', 'content_refresh_form')
-
- if show_retract:
- append_action('Retract', 'content_retract_form')
- if show_obsolete:
- append_action('Obsolete', 'content_obsolete_form')
- if show_reject:
- append_action('Reject', 'content_reject_form')
- if allow_review or allow_request:
- append_action('Status history', 'content_status_history')
-
- return actions
-
-
- def listGlobalActions(self, info):
- '''
- Allows this workflow to
- include actions to be displayed in the actions box.
- Called on every request.
- Returns the actions to be displayed to the user.
- '''
- if (info.isAnonymous or not _checkPermission(
- 'Review portal content', info.portal)):
- return None
-
- actions = []
- return actions
-
-
- def isActionSupported(self, ob, action):
- '''
- Returns a true value if the given action name is supported.
- '''
- return (action in ( 'submit'
- , 'retract'
- , 'publish'
- , 'reject'
- , 'obsolete'
- , 'refresh'
- ))
-
-
- def doActionFor(self, ob, action, comment='', **kw):
- '''
- Allows the user to request a workflow action. This method
- must perform its own security checks.
- '''
- allow_review = _checkPermission('Review portal content', ob)
- allow_request = _checkPermission('Request review', ob)
- allow_change = _checkPermission('Manage properties', ob)
- is_sitemanager = _checkPermission('Manage portal', ob)
- content_creator = ob.Creator()
- pm = getToolByName(self, 'portal_membership')
- current_user = pm.getAuthenticatedMember().getUserName()
- is_owner = current_user == content_creator
- review_state = self.getReviewStateOf(ob)
- tool = aq_parent(aq_inner(self))
-
- if action == 'submit':
- if not allow_request:
- raise 'Unauthorized', 'Not authorized'
- elif review_state != 'private':
- raise 'Unauthorized', 'Already in submit state'
- self.setReviewStateOf(ob, 'pending', action, comment)
-
- elif action == 'retract':
- if not allow_request:
- raise 'Unauthorized', 'Not authorized'
- elif review_state == 'private':
- raise 'Unauthorized', 'Already private'
-
- if (not is_owner) and not allow_review:
- raise 'Unauthorized', 'Not creator or reviewer'
- self.setReviewStateOf(ob, 'private', action, comment)
-
- elif action == 'publish':
- if ( not allow_review or is_owner ) and not is_sitemanager:
- raise 'Unauthorized', 'Not authorized'
- self.setReviewStateOf(ob, 'published', action, comment)
-
- elif action == 'reject':
- if not allow_review or is_owner:
- raise 'Unauthorized', 'Not authorized'
-
- self.setReviewStateOf(ob, 'private', action, comment)
-
- elif action == 'obsolete':
- if not allow_change:
- raise 'Unauthorized', 'Not authorized'
- self.setReviewStateOf(ob, 'obsolete', action, comment)
- self.unindexObject()
- raise ObjectDeleted
-
- elif action == 'refresh':
- if review_state != 'obsolete':
- msg = 'Only "obsolete" content can be refreshed'
- raise 'Unauthorized', msg
- wf_tool = getToolByName(self, 'portal_workflow')
- wf_chain = wf_tool.getChainFor(ob)
- if wf_chain:
- wf_id = wf_chain[0]
- wf_history = wf_tool.getHistoryOf(wf_id, ob)
- if len(wf_history) > 1:
- prev_status = wf_history[-2]['review_state']
- else:
- prev_status = 'private'
-
- self.setReviewStateOf(ob, prev_status, action, comment)
-
-
- def updateRoleMappingsFor(self, ob):
- '''
- Changes the object permissions according to the current
- review_state.
- '''
- review_state = self.getReviewStateOf(ob)
- if review_state == 'private':
- anon_view = 0
- owner_modify = 1
- reviewer_view = 0
- elif review_state == 'pending':
- anon_view = 0
- owner_modify = 0 # Require a retraction for editing.
- reviewer_view = 1
- elif review_state == 'published':
- anon_view = 1
- owner_modify = 0
- reviewer_view = 1
- elif review_state == 'obsolete':
- anon_view = 1
- owner_modify = 1
- reviewer_view = 1
-
- # Modify role to permission mappings directly.
-
- return _modifyPermissionMappings(ob,
- {'View': {'Anonymous': anon_view,
- 'Reviewer': reviewer_view,
- 'Owner': 1,
- },
- 'Modify portal content': {'Owner': owner_modify}})
-
-
-InitializeClass( ZopeOrgWorkflowDefinition )
-
-addWorkflowClass( ZopeOrgWorkflowDefinition )
+from Products.CMFCore.WorkflowTool import addWorkflowFactory
+from Products.DCWorkflow.Default import createDefaultWorkflowClassic
+from Products.PythonScripts.PythonScript import PythonScript
+from Products.CMFCore.CMFCorePermissions import ReviewPortalContent, \
+ RequestReview
+
+obsolete_script_id = 'obsoleteObject'
+obsolete_script = '''
+## Script (Python) "%s"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=state_change
+##title=Uncatalog an obsolete object
+state_change.object.unindexObject()
+''' % obsolete_script_id
+
+refresh_script_id = 'refreshObject'
+refresh_script = '''
+## Script (Python) "%s"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=state_change
+##title=Revert an object to previous state, and recatalog it
+state_change.object.reindexObject()
+''' % refresh_script_id
+
+def createZopeOrgWorkflow(id):
+ wf = createDefaultWorkflowClassic(id)
+ setupZopeOrgWorkflow(wf)
+ return wf
+
+addWorkflowFactory( createZopeOrgWorkflow, id='zopeorg_default_workflow'
+ , title='Default Zope.org Workflow')
+
+obsoletable_states = ('private', 'published')
+obsolete_state = 'obsolete'
+obsolete_trans = obsolete_state
+refresh_trans = 'refresh'
+
+def setupZopeOrgWorkflow(wf):
+ '''
+ Add obsoleting/refreshing transitions and state to classic wf
+ '''
+ wf.setProperties(title='Zope.org workflow')
+
+ wf.transitions.addTransition(obsolete_trans)
+ wf.transitions.addTransition(refresh_trans)
+
+ wf.states.addState(obsolete_state)
+ wf.states[obsolete_state].setProperties(
+ title='Obsolete (uncataloged)',
+ transitions=(refresh_trans,))
+
+ for state in obsoletable_states:
+ wf.states[state].transitions += (obsolete_trans,)
+
+ # eek! why no addScript() method?
+ wf.scripts._setObject(obsolete_script_id,
+ PythonScript(obsolete_script_id))
+ getattr(wf.scripts, obsolete_script_id).write(obsolete_script)
+ wf.scripts._setObject(refresh_script_id, PythonScript(refresh_script_id))
+ getattr(wf.scripts, refresh_script_id).write(refresh_script)
+
+ wf.transitions[obsolete_trans].setProperties(
+ title = 'Make content obsolete',
+ new_state_id = obsolete_state,
+ actbox_name = 'Obsolete',
+ actbox_url = '%(content_url)s/content_obsolete_form',
+ props = {'guard_permissions': '%s;%s' % (ReviewPortalContent,
+ RequestReview)},
+ after_script_name = obsolete_script_id)
+
+ wf.transitions[refresh_trans].setProperties(
+ title = 'Re-enable obsolete content',
+ new_state_id = 'private',
+ actbox_name = 'Refresh',
+ actbox_url = '%(content_url)s/content_refresh_form',
+ props = {'guard_permissions': '%s;%s' % (ReviewPortalContent,
+ RequestReview)},
+ after_script_name = refresh_script_id)
=== Products/ZopeOrg-NV/__init__.py 1.18 => 1.19 ===
from Products.CMFCore.utils import registerIcon, ToolInit, ContentInit
from Products.CMFCore.CMFCorePermissions import AddPortalContent
from Products.CMFCore import PortalFolder
-#import SoftwareProduct
-import NewsItemWorkflow
import ZopeOrgWorkflow
-#import ZopeOrgMemberDataTool
-#import ZopeOrgMembershipTool
import ContentList
import Acquisition
import CaseStudy
import ZopeServiceProvider
+#import SoftwareProduct
+#import ZopeOrgMemberDataTool
+#import ZopeOrgMembershipTool
#Hackish workaround to allow accesing the broken ZODB on ZopeOrg
class ImplicitAcquirerWrapper:
@@ -37,21 +36,24 @@
def initialize( context ):
""" Initialize the ZopeOrg components """
- registerIcon( NewsItemWorkflow.NewsItemWorkflowDefinition
- , 'images/org_workflow.gif'
- , globals()
- )
-
- registerIcon( ZopeOrgWorkflow.ZopeOrgWorkflowDefinition
- , 'images/org_workflow.gif'
- , globals()
- )
context.registerClass( ContentList.ContentList
, constructors=CL_CTORS
, permission='Manage portal'
)
+ ContentInit(
+ 'Zope.org Content',
+ content_types = ( CaseStudy.CaseStudy
+ , ZopeServiceProvider.ZopeServiceProvider
+ ),
+ permission = AddPortalContent,
+ extra_constructors = ( CaseStudy.addCaseStudy
+ , ZopeServiceProvider.addZSP
+ ),
+ fti = ftis ,
+ ).initialize(context)
+
#ToolInit(
# 'Zope.Org Tools',
# tools = ( ZopeOrgMemberDataTool.ZopeOrgMemberDataTool
@@ -72,15 +74,3 @@
# ),
# fti = ftis ,
# ).initialize(context)
-
- ContentInit(
- 'Zope.org Content',
- content_types = ( CaseStudy.CaseStudy
- , ZopeServiceProvider.ZopeServiceProvider
- ),
- permission = AddPortalContent,
- extra_constructors = ( CaseStudy.addCaseStudy
- , ZopeServiceProvider.addZSP
- ),
- fti = ftis ,
- ).initialize(context)
More information about the zopeorg-checkins
mailing list