src/pyams_content/component/links/zmi/__init__.py
changeset 1351 045be80a5645
parent 1191 64b3043045bf
--- a/src/pyams_content/component/links/zmi/__init__.py	Wed Sep 25 09:47:48 2019 +0200
+++ b/src/pyams_content/component/links/zmi/__init__.py	Wed Sep 25 09:50:05 2019 +0200
@@ -10,41 +10,50 @@
 # FOR A PARTICULAR PURPOSE.
 #
 
-__docformat__ = 'restructuredtext'
-
 from z3c.form import field
 from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget
-from zope.interface import implementer
+from zope.interface import Interface, implementer
 
-from pyams_content import _
 from pyams_content.component.association.interfaces import IAssociationContainer
-from pyams_content.component.association.zmi import AssociationItemAJAXAddForm, AssociationItemAJAXEditForm
+from pyams_content.component.association.zmi import AssociationItemAJAXAddForm, \
+    AssociationItemAJAXEditForm
 from pyams_content.component.association.zmi.interfaces import IAssociationsView
-from pyams_content.component.links import ExternalLink, InternalLink, MailtoLink
-from pyams_content.component.links.interfaces import IExternalLink, IInternalLink, ILinkContainerTarget, IMailtoLink
+from pyams_content.component.links import ExternalLink, IInternalLinkCustomInfo, InternalLink, \
+    MailtoLink
+from pyams_content.component.links.interfaces import ICustomInternalLinkTarget, IExternalLink, \
+    IInternalLink, ILinkContainerTarget, IMailtoLink
 from pyams_content.component.paragraph.zmi import get_json_paragraph_markers_refresh_event
 from pyams_content.component.paragraph.zmi.container import ParagraphContainerCounterBase
-from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerTable, IParagraphTitleToolbar
+from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerTable, \
+    IParagraphTitleToolbar
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
 from pyams_content.reference.pictograms.zmi.widget import PictogramSelectFieldWidget
 from pyams_form.form import ajax_config
+from pyams_form.interfaces.form import IInnerSubForm
 from pyams_form.security import ProtectedFormObjectMixin
 from pyams_pagelet.pagelet import pagelet_config
 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
 from pyams_skin.layer import IPyAMSLayer
 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
+from pyams_utils.adapter import adapter_config
 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
 from pyams_viewlet.viewlet import viewlet_config
-from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
+from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm, InnerAdminEditForm
 from pyams_zmi.interfaces import IPropertiesEditForm
 
 
+__docformat__ = 'restructuredtext'
+
+from pyams_content import _
+
+
 #
 # Internal links views
 #
 
-@viewlet_config(name='internal-links', context=ILinkContainerTarget, layer=IPyAMSLayer, view=IParagraphContainerTable,
-                manager=IParagraphTitleToolbar, permission=VIEW_SYSTEM_PERMISSION, weight=10)
+@viewlet_config(name='internal-links', context=ILinkContainerTarget, layer=IPyAMSLayer,
+                view=IParagraphContainerTable, manager=IParagraphTitleToolbar,
+                permission=VIEW_SYSTEM_PERMISSION, weight=10)
 class InternalLinksCounter(ParagraphContainerCounterBase):
     """Internal links count column"""
 
@@ -61,8 +70,8 @@
                     if IInternalLink.providedBy(file)])
 
 
-@viewlet_config(name='add-internal-link.menu', context=ILinkContainerTarget, view=IAssociationsView,
-                layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50)
+@viewlet_config(name='add-internal-link.menu', context=ILinkContainerTarget,
+                view=IAssociationsView, layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50)
 class InternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem):
     """Internal link add menu"""
 
@@ -83,7 +92,8 @@
     legend = _("Add new internal link")
     icon_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
 
-    fields = field.Fields(IInternalLink).select('reference', 'force_canonical_url', 'title', 'description',
+    fields = field.Fields(IInternalLink).select('reference', 'force_canonical_url', 'title',
+                                                'description',
                                                 'pictogram_name')
     fields['force_canonical_url'].widgetFactory = SingleCheckBoxFieldWidget
     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
@@ -99,12 +109,14 @@
     def get_ajax_output(self, changes):
         output = super(self.__class__, self).get_ajax_output(changes)
         if output:
-            output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
-                                                                                            self, InternalLinksCounter))
+            output.setdefault('events', []).append(
+                get_json_paragraph_markers_refresh_event(self.context, self.request,
+                                                         self, InternalLinksCounter))
         return output
 
 
-@pagelet_config(name='properties.html', context=IInternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@pagelet_config(name='properties.html', context=IInternalLink, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
 @ajax_config(name='properties.json', context=IInternalLink, layer=IPyAMSLayer,
              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
 @implementer(IPropertiesEditForm)
@@ -117,7 +129,8 @@
     icon_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
     dialog_class = 'modal-large'
 
-    fields = field.Fields(IInternalLink).select('reference', 'force_canonical_url', 'title', 'description',
+    fields = field.Fields(IInternalLink).select('reference', 'force_canonical_url', 'title',
+                                                'description',
                                                 'pictogram_name')
     fields['force_canonical_url'].widgetFactory = SingleCheckBoxFieldWidget
     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
@@ -131,12 +144,42 @@
             return super(self.__class__, self).get_ajax_output(changes)
 
 
+@adapter_config(name='custom',
+                context=(ICustomInternalLinkTarget, IPyAMSLayer, InternalLinkPropertiesEditForm),
+                provides=IInnerSubForm)
+class CustomInternalLinkPropertiesEditForm(InnerAdminEditForm):
+    """Custom internal link properties edit form"""
+
+    prefix = 'custom_properties.'
+
+    css_class = 'form-group'
+    padding_class = ''
+
+    legend = _("Custom target properties")
+    fieldset_class = 'bordered'
+
+    @property
+    def fields(self):
+        info = IInternalLinkCustomInfo(self.context, None)
+        if info is not None:
+            return field.Fields(info.properties_interface).omit('properties_interface')
+        return field.Fields(Interface)
+
+    weight = 1
+
+    def render(self):
+        if not self.fields:
+            return ''
+        return super(CustomInternalLinkPropertiesEditForm, self).render()
+
+
 #
 # External links views
 #
 
-@viewlet_config(name='external-links', context=ILinkContainerTarget, layer=IPyAMSLayer, view=IParagraphContainerTable,
-                manager=IParagraphTitleToolbar, permission=VIEW_SYSTEM_PERMISSION, weight=11)
+@viewlet_config(name='external-links', context=ILinkContainerTarget, layer=IPyAMSLayer,
+                view=IParagraphContainerTable, manager=IParagraphTitleToolbar,
+                permission=VIEW_SYSTEM_PERMISSION, weight=11)
 class ExternalLinksCounter(ParagraphContainerCounterBase):
     """External links count column"""
 
@@ -153,8 +196,8 @@
                     if IExternalLink.providedBy(file)])
 
 
-@viewlet_config(name='add-external-link.menu', context=ILinkContainerTarget, view=IAssociationsView,
-                layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=51)
+@viewlet_config(name='add-external-link.menu', context=ILinkContainerTarget,
+                view=IAssociationsView, layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=51)
 class ExternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem):
     """External link add menu"""
 
@@ -175,7 +218,8 @@
     legend = _("Add new external link")
     icon_css_class = 'fa fa-fw fa-external-link'
 
-    fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'pictogram_name', 'language')
+    fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'pictogram_name',
+                                                'language')
     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
@@ -189,12 +233,14 @@
     def get_ajax_output(self, changes):
         output = super(self.__class__, self).get_ajax_output(changes)
         if output:
-            output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
-                                                                                            self, ExternalLinksCounter))
+            output.setdefault('events', []).append(
+                get_json_paragraph_markers_refresh_event(self.context, self.request,
+                                                         self, ExternalLinksCounter))
         return output
 
 
-@pagelet_config(name='properties.html', context=IExternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@pagelet_config(name='properties.html', context=IExternalLink, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
 @ajax_config(name='properties.json', context=IExternalLink, layer=IPyAMSLayer,
              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
 @implementer(IPropertiesEditForm)
@@ -207,7 +253,8 @@
     icon_css_class = 'fa fa-fw fa-external-link'
     dialog_class = 'modal-large'
 
-    fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'pictogram_name', 'language')
+    fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'pictogram_name',
+                                                'language')
     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
 
     edit_permission = None  # defined by IFormContextPermissionChecker adapter
@@ -223,8 +270,9 @@
 # Mailto links views
 #
 
-@viewlet_config(name='mailto-links', context=ILinkContainerTarget, layer=IPyAMSLayer, view=IParagraphContainerTable,
-                manager=IParagraphTitleToolbar, permission=VIEW_SYSTEM_PERMISSION, weight=12)
+@viewlet_config(name='mailto-links', context=ILinkContainerTarget, layer=IPyAMSLayer,
+                view=IParagraphContainerTable, manager=IParagraphTitleToolbar,
+                permission=VIEW_SYSTEM_PERMISSION, weight=12)
 class MailtoLinksCounter(ParagraphContainerCounterBase):
     """Mailto links count column"""
 
@@ -263,7 +311,8 @@
     legend = _("Add new mailto link")
     icon_css_class = 'fa fa-fw fa-envelope-o'
 
-    fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description', 'pictogram_name')
+    fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description',
+                                              'pictogram_name')
     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
@@ -277,12 +326,14 @@
     def get_ajax_output(self, changes):
         output = super(self.__class__, self).get_ajax_output(changes)
         if output:
-            output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
-                                                                                            self, MailtoLinksCounter))
+            output.setdefault('events', []).append(
+                get_json_paragraph_markers_refresh_event(self.context, self.request,
+                                                         self, MailtoLinksCounter))
         return output
 
 
-@pagelet_config(name='properties.html', context=IMailtoLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@pagelet_config(name='properties.html', context=IMailtoLink, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
 @ajax_config(name='properties.json', context=IMailtoLink, layer=IPyAMSLayer,
              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
 @implementer(IPropertiesEditForm)
@@ -294,7 +345,8 @@
     legend = _("Edit mailto link properties")
     icon_css_class = 'fa fa-fw fa-envelope-o'
 
-    fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description', 'pictogram_name')
+    fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description',
+                                              'pictogram_name')
     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
 
     edit_permission = None  # defined by IFormContextPermissionChecker adapter