src/pyams_content/component/paragraph/zmi/html.py
changeset 555 8e8a14452567
parent 550 9658debb49a3
child 591 b694d5667d17
equal deleted inserted replaced
554:120ce09ade94 555:8e8a14452567
    16 # import standard library
    16 # import standard library
    17 
    17 
    18 # import interfaces
    18 # import interfaces
    19 from pyams_content.component.association.interfaces import IAssociationTarget
    19 from pyams_content.component.association.interfaces import IAssociationTarget
    20 from pyams_content.component.association.zmi.interfaces import IAssociationsParentForm
    20 from pyams_content.component.association.zmi.interfaces import IAssociationsParentForm
    21 from pyams_content.component.illustration.interfaces import IIllustration
       
    22 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphFactorySettings, \
    21 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphFactorySettings, \
    23     IParagraphContainer, IParagraphRenderer
    22     IParagraphContainer
    24 from pyams_content.component.paragraph.interfaces.html import IHTMLParagraph, IRawParagraph, RAW_PARAGRAPH_TYPE, \
    23 from pyams_content.component.paragraph.interfaces.html import IHTMLParagraph, IRawParagraph, RAW_PARAGRAPH_TYPE, \
    25     HTML_PARAGRAPH_TYPE
    24     HTML_PARAGRAPH_TYPE
    26 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
    25 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
    27 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
    26 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
    28 from pyams_form.interfaces.form import IInnerForm
    27 from pyams_form.interfaces.form import IInnerForm
    29 from pyams_i18n.interfaces import II18n
       
    30 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
    28 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
    31 from pyams_skin.layer import IPyAMSLayer
    29 from pyams_skin.layer import IPyAMSLayer
    32 from pyams_zmi.interfaces import IPropertiesEditForm
    30 from pyams_zmi.interfaces import IPropertiesEditForm
    33 from z3c.form.interfaces import INPUT_MODE
    31 from z3c.form.interfaces import INPUT_MODE
    34 
    32 
    36 from pyams_content.component.association.zmi import AssociationsTable
    34 from pyams_content.component.association.zmi import AssociationsTable
    37 from pyams_content.component.paragraph.html import HTMLParagraph, RawParagraph
    35 from pyams_content.component.paragraph.html import HTMLParagraph, RawParagraph
    38 from pyams_content.component.paragraph.zmi import BaseParagraphAJAXAddForm, BaseParagraphAJAXEditForm, \
    36 from pyams_content.component.paragraph.zmi import BaseParagraphAJAXAddForm, BaseParagraphAJAXEditForm, \
    39     BaseParagraphAddMenu, BaseParagraphPropertiesEditForm, get_json_paragraph_toolbar_refresh_event, \
    37     BaseParagraphAddMenu, BaseParagraphPropertiesEditForm, get_json_paragraph_toolbar_refresh_event, \
    40     IParagraphEditFormButtons
    38     IParagraphEditFormButtons
       
    39 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget
    41 from pyams_form.security import ProtectedFormObjectMixin
    40 from pyams_form.security import ProtectedFormObjectMixin
    42 from pyams_pagelet.pagelet import pagelet_config
    41 from pyams_pagelet.pagelet import pagelet_config
    43 from pyams_skin.event import get_json_switched_table_refresh_event
    42 from pyams_skin.event import get_json_switched_table_refresh_event
    44 from pyams_skin.viewlet.menu import MenuDivider
    43 from pyams_skin.viewlet.menu import MenuDivider
    45 from pyams_template.template import template_config
       
    46 from pyams_utils.adapter import adapter_config
    44 from pyams_utils.adapter import adapter_config
    47 from pyams_utils.traversing import get_parent
    45 from pyams_utils.traversing import get_parent
    48 from pyams_viewlet.viewlet import viewlet_config, BaseContentProvider
    46 from pyams_viewlet.viewlet import viewlet_config
    49 from pyams_zmi.form import AdminDialogAddForm
    47 from pyams_zmi.form import AdminDialogAddForm
    50 from pyramid.view import view_config
    48 from pyramid.view import view_config
    51 from z3c.form import field, button
    49 from z3c.form import field, button
    52 from zope.interface import implementer
    50 from zope.interface import implementer
    53 
    51 
   123 
   121 
   124     legend = _("Edit raw HTML paragraph properties")
   122     legend = _("Edit raw HTML paragraph properties")
   125     icon_css_class = 'fa fa-fw fa-code'
   123     icon_css_class = 'fa fa-fw fa-code'
   126 
   124 
   127     fields = field.Fields(IRawParagraph).omit('__parent__', '__name__', 'visible')
   125     fields = field.Fields(IRawParagraph).omit('__parent__', '__name__', 'visible')
       
   126     fields['renderer'].widgetFactory = RendererFieldWidget
       
   127 
   128     ajax_handler = 'properties.json'
   128     ajax_handler = 'properties.json'
   129     edit_permission = MANAGE_CONTENT_PERMISSION
   129     edit_permission = MANAGE_CONTENT_PERMISSION
   130 
   130 
   131     def updateWidgets(self, prefix=None):
   131     def updateWidgets(self, prefix=None):
   132         super(RawParagraphPropertiesEditForm, self).updateWidgets(prefix)
   132         super(RawParagraphPropertiesEditForm, self).updateWidgets(prefix)
   161 class RawParagraphInnerAJAXEditForm(BaseParagraphAJAXEditForm, RawParagraphInnerEditForm):
   161 class RawParagraphInnerAJAXEditForm(BaseParagraphAJAXEditForm, RawParagraphInnerEditForm):
   162     """Raw HTML paragraph inner edit form, JSON renderer"""
   162     """Raw HTML paragraph inner edit form, JSON renderer"""
   163 
   163 
   164 
   164 
   165 #
   165 #
   166 # Raw HTML paragraph renderer
       
   167 #
       
   168 
       
   169 @adapter_config(context=(IRawParagraph, IPyAMSLayer), provides=IParagraphRenderer)
       
   170 @template_config(template='templates/raw-render.pt', layer=IPyAMSLayer)
       
   171 class RawParagraphRenderer(BaseContentProvider):
       
   172     """Raw HTML paragraph renderer"""
       
   173 
       
   174     language = None
       
   175 
       
   176     def update(self):
       
   177         i18n = II18n(self.context)
       
   178         if self.language:
       
   179             for attr in ('title', 'body'):
       
   180                 setattr(self, attr, i18n.get_attribute(attr, self.language, request=self.request))
       
   181         else:
       
   182             for attr in ('title', 'body'):
       
   183                 setattr(self, attr, i18n.query_attribute(attr, request=self.request))
       
   184 
       
   185 
       
   186 #
       
   187 # Rich text paragraph
   166 # Rich text paragraph
   188 #
   167 #
   189 
   168 
   190 @viewlet_config(name='add-html-paragraph.menu', context=IParagraphContainerTarget, view=IParagraphContainerView,
   169 @viewlet_config(name='add-html-paragraph.menu', context=IParagraphContainerTarget, view=IParagraphContainerView,
   191                 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50)
   170                 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50)
   243     icon_css_class = 'fa fa-fw fa-font'
   222     icon_css_class = 'fa fa-fw fa-font'
   244     label_css_class = 'control-label col-md-2'
   223     label_css_class = 'control-label col-md-2'
   245     input_css_class = 'col-md-10'
   224     input_css_class = 'col-md-10'
   246 
   225 
   247     fields = field.Fields(IHTMLParagraph).omit('__parent__', '__name__', 'visible')
   226     fields = field.Fields(IHTMLParagraph).omit('__parent__', '__name__', 'visible')
       
   227     fields['renderer'].widgetFactory = RendererFieldWidget
       
   228 
   248     ajax_handler = 'properties.json'
   229     ajax_handler = 'properties.json'
   249     edit_permission = MANAGE_CONTENT_PERMISSION
   230     edit_permission = MANAGE_CONTENT_PERMISSION
   250 
   231 
   251     def updateWidgets(self, prefix=None):
   232     def updateWidgets(self, prefix=None):
   252         super(HTMLParagraphPropertiesEditForm, self).updateWidgets(prefix)
   233         super(HTMLParagraphPropertiesEditForm, self).updateWidgets(prefix)
   306                 get_json_paragraph_toolbar_refresh_event(parent, self.request))
   287                 get_json_paragraph_toolbar_refresh_event(parent, self.request))
   307             # refresh associations table
   288             # refresh associations table
   308             output.setdefault('events', []).append(
   289             output.setdefault('events', []).append(
   309                 get_json_switched_table_refresh_event(self.context, self.request, AssociationsTable))
   290                 get_json_switched_table_refresh_event(self.context, self.request, AssociationsTable))
   310         return output
   291         return output
   311 
       
   312 
       
   313 #
       
   314 # Rich text paragraph renderer
       
   315 #
       
   316 
       
   317 @adapter_config(context=(IHTMLParagraph, IPyAMSLayer), provides=IParagraphRenderer)
       
   318 @template_config(template='templates/html-render.pt', layer=IPyAMSLayer)
       
   319 class HTMLParagraphRenderer(BaseContentProvider):
       
   320     """Rich text paragraph renderer"""
       
   321 
       
   322     illustration = None
       
   323     illustration_renderer = None
       
   324     language = None
       
   325 
       
   326     def update(self):
       
   327         i18n = II18n(self.context)
       
   328         if self.language:
       
   329             for attr in ('title', 'body'):
       
   330                 setattr(self, attr, i18n.get_attribute(attr, self.language, request=self.request))
       
   331         else:
       
   332             for attr in ('title', 'body'):
       
   333                 setattr(self, attr, i18n.query_attribute(attr, request=self.request))
       
   334         self.illustration = IIllustration(self.context)
       
   335         if self.illustration.data:
       
   336             renderer = self.illustration_renderer = self.illustration.get_renderer()
       
   337             if renderer is not None:
       
   338                 renderer.update()
       
   339 
       
   340     def render_illustration(self):
       
   341         if not self.illustration_renderer:
       
   342             return ''
       
   343         return self.illustration_renderer.render()