Skip to content

Commit

Permalink
Add workflow for proposals.
Browse files Browse the repository at this point in the history
  • Loading branch information
dukebody committed Nov 11, 2010
1 parent 9e46dd7 commit 696daa6
Show file tree
Hide file tree
Showing 5 changed files with 192 additions and 2 deletions.
9 changes: 8 additions & 1 deletion collective/libreorganizacion/content/proposal.py
Expand Up @@ -3,10 +3,12 @@
# CMF and Zope imports
from zope import schema
from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
from zope.interface import Interface
from zope.interface import Interface, implements

from plone.dexterity.content import Container
from plone.app.textfield import RichText
from plone.namedfile.field import NamedImage
from Products.CMFPlone.interfaces import INonStructuralFolder

from collective.libreorganizacion import _

Expand Down Expand Up @@ -62,3 +64,8 @@ class IProposal(Interface):
country = schema.TextLine(
title=_(u'País'),
)


class Proposal(Container):
"""Container type with a marker interface ad-hoc to allow comments."""
implements(INonStructuralFolder)
Expand Up @@ -15,7 +15,7 @@
<property name="schema">collective.libreorganizacion.content.proposal.IProposal</property>

<!-- class used for content items -->
<property name="klass">plone.dexterity.content.Container</property>
<property name="klass">collective.libreorganizacion.content.proposal.Proposal</property>

<!-- add permission -->
<property name="add_permission">collective.libreorganizacion.AddProposal</property>
Expand Down
9 changes: 9 additions & 0 deletions collective/libreorganizacion/profiles/default/workflows.xml
@@ -0,0 +1,9 @@
<?xml version="1.0"?>
<object name="portal_workflow">
<object name="collective.libreorganizacion.proposal_workflow" meta_type="Workflow" />
<bindings>
<type type_id="collective.libreorganizacion.proposal">
<bound-workflow workflow_id="collective.libreorganizacion.proposal_workflow" />
</type>
</bindings>
</object>
@@ -0,0 +1,157 @@
<?xml version="1.0"?>
<dc-workflow xmlns:i18n="http://xml.zope.org/namespaces/i18n"
i18n:domain="plone"
workflow_id="collective.libreorganizacion.proposal_workflow"
title="Workflow para propuestas"
description="Workflow para propuestas que deben ser presentadas, apoyadas para su discusión en plenario y más tarde votadas."
state_variable="review_state"
initial_state="draft"
i18n:attributes="title; description">

<permission>Access contents information</permission>
<permission>Modify portal content</permission>
<permission>View</permission>

<state state_id="draft" title="Borrador" i18n:attributes="title">
<description i18n:translate="">
La propuesta está redactándose.
</description>
<exit-transition transition_id="submit"/>
<permission-map name="Access contents information" acquired="False">
<permission-role>Editor</permission-role>
<permission-role>Manager</permission-role>
<permission-role>Owner</permission-role>
<permission-role>Reader</permission-role>
</permission-map>
<permission-map name="Modify portal content" acquired="False">
<permission-role>Editor</permission-role>
<permission-role>Manager</permission-role>
<permission-role>Owner</permission-role>
</permission-map>
<permission-map name="View" acquired="False">
<permission-role>Editor</permission-role>
<permission-role>Manager</permission-role>
<permission-role>Owner</permission-role>
<permission-role>Reader</permission-role>
</permission-map>
</state>

<state state_id="pending" title="Buscando apoyos"
i18n:attributes="title">
<description i18n:translate="">La propuesta es pública y está recabando apoyos.</description>
<exit-transition transition_id="retract"/>
<exit-transition transition_id="reject"/>
<exit-transition transition_id="promote"/>
<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>Editor</permission-role>
<permission-role>Manager</permission-role>
</permission-map>
<permission-map name="View" acquired="False">
<permission-role>Anonymous</permission-role>
</permission-map>
</state>

<state state_id="plenary" title="En plenario"
i18n:attributes="title">
<description i18n:translate="">
La propuesta ha recibido un número suficiente de apoyos y se está debatiendo en el plenario.
</description>
<exit-transition transition_id="archive"/>
<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>Editor</permission-role>
<permission-role>Manager</permission-role>
</permission-map>
<permission-map name="View" acquired="False">
<permission-role>Anonymous</permission-role>
</permission-map>
</state>

<state state_id="rejected" title="Rechazada"
i18n:attributes="title">
<description i18n:translate="">
La propuesta no recibió el apoyo suficiente y fue rechazada.
</description>
<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>Editor</permission-role>
<permission-role>Manager</permission-role>
</permission-map>
<permission-map name="View" acquired="False">
<permission-role>Anonymous</permission-role>
</permission-map>
</state>

<state state_id="archived" title="Archivada"
i18n:attributes="title">
<description i18n:translate="">
La propuesta fue debatida y votada en el plenario y está archivada.
</description>
<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>Editor</permission-role>
<permission-role>Manager</permission-role>
</permission-map>
<permission-map name="View" acquired="False">
<permission-role>Anonymous</permission-role>
</permission-map>
</state>

<transition transition_id="submit" title="Publicar"
new_state="pending" trigger="USER"
before_script="" after_script=""
i18n:attributes="title">
<action url="%(content_url)s/content_status_modify?workflow_action=submit"
category="workflow" icon="" i18n:translate="">Publicar</action>
<guard>
<guard-permission>Request review</guard-permission>
</guard>
</transition>

<transition transition_id="retract" title="Retirar"
new_state="draft" trigger="USER" before_script="" after_script=""
i18n:attributes="title">
<action url="%(content_url)s/content_status_modify?workflow_action=retract" category="workflow" icon="" i18n:translate="">Retirar</action>
<guard>
<guard-permission>Request review</guard-permission>
</guard>
</transition>

<transition transition_id="reject" title="Rechazar"
new_state="rejected" trigger="USER" before_script=""
after_script="" i18n:attributes="title">
<action url="%(content_url)s/content_status_modify?workflow_action=reject" category="workflow" icon="" i18n:translate="">Rechazar</action>
<guard>
<guard-permission>Review portal content</guard-permission>
</guard>
</transition>

<transition transition_id="promote" title="Promocionar"
new_state="plenary" trigger="USER"
before_script="" after_script=""
i18n:attributes="title">
<action url="%(content_url)s/content_status_modify?workflow_action=promote" category="workflow" icon="" i18n:translate="">Promocionar a plenario</action>
<guard>
<guard-permission>Review portal content</guard-permission>
</guard>
</transition>

<transition transition_id="archive" title="Archivar"
new_state="archived" trigger="USER" before_script="" after_script=""
i18n:attributes="title">
<action url="%(content_url)s/content_status_modify?workflow_action=archive" category="workflow" icon="" i18n:translate="">Archivar</action>
<guard>
<guard-permission>Review portal content</guard-permission>
</guard>
</transition>

</dc-workflow>
17 changes: 17 additions & 0 deletions collective/libreorganizacion/tests.py
Expand Up @@ -15,7 +15,10 @@
from plone.app.testing import login, logout
from plone.app.testing import TEST_USER_NAME

from plone.app.workflow.interfaces import ISharingPageRole

from zope.configuration import xmlconfig
from zope.component import getUtilitiesFor

from Products.CMFCore.utils import getToolByName

Expand Down Expand Up @@ -75,6 +78,19 @@ def testElectorRole(self):
"""Comprobar que existe el rol 'Elector'"""
self.assertTrue('Elector' in self.layer['portal'].valid_roles())

def testProposalWorkflow(self):
"""Comprobar que el tipo Propuesta está asociado al
workflow correspondiente."""
portal = self.layer['portal']
wt = portal.portal_workflow
self.failUnless('collective.libreorganizacion.proposal_workflow' in wt.getChainForPortalType('collective.libreorganizacion.proposal'))

def testElectorInSharing(self):
"""Comprobar que se puede asignar el rol Elector desde la
pestaña 'Compartir'."""
roles = dict(getUtilitiesFor(ISharingPageRole))
self.assertTrue('Elector' in roles)

def testElectorCanCreateProposals(self):
"""Comprobar que un Elector puede crear propuestas"""
portal = self.layer['portal']
Expand All @@ -99,6 +115,7 @@ def testNonElectorsCantCommentOnProposals(self):
permissions = [p['name'] for p in portal.permissionsOfRole('Member') if p['selected']]
self.assertFalse('Reply to item' in permissions)


def test_suite():
from unittest import TestSuite, makeSuite
suite = TestSuite()
Expand Down

0 comments on commit 696daa6

Please sign in to comment.