src/pyams_portal/zmi/page.py
changeset 5 670b7956c689
parent 2 619200513bbc
child 13 2ba62c6a9086
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_portal/zmi/page.py	Mon Jan 18 18:09:46 2016 +0100
@@ -0,0 +1,178 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+from pyams_zmi.site import PropertiesEditFormHeaderAdapter
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_form.interfaces.form import IWidgetForm
+from pyams_portal.interfaces import IPortalContext, IPortalPage, IPortalTemplateConfiguration
+from pyams_portal.zmi.interfaces import IPortalContextTemplatePropertiesMenu
+from pyams_skin.interfaces import IPageHeader, IInnerPage
+from pyams_skin.layer import IPyAMSLayer
+from pyams_utils.interfaces import MANAGE_PERMISSION, VIEW_SYSTEM_PERMISSION
+from pyams_zmi.interfaces.menu import ISiteManagementMenu
+from pyams_zmi.layer import IAdminLayer
+
+# import packages
+from pyramid.view import view_config
+from pyams_form.form import AJAXEditForm
+from pyams_pagelet.pagelet import pagelet_config
+from pyams_portal.zmi.layout import PortalTemplateLayoutView, PortalTemplatePortletEditForm, \
+    PortalTemplatePortletAJAXEditForm
+from pyams_portal.zmi.template import PortalTemplateHeaderAdapter
+from pyams_skin.viewlet.menu import MenuItem
+from pyams_utils.adapter import adapter_config
+from pyams_utils.url import absolute_url
+from pyams_viewlet.manager import viewletmanager_config
+from pyams_viewlet.viewlet import viewlet_config
+from pyams_zmi.form import AdminEditForm
+from z3c.form import field
+from zope.interface import implementer, Interface
+
+from pyams_portal import _
+
+
+#
+# Portal context template configuration
+#
+
+@viewlet_config(name='template-properties.menu', context=IPortalContext, layer=IAdminLayer,
+                manager=ISiteManagementMenu, permission=MANAGE_PERMISSION, weight=10)
+@viewletmanager_config(name='template-properties.menu', layer=IAdminLayer, context=IPortalContext,
+                       provides=IPortalContextTemplatePropertiesMenu)
+@implementer(IPortalContextTemplatePropertiesMenu)
+class PortalContextTemplatePropertiesMenu(MenuItem):
+    """Portal context template properties menu"""
+
+    label = _("Presentation")
+    icon_class = 'fa-columns'
+    url = '#template-properties.html'
+
+
+@pagelet_config(name='template-properties.html', context=IPortalContext, layer=IPyAMSLayer,
+                permission=MANAGE_PERMISSION)
+@implementer(IWidgetForm, IInnerPage)
+class PortalContextTemplatePropertiesEditForm(AdminEditForm):
+    """Portal context template properties edit form"""
+
+    @property
+    def title(self):
+        return self.context.title
+
+    legend = _("Edit template configuration")
+
+    @property
+    def fields(self):
+        fields = field.Fields(IPortalPage).select('inherit_parent', 'use_local_template', 'shared_template')
+        if not self.getContent().can_inherit:
+            fields = fields.omit('inherit_parent')
+        return fields
+
+    ajax_handler = 'template-properties.json'
+    edit_permission = MANAGE_PERMISSION
+
+    def getContent(self):
+        return IPortalPage(self.context)
+
+
+@view_config(name='template-properties.json', context=IPortalContext, request_type=IPyAMSLayer,
+             permission=MANAGE_PERMISSION, renderer='json', xhr=True)
+class PortalContextTemplatePropertiesAJAXEditForm(AJAXEditForm, PortalContextTemplatePropertiesEditForm):
+    """Portal context template properties edit form, JSON renderer"""
+
+    def get_ajax_output(self, changes):
+        if 'use_local_template' in changes.get(IPortalPage, ()):
+            return {'status': 'redirect'}
+        else:
+            return super(PortalContextTemplatePropertiesAJAXEditForm, self).get_ajax_output(changes)
+
+
+@adapter_config(context=(Interface, IPyAMSLayer, PortalContextTemplatePropertiesEditForm), provides=IPageHeader)
+class PortalContextPropertiesEditFormHeaderAdapter(PropertiesEditFormHeaderAdapter):
+    """Portal context template properties edit form header adapter"""
+
+    icon_class = 'fa fa-fw fa-columns'
+
+
+#
+#
+#
+
+@viewlet_config(name='template-config.menu', context=IPortalContext, layer=IAdminLayer,
+                manager=IPortalContextTemplatePropertiesMenu, permission=MANAGE_PERMISSION, weight=50)
+class PortalContextTemplateConfigMenu(MenuItem):
+    """Portal context template configuration menu"""
+
+    label = _("Template properties")
+
+    url = '#template-config.html'
+
+    def __new__(cls, context, request, view, manager=None):
+        page = IPortalPage(context)
+        if page.template is None:
+            return None
+        return MenuItem.__new__(cls)
+
+    def get_url(self):
+        page = IPortalPage(self.context)
+        if page.use_local_template:
+            return absolute_url(page.template, self.request, 'admin.html#properties.html')
+        else:
+            return super(PortalContextTemplateConfigMenu, self).get_url()
+
+
+@pagelet_config(name='template-config.html', context=IPortalContext, layer=IPyAMSLayer,
+                permission=MANAGE_PERMISSION)
+class PortalContextTemplateLayoutView(PortalTemplateLayoutView):
+    """Portal context template configuration view"""
+
+    def get_template(self):
+        return IPortalPage(self.context).template
+
+    @property
+    def can_change(self):
+        if not IPortalPage(self.context).use_local_template:
+            return False
+        return self.request.has_permission(MANAGE_PERMISSION)
+
+
+@adapter_config(context=(IPortalContext, IAdminLayer, PortalContextTemplateLayoutView), provides=IPageHeader)
+class PortalContextTemplateLayoutHeaderAdapter(PortalTemplateHeaderAdapter):
+    """Portal context template configuration header adapter"""
+
+
+#
+# Template management views
+#
+
+@view_config(name='get-slots-width.json', context=IPortalContext, request_type=IPyAMSLayer,
+             permission=VIEW_SYSTEM_PERMISSION, renderer='json', xhr=True)
+def get_template_slots_width(request):
+    """Get template slots width"""
+    config = IPortalTemplateConfiguration(request.context)
+    return config.get_slots_width(request.params.get('device'))
+
+
+@view_config(name='portlet-properties.html', context=IPortalContext, request_type=IPyAMSLayer,
+             permission=MANAGE_PERMISSION)
+class PortalContextTemplatePortletEditForm(PortalTemplatePortletEditForm):
+    """Portal context template portlet edit form"""
+
+
+@view_config(name='portlet-properties.json', context=IPortalContext, request_type=IPyAMSLayer,
+             permission=MANAGE_PERMISSION, renderer='json', xhr=True)
+class PortalContextTemplatePortletAJAXEditForm(PortalTemplatePortletAJAXEditForm):
+    """Portal context template portlet edit form, JSON renderer"""