src/pyams_content/shared/common/zmi/workflow.py
changeset 1049 6d6279200826
parent 966 a3d8d83fb6f0
child 1077 24ab1360b343
equal deleted inserted replaced
1048:a9b49a33673f 1049:6d6279200826
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
    10 # FOR A PARTICULAR PURPOSE.
    10 # FOR A PARTICULAR PURPOSE.
    11 #
    11 #
       
    12 
       
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 from datetime import datetime
       
    16 
       
    17 from pyramid.events import subscriber
       
    18 from z3c.form import button, field
       
    19 from z3c.form.browser.radio import RadioWidget
       
    20 from z3c.form.interfaces import IDataExtractedEvent
       
    21 from z3c.form.widget import FieldWidget
       
    22 from zope.interface import Interface, Invalid
       
    23 from zope.schema import Bool
       
    24 
    12 from pyams_content.features.preview.interfaces import IPreviewTarget
    25 from pyams_content.features.preview.interfaces import IPreviewTarget
    13 
    26 from pyams_content.interfaces import CREATE_CONTENT_PERMISSION, MANAGE_CONTENT_PERMISSION, PUBLISH_CONTENT_PERMISSION
    14 __docformat__ = 'restructuredtext'
    27 from pyams_content.shared.common.interfaces import IBaseSharedTool, IContributorRestrictions, IManagerRestrictions, \
    15 
    28     ISharedContent, IWfSharedContent
    16 
    29 from pyams_content.workflow import DELETED, DRAFT
    17 # import standard library
    30 from pyams_form.form import AJAXAddForm, ajax_config
    18 from datetime import datetime
       
    19 
       
    20 # import interfaces
       
    21 from pyams_content.interfaces import PUBLISH_CONTENT_PERMISSION, CREATE_CONTENT_PERMISSION, MANAGE_CONTENT_PERMISSION
       
    22 from pyams_content.shared.common.interfaces import IWfSharedContent, IBaseSharedTool, ISharedContent, \
       
    23     IContributorRestrictions, IManagerRestrictions
       
    24 from pyams_form.interfaces import IFormLayer
    31 from pyams_form.interfaces import IFormLayer
    25 from pyams_form.interfaces.form import IWidgetsPrefixViewletsManager, IFormSuffixViewletsManager, IInnerSubForm
    32 from pyams_form.interfaces.form import IFormSuffixViewletsManager, IInnerSubForm, IWidgetsPrefixViewletsManager
    26 from pyams_security.interfaces import ISecurityManager
       
    27 from pyams_skin.layer import IPyAMSLayer
       
    28 from pyams_workflow.interfaces import IWorkflowInfo, IWorkflowTransitionInfo, IWorkflowPublicationInfo, \
       
    29     IWorkflowCommentInfo, IWorkflowVersions, IWorkflowState, IWorkflow, IWorkflowStateLabel, \
       
    30     IWorkflowRequestUrgencyInfo, SYSTEM, MANUAL
       
    31 from z3c.form.interfaces import IDataExtractedEvent
       
    32 
       
    33 # import packages
       
    34 from pyams_content.workflow import DRAFT, DELETED
       
    35 from pyams_form.form import AJAXAddForm, ajax_config
       
    36 from pyams_form.schema import CloseButton
    33 from pyams_form.schema import CloseButton
    37 from pyams_form.widget import widgettemplate_config
    34 from pyams_form.widget import widgettemplate_config
    38 from pyams_pagelet.pagelet import pagelet_config
    35 from pyams_pagelet.pagelet import pagelet_config
       
    36 from pyams_security.interfaces import ISecurityManager
       
    37 from pyams_skin.layer import IPyAMSLayer
    39 from pyams_template.template import template_config
    38 from pyams_template.template import template_config
    40 from pyams_utils.adapter import adapter_config
    39 from pyams_utils.adapter import adapter_config
    41 from pyams_utils.date import format_datetime
    40 from pyams_utils.date import format_datetime
    42 from pyams_utils.registry import get_utility
    41 from pyams_utils.registry import get_utility
    43 from pyams_utils.text import text_to_html
    42 from pyams_utils.text import text_to_html
    44 from pyams_utils.timezone import tztime
    43 from pyams_utils.timezone import tztime
    45 from pyams_utils.traversing import get_parent
    44 from pyams_utils.traversing import get_parent
    46 from pyams_utils.url import absolute_url
    45 from pyams_utils.url import absolute_url
    47 from pyams_viewlet.viewlet import viewlet_config, Viewlet
    46 from pyams_viewlet.viewlet import Viewlet, viewlet_config
       
    47 from pyams_workflow.interfaces import IWorkflow, IWorkflowCommentInfo, IWorkflowInfo, IWorkflowPublicationInfo, \
       
    48     IWorkflowRequestUrgencyInfo, IWorkflowState, IWorkflowStateLabel, IWorkflowTransitionInfo, IWorkflowVersions, \
       
    49     MANUAL, SYSTEM
    48 from pyams_workflow.zmi.transition import WorkflowContentTransitionForm
    50 from pyams_workflow.zmi.transition import WorkflowContentTransitionForm
    49 from pyams_zmi.form import InnerAdminAddForm
    51 from pyams_zmi.form import InnerAdminAddForm
    50 from pyramid.events import subscriber
       
    51 from z3c.form import field, button
       
    52 from z3c.form.browser.radio import RadioWidget
       
    53 from z3c.form.widget import FieldWidget
       
    54 from zope.interface import Interface, Invalid
       
    55 from zope.schema import Bool
       
    56 
    52 
    57 from pyams_content import _
    53 from pyams_content import _
    58 
    54 
    59 
    55 
    60 #
    56 #
   137     @property
   133     @property
   138     def fields(self):
   134     def fields(self):
   139         pub_fields = ('publication_effective_date', 'push_end_date', 'publication_expiration_date')
   135         pub_fields = ('publication_effective_date', 'push_end_date', 'publication_expiration_date')
   140         state = IWorkflowState(self.context)
   136         state = IWorkflowState(self.context)
   141         if state.version_id > 1:
   137         if state.version_id > 1:
   142             pub_fields += ('displayed_publication_date', )
   138             pub_fields += ('displayed_publication_date',)
   143         return field.Fields(IWorkflowTransitionInfo) + \
   139         return field.Fields(IWorkflowTransitionInfo) + \
   144             field.Fields(IWorkflowPublicationInfo).select(*pub_fields) + \
   140                field.Fields(IWorkflowPublicationInfo).select(*pub_fields) + \
   145             field.Fields(IWorkflowRequestUrgencyInfo) + \
   141                field.Fields(IWorkflowRequestUrgencyInfo) + \
   146             field.Fields(IWorkflowCommentInfo)
   142                field.Fields(IWorkflowCommentInfo)
   147 
   143 
   148     buttons = button.Buttons(IPublicationRequestButtons)
   144     buttons = button.Buttons(IPublicationRequestButtons)
   149 
   145 
   150     def updateWidgets(self, prefix=None):
   146     def updateWidgets(self, prefix=None):
   151         super(PublicationRequestForm, self).updateWidgets(prefix)
   147         super(PublicationRequestForm, self).updateWidgets(prefix)
   176 @subscriber(IDataExtractedEvent, form_selector=PublicationRequestForm)
   172 @subscriber(IDataExtractedEvent, form_selector=PublicationRequestForm)
   177 def handle_publication_request_form_data_extraction(event):
   173 def handle_publication_request_form_data_extraction(event):
   178     """Handle publication request form data extraction"""
   174     """Handle publication request form data extraction"""
   179     data = event.data
   175     data = event.data
   180     if not data.get('publication_effective_date'):
   176     if not data.get('publication_effective_date'):
   181         event.form.widgets.errors += (Invalid(_("Publication start date is required")), )
   177         event.form.widgets.errors += (Invalid(_("Publication start date is required")),)
   182 
   178 
   183 
   179 
   184 @viewlet_config(name='wf-propose-message', context=IWfSharedContent, layer=IPyAMSLayer, view=PublicationRequestForm,
   180 @viewlet_config(name='wf-propose-message', context=IWfSharedContent, layer=IPyAMSLayer, view=PublicationRequestForm,
   185                 manager=IWidgetsPrefixViewletsManager, weight=20)
   181                 manager=IWidgetsPrefixViewletsManager, weight=20)
   186 @template_config(template='templates/wf-propose-message.pt')
   182 @template_config(template='templates/wf-propose-message.pt')
   269 @subscriber(IDataExtractedEvent, form_selector=PublicationRequestRefuseForm)
   265 @subscriber(IDataExtractedEvent, form_selector=PublicationRequestRefuseForm)
   270 def handle_publication_request_refuse_form_data_extraction(event):
   266 def handle_publication_request_refuse_form_data_extraction(event):
   271     """Handle publication request refuse form data extraction"""
   267     """Handle publication request refuse form data extraction"""
   272     comment = (event.data.get('comment') or '').strip()
   268     comment = (event.data.get('comment') or '').strip()
   273     if not comment:
   269     if not comment:
   274         event.form.widgets.errors += (Invalid(_("A comment is required")), )
   270         event.form.widgets.errors += (Invalid(_("A comment is required")),)
   275 
   271 
   276 
   272 
   277 @viewlet_config(name='wf-refuse-message', context=IWfSharedContent, layer=IPyAMSLayer,
   273 @viewlet_config(name='wf-refuse-message', context=IWfSharedContent, layer=IPyAMSLayer,
   278                 view=PublicationRequestRefuseForm, manager=IWidgetsPrefixViewletsManager, weight=20)
   274                 view=PublicationRequestRefuseForm, manager=IWidgetsPrefixViewletsManager, weight=20)
   279 @template_config(template='templates/wf-refuse-propose-message.pt')
   275 @template_config(template='templates/wf-refuse-propose-message.pt')
   318     @property
   314     @property
   319     def fields(self):
   315     def fields(self):
   320         pub_fields = ('publication_effective_date', 'push_end_date', 'publication_expiration_date')
   316         pub_fields = ('publication_effective_date', 'push_end_date', 'publication_expiration_date')
   321         state = IWorkflowState(self.context)
   317         state = IWorkflowState(self.context)
   322         if state.version_id > 1:
   318         if state.version_id > 1:
   323             pub_fields += ('displayed_publication_date', )
   319             pub_fields += ('displayed_publication_date',)
   324         return field.Fields(IWorkflowTransitionInfo) + \
   320         return field.Fields(IWorkflowTransitionInfo) + \
   325             field.Fields(IWorkflowPublicationInfo).select(*pub_fields) + \
   321                field.Fields(IWorkflowPublicationInfo).select(*pub_fields) + \
   326             field.Fields(IWorkflowCommentInfo)
   322                field.Fields(IWorkflowCommentInfo)
   327 
   323 
   328     buttons = button.Buttons(IPublicationButtons)
   324     buttons = button.Buttons(IPublicationButtons)
   329 
   325 
   330     def updateWidgets(self, prefix=None):
   326     def updateWidgets(self, prefix=None):
   331         super(PublicationForm, self).updateWidgets(prefix)
   327         super(PublicationForm, self).updateWidgets(prefix)
   358 @subscriber(IDataExtractedEvent, form_selector=PublicationForm)
   354 @subscriber(IDataExtractedEvent, form_selector=PublicationForm)
   359 def handle_publication_form_data_extraction(event):
   355 def handle_publication_form_data_extraction(event):
   360     """Handle publication form data extraction"""
   356     """Handle publication form data extraction"""
   361     data = event.data
   357     data = event.data
   362     if not data.get('publication_effective_date'):
   358     if not data.get('publication_effective_date'):
   363         event.form.widgets.errors += (Invalid(_("Publication start date is required")), )
   359         event.form.widgets.errors += (Invalid(_("Publication start date is required")),)
   364 
   360 
   365 
   361 
   366 @viewlet_config(name='wf-publish-message', context=IWfSharedContent, layer=IPyAMSLayer,
   362 @viewlet_config(name='wf-publish-message', context=IWfSharedContent, layer=IPyAMSLayer,
   367                 view=PublicationForm, manager=IWidgetsPrefixViewletsManager, weight=20)
   363                 view=PublicationForm, manager=IWidgetsPrefixViewletsManager, weight=20)
   368 @template_config(template='templates/wf-publish-message.pt')
   364 @template_config(template='templates/wf-publish-message.pt')
   400              permission=MANAGE_CONTENT_PERMISSION, base=AJAXAddForm)
   396              permission=MANAGE_CONTENT_PERMISSION, base=AJAXAddForm)
   401 class PublicationRetireRequestForm(WorkflowContentTransitionForm):
   397 class PublicationRetireRequestForm(WorkflowContentTransitionForm):
   402     """Shared content publication request refuse form"""
   398     """Shared content publication request refuse form"""
   403 
   399 
   404     fields = field.Fields(IWorkflowTransitionInfo) + \
   400     fields = field.Fields(IWorkflowTransitionInfo) + \
   405         field.Fields(IWorkflowRequestUrgencyInfo) + \
   401              field.Fields(IWorkflowRequestUrgencyInfo) + \
   406         field.Fields(IWorkflowCommentInfo)
   402              field.Fields(IWorkflowCommentInfo)
   407     buttons = button.Buttons(IPublicationRetireRequestButtons)
   403     buttons = button.Buttons(IPublicationRetireRequestButtons)
   408 
   404 
   409     def updateWidgets(self, prefix=None):
   405     def updateWidgets(self, prefix=None):
   410         super(PublicationRetireRequestForm, self).updateWidgets(prefix)
   406         super(PublicationRetireRequestForm, self).updateWidgets(prefix)
   411         if 'comment' in self.widgets:
   407         if 'comment' in self.widgets:
   415 @subscriber(IDataExtractedEvent, form_selector=PublicationRetireRequestForm)
   411 @subscriber(IDataExtractedEvent, form_selector=PublicationRetireRequestForm)
   416 def handle_publication_retire_request_form_data_extraction(event):
   412 def handle_publication_retire_request_form_data_extraction(event):
   417     """Handle publication retire request form data extraction"""
   413     """Handle publication retire request form data extraction"""
   418     comment = (event.data.get('comment') or '').strip()
   414     comment = (event.data.get('comment') or '').strip()
   419     if not comment:
   415     if not comment:
   420         event.form.widgets.errors += (Invalid(_("A comment is required")), )
   416         event.form.widgets.errors += (Invalid(_("A comment is required")),)
   421 
   417 
   422 
   418 
   423 @viewlet_config(name='wf-retiring-message', context=IWfSharedContent, layer=IPyAMSLayer,
   419 @viewlet_config(name='wf-retiring-message', context=IWfSharedContent, layer=IPyAMSLayer,
   424                 view=PublicationRetireRequestForm, manager=IWidgetsPrefixViewletsManager, weight=20)
   420                 view=PublicationRetireRequestForm, manager=IWidgetsPrefixViewletsManager, weight=20)
   425 @template_config(template='templates/wf-retiring-message.pt')
   421 @template_config(template='templates/wf-retiring-message.pt')
   537              permission=MANAGE_CONTENT_PERMISSION, base=AJAXAddForm)
   533              permission=MANAGE_CONTENT_PERMISSION, base=AJAXAddForm)
   538 class PublicationArchiveRequestForm(WorkflowContentTransitionForm):
   534 class PublicationArchiveRequestForm(WorkflowContentTransitionForm):
   539     """Shared content publication request archive form"""
   535     """Shared content publication request archive form"""
   540 
   536 
   541     fields = field.Fields(IWorkflowTransitionInfo) + \
   537     fields = field.Fields(IWorkflowTransitionInfo) + \
   542         field.Fields(IWorkflowRequestUrgencyInfo) + \
   538              field.Fields(IWorkflowRequestUrgencyInfo) + \
   543         field.Fields(IWorkflowCommentInfo)
   539              field.Fields(IWorkflowCommentInfo)
   544     buttons = button.Buttons(IPublicationArchiveRequestButtons)
   540     buttons = button.Buttons(IPublicationArchiveRequestButtons)
   545 
   541 
   546 
   542 
   547 @viewlet_config(name='wf-archiving-message', context=IWfSharedContent, layer=IPyAMSLayer,
   543 @viewlet_config(name='wf-archiving-message', context=IWfSharedContent, layer=IPyAMSLayer,
   548                 view=PublicationArchiveRequestForm, manager=IWidgetsPrefixViewletsManager, weight=20)
   544                 view=PublicationArchiveRequestForm, manager=IWidgetsPrefixViewletsManager, weight=20)