Make saved searches private by default #4566

This commit is contained in:
Nicolas Demonte 2020-06-30 18:28:31 +02:00
parent d82a32792c
commit 20e957d2a4
8 changed files with 195 additions and 10 deletions

View File

@ -44,6 +44,10 @@ msgstr "Retour à attribuer"
msgid "Back to draft"
msgstr "Retour à la rédaction"
#: ../profiles/default/workflows/private_public_workflow/definition.xml
msgid "Back to private"
msgstr ""
#: ../profiles/default/workflows/incomingmail_workflow/definition.xml
msgid "Back to registering"
msgstr "Retour à indicater"
@ -138,6 +142,10 @@ msgstr "Sans suite"
msgid "Obsolete"
msgstr "Obsolète"
#: ../profiles/default/workflows/private_public_workflow/definition.xml
msgid "Private"
msgstr ""
#: ../profiles/default/workflows/pfwbgeddocument_workflow/definition.xml
msgid "Process"
msgstr "Traiter"
@ -151,7 +159,12 @@ msgstr "Traité"
msgid "Processing"
msgstr "En cours de traitement"
#: ../profiles/default/workflows/private_public_workflow/definition.xml
msgid "Publish"
msgstr ""
#: ../profiles/default/workflows/appendix_workflow/definition.xml
#: ../profiles/default/workflows/private_public_workflow/definition.xml
msgid "Published"
msgstr "Publiée"

View File

@ -45,6 +45,10 @@ msgstr ""
msgid "Back to draft"
msgstr ""
#: ../profiles/default/workflows/private_public_workflow/definition.xml
msgid "Back to private"
msgstr ""
#: ../profiles/default/workflows/incomingmail_workflow/definition.xml
msgid "Back to registering"
msgstr ""
@ -128,6 +132,10 @@ msgstr ""
msgid "Obsolete"
msgstr ""
#: ../profiles/default/workflows/private_public_workflow/definition.xml
msgid "Private"
msgstr ""
#: ../profiles/default/workflows/pfwbgeddocument_workflow/definition.xml
msgid "Process"
msgstr ""
@ -141,7 +149,12 @@ msgstr ""
msgid "Processing"
msgstr ""
#: ../profiles/default/workflows/private_public_workflow/definition.xml
msgid "Publish"
msgstr ""
#: ../profiles/default/workflows/appendix_workflow/definition.xml
#: ../profiles/default/workflows/private_public_workflow/definition.xml
msgid "Published"
msgstr ""

View File

@ -1,6 +1,6 @@
<?xml version="1.0"?>
<metadata>
<version>8</version>
<version>9</version>
<dependencies>
<dependency>profile-collective.dms.basecontent:default</dependency>
<dependency>profile-collective.dms.batchimport:default</dependency>

View File

@ -8,6 +8,7 @@
<object name="pfwbgeddocument_workflow" meta_type="Workflow"/>
<object name="pfwbgedfolder_workflow" meta_type="Workflow"/>
<object name="pfwbgedmainfolder_workflow" meta_type="Workflow"/>
<object name="private_public_workflow" meta_type="Workflow"/>
<object name="versionnote_workflow" meta_type="Workflow"/>
<bindings>
<default>
@ -17,7 +18,7 @@
<bound-workflow workflow_id=""/>
</type>
<type type_id="pfwbgedcollection">
<bound-workflow workflow_id="one_state_workflow"/>
<bound-workflow workflow_id="private_public_workflow"/>
</type>
<type type_id="pfwbgedlink">
<bound-workflow workflow_id=""/>

View File

@ -0,0 +1,106 @@
<?xml version="1.0"?>
<dc-workflow workflow_id="private_public_workflow"
title="Private Public Workflow"
description="Accessible by owner and managers when private, by everyone when published"
state_variable="review_state"
initial_state="private"
manager_bypass="True"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
i18n:domain="plone">
<permission>Access contents information</permission>
<permission>Delete objects</permission>
<permission>Modify portal content</permission>
<permission>View</permission>
<state state_id="private" title="Private" i18n:attributes="title">
<exit-transition transition_id="publish"/>
<permission-map name="View" acquired="False">
<permission-role>Manager</permission-role>
<permission-role>Owner</permission-role>
</permission-map>
<permission-map name="Access contents information" acquired="False">
<permission-role>Manager</permission-role>
<permission-role>Owner</permission-role>
</permission-map>
<permission-map name="Modify portal content" acquired="False">
<permission-role>Manager</permission-role>
<permission-role>Owner</permission-role>
</permission-map>
<permission-map name="Delete objects" acquired="False">
<permission-role>Manager</permission-role>
<permission-role>Owner</permission-role>
</permission-map>
</state>
<state state_id="published" title="Published" i18n:attributes="title">
<exit-transition transition_id="back_to_private"/>
<permission-map name="View" acquired="False">
<permission-role>Anonymous</permission-role>
</permission-map>
<permission-map name="Access contents information" acquired="False">
<permission-role>Anonymous</permission-role>
</permission-map>
<permission-map name="Modify portal content" acquired="False">
<permission-role>Manager</permission-role>
<permission-role>Owner</permission-role>
</permission-map>
<permission-map name="Delete objects" acquired="False">
<permission-role>Manager</permission-role>
<permission-role>Owner</permission-role>
</permission-map>
</state>
<transition transition_id="back_to_private" title="Back to private" new_state="private" trigger="USER" before_script="" after_script="" i18n:attributes="title">
<action url="" category="workflow" icon="" i18n:translate="">Back to private</action>
<guard>
<guard-role>Manager</guard-role>
<guard-role>Owner</guard-role>
</guard>
</transition>
<transition transition_id="publish" title="Publish" new_state="published" trigger="USER" before_script="" after_script="" i18n:attributes="title">
<action url="" category="workflow" icon="" i18n:translate="">Publish</action>
<guard>
<guard-role>Manager</guard-role>
<guard-role>Owner</guard-role>
</guard>
</transition>
<variable variable_id="action" for_catalog="False" for_status="True" update_always="True">
<description>Previous transition</description>
<default>
<expression>transition/getId|nothing</expression>
</default>
<guard>
</guard>
</variable>
<variable variable_id="actor" for_catalog="False" for_status="True" update_always="True">
<description>The ID of the user who performed the last transition</description>
<default>
<expression>user/getId</expression>
</default>
<guard>
</guard>
</variable>
<variable variable_id="comments" for_catalog="False" for_status="True" update_always="True">
<description>Comment about the last transition</description>
<default>
<expression>python:state_change.kwargs.get('comment', '')</expression>
</default>
<guard>
</guard>
</variable>
<variable variable_id="review_history" for_catalog="False" for_status="False" update_always="False">
<description>Provides access to workflow history</description>
<default>
<expression>state_change/getHistory</expression>
</default>
<guard>
<guard-permission>Request review</guard-permission>
<guard-permission>Review portal content</guard-permission>
</guard>
</variable>
<variable variable_id="time" for_catalog="False" for_status="True" update_always="True">
<description>When the previous transition was performed</description>
<default>
<expression>state_change/getDateTime</expression>
</default>
<guard>
</guard>
</variable>
</dc-workflow>

View File

@ -94,6 +94,8 @@ def create_tasks_collections(context):
item_count=item_count,
query=query,
)
api.content.transition(collection, 'publish')
role = u'responsible'
id = '%s-%s' % (type, role)
if id not in container:
@ -108,6 +110,8 @@ def create_tasks_collections(context):
item_count=item_count,
query=query,
)
api.content.transition(collection, 'publish')
# opinions
type = u'opinion'
role = u'enquirer'
@ -124,6 +128,8 @@ def create_tasks_collections(context):
item_count=item_count,
query=query,
)
api.content.transition(collection, 'publish')
role = u'responsible'
id = '%s-%s' % (type, role)
if id not in container:
@ -138,6 +144,8 @@ def create_tasks_collections(context):
item_count=item_count,
query=query,
)
api.content.transition(collection, 'publish')
# validations
type = u'validation'
role = u'enquirer'
@ -154,6 +162,8 @@ def create_tasks_collections(context):
item_count=item_count,
query=query,
)
api.content.transition(collection, 'publish')
role = u'responsible'
id = '%s-%s' % (type, role)
if id not in container:
@ -168,6 +178,8 @@ def create_tasks_collections(context):
item_count=item_count,
query=query,
)
api.content.transition(collection, 'publish')
# informations
sort_on = u'created'
type = u'information'
@ -185,6 +197,8 @@ def create_tasks_collections(context):
item_count=item_count,
query=query,
)
api.content.transition(collection, 'publish')
role = u'responsible'
id = '%s-%s' % (type, role)
if id not in container:
@ -199,6 +213,8 @@ def create_tasks_collections(context):
item_count=item_count,
query=query,
)
api.content.transition(collection, 'publish')
def setup_folder_portlets(folder):

View File

@ -81,4 +81,21 @@
handler=".registry.setup_mail_reader_group"
/>
<genericsetup:upgradeSteps
source="8"
destination="9"
profile="pfwbged.policy:default">
<genericsetup:upgradeStep
title="Update saved search workflow"
description=""
handler=".workflow.update_saved_search_workflow"
/>
<genericsetup:upgradeDepends
title="Reimport workflows"
import_steps="workflow" />
</genericsetup:upgradeSteps>
</configure>

View File

@ -76,25 +76,44 @@ def update_refused_version_state(context):
version.reindexObject(idxs=['allowedRolesAndUsers', 'review_state'])
def refresh_workflow_permissions(context, workflow_id):
def refresh_workflow_permissions(context, workflow_id, folder_path=None):
if not folder_path:
folder_path = '/'.join(api.portal.get().getPhysicalPath())
portal_workflow = api.portal.get_tool('portal_workflow')
portal_catalog = api.portal.get_tool('portal_catalog')
workflow = portal_workflow.getWorkflowById(workflow_id)
portal = api.portal.get()
folder_path = '/'.join(portal['documents'].getPhysicalPath())
for dx_type, wf_ids in portal_workflow._chains_by_type.items():
if workflow_id in wf_ids:
query = {'path': {
'query': folder_path},
'portal_type': dx_type}
query = {
'path': {'query': folder_path},
'portal_type': dx_type,
}
results = portal_catalog.unrestrictedSearchResults(query)
for brain in results:
obj = brain.getObject()
workflow.updateRoleMappingsFor(obj)
obj.reindexObjectSecurity()
obj.reindexObject(idxs=['allowedRolesAndUsers'])
obj.reindexObject(idxs=['allowedRolesAndUsers', 'review_state'])
def incomingmail_deletion_permissions(context):
refresh_workflow_permissions(context, "incomingmail_workflow")
folder_path = '/'.join(api.portal.get()['documents'].getPhysicalPath())
refresh_workflow_permissions(context, "incomingmail_workflow", folder_path)
def update_saved_search_workflow(context):
refresh_workflow_permissions(context, "private_public_workflow")
# publish the communal searches in /Members
query = {
'path': {
'query': '/'.join(api.portal.get().Members.getPhysicalPath()),
'depth': 1,
},
'portal_type': 'pfwbgedcollection',
'review_state': 'private',
}
portal_catalog = api.portal.get_tool('portal_catalog')
for brain in portal_catalog.unrestrictedSearchResults(query):
api.content.transition(brain.getObject(), 'publish')