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) |