src/pyams_content/component/paragraph/zmi/html.py
changeset 355 5dce53509832
parent 283 9139536eab90
child 395 2a39b333a585
equal deleted inserted replaced
354:871c7cb35fd6 355:5dce53509832
    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, IIllustrationRenderer
    21 from pyams_content.component.illustration.interfaces import IIllustration, IIllustrationRenderer
    22 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
    22 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
    23     IParagraphSummary
    23     IParagraphSummary
    24 from pyams_content.component.paragraph.interfaces.html import IHTMLParagraph
    24 from pyams_content.component.paragraph.interfaces.html import IHTMLParagraph, IRawParagraph
    25 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
    25 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
    26 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
    26 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
    27 from pyams_content.shared.common.interfaces import IWfSharedContent
       
    28 from pyams_form.interfaces.form import IInnerForm, IEditFormButtons
    27 from pyams_form.interfaces.form import IInnerForm, IEditFormButtons
    29 from pyams_i18n.interfaces import II18n
    28 from pyams_i18n.interfaces import II18n
    30 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
    29 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
    31 from pyams_skin.layer import IPyAMSLayer
    30 from pyams_skin.layer import IPyAMSLayer
    32 from pyams_zmi.interfaces import IPropertiesEditForm
    31 from pyams_zmi.interfaces import IPropertiesEditForm
    33 from z3c.form.interfaces import INPUT_MODE
    32 from z3c.form.interfaces import INPUT_MODE
    34 
    33 
    35 # import packages
    34 # import packages
    36 from pyams_content.component.association.zmi import AssociationsTable
    35 from pyams_content.component.association.zmi import AssociationsTable
    37 from pyams_content.component.paragraph.html import HTMLParagraph
    36 from pyams_content.component.paragraph.html import HTMLParagraph, RawParagraph
    38 from pyams_content.component.paragraph.zmi import BaseParagraphAJAXAddForm, BaseParagraphAJAXEditForm, \
    37 from pyams_content.component.paragraph.zmi import BaseParagraphAJAXAddForm, BaseParagraphAJAXEditForm, \
    39     BaseParagraphAddMenu, BaseParagraphPropertiesEditForm
    38     BaseParagraphAddMenu, BaseParagraphPropertiesEditForm
    40 from pyams_content.component.paragraph.zmi.container import ParagraphContainerTable, \
    39 from pyams_content.component.paragraph.zmi.container import ParagraphContainerTable, \
    41     ParagraphTitleToolbarViewletManager
    40     ParagraphTitleToolbarViewletManager
    42 from pyams_pagelet.pagelet import pagelet_config
    41 from pyams_pagelet.pagelet import pagelet_config
    43 from pyams_template.template import template_config
    42 from pyams_template.template import template_config
    44 
       
    45 from pyams_utils.adapter import adapter_config
    43 from pyams_utils.adapter import adapter_config
    46 from pyams_utils.traversing import get_parent
    44 from pyams_utils.traversing import get_parent
    47 from pyams_viewlet.viewlet import viewlet_config, BaseContentProvider
    45 from pyams_viewlet.viewlet import viewlet_config, BaseContentProvider
    48 from pyams_zmi.form import AdminDialogAddForm
    46 from pyams_zmi.form import AdminDialogAddForm
    49 from pyramid.threadlocal import get_current_registry
    47 from pyramid.threadlocal import get_current_registry
    53 
    51 
    54 from pyams_content import _
    52 from pyams_content import _
    55 
    53 
    56 
    54 
    57 #
    55 #
    58 # HTML paragraph
    56 # Raw HTML paragraph
       
    57 #
       
    58 
       
    59 @viewlet_config(name='add-raw-paragraph.menu', context=IParagraphContainerTarget, view=IParagraphContainerView,
       
    60                 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=999)
       
    61 class RawParagraphAddMenu(BaseParagraphAddMenu):
       
    62     """Raw HTML paragraph add menu"""
       
    63 
       
    64     label = _("Add raw HTML paragraph...")
       
    65     label_css_class = 'fa fa-fw fa-code'
       
    66     url = 'add-raw-paragraph.html'
       
    67     paragraph_type = 'raw'
       
    68 
       
    69 
       
    70 @pagelet_config(name='add-raw-paragraph.html', context=IParagraphContainerTarget, layer=IPyAMSLayer,
       
    71                 permission=MANAGE_CONTENT_PERMISSION)
       
    72 class RawParagraphAddForm(AdminDialogAddForm):
       
    73     """Raw HTML paragraph add form"""
       
    74 
       
    75     legend = _("Add new raw HTML paragraph")
       
    76     dialog_class = 'modal-large'
       
    77     icon_css_class = 'fa fa-fw fa-code'
       
    78     label_css_class = 'control-label col-md-2'
       
    79     input_css_class = 'col-md-10'
       
    80 
       
    81     fields = field.Fields(IRawParagraph).omit('__parent__', '__name__', 'visible')
       
    82     ajax_handler = 'add-raw-paragraph.json'
       
    83     edit_permission = MANAGE_CONTENT_PERMISSION
       
    84 
       
    85     def updateWidgets(self, prefix=None):
       
    86         super(RawParagraphAddForm, self).updateWidgets(prefix)
       
    87         if 'body' in self.widgets:
       
    88             self.widgets['body'].widget_css_class = 'textarea height-100'
       
    89 
       
    90     def create(self, data):
       
    91         return RawParagraph()
       
    92 
       
    93     def add(self, object):
       
    94         IParagraphContainer(self.context).append(object)
       
    95 
       
    96 
       
    97 @view_config(name='add-raw-paragraph.json', context=IParagraphContainerTarget, request_type=IPyAMSLayer,
       
    98              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
    99 class RawParagraphAJAXAddForm(BaseParagraphAJAXAddForm, RawParagraphAddForm):
       
   100     """Raw HTML paragraph add form, JSON renderer"""
       
   101 
       
   102 
       
   103 @pagelet_config(name='properties.html', context=IRawParagraph, layer=IPyAMSLayer,
       
   104                 permission=MANAGE_CONTENT_PERMISSION)
       
   105 class RawParagraphPropertiesEditForm(BaseParagraphPropertiesEditForm):
       
   106     """Raw HTML paragraph properties edit form"""
       
   107 
       
   108     legend = _("Edit raw HTML paragraph properties")
       
   109     icon_css_class = 'fa fa-fw fa-code'
       
   110 
       
   111     fields = field.Fields(IRawParagraph).omit('__parent__', '__name__', 'visible')
       
   112     ajax_handler = 'properties.json'
       
   113     edit_permission = MANAGE_CONTENT_PERMISSION
       
   114 
       
   115     def updateWidgets(self, prefix=None):
       
   116         super(RawParagraphPropertiesEditForm, self).updateWidgets(prefix)
       
   117         if 'body' in self.widgets:
       
   118             self.widgets['body'].widget_css_class = 'textarea height-100'
       
   119 
       
   120 
       
   121 @view_config(name='properties.json', context=IRawParagraph, request_type=IPyAMSLayer,
       
   122              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   123 class RawParagraphPropertiesAJAXEditForm(BaseParagraphAJAXEditForm, RawParagraphPropertiesEditForm):
       
   124     """Raw HTML paragraph properties edit form, JSON renderer"""
       
   125 
       
   126 
       
   127 @adapter_config(context=(IRawParagraph, IPyAMSLayer), provides=IParagraphInnerEditor)
       
   128 @implementer(IInnerForm)
       
   129 class RawParagraphInnerEditForm(RawParagraphPropertiesEditForm):
       
   130     """Raw HTML paragraph inner edit form"""
       
   131 
       
   132     legend = None
       
   133     ajax_handler = 'inner-properties.json'
       
   134 
       
   135     @property
       
   136     def buttons(self):
       
   137         if self.mode == INPUT_MODE:
       
   138             return button.Buttons(IEditFormButtons)
       
   139         else:
       
   140             return button.Buttons()
       
   141 
       
   142 
       
   143 @view_config(name='inner-properties.json', context=IRawParagraph, request_type=IPyAMSLayer,
       
   144              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   145 class RawParagraphInnerAJAXEditForm(BaseParagraphAJAXEditForm, RawParagraphInnerEditForm):
       
   146     """Raw HTML paragraph inner edit form, JSON renderer"""
       
   147 
       
   148 
       
   149 #
       
   150 # Raw HTML paragraph summary
       
   151 #
       
   152 
       
   153 @adapter_config(context=(IRawParagraph, IPyAMSLayer), provides=IParagraphSummary)
       
   154 @template_config(template='templates/raw-summary.pt', layer=IPyAMSLayer)
       
   155 class RawParagraphSummary(BaseContentProvider):
       
   156     """Raw HTML paragraph summary"""
       
   157 
       
   158     language = None
       
   159 
       
   160     def update(self):
       
   161         i18n = II18n(self.context)
       
   162         if self.language:
       
   163             for attr in ('title', 'body'):
       
   164                 setattr(self, attr, i18n.get_attribute(attr, self.language, request=self.request))
       
   165         else:
       
   166             for attr in ('title', 'body'):
       
   167                 setattr(self, attr, i18n.query_attribute(attr, request=self.request))
       
   168 
       
   169 
       
   170 #
       
   171 # Rich text paragraph
    59 #
   172 #
    60 
   173 
    61 @viewlet_config(name='add-html-paragraph.menu', context=IParagraphContainerTarget, view=IParagraphContainerView,
   174 @viewlet_config(name='add-html-paragraph.menu', context=IParagraphContainerTarget, view=IParagraphContainerView,
    62                 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50)
   175                 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50)
    63 class HTMLParagraphAddMenu(BaseParagraphAddMenu):
   176 class HTMLParagraphAddMenu(BaseParagraphAddMenu):
    64     """HTML paragraph add menu"""
   177     """Rich text paragraph add menu"""
    65 
   178 
    66     label = _("Add HTML paragraph...")
   179     label = _("Add rich text paragraph...")
    67     label_css_class = 'fa fa-fw fa-html5'
   180     label_css_class = 'fa fa-fw fa-html5'
    68     url = 'add-html-paragraph.html'
   181     url = 'add-html-paragraph.html'
    69     paragraph_type = 'HTML'
   182     paragraph_type = 'HTML'
    70 
   183 
    71 
   184 
    72 @pagelet_config(name='add-html-paragraph.html', context=IParagraphContainerTarget, layer=IPyAMSLayer,
   185 @pagelet_config(name='add-html-paragraph.html', context=IParagraphContainerTarget, layer=IPyAMSLayer,
    73                 permission=MANAGE_CONTENT_PERMISSION)
   186                 permission=MANAGE_CONTENT_PERMISSION)
    74 class HTMLParagraphAddForm(AdminDialogAddForm):
   187 class HTMLParagraphAddForm(AdminDialogAddForm):
    75     """HTML paragraph add form"""
   188     """Rich text paragraph add form"""
    76 
   189 
    77     legend = _("Add new HTML paragraph")
   190     legend = _("Add new rich text paragraph")
    78     dialog_class = 'modal-max'
   191     dialog_class = 'modal-max'
    79     icon_css_class = 'fa fa-fw fa-html5'
   192     icon_css_class = 'fa fa-fw fa-html5'
    80     label_css_class = 'control-label col-md-2'
   193     label_css_class = 'control-label col-md-2'
    81     input_css_class = 'col-md-10'
   194     input_css_class = 'col-md-10'
    82 
   195 
    97 
   210 
    98 
   211 
    99 @view_config(name='add-html-paragraph.json', context=IParagraphContainerTarget, request_type=IPyAMSLayer,
   212 @view_config(name='add-html-paragraph.json', context=IParagraphContainerTarget, request_type=IPyAMSLayer,
   100              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   213              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   101 class HTMLParagraphAJAXAddForm(BaseParagraphAJAXAddForm, HTMLParagraphAddForm):
   214 class HTMLParagraphAJAXAddForm(BaseParagraphAJAXAddForm, HTMLParagraphAddForm):
   102     """HTML paragraph add form, JSON renderer"""
   215     """Rich text paragraph add form, JSON renderer"""
   103 
   216 
   104 
   217 
   105 @pagelet_config(name='properties.html', context=IHTMLParagraph, layer=IPyAMSLayer,
   218 @pagelet_config(name='properties.html', context=IHTMLParagraph, layer=IPyAMSLayer,
   106                 permission=MANAGE_CONTENT_PERMISSION)
   219                 permission=MANAGE_CONTENT_PERMISSION)
   107 class HTMLParagraphPropertiesEditForm(BaseParagraphPropertiesEditForm):
   220 class HTMLParagraphPropertiesEditForm(BaseParagraphPropertiesEditForm):
   108     """HTML paragraph properties edit form"""
   221     """Rich text paragraph properties edit form"""
   109 
   222 
   110     legend = _("Edit HTML paragraph properties")
   223     legend = _("Edit rich text paragraph properties")
   111     dialog_class = 'modal-max'
   224     dialog_class = 'modal-max'
   112     icon_css_class = 'fa fa-fw fa-html5'
   225     icon_css_class = 'fa fa-fw fa-html5'
   113     label_css_class = 'control-label col-md-2'
   226     label_css_class = 'control-label col-md-2'
   114     input_css_class = 'col-md-10'
   227     input_css_class = 'col-md-10'
   115 
   228 
   126                 widget.id = '{id}_{name}'.format(id=widget.id, name=self.context.__name__)
   239                 widget.id = '{id}_{name}'.format(id=widget.id, name=self.context.__name__)
   127             body_widget.widget_css_class = 'textarea'
   240             body_widget.widget_css_class = 'textarea'
   128 
   241 
   129 
   242 
   130 class IHTMLParagraphInnerEditForm(Interface):
   243 class IHTMLParagraphInnerEditForm(Interface):
   131     """Marker interface for HTML paragraph inner form"""
   244     """Marker interface for rich text paragraph inner form"""
   132 
   245 
   133 
   246 
   134 @view_config(name='properties.json', context=IHTMLParagraph, request_type=IPyAMSLayer,
   247 @view_config(name='properties.json', context=IHTMLParagraph, request_type=IPyAMSLayer,
   135              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   248              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   136 class HTMLParagraphPropertiesAJAXEditForm(BaseParagraphAJAXEditForm, HTMLParagraphPropertiesEditForm):
   249 class HTMLParagraphPropertiesAJAXEditForm(BaseParagraphAJAXEditForm, HTMLParagraphPropertiesEditForm):
   137     """HTML paragraph properties edit form, JSON renderer"""
   250     """Rich text paragraph properties edit form, JSON renderer"""
   138 
   251 
   139     def get_ajax_output(self, changes):
   252     def get_ajax_output(self, changes):
   140         output = super(HTMLParagraphPropertiesAJAXEditForm, self).get_ajax_output(changes)
   253         output = super(HTMLParagraphPropertiesAJAXEditForm, self).get_ajax_output(changes)
   141         if 'body' in changes.get(IHTMLParagraph, ()):
   254         if 'body' in changes.get(IHTMLParagraph, ()):
   142             # refresh associations count markers
   255             # refresh associations count markers
   167 
   280 
   168 
   281 
   169 @adapter_config(context=(IHTMLParagraph, IPyAMSLayer), provides=IParagraphInnerEditor)
   282 @adapter_config(context=(IHTMLParagraph, IPyAMSLayer), provides=IParagraphInnerEditor)
   170 @implementer(IInnerForm, IPropertiesEditForm, IAssociationsParentForm, IHTMLParagraphInnerEditForm)
   283 @implementer(IInnerForm, IPropertiesEditForm, IAssociationsParentForm, IHTMLParagraphInnerEditForm)
   171 class HTMLParagraphInnerEditForm(HTMLParagraphPropertiesEditForm):
   284 class HTMLParagraphInnerEditForm(HTMLParagraphPropertiesEditForm):
   172     """HTML paragraph inner edit form"""
   285     """Rich text paragraph inner edit form"""
   173 
   286 
   174     legend = None
   287     legend = None
   175     ajax_handler = 'inner-properties.json'
   288     ajax_handler = 'inner-properties.json'
   176 
   289 
   177     @property
   290     @property
   183 
   296 
   184 
   297 
   185 @view_config(name='inner-properties.json', context=IHTMLParagraph, request_type=IPyAMSLayer,
   298 @view_config(name='inner-properties.json', context=IHTMLParagraph, request_type=IPyAMSLayer,
   186              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   299              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   187 class HTMLParagraphInnerAJAXEditForm(BaseParagraphAJAXEditForm, HTMLParagraphInnerEditForm):
   300 class HTMLParagraphInnerAJAXEditForm(BaseParagraphAJAXEditForm, HTMLParagraphInnerEditForm):
   188     """HTML paragraph inner edit form, JSON renderer"""
   301     """Rich text paragraph inner edit form, JSON renderer"""
   189 
   302 
   190     def get_ajax_output(self, changes):
   303     def get_ajax_output(self, changes):
   191         output = super(HTMLParagraphInnerAJAXEditForm, self).get_ajax_output(changes)
   304         output = super(HTMLParagraphInnerAJAXEditForm, self).get_ajax_output(changes)
   192         if 'body' in changes.get(IHTMLParagraph, ()):
   305         if 'body' in changes.get(IHTMLParagraph, ()):
   193             # refresh associations count markers
   306             # refresh associations count markers
   216             })
   329             })
   217         return output
   330         return output
   218 
   331 
   219 
   332 
   220 #
   333 #
   221 # HTML paragraph summary
   334 # rich text paragraph summary
   222 #
   335 #
   223 
   336 
   224 @adapter_config(context=(IHTMLParagraph, IPyAMSLayer), provides=IParagraphSummary)
   337 @adapter_config(context=(IHTMLParagraph, IPyAMSLayer), provides=IParagraphSummary)
   225 @template_config(template='templates/html-summary.pt', layer=IPyAMSLayer)
   338 @template_config(template='templates/html-summary.pt', layer=IPyAMSLayer)
   226 class HTMLParagraphSummary(BaseContentProvider):
   339 class HTMLParagraphSummary(BaseContentProvider):
   227     """HTML paragraph summary"""
   340     """Rich text paragraph summary"""
   228 
   341 
   229     illustration = None
   342     illustration = None
   230     illustration_renderer = None
   343     illustration_renderer = None
   231     language = None
   344     language = None
   232 
   345