src/pyams_content/component/paragraph/zmi/__init__.py
changeset 1243 837612af4dc3
parent 1126 f3b3d2beb266
child 1345 9b406fb98cfa
--- a/src/pyams_content/component/paragraph/zmi/__init__.py	Thu Jan 17 12:41:14 2019 +0100
+++ b/src/pyams_content/component/paragraph/zmi/__init__.py	Thu Jan 17 16:42:32 2019 +0100
@@ -12,17 +12,19 @@
 
 __docformat__ = 'restructuredtext'
 
+from pyramid.decorator import reify
 from pyramid.location import lineage
 from z3c.form import button, field
 from zope.interface import Interface
 
+from pyams_content.component.paragraph import IParagraphContainer, IParagraphTitle
 from pyams_content.component.paragraph.interfaces import IBaseParagraph, IParagraphContainerTarget, IParagraphFactory, \
-    IParagraphFactorySettings, IParagraphRenderer
+    IParagraphFactorySettings, IParagraphRenderer, PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.zmi.container import ParagraphContainerBaseTable, ParagraphContainerTable
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerView
-from pyams_content.component.paragraph import IParagraphTitle
 from pyams_content.features.renderer.zmi import BaseRenderedContentRenderer
-from pyams_content.interfaces import MANAGE_TOOL_PERMISSION
+from pyams_content.features.renderer.zmi.widget import RendererFieldWidget
+from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION, MANAGE_TOOL_PERMISSION
 from pyams_content.shared.common.interfaces import IWfSharedContent
 from pyams_form.form import AJAXAddForm, AJAXEditForm, ajax_config
 from pyams_form.help import FormHelp
@@ -39,10 +41,11 @@
 from pyams_skin.viewlet.menu import MenuDivider, MenuItem
 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
 from pyams_utils.adapter import adapter_config
+from pyams_utils.factory import get_object_factory
 from pyams_utils.registry import query_utility
 from pyams_utils.traversing import get_parent
 from pyams_viewlet.viewlet import viewlet_config
-from pyams_zmi.form import AdminDialogEditForm
+from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
 from pyams_zmi.interfaces.menu import IPropertiesMenu
 from pyams_zmi.layer import IAdminLayer
 
@@ -183,6 +186,36 @@
         return None
 
 
+#
+# Base paragraphs add forms
+#
+
+class BaseParagraphAddForm(AdminDialogAddForm):
+    """Base paragraph add form"""
+
+    content_interface = None
+
+    @reify
+    def factory(self):
+        return get_object_factory(self.content_interface)
+
+    @property
+    def icon_css_class(self):
+        return 'fa fa-fw {}'.format(self.factory.factory.icon_class)
+
+    @property
+    def fields(self):
+        return field.Fields(self.content_interface).omit(*PARAGRAPH_HIDDEN_FIELDS)
+
+    edit_permission = MANAGE_CONTENT_PERMISSION
+
+    def create(self, data):
+        return self.factory()
+
+    def add(self, object):
+        IParagraphContainer(self.context).append(object)
+
+
 class BaseParagraphAJAXAddForm(AJAXAddForm):
     """Base paragraph AJAX add form"""
 
@@ -204,6 +237,10 @@
         }
 
 
+#
+# Base paragraph edit forms
+#
+
 class IParagraphEditFormButtons(Interface):
     """Paragraph edit form buttons"""
 
@@ -234,7 +271,9 @@
     """Base paragraph edit form"""
 
     prefix = 'paragraph.'
-    buttons = button.Buttons(IParagraphInnerEditFormButtons)
+    buttons = button.Buttons(IParagraphEditFormButtons)
+
+    content_interface = None
 
     @property
     def title(self):
@@ -248,6 +287,23 @@
             return II18n(content).query_attribute('title', request=self.request)
         return super(BaseParagraphPropertiesEditForm, self).title
 
+    @reify
+    def factory(self):
+        return get_object_factory(self.content_interface)
+
+    @property
+    def icon_css_class(self):
+        return 'fa fa-fw {}'.format(self.factory.factory.icon_class)
+
+    @property
+    def fields(self):
+        fields = field.Fields(self.content_interface).omit(*PARAGRAPH_HIDDEN_FIELDS)
+        if 'renderer' in fields:
+            fields['renderer'].widgetFactory = RendererFieldWidget
+        return fields
+
+    edit_permission = MANAGE_CONTENT_PERMISSION
+
 
 class BaseParagraphAJAXEditForm(AJAXEditForm):
     """Base paragraph AJAX edit form"""