src/pyams_content/component/links/zmi/__init__.py
changeset 591 b694d5667d17
parent 550 9658debb49a3
child 625 abd143a83a07
equal deleted inserted replaced
590:4fafaf94701d 591:b694d5667d17
    29 # import packages
    29 # import packages
    30 from pyams_content.component.association.zmi import AssociationItemAJAXAddForm, AssociationItemAJAXEditForm
    30 from pyams_content.component.association.zmi import AssociationItemAJAXAddForm, AssociationItemAJAXEditForm
    31 from pyams_content.component.links import InternalLink, ExternalLink, MailtoLink
    31 from pyams_content.component.links import InternalLink, ExternalLink, MailtoLink
    32 from pyams_content.component.paragraph.zmi import get_json_paragraph_markers_refresh_event
    32 from pyams_content.component.paragraph.zmi import get_json_paragraph_markers_refresh_event
    33 from pyams_content.component.paragraph.zmi.container import ParagraphContainerCounterBase
    33 from pyams_content.component.paragraph.zmi.container import ParagraphContainerCounterBase
       
    34 from pyams_form.form import ajax_config
    34 from pyams_form.security import ProtectedFormObjectMixin
    35 from pyams_form.security import ProtectedFormObjectMixin
    35 from pyams_pagelet.pagelet import pagelet_config
    36 from pyams_pagelet.pagelet import pagelet_config
    36 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
    37 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
    37 from pyams_viewlet.viewlet import viewlet_config
    38 from pyams_viewlet.viewlet import viewlet_config
    38 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    39 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    39 from pyramid.view import view_config
       
    40 from z3c.form import field
    40 from z3c.form import field
    41 
    41 
    42 from pyams_content import _
    42 from pyams_content import _
    43 
    43 
    44 
    44 
    76     modal_target = True
    76     modal_target = True
    77 
    77 
    78 
    78 
    79 @pagelet_config(name='add-internal-link.html', context=ILinkContainerTarget, layer=IPyAMSLayer,
    79 @pagelet_config(name='add-internal-link.html', context=ILinkContainerTarget, layer=IPyAMSLayer,
    80                 permission=MANAGE_CONTENT_PERMISSION)
    80                 permission=MANAGE_CONTENT_PERMISSION)
       
    81 @ajax_config(name='add-internal-link.json', context=ILinkContainerTarget, layer=IPyAMSLayer,
       
    82              base=AssociationItemAJAXAddForm)
    81 class InternalLinkAddForm(AdminDialogAddForm):
    83 class InternalLinkAddForm(AdminDialogAddForm):
    82     """Internal link add form"""
    84     """Internal link add form"""
    83 
    85 
    84     legend = _("Add new internal link")
    86     legend = _("Add new internal link")
    85     icon_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
    87     icon_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
    86 
    88 
    87     fields = field.Fields(IInternalLink).select('reference', 'title', 'description')
    89     fields = field.Fields(IInternalLink).select('reference', 'title', 'description')
    88     ajax_handler = 'add-internal-link.json'
       
    89     edit_permission = MANAGE_CONTENT_PERMISSION
    90     edit_permission = MANAGE_CONTENT_PERMISSION
    90 
    91 
    91     def updateWidgets(self, prefix=None):
    92     def updateWidgets(self, prefix=None):
    92         super(InternalLinkAddForm, self).updateWidgets(prefix)
    93         super(InternalLinkAddForm, self).updateWidgets(prefix)
    93         if 'description' in self.widgets:
    94         if 'description' in self.widgets:
    97         return InternalLink()
    98         return InternalLink()
    98 
    99 
    99     def add(self, object):
   100     def add(self, object):
   100         IAssociationContainer(self.context).append(object)
   101         IAssociationContainer(self.context).append(object)
   101 
   102 
   102 
   103     def get_ajax_output(self, changes):
   103 @view_config(name='add-internal-link.json', context=ILinkContainerTarget, request_type=IPyAMSLayer,
   104         output = super(self.__class__, self).get_ajax_output(changes)
   104              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   105 class InternalLinkAJAXAddForm(AssociationItemAJAXAddForm, InternalLinkAddForm):
       
   106     """Internal link add form, JSON renderer"""
       
   107 
       
   108     def get_ajax_output(self, changes):
       
   109         output = super(InternalLinkAJAXAddForm, self).get_ajax_output(changes)
       
   110         if output:
   105         if output:
   111             output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
   106             output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
   112                                                                                             self, InternalLinksCounter))
   107                                                                                             self, InternalLinksCounter))
   113         return output
   108         return output
   114 
   109 
   115 
   110 
   116 @pagelet_config(name='properties.html', context=IInternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
   111 @pagelet_config(name='properties.html', context=IInternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
       
   112 @ajax_config(name='properties.json', context=IInternalLink, layer=IPyAMSLayer,
       
   113              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
   117 class InternalLinkPropertiesEditForm(AdminDialogEditForm):
   114 class InternalLinkPropertiesEditForm(AdminDialogEditForm):
   118     """Internal link properties edit form"""
   115     """Internal link properties edit form"""
   119 
   116 
   120     prefix = 'internallink_properties.'
   117     prefix = 'internallink_properties.'
   121 
   118 
   122     legend = _("Edit internal link properties")
   119     legend = _("Edit internal link properties")
   123     icon_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
   120     icon_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
   124 
   121 
   125     fields = field.Fields(IInternalLink).select('reference', 'title', 'description')
   122     fields = field.Fields(IInternalLink).select('reference', 'title', 'description')
   126     ajax_handler = 'properties.json'
       
   127     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   123     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   128 
   124 
   129     def updateWidgets(self, prefix=None):
   125     def updateWidgets(self, prefix=None):
   130         super(InternalLinkPropertiesEditForm, self).updateWidgets(prefix)
   126         super(InternalLinkPropertiesEditForm, self).updateWidgets(prefix)
   131         if 'description' in self.widgets:
   127         if 'description' in self.widgets:
   132             self.widgets['description'].widget_css_class = 'textarea'
   128             self.widgets['description'].widget_css_class = 'textarea'
   133 
       
   134 
       
   135 @view_config(name='properties.json', context=IInternalLink, request_type=IPyAMSLayer,
       
   136              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   137 class InternalLinkPropertiesAJAXEditForm(AssociationItemAJAXEditForm, InternalLinkPropertiesEditForm):
       
   138     """Internal link properties edit form, JSON renderer"""
       
   139 
   129 
   140     def get_ajax_output(self, changes):
   130     def get_ajax_output(self, changes):
   141         if ('title' in changes.get(IBaseLink, ())) or \
   131         if ('title' in changes.get(IBaseLink, ())) or \
   142            ('reference' in changes.get(IInternalLink, ())):
   132            ('reference' in changes.get(IInternalLink, ())):
   143             return self.get_associations_table()
   133             return self.get_associations_table()
   144         else:
   134         else:
   145             return super(InternalLinkPropertiesAJAXEditForm, self).get_ajax_output(changes)
   135             return super(self.__class__, self).get_ajax_output(changes)
   146 
   136 
   147 
   137 
   148 #
   138 #
   149 # External links views
   139 # External links views
   150 #
   140 #
   179     modal_target = True
   169     modal_target = True
   180 
   170 
   181 
   171 
   182 @pagelet_config(name='add-external-link.html', context=ILinkContainerTarget, layer=IPyAMSLayer,
   172 @pagelet_config(name='add-external-link.html', context=ILinkContainerTarget, layer=IPyAMSLayer,
   183                 permission=MANAGE_CONTENT_PERMISSION)
   173                 permission=MANAGE_CONTENT_PERMISSION)
       
   174 @ajax_config(name='add-external-link.json', context=ILinkContainerTarget, layer=IPyAMSLayer,
       
   175              base=AssociationItemAJAXAddForm)
   184 class ExternalLinkAddForm(AdminDialogAddForm):
   176 class ExternalLinkAddForm(AdminDialogAddForm):
   185     """External link add form"""
   177     """External link add form"""
   186 
   178 
   187     legend = _("Add new external link")
   179     legend = _("Add new external link")
   188     icon_css_class = 'fa fa-fw fa-external-link'
   180     icon_css_class = 'fa fa-fw fa-external-link'
   189 
   181 
   190     fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'language')
   182     fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'language')
   191     ajax_handler = 'add-external-link.json'
       
   192     edit_permission = MANAGE_CONTENT_PERMISSION
   183     edit_permission = MANAGE_CONTENT_PERMISSION
   193 
   184 
   194     def updateWidgets(self, prefix=None):
   185     def updateWidgets(self, prefix=None):
   195         super(ExternalLinkAddForm, self).updateWidgets(prefix)
   186         super(ExternalLinkAddForm, self).updateWidgets(prefix)
   196         if 'description' in self.widgets:
   187         if 'description' in self.widgets:
   200         return ExternalLink()
   191         return ExternalLink()
   201 
   192 
   202     def add(self, object):
   193     def add(self, object):
   203         IAssociationContainer(self.context).append(object)
   194         IAssociationContainer(self.context).append(object)
   204 
   195 
   205 
   196     def get_ajax_output(self, changes):
   206 @view_config(name='add-external-link.json', context=ILinkContainerTarget, request_type=IPyAMSLayer,
   197         output = super(self.__class__, self).get_ajax_output(changes)
   207              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   208 class ExternalLinkAJAXAddForm(AssociationItemAJAXAddForm, ExternalLinkAddForm):
       
   209     """External link add form, JSON renderer"""
       
   210 
       
   211     def get_ajax_output(self, changes):
       
   212         output = super(ExternalLinkAJAXAddForm, self).get_ajax_output(changes)
       
   213         if output:
   198         if output:
   214             output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
   199             output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
   215                                                                                             self, ExternalLinksCounter))
   200                                                                                             self, ExternalLinksCounter))
   216         return output
   201         return output
   217 
   202 
   218 
   203 
   219 @pagelet_config(name='properties.html', context=IExternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
   204 @pagelet_config(name='properties.html', context=IExternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
       
   205 @ajax_config(name='properties.json', context=IExternalLink, layer=IPyAMSLayer,
       
   206              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
   220 class ExternalLinkPropertiesEditForm(AdminDialogEditForm):
   207 class ExternalLinkPropertiesEditForm(AdminDialogEditForm):
   221     """External link properties edit form"""
   208     """External link properties edit form"""
   222 
   209 
   223     prefix = 'externallink_properties.'
   210     prefix = 'externallink_properties.'
   224 
   211 
   225     legend = _("Edit external link properties")
   212     legend = _("Edit external link properties")
   226     icon_css_class = 'fa fa-fw fa-external-link'
   213     icon_css_class = 'fa fa-fw fa-external-link'
   227 
   214 
   228     fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'language')
   215     fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'language')
   229     ajax_handler = 'properties.json'
       
   230     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   216     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   231 
   217 
   232     def updateWidgets(self, prefix=None):
   218     def updateWidgets(self, prefix=None):
   233         super(ExternalLinkPropertiesEditForm, self).updateWidgets(prefix)
   219         super(ExternalLinkPropertiesEditForm, self).updateWidgets(prefix)
   234         if 'description' in self.widgets:
   220         if 'description' in self.widgets:
   235             self.widgets['description'].widget_css_class = 'textarea'
   221             self.widgets['description'].widget_css_class = 'textarea'
   236 
       
   237 
       
   238 @view_config(name='properties.json', context=IExternalLink, request_type=IPyAMSLayer,
       
   239              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   240 class ExternalLinkPropertiesAJAXEditForm(AssociationItemAJAXEditForm, ExternalLinkPropertiesEditForm):
       
   241     """External link properties edit form, JSON renderer"""
       
   242 
   222 
   243     def get_ajax_output(self, changes):
   223     def get_ajax_output(self, changes):
   244         if ('title' in changes.get(IBaseLink, ())) or \
   224         if ('title' in changes.get(IBaseLink, ())) or \
   245            ('url' in changes.get(IExternalLink, ())):
   225            ('url' in changes.get(IExternalLink, ())):
   246             return self.get_associations_table()
   226             return self.get_associations_table()
   247         else:
   227         else:
   248             return super(ExternalLinkPropertiesAJAXEditForm, self).get_ajax_output(changes)
   228             return super(self.__class__, self).get_ajax_output(changes)
   249 
   229 
   250 
   230 
   251 #
   231 #
   252 # Mailto links views
   232 # Mailto links views
   253 #
   233 #
   282     modal_target = True
   262     modal_target = True
   283 
   263 
   284 
   264 
   285 @pagelet_config(name='add-mailto-link.html', context=ILinkContainerTarget, layer=IPyAMSLayer,
   265 @pagelet_config(name='add-mailto-link.html', context=ILinkContainerTarget, layer=IPyAMSLayer,
   286                 permission=MANAGE_CONTENT_PERMISSION)
   266                 permission=MANAGE_CONTENT_PERMISSION)
       
   267 @ajax_config(name='add-mailto-link.json', context=ILinkContainerTarget, layer=IPyAMSLayer,
       
   268              base=AssociationItemAJAXAddForm)
   287 class MailtoLinkAddForm(AdminDialogAddForm):
   269 class MailtoLinkAddForm(AdminDialogAddForm):
   288     """Mailto link add form"""
   270     """Mailto link add form"""
   289 
   271 
   290     legend = _("Add new mailto link")
   272     legend = _("Add new mailto link")
   291     icon_css_class = 'fa fa-fw fa-envelope-o'
   273     icon_css_class = 'fa fa-fw fa-envelope-o'
   292 
   274 
   293     fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description')
   275     fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description')
   294     ajax_handler = 'add-mailto-link.json'
       
   295     edit_permission = MANAGE_CONTENT_PERMISSION
   276     edit_permission = MANAGE_CONTENT_PERMISSION
   296 
   277 
   297     def updateWidgets(self, prefix=None):
   278     def updateWidgets(self, prefix=None):
   298         super(MailtoLinkAddForm, self).updateWidgets(prefix)
   279         super(MailtoLinkAddForm, self).updateWidgets(prefix)
   299         if 'description' in self.widgets:
   280         if 'description' in self.widgets:
   303         return MailtoLink()
   284         return MailtoLink()
   304 
   285 
   305     def add(self, object):
   286     def add(self, object):
   306         IAssociationContainer(self.context).append(object)
   287         IAssociationContainer(self.context).append(object)
   307 
   288 
   308 
   289     def get_ajax_output(self, changes):
   309 @view_config(name='add-mailto-link.json', context=ILinkContainerTarget, request_type=IPyAMSLayer,
   290         output = super(self.__class__, self).get_ajax_output(changes)
   310              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   311 class MailtoLinkAJAXAddForm(AssociationItemAJAXAddForm, MailtoLinkAddForm):
       
   312     """Mailto link add form, JSON renderer"""
       
   313 
       
   314     def get_ajax_output(self, changes):
       
   315         output = super(MailtoLinkAJAXAddForm, self).get_ajax_output(changes)
       
   316         if output:
   291         if output:
   317             output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
   292             output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
   318                                                                                             self, MailtoLinksCounter))
   293                                                                                             self, MailtoLinksCounter))
   319         return output
   294         return output
   320 
   295 
   321 
   296 
   322 @pagelet_config(name='properties.html', context=IMailtoLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
   297 @pagelet_config(name='properties.html', context=IMailtoLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
       
   298 @ajax_config(name='properties.json', context=IMailtoLink, layer=IPyAMSLayer,
       
   299              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
   323 class MailtoLinkPropertiesEditForm(AdminDialogEditForm):
   300 class MailtoLinkPropertiesEditForm(AdminDialogEditForm):
   324     """Mailto link properties edit form"""
   301     """Mailto link properties edit form"""
   325 
   302 
   326     prefix = 'mailtolink_properties.'
   303     prefix = 'mailtolink_properties.'
   327 
   304 
   328     legend = _("Edit mailto link properties")
   305     legend = _("Edit mailto link properties")
   329     icon_css_class = 'fa fa-fw fa-envelope-o'
   306     icon_css_class = 'fa fa-fw fa-envelope-o'
   330 
   307 
   331     fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description')
   308     fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description')
   332     ajax_handler = 'properties.json'
       
   333     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   309     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   334 
   310 
   335     def updateWidgets(self, prefix=None):
   311     def updateWidgets(self, prefix=None):
   336         super(MailtoLinkPropertiesEditForm, self).updateWidgets(prefix)
   312         super(MailtoLinkPropertiesEditForm, self).updateWidgets(prefix)
   337         if 'description' in self.widgets:
   313         if 'description' in self.widgets:
   338             self.widgets['description'].widget_css_class = 'textarea'
   314             self.widgets['description'].widget_css_class = 'textarea'
   339 
       
   340 
       
   341 @view_config(name='properties.json', context=IMailtoLink, request_type=IPyAMSLayer,
       
   342              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   343 class MailtoLinkPropertiesAJAXEditForm(AssociationItemAJAXEditForm, MailtoLinkPropertiesEditForm):
       
   344     """Mailto link properties edit form, JSON renderer"""
       
   345 
   315 
   346     def get_ajax_output(self, changes):
   316     def get_ajax_output(self, changes):
   347         if ('title' in changes.get(IBaseLink, ())) or changes.get(IMailtoLink, ()):
   317         if ('title' in changes.get(IBaseLink, ())) or changes.get(IMailtoLink, ()):
   348             return self.get_associations_table()
   318             return self.get_associations_table()
   349         else:
   319         else:
   350             return super(MailtoLinkPropertiesAJAXEditForm, self).get_ajax_output(changes)
   320             return super(self.__class__, self).get_ajax_output(changes)