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 |
12 |
13 __docformat__ = 'restructuredtext' |
|
14 |
|
15 from datetime import datetime |
13 from datetime import datetime |
16 |
14 |
17 from pyramid.events import subscriber |
15 from pyramid.events import subscriber |
18 from pyramid.path import DottedNameResolver |
16 from pyramid.path import DottedNameResolver |
19 from z3c.form import field |
17 from z3c.form import field |
20 from z3c.form.interfaces import IDataExtractedEvent |
18 from z3c.form.interfaces import IDataExtractedEvent |
21 from zope.interface import Invalid |
19 from zope.interface import Invalid |
22 |
20 |
23 from pyams_content.interfaces import MANAGE_SITE_ROOT_PERMISSION, MANAGE_SITE_PERMISSION, MANAGE_TOOL_PERMISSION |
21 from pyams_content.interfaces import MANAGE_SITE_PERMISSION, MANAGE_SITE_ROOT_PERMISSION, \ |
|
22 MANAGE_TOOL_PERMISSION |
24 from pyams_content.root.interfaces import ISiteRoot |
23 from pyams_content.root.interfaces import ISiteRoot |
25 from pyams_content.shared.blog.interfaces import IBlogManager, IBlogManagerFactory |
24 from pyams_content.shared.blog.interfaces import IBlogManager, IBlogManagerFactory |
26 from pyams_content.shared.blog.manager import BlogManager |
25 from pyams_content.shared.blog.manager import BlogManager |
27 from pyams_content.shared.common import IBaseSharedTool |
26 from pyams_content.shared.common import IBaseSharedTool, IDashboardTypeColumnValue |
|
27 from pyams_content.shared.common.interfaces.zmi import IDashboardTable |
28 from pyams_content.shared.common.zmi.manager import SharedToolPropertiesEditForm |
28 from pyams_content.shared.common.zmi.manager import SharedToolPropertiesEditForm |
29 from pyams_content.zmi.interfaces import ISiteTreeTable, IUserAddingsMenuLabel |
29 from pyams_content.zmi.interfaces import ISiteTreeTable, IUserAddingsMenuLabel |
30 from pyams_form.form import AJAXAddForm, ajax_config |
30 from pyams_form.form import AJAXAddForm, ajax_config |
31 from pyams_i18n.interfaces import II18n, INegotiator |
31 from pyams_i18n.interfaces import II18n, INegotiator |
32 from pyams_pagelet.pagelet import pagelet_config |
32 from pyams_pagelet.pagelet import pagelet_config |
33 from pyams_skin.interfaces.container import ITableElementEditor |
33 from pyams_skin.interfaces.container import ITableElementEditor |
34 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, ITableItemColumnActionsMenu, IMenuHeader |
34 from pyams_skin.interfaces.viewlet import IMenuHeader, ITableItemColumnActionsMenu, \ |
|
35 IToolbarAddingMenu |
35 from pyams_skin.layer import IPyAMSLayer |
36 from pyams_skin.layer import IPyAMSLayer |
36 from pyams_skin.table import DefaultElementEditorAdapter |
37 from pyams_skin.table import DefaultElementEditorAdapter |
37 from pyams_skin.viewlet.menu import MenuItem |
38 from pyams_skin.viewlet.menu import MenuItem |
38 from pyams_skin.viewlet.toolbar import ToolbarMenuItem |
39 from pyams_skin.viewlet.toolbar import ToolbarMenuItem |
39 from pyams_utils.adapter import adapter_config, ContextRequestAdapter |
40 from pyams_utils.adapter import ContextRequestAdapter, adapter_config |
40 from pyams_utils.registry import query_utility |
41 from pyams_utils.registry import query_utility |
41 from pyams_utils.timezone import tztime |
42 from pyams_utils.timezone import tztime |
42 from pyams_utils.unicode import translate_string |
43 from pyams_utils.unicode import translate_string |
43 from pyams_utils.url import absolute_url |
44 from pyams_utils.url import absolute_url |
44 from pyams_viewlet.viewlet import viewlet_config |
45 from pyams_viewlet.viewlet import viewlet_config |
45 from pyams_workflow.interfaces import IWorkflowPublicationInfo |
46 from pyams_workflow.interfaces import IWorkflowPublicationInfo |
46 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm |
47 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm |
47 from pyams_zmi.interfaces.menu import IPropertiesMenu, ISiteManagementMenu |
48 from pyams_zmi.interfaces.menu import IPropertiesMenu, ISiteManagementMenu |
48 from pyams_zmi.layer import IAdminLayer |
49 from pyams_zmi.layer import IAdminLayer |
49 |
50 |
|
51 |
|
52 __docformat__ = 'restructuredtext' |
|
53 |
50 from pyams_content import _ |
54 from pyams_content import _ |
|
55 |
|
56 |
|
57 @adapter_config(context=(IDashboardTable, IPyAMSLayer, IBlogManager), |
|
58 provides=IDashboardTypeColumnValue) |
|
59 def blog_manager_dashboard_type(context, request): |
|
60 """Blog manager dashboard type column adapter""" |
|
61 return request.localizer.translate(context.content_name) |
51 |
62 |
52 |
63 |
53 @adapter_config(context=(IBlogManager, ISiteManagementMenu), provides=IMenuHeader) |
64 @adapter_config(context=(IBlogManager, ISiteManagementMenu), provides=IMenuHeader) |
54 class BlogManagerSiteManagementMenuHeader(ContextRequestAdapter): |
65 class BlogManagerSiteManagementMenuHeader(ContextRequestAdapter): |
55 """Blog manager site management menu header adapter""" |
66 """Blog manager site management menu header adapter""" |
66 """Blog manager user addings menu label adapter""" |
77 """Blog manager user addings menu label adapter""" |
67 |
78 |
68 @property |
79 @property |
69 def label(self): |
80 def label(self): |
70 return '{content} ({blog})'.format( |
81 return '{content} ({blog})'.format( |
71 content=self.request.localizer.translate(self.context.shared_content_factory.content_class.content_name), |
82 content=self.request.localizer.translate( |
|
83 self.context.shared_content_factory.content_class.content_name), |
72 blog=II18n(self.context).query_attribute('title', request=self.request)) |
84 blog=II18n(self.context).query_attribute('title', request=self.request)) |
73 |
85 |
74 |
86 |
75 @viewlet_config(name='add-blog-manager.menu', context=ISiteRoot, layer=IAdminLayer, |
87 @viewlet_config(name='add-blog-manager.menu', context=ISiteRoot, layer=IAdminLayer, |
76 view=ISiteTreeTable, manager=IToolbarAddingMenu, permission=MANAGE_SITE_ROOT_PERMISSION) |
88 view=ISiteTreeTable, manager=IToolbarAddingMenu, |
|
89 permission=MANAGE_SITE_ROOT_PERMISSION) |
77 class BlogManagerAddMenu(ToolbarMenuItem): |
90 class BlogManagerAddMenu(ToolbarMenuItem): |
78 """Blog manager add menu""" |
91 """Blog manager add menu""" |
79 |
92 |
80 label = _("Add blog manager") |
93 label = _("Add blog manager") |
81 label_css_class = 'fa fa-fw fa-tags' |
94 label_css_class = 'fa fa-fw fa-tags' |
119 """Handle new blog manager data extraction""" |
132 """Handle new blog manager data extraction""" |
120 container = event.form.context |
133 container = event.form.context |
121 negotiator = query_utility(INegotiator) |
134 negotiator = query_utility(INegotiator) |
122 short_name = event.data['short_name'].get(negotiator.server_language) |
135 short_name = event.data['short_name'].get(negotiator.server_language) |
123 if not short_name: |
136 if not short_name: |
124 event.form.widgets.errors += (Invalid(_("You must provide a short name for default server language!")),) |
137 event.form.widgets.errors += (Invalid(_("You must provide a short name for default " |
|
138 "server language!")),) |
125 return |
139 return |
126 name = translate_string(short_name, force_lower=True, spaces='-') |
140 name = translate_string(short_name, force_lower=True, spaces='-') |
127 if name in container: |
141 if name in container: |
128 event.form.widgets.errors += (Invalid(_("Specified blog manager name is already used!")),) |
142 event.form.widgets.errors += (Invalid(_("Specified blog manager name is already " |
|
143 "used!")),) |
129 return |
144 return |
130 blog = query_utility(IBlogManager, name=short_name) |
145 blog = query_utility(IBlogManager, name=short_name) |
131 if blog is not None: |
146 if blog is not None: |
132 event.form.widgets.errors += (Invalid(_("A blog manager is already registered with this name!!")),) |
147 event.form.widgets.errors += (Invalid(_("A blog manager is already registered with " |
133 |
148 "this name!!")),) |
134 |
149 |
135 @adapter_config(context=(IBlogManager, IAdminLayer, ISiteTreeTable), provides=ITableElementEditor) |
150 |
|
151 @adapter_config(context=(IBlogManager, IAdminLayer, ISiteTreeTable), |
|
152 provides=ITableElementEditor) |
136 class BlogManagerTableElementEditor(DefaultElementEditorAdapter): |
153 class BlogManagerTableElementEditor(DefaultElementEditorAdapter): |
137 """Blog manager table element editor""" |
154 """Blog manager table element editor""" |
138 |
155 |
139 view_name = 'admin' |
156 view_name = 'admin' |
140 modal_target = False |
157 modal_target = False |
141 |
158 |
142 |
159 |
143 @pagelet_config(name='properties.html', context=IBlogManager, layer=IPyAMSLayer, permission=MANAGE_TOOL_PERMISSION) |
160 @pagelet_config(name='properties.html', context=IBlogManager, layer=IPyAMSLayer, |
|
161 permission=MANAGE_TOOL_PERMISSION) |
144 @ajax_config(name='properties.json', context=IBlogManager, layer=IPyAMSLayer) |
162 @ajax_config(name='properties.json', context=IBlogManager, layer=IPyAMSLayer) |
145 class BlogManagerPropertiesEditForm(SharedToolPropertiesEditForm): |
163 class BlogManagerPropertiesEditForm(SharedToolPropertiesEditForm): |
146 """Site folder properties edit form""" |
164 """Site folder properties edit form""" |
147 |
165 |
148 legend = _("Blog properties") |
166 legend = _("Blog properties") |
149 |
167 |
150 fields = field.Fields(IBlogManager).select('title', 'short_name', 'description', 'notepad') + \ |
168 fields = field.Fields(IBlogManager).select('title', 'short_name', 'description', |
|
169 'notepad') + \ |
151 field.Fields(IBaseSharedTool).select('shared_content_workflow') |
170 field.Fields(IBaseSharedTool).select('shared_content_workflow') |
152 |
171 |
153 |
172 |
154 # |
173 # |
155 # Blog manager publication views |
174 # Blog manager publication views |
156 # |
175 # |
157 |
176 |
158 @viewlet_config(name='workflow-publication.menu', context=IBlogManager, layer=IPyAMSLayer, view=ISiteTreeTable, |
177 @viewlet_config(name='workflow-publication.menu', context=IBlogManager, layer=IPyAMSLayer, |
159 manager=ITableItemColumnActionsMenu, permission=MANAGE_SITE_PERMISSION, weight=210) |
178 view=ISiteTreeTable, manager=ITableItemColumnActionsMenu, |
|
179 permission=MANAGE_SITE_PERMISSION, weight=210) |
160 class BlogManagerTableItemWorkflowPublicationMenu(ToolbarMenuItem): |
180 class BlogManagerTableItemWorkflowPublicationMenu(ToolbarMenuItem): |
161 """Blog manager tree item workflow publication menu""" |
181 """Blog manager tree item workflow publication menu""" |
162 |
182 |
163 label = _("Publication dates...") |
183 label = _("Publication dates...") |
164 label_css_class = 'fa fa-fw fa-eye' |
184 label_css_class = 'fa fa-fw fa-eye' |
165 url = 'workflow-publication.html' |
185 url = 'workflow-publication.html' |
166 modal_target = True |
186 modal_target = True |
167 stop_propagation = True |
187 stop_propagation = True |
168 |
188 |
169 |
189 |
170 @viewlet_config(name='workflow-publication.menu', context=IBlogManager, layer=IAdminLayer, manager=IPropertiesMenu, |
190 @viewlet_config(name='workflow-publication.menu', context=IBlogManager, layer=IAdminLayer, |
171 permission=MANAGE_SITE_PERMISSION, weight=210) |
191 manager=IPropertiesMenu, permission=MANAGE_SITE_PERMISSION, weight=210) |
172 class BlogManagerWorkflowPublicationMenu(MenuItem): |
192 class BlogManagerWorkflowPublicationMenu(MenuItem): |
173 """Blog manager workflow publication menu""" |
193 """Blog manager workflow publication menu""" |
174 |
194 |
175 label = _("Publication dates...") |
195 label = _("Publication dates...") |
176 icon_class = 'fa-eye' |
196 icon_class = 'fa-eye' |
186 |
206 |
187 prefix = 'blog_publication.' |
207 prefix = 'blog_publication.' |
188 |
208 |
189 legend = _("Update publication dates") |
209 legend = _("Update publication dates") |
190 |
210 |
191 fields = field.Fields(IWorkflowPublicationInfo).select('publication_effective_date', 'publication_expiration_date') |
211 fields = field.Fields(IWorkflowPublicationInfo).select('publication_effective_date', |
|
212 'publication_expiration_date') |
192 edit_permission = MANAGE_SITE_PERMISSION |
213 edit_permission = MANAGE_SITE_PERMISSION |
193 |
214 |
194 def updateWidgets(self, prefix=None): |
215 def updateWidgets(self, prefix=None): |
195 super(BlogManagerWorkflowPublicationEditForm, self).updateWidgets(prefix) |
216 super(BlogManagerWorkflowPublicationEditForm, self).updateWidgets(prefix) |
196 if 'publication_effective_date' in self.widgets: |
217 if 'publication_effective_date' in self.widgets: |
197 pub_info = IWorkflowPublicationInfo(self.context) |
218 pub_info = IWorkflowPublicationInfo(self.context) |
198 if pub_info.publication_effective_date is None: |
219 if pub_info.publication_effective_date is None: |
199 self.widgets['publication_effective_date'].value = tztime(datetime.utcnow()).strftime('%d/%m/%y %H:%M') |
220 self.widgets['publication_effective_date'].value = \ |
|
221 tztime(datetime.utcnow()).strftime('%d/%m/%y %H:%M') |