26 from zope.interface import Interface |
26 from zope.interface import Interface |
27 from zope.schema import Bool, TextLine |
27 from zope.schema import Bool, TextLine |
28 |
28 |
29 from pyams_catalog.query import CatalogResultSet |
29 from pyams_catalog.query import CatalogResultSet |
30 from pyams_content import _ |
30 from pyams_content import _ |
31 from pyams_content.features.redirect.interfaces import IRedirectionManager, IRedirectionManagerTarget |
31 from pyams_content.features.redirect.interfaces import IRedirectionManager, \ |
|
32 IRedirectionManagerTarget |
32 from pyams_content.interfaces import MANAGE_SITE_ROOT_PERMISSION |
33 from pyams_content.interfaces import MANAGE_SITE_ROOT_PERMISSION |
33 from pyams_content.zmi import pyams_content |
34 from pyams_content.zmi import pyams_content |
34 from pyams_form.form import AJAXAddForm |
35 from pyams_form.form import AJAXAddForm |
35 from pyams_form.interfaces.form import IWidgetsSuffixViewletsManager |
36 from pyams_form.interfaces.form import IWidgetsSuffixViewletsManager |
36 from pyams_form.schema import CloseButton |
37 from pyams_form.schema import CloseButton |
41 from pyams_skin.interfaces import IContentHelp, IPageHeader, IUserSkinnable |
42 from pyams_skin.interfaces import IContentHelp, IPageHeader, IUserSkinnable |
42 from pyams_skin.interfaces.viewlet import IToolbarViewletManager |
43 from pyams_skin.interfaces.viewlet import IToolbarViewletManager |
43 from pyams_skin.layer import IPyAMSLayer |
44 from pyams_skin.layer import IPyAMSLayer |
44 from pyams_skin.page import DefaultPageHeaderAdapter |
45 from pyams_skin.page import DefaultPageHeaderAdapter |
45 from pyams_skin.skin import apply_skin |
46 from pyams_skin.skin import apply_skin |
46 from pyams_skin.table import AttributeSwitcherColumn, BaseTable, I18nColumn, ImageColumn, SorterColumn, TrashColumn |
47 from pyams_skin.table import AttributeSwitcherColumn, BaseTable, I18nColumn, ImageColumn, \ |
|
48 SorterColumn, TrashColumn |
47 from pyams_skin.viewlet.menu import MenuItem |
49 from pyams_skin.viewlet.menu import MenuItem |
48 from pyams_skin.viewlet.toolbar import ToolbarAction |
50 from pyams_skin.viewlet.toolbar import ToolbarAction |
49 from pyams_template.template import template_config |
51 from pyams_template.template import template_config |
50 from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config |
52 from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config |
51 from pyams_utils.fanstatic import get_resource_path |
53 from pyams_utils.fanstatic import get_resource_path |
123 translate = self.request.localizer.translate |
125 translate = self.request.localizer.translate |
124 return translate(_("No currently defined redirection rule.")) |
126 return translate(_("No currently defined redirection rule.")) |
125 return super(RedirectionsContainerTable, self).render() |
127 return super(RedirectionsContainerTable, self).render() |
126 |
128 |
127 |
129 |
128 @adapter_config(context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), provides=IValues) |
130 @adapter_config(context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
|
131 provides=IValues) |
129 class RedirectionsContainerValues(ContextRequestViewAdapter): |
132 class RedirectionsContainerValues(ContextRequestViewAdapter): |
130 """Redirections container values""" |
133 """Redirections container values""" |
131 |
134 |
132 @property |
135 @property |
133 def values(self): |
136 def values(self): |
134 return IRedirectionManager(self.context).values() |
137 return IRedirectionManager(self.context).values() |
135 |
138 |
136 |
139 |
137 @adapter_config(name='sorter', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
140 @adapter_config(name='sorter', |
|
141 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
138 provides=IColumn) |
142 provides=IColumn) |
139 class RedirectionsContainerSorterColumn(SorterColumn): |
143 class RedirectionsContainerSorterColumn(SorterColumn): |
140 """Redirections container sorter column""" |
144 """Redirections container sorter column""" |
141 |
145 |
142 |
146 |
147 order = list(map(str, json.loads(request.params.get('names')))) |
151 order = list(map(str, json.loads(request.params.get('names')))) |
148 request.context.updateOrder(order) |
152 request.context.updateOrder(order) |
149 return {'status': 'success'} |
153 return {'status': 'success'} |
150 |
154 |
151 |
155 |
152 @adapter_config(name='enable-disable', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
156 @adapter_config(name='enable-disable', |
|
157 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
153 provides=IColumn) |
158 provides=IColumn) |
154 class RedirectionsContainerEnablerColumn(AttributeSwitcherColumn): |
159 class RedirectionsContainerEnablerColumn(AttributeSwitcherColumn): |
155 """Redirections container enabler switcher column""" |
160 """Redirections container enabler switcher column""" |
156 |
161 |
157 switch_attribute = 'active' |
162 switch_attribute = 'active' |
162 icon_hint = _("Enable/disable rule") |
167 icon_hint = _("Enable/disable rule") |
163 |
168 |
164 weight = 6 |
169 weight = 6 |
165 |
170 |
166 |
171 |
167 @view_config(name='switch-rule-activity.json', context=IRedirectionManager, request_type=IPyAMSLayer, |
172 @view_config(name='switch-rule-activity.json', context=IRedirectionManager, |
168 permission=MANAGE_SITE_ROOT_PERMISSION, renderer='json', xhr=True) |
173 request_type=IPyAMSLayer, permission=MANAGE_SITE_ROOT_PERMISSION, |
|
174 renderer='json', xhr=True) |
169 def switch_rule_activity(request): |
175 def switch_rule_activity(request): |
170 """Switch rule activity""" |
176 """Switch rule activity""" |
171 container = IRedirectionManager(request.context) |
177 container = IRedirectionManager(request.context) |
172 rule = container.get(str(request.params.get('object_name'))) |
178 rule = container.get(str(request.params.get('object_name'))) |
173 if rule is None: |
179 if rule is None: |
174 raise NotFound() |
180 raise NotFound() |
175 rule.active = not rule.active |
181 rule.active = not rule.active |
176 return {'on': rule.active} |
182 return { |
177 |
183 'status': 'success', |
178 |
184 'on': rule.active |
179 @adapter_config(name='chain-unchain', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
185 } |
|
186 |
|
187 |
|
188 @adapter_config(name='chain-unchain', |
|
189 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
180 provides=IColumn) |
190 provides=IColumn) |
181 class RedirectionsContainerChainedColumn(AttributeSwitcherColumn): |
191 class RedirectionsContainerChainedColumn(AttributeSwitcherColumn): |
182 """Redirections container chained switcher column""" |
192 """Redirections container chained switcher column""" |
183 |
193 |
184 switch_attribute = 'chained' |
194 switch_attribute = 'chained' |
201 raise NotFound() |
211 raise NotFound() |
202 rule.chained = not rule.chained |
212 rule.chained = not rule.chained |
203 return {'chained': rule.chained} |
213 return {'chained': rule.chained} |
204 |
214 |
205 |
215 |
206 @adapter_config(name='name', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
216 @adapter_config(name='name', |
|
217 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
207 provides=IColumn) |
218 provides=IColumn) |
208 class RedirectionsContainerNameColumn(I18nColumn, GetAttrColumn): |
219 class RedirectionsContainerNameColumn(I18nColumn, GetAttrColumn): |
209 """Redirections container name column""" |
220 """Redirections container name column""" |
210 |
221 |
211 _header = _("URL pattern") |
222 _header = _("URL pattern") |
214 |
225 |
215 |
226 |
216 MISSING_TARGET = object() |
227 MISSING_TARGET = object() |
217 |
228 |
218 |
229 |
219 @adapter_config(name='visible', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
230 @adapter_config(name='visible', |
|
231 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
220 provides=IColumn) |
232 provides=IColumn) |
221 class RedirectionsContainerVisibleColumn(ImageColumn): |
233 class RedirectionsContainerVisibleColumn(ImageColumn): |
222 """Redirections container visible column""" |
234 """Redirections container visible column""" |
223 |
235 |
224 cssClasses = {'th': 'action', 'td': 'action'} |
236 cssClasses = {'th': 'action', 'td': 'action'} |
276 return self.request.localizer.translate(hint) |
288 return self.request.localizer.translate(hint) |
277 else: |
289 else: |
278 return self.request.localizer.translate(_("External link")) |
290 return self.request.localizer.translate(_("External link")) |
279 |
291 |
280 |
292 |
281 @adapter_config(name='target', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
293 @adapter_config(name='target', |
|
294 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
282 provides=IColumn) |
295 provides=IColumn) |
283 class RedirectionsContainerTargetColumn(I18nColumn, GetAttrColumn): |
296 class RedirectionsContainerTargetColumn(I18nColumn, GetAttrColumn): |
284 """Redirections container target column""" |
297 """Redirections container target column""" |
285 |
298 |
286 _header = _("Target") |
299 _header = _("Target") |
297 return self.request.localizer.translate(_("Internal reference: {0} (not found)")).format(obj.reference) |
310 return self.request.localizer.translate(_("Internal reference: {0} (not found)")).format(obj.reference) |
298 else: |
311 else: |
299 return super(RedirectionsContainerTargetColumn, self).getValue(obj) |
312 return super(RedirectionsContainerTargetColumn, self).getValue(obj) |
300 |
313 |
301 |
314 |
302 @adapter_config(name='trash', context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
315 @adapter_config(name='trash', |
|
316 context=(IRedirectionManagerTarget, IPyAMSLayer, RedirectionsContainerTable), |
303 provides=IColumn) |
317 provides=IColumn) |
304 class RedirectionsContainerTrashColumn(TrashColumn): |
318 class RedirectionsContainerTrashColumn(TrashColumn): |
305 """Redirections container trash column""" |
319 """Redirections container trash column""" |
306 |
320 |
307 permission = MANAGE_SITE_ROOT_PERMISSION |
321 permission = MANAGE_SITE_ROOT_PERMISSION |
314 |
328 |
315 title = _("Redirections list") |
329 title = _("Redirections list") |
316 table_class = RedirectionsContainerTable |
330 table_class = RedirectionsContainerTable |
317 |
331 |
318 |
332 |
319 @adapter_config(context=(IRedirectionManagerTarget, IAdminLayer, RedirectionsContainerView), provides=IPageHeader) |
333 @adapter_config(context=(IRedirectionManagerTarget, IAdminLayer, RedirectionsContainerView), |
|
334 provides=IPageHeader) |
320 class RedirectionsContainerViewHeaderAdapter(DefaultPageHeaderAdapter): |
335 class RedirectionsContainerViewHeaderAdapter(DefaultPageHeaderAdapter): |
321 """Redirections container view header adapter""" |
336 """Redirections container view header adapter""" |
322 |
337 |
323 icon_class = 'fa fa-fw fa-map-signs' |
338 icon_class = 'fa fa-fw fa-map-signs' |
324 |
339 |
325 |
340 |
326 @adapter_config(context=(IRedirectionManagerTarget, IAdminLayer, RedirectionsContainerView), provides=IContentHelp) |
341 @adapter_config(context=(IRedirectionManagerTarget, IAdminLayer, RedirectionsContainerView), |
|
342 provides=IContentHelp) |
327 class RedirectionsContainerHelpAdapter(ContentHelp): |
343 class RedirectionsContainerHelpAdapter(ContentHelp): |
328 """Redirections container help adapter""" |
344 """Redirections container help adapter""" |
329 |
345 |
330 header = _("Redirection rules") |
346 header = _("Redirection rules") |
331 message = _("""Redirection rules are use to handle redirections responses when a request generates |
347 message = _("""Redirection rules are use to handle redirections responses when a request generates |
381 |
397 |
382 close = CloseButton(name='close', title=_("Close")) |
398 close = CloseButton(name='close', title=_("Close")) |
383 test = button.Button(name='test', title=_("Test rules")) |
399 test = button.Button(name='test', title=_("Test rules")) |
384 |
400 |
385 |
401 |
386 @pagelet_config(name='test-redirection-rules.html', context=IRedirectionManagerTarget, layer=IPyAMSLayer, |
402 @pagelet_config(name='test-redirection-rules.html', context=IRedirectionManagerTarget, |
387 permission=MANAGE_SITE_ROOT_PERMISSION) |
403 layer=IPyAMSLayer, permission=MANAGE_SITE_ROOT_PERMISSION) |
388 class RedirectionsContainerTestForm(AdminDialogAddForm): |
404 class RedirectionsContainerTestForm(AdminDialogAddForm): |
389 """Redirections container test form""" |
405 """Redirections container test form""" |
390 |
406 |
391 dialog_class = 'modal-max' |
407 dialog_class = 'modal-max' |
392 legend = _("Test redirection rules") |
408 legend = _("Test redirection rules") |
409 |
425 |
410 def createAndAdd(self, data): |
426 def createAndAdd(self, data): |
411 data = data.get(self, data) |
427 data = data.get(self, data) |
412 request = copy_request(self.request) |
428 request = copy_request(self.request) |
413 apply_skin(request, IUserSkinnable(self.context).get_skin()) |
429 apply_skin(request, IUserSkinnable(self.context).get_skin()) |
414 return IRedirectionManager(self.context).test_rules(data['source_url'], request, data['check_inactive_rules']) |
430 return IRedirectionManager(self.context).test_rules(data['source_url'], request, |
415 |
431 data['check_inactive_rules']) |
416 |
432 |
417 @viewlet_config(name='test-indexer-process.suffix', layer=IAdminLayer, manager=IWidgetsSuffixViewletsManager, |
433 |
418 view=RedirectionsContainerTestForm, weight=50) |
434 @viewlet_config(name='test-indexer-process.suffix', layer=IAdminLayer, |
|
435 manager=IWidgetsSuffixViewletsManager, view=RedirectionsContainerTestForm, |
|
436 weight=50) |
419 @template_config(template='templates/manager-test.pt') |
437 @template_config(template='templates/manager-test.pt') |
420 class RedirectionsContainerTestSuffix(Viewlet): |
438 class RedirectionsContainerTestSuffix(Viewlet): |
421 """Redirections container test form suffix""" |
439 """Redirections container test form suffix""" |
422 |
440 |
423 |
441 |
424 @view_config(name='test-redirection-rules.json', context=IRedirectionManagerTarget, request_type=IPyAMSLayer, |
442 @view_config(name='test-redirection-rules.json', context=IRedirectionManagerTarget, |
425 permission=MANAGE_SITE_ROOT_PERMISSION, renderer='json', xhr=True) |
443 request_type=IPyAMSLayer, permission=MANAGE_SITE_ROOT_PERMISSION, |
|
444 renderer='json', xhr=True) |
426 class RedirectionsContainerAJAXTestForm(AJAXAddForm, RedirectionsContainerTestForm): |
445 class RedirectionsContainerAJAXTestForm(AJAXAddForm, RedirectionsContainerTestForm): |
427 """Redirections container test form, JSON renderer""" |
446 """Redirections container test form, JSON renderer""" |
428 |
447 |
429 def get_ajax_output(self, changes): |
448 def get_ajax_output(self, changes): |
430 message = [] |
449 message = [] |
433 if not message: |
452 if not message: |
434 message.append('{:<40} | {:<40} | {:<40}'.format(translate(_("Input URL")), |
453 message.append('{:<40} | {:<40} | {:<40}'.format(translate(_("Input URL")), |
435 translate(_("URL pattern")), |
454 translate(_("URL pattern")), |
436 translate(_("Output URL")))) |
455 translate(_("Output URL")))) |
437 message.append('{:<40}-|-{:<40}-|-{:<40}'.format('-' * 40, '-' * 40, '-' * 40)) |
456 message.append('{:<40}-|-{:<40}-|-{:<40}'.format('-' * 40, '-' * 40, '-' * 40)) |
438 message.append('{:<40} | {:<40} | {:<40}'.format(source_url, rule.url_pattern, target_url)) |
457 message.append('{:<40} | {:<40} | {:<40}'.format(source_url, rule.url_pattern, |
|
458 target_url)) |
439 if not message: |
459 if not message: |
440 message.append(translate(_("No matching rule!"))) |
460 message.append(translate(_("No matching rule!"))) |
441 return { |
461 return { |
442 'status': 'success', |
462 'status': 'success', |
443 'content': {'html': '\n'.join(message)}, |
463 'content': {'html': '\n'.join(message)}, |