src/pyams_content/component/links/zmi/__init__.py
changeset 1351 045be80a5645
parent 1191 64b3043045bf
equal deleted inserted replaced
1350:1bbc829453f9 1351:045be80a5645
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
    10 # FOR A PARTICULAR PURPOSE.
    10 # FOR A PARTICULAR PURPOSE.
    11 #
    11 #
    12 
    12 
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 from z3c.form import field
    13 from z3c.form import field
    16 from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget
    14 from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget
    17 from zope.interface import implementer
    15 from zope.interface import Interface, implementer
    18 
    16 
    19 from pyams_content import _
       
    20 from pyams_content.component.association.interfaces import IAssociationContainer
    17 from pyams_content.component.association.interfaces import IAssociationContainer
    21 from pyams_content.component.association.zmi import AssociationItemAJAXAddForm, AssociationItemAJAXEditForm
    18 from pyams_content.component.association.zmi import AssociationItemAJAXAddForm, \
       
    19     AssociationItemAJAXEditForm
    22 from pyams_content.component.association.zmi.interfaces import IAssociationsView
    20 from pyams_content.component.association.zmi.interfaces import IAssociationsView
    23 from pyams_content.component.links import ExternalLink, InternalLink, MailtoLink
    21 from pyams_content.component.links import ExternalLink, IInternalLinkCustomInfo, InternalLink, \
    24 from pyams_content.component.links.interfaces import IExternalLink, IInternalLink, ILinkContainerTarget, IMailtoLink
    22     MailtoLink
       
    23 from pyams_content.component.links.interfaces import ICustomInternalLinkTarget, IExternalLink, \
       
    24     IInternalLink, ILinkContainerTarget, IMailtoLink
    25 from pyams_content.component.paragraph.zmi import get_json_paragraph_markers_refresh_event
    25 from pyams_content.component.paragraph.zmi import get_json_paragraph_markers_refresh_event
    26 from pyams_content.component.paragraph.zmi.container import ParagraphContainerCounterBase
    26 from pyams_content.component.paragraph.zmi.container import ParagraphContainerCounterBase
    27 from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerTable, IParagraphTitleToolbar
    27 from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerTable, \
       
    28     IParagraphTitleToolbar
    28 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
    29 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
    29 from pyams_content.reference.pictograms.zmi.widget import PictogramSelectFieldWidget
    30 from pyams_content.reference.pictograms.zmi.widget import PictogramSelectFieldWidget
    30 from pyams_form.form import ajax_config
    31 from pyams_form.form import ajax_config
       
    32 from pyams_form.interfaces.form import IInnerSubForm
    31 from pyams_form.security import ProtectedFormObjectMixin
    33 from pyams_form.security import ProtectedFormObjectMixin
    32 from pyams_pagelet.pagelet import pagelet_config
    34 from pyams_pagelet.pagelet import pagelet_config
    33 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
    35 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
    34 from pyams_skin.layer import IPyAMSLayer
    36 from pyams_skin.layer import IPyAMSLayer
    35 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
    37 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
       
    38 from pyams_utils.adapter import adapter_config
    36 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
    39 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
    37 from pyams_viewlet.viewlet import viewlet_config
    40 from pyams_viewlet.viewlet import viewlet_config
    38 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    41 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm, InnerAdminEditForm
    39 from pyams_zmi.interfaces import IPropertiesEditForm
    42 from pyams_zmi.interfaces import IPropertiesEditForm
    40 
    43 
    41 
    44 
       
    45 __docformat__ = 'restructuredtext'
       
    46 
       
    47 from pyams_content import _
       
    48 
       
    49 
    42 #
    50 #
    43 # Internal links views
    51 # Internal links views
    44 #
    52 #
    45 
    53 
    46 @viewlet_config(name='internal-links', context=ILinkContainerTarget, layer=IPyAMSLayer, view=IParagraphContainerTable,
    54 @viewlet_config(name='internal-links', context=ILinkContainerTarget, layer=IPyAMSLayer,
    47                 manager=IParagraphTitleToolbar, permission=VIEW_SYSTEM_PERMISSION, weight=10)
    55                 view=IParagraphContainerTable, manager=IParagraphTitleToolbar,
       
    56                 permission=VIEW_SYSTEM_PERMISSION, weight=10)
    48 class InternalLinksCounter(ParagraphContainerCounterBase):
    57 class InternalLinksCounter(ParagraphContainerCounterBase):
    49     """Internal links count column"""
    58     """Internal links count column"""
    50 
    59 
    51     weight = 10
    60     weight = 10
    52     action_class = 'action internal-links nowrap width-40'
    61     action_class = 'action internal-links nowrap width-40'
    59     def count(self):
    68     def count(self):
    60         return len([file for file in IAssociationContainer(self.context).values()
    69         return len([file for file in IAssociationContainer(self.context).values()
    61                     if IInternalLink.providedBy(file)])
    70                     if IInternalLink.providedBy(file)])
    62 
    71 
    63 
    72 
    64 @viewlet_config(name='add-internal-link.menu', context=ILinkContainerTarget, view=IAssociationsView,
    73 @viewlet_config(name='add-internal-link.menu', context=ILinkContainerTarget,
    65                 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50)
    74                 view=IAssociationsView, layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50)
    66 class InternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem):
    75 class InternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem):
    67     """Internal link add menu"""
    76     """Internal link add menu"""
    68 
    77 
    69     label = _("Add internal link")
    78     label = _("Add internal link")
    70     label_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
    79     label_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
    81     """Internal link add form"""
    90     """Internal link add form"""
    82 
    91 
    83     legend = _("Add new internal link")
    92     legend = _("Add new internal link")
    84     icon_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
    93     icon_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
    85 
    94 
    86     fields = field.Fields(IInternalLink).select('reference', 'force_canonical_url', 'title', 'description',
    95     fields = field.Fields(IInternalLink).select('reference', 'force_canonical_url', 'title',
       
    96                                                 'description',
    87                                                 'pictogram_name')
    97                                                 'pictogram_name')
    88     fields['force_canonical_url'].widgetFactory = SingleCheckBoxFieldWidget
    98     fields['force_canonical_url'].widgetFactory = SingleCheckBoxFieldWidget
    89     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
    99     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
    90 
   100 
    91     edit_permission = MANAGE_CONTENT_PERMISSION
   101     edit_permission = MANAGE_CONTENT_PERMISSION
    97         IAssociationContainer(self.context).append(object)
   107         IAssociationContainer(self.context).append(object)
    98 
   108 
    99     def get_ajax_output(self, changes):
   109     def get_ajax_output(self, changes):
   100         output = super(self.__class__, self).get_ajax_output(changes)
   110         output = super(self.__class__, self).get_ajax_output(changes)
   101         if output:
   111         if output:
   102             output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
   112             output.setdefault('events', []).append(
   103                                                                                             self, InternalLinksCounter))
   113                 get_json_paragraph_markers_refresh_event(self.context, self.request,
       
   114                                                          self, InternalLinksCounter))
   104         return output
   115         return output
   105 
   116 
   106 
   117 
   107 @pagelet_config(name='properties.html', context=IInternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
   118 @pagelet_config(name='properties.html', context=IInternalLink, layer=IPyAMSLayer,
       
   119                 permission=VIEW_SYSTEM_PERMISSION)
   108 @ajax_config(name='properties.json', context=IInternalLink, layer=IPyAMSLayer,
   120 @ajax_config(name='properties.json', context=IInternalLink, layer=IPyAMSLayer,
   109              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
   121              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
   110 @implementer(IPropertiesEditForm)
   122 @implementer(IPropertiesEditForm)
   111 class InternalLinkPropertiesEditForm(AdminDialogEditForm):
   123 class InternalLinkPropertiesEditForm(AdminDialogEditForm):
   112     """Internal link properties edit form"""
   124     """Internal link properties edit form"""
   115 
   127 
   116     legend = _("Edit internal link properties")
   128     legend = _("Edit internal link properties")
   117     icon_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
   129     icon_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90'
   118     dialog_class = 'modal-large'
   130     dialog_class = 'modal-large'
   119 
   131 
   120     fields = field.Fields(IInternalLink).select('reference', 'force_canonical_url', 'title', 'description',
   132     fields = field.Fields(IInternalLink).select('reference', 'force_canonical_url', 'title',
       
   133                                                 'description',
   121                                                 'pictogram_name')
   134                                                 'pictogram_name')
   122     fields['force_canonical_url'].widgetFactory = SingleCheckBoxFieldWidget
   135     fields['force_canonical_url'].widgetFactory = SingleCheckBoxFieldWidget
   123     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
   136     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
   124 
   137 
   125     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   138     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   129             return self.get_associations_table()
   142             return self.get_associations_table()
   130         else:
   143         else:
   131             return super(self.__class__, self).get_ajax_output(changes)
   144             return super(self.__class__, self).get_ajax_output(changes)
   132 
   145 
   133 
   146 
       
   147 @adapter_config(name='custom',
       
   148                 context=(ICustomInternalLinkTarget, IPyAMSLayer, InternalLinkPropertiesEditForm),
       
   149                 provides=IInnerSubForm)
       
   150 class CustomInternalLinkPropertiesEditForm(InnerAdminEditForm):
       
   151     """Custom internal link properties edit form"""
       
   152 
       
   153     prefix = 'custom_properties.'
       
   154 
       
   155     css_class = 'form-group'
       
   156     padding_class = ''
       
   157 
       
   158     legend = _("Custom target properties")
       
   159     fieldset_class = 'bordered'
       
   160 
       
   161     @property
       
   162     def fields(self):
       
   163         info = IInternalLinkCustomInfo(self.context, None)
       
   164         if info is not None:
       
   165             return field.Fields(info.properties_interface).omit('properties_interface')
       
   166         return field.Fields(Interface)
       
   167 
       
   168     weight = 1
       
   169 
       
   170     def render(self):
       
   171         if not self.fields:
       
   172             return ''
       
   173         return super(CustomInternalLinkPropertiesEditForm, self).render()
       
   174 
       
   175 
   134 #
   176 #
   135 # External links views
   177 # External links views
   136 #
   178 #
   137 
   179 
   138 @viewlet_config(name='external-links', context=ILinkContainerTarget, layer=IPyAMSLayer, view=IParagraphContainerTable,
   180 @viewlet_config(name='external-links', context=ILinkContainerTarget, layer=IPyAMSLayer,
   139                 manager=IParagraphTitleToolbar, permission=VIEW_SYSTEM_PERMISSION, weight=11)
   181                 view=IParagraphContainerTable, manager=IParagraphTitleToolbar,
       
   182                 permission=VIEW_SYSTEM_PERMISSION, weight=11)
   140 class ExternalLinksCounter(ParagraphContainerCounterBase):
   183 class ExternalLinksCounter(ParagraphContainerCounterBase):
   141     """External links count column"""
   184     """External links count column"""
   142 
   185 
   143     weight = 11
   186     weight = 11
   144     action_class = 'action external-links nowrap width-40'
   187     action_class = 'action external-links nowrap width-40'
   151     def count(self):
   194     def count(self):
   152         return len([file for file in IAssociationContainer(self.context).values()
   195         return len([file for file in IAssociationContainer(self.context).values()
   153                     if IExternalLink.providedBy(file)])
   196                     if IExternalLink.providedBy(file)])
   154 
   197 
   155 
   198 
   156 @viewlet_config(name='add-external-link.menu', context=ILinkContainerTarget, view=IAssociationsView,
   199 @viewlet_config(name='add-external-link.menu', context=ILinkContainerTarget,
   157                 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=51)
   200                 view=IAssociationsView, layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=51)
   158 class ExternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem):
   201 class ExternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem):
   159     """External link add menu"""
   202     """External link add menu"""
   160 
   203 
   161     label = _("Add external link")
   204     label = _("Add external link")
   162     label_css_class = 'fa fa-fw fa-external-link'
   205     label_css_class = 'fa fa-fw fa-external-link'
   173     """External link add form"""
   216     """External link add form"""
   174 
   217 
   175     legend = _("Add new external link")
   218     legend = _("Add new external link")
   176     icon_css_class = 'fa fa-fw fa-external-link'
   219     icon_css_class = 'fa fa-fw fa-external-link'
   177 
   220 
   178     fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'pictogram_name', 'language')
   221     fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'pictogram_name',
       
   222                                                 'language')
   179     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
   223     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
   180 
   224 
   181     edit_permission = MANAGE_CONTENT_PERMISSION
   225     edit_permission = MANAGE_CONTENT_PERMISSION
   182 
   226 
   183     def create(self, data):
   227     def create(self, data):
   187         IAssociationContainer(self.context).append(object)
   231         IAssociationContainer(self.context).append(object)
   188 
   232 
   189     def get_ajax_output(self, changes):
   233     def get_ajax_output(self, changes):
   190         output = super(self.__class__, self).get_ajax_output(changes)
   234         output = super(self.__class__, self).get_ajax_output(changes)
   191         if output:
   235         if output:
   192             output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
   236             output.setdefault('events', []).append(
   193                                                                                             self, ExternalLinksCounter))
   237                 get_json_paragraph_markers_refresh_event(self.context, self.request,
       
   238                                                          self, ExternalLinksCounter))
   194         return output
   239         return output
   195 
   240 
   196 
   241 
   197 @pagelet_config(name='properties.html', context=IExternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
   242 @pagelet_config(name='properties.html', context=IExternalLink, layer=IPyAMSLayer,
       
   243                 permission=VIEW_SYSTEM_PERMISSION)
   198 @ajax_config(name='properties.json', context=IExternalLink, layer=IPyAMSLayer,
   244 @ajax_config(name='properties.json', context=IExternalLink, layer=IPyAMSLayer,
   199              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
   245              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
   200 @implementer(IPropertiesEditForm)
   246 @implementer(IPropertiesEditForm)
   201 class ExternalLinkPropertiesEditForm(AdminDialogEditForm):
   247 class ExternalLinkPropertiesEditForm(AdminDialogEditForm):
   202     """External link properties edit form"""
   248     """External link properties edit form"""
   205 
   251 
   206     legend = _("Edit external link properties")
   252     legend = _("Edit external link properties")
   207     icon_css_class = 'fa fa-fw fa-external-link'
   253     icon_css_class = 'fa fa-fw fa-external-link'
   208     dialog_class = 'modal-large'
   254     dialog_class = 'modal-large'
   209 
   255 
   210     fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'pictogram_name', 'language')
   256     fields = field.Fields(IExternalLink).select('url', 'title', 'description', 'pictogram_name',
       
   257                                                 'language')
   211     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
   258     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
   212 
   259 
   213     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   260     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   214 
   261 
   215     def get_ajax_output(self, changes):
   262     def get_ajax_output(self, changes):
   221 
   268 
   222 #
   269 #
   223 # Mailto links views
   270 # Mailto links views
   224 #
   271 #
   225 
   272 
   226 @viewlet_config(name='mailto-links', context=ILinkContainerTarget, layer=IPyAMSLayer, view=IParagraphContainerTable,
   273 @viewlet_config(name='mailto-links', context=ILinkContainerTarget, layer=IPyAMSLayer,
   227                 manager=IParagraphTitleToolbar, permission=VIEW_SYSTEM_PERMISSION, weight=12)
   274                 view=IParagraphContainerTable, manager=IParagraphTitleToolbar,
       
   275                 permission=VIEW_SYSTEM_PERMISSION, weight=12)
   228 class MailtoLinksCounter(ParagraphContainerCounterBase):
   276 class MailtoLinksCounter(ParagraphContainerCounterBase):
   229     """Mailto links count column"""
   277     """Mailto links count column"""
   230 
   278 
   231     weight = 12
   279     weight = 12
   232     action_class = 'action mailto-links nowrap width-40'
   280     action_class = 'action mailto-links nowrap width-40'
   261     """Mailto link add form"""
   309     """Mailto link add form"""
   262 
   310 
   263     legend = _("Add new mailto link")
   311     legend = _("Add new mailto link")
   264     icon_css_class = 'fa fa-fw fa-envelope-o'
   312     icon_css_class = 'fa fa-fw fa-envelope-o'
   265 
   313 
   266     fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description', 'pictogram_name')
   314     fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description',
       
   315                                               'pictogram_name')
   267     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
   316     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
   268 
   317 
   269     edit_permission = MANAGE_CONTENT_PERMISSION
   318     edit_permission = MANAGE_CONTENT_PERMISSION
   270 
   319 
   271     def create(self, data):
   320     def create(self, data):
   275         IAssociationContainer(self.context).append(object)
   324         IAssociationContainer(self.context).append(object)
   276 
   325 
   277     def get_ajax_output(self, changes):
   326     def get_ajax_output(self, changes):
   278         output = super(self.__class__, self).get_ajax_output(changes)
   327         output = super(self.__class__, self).get_ajax_output(changes)
   279         if output:
   328         if output:
   280             output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request,
   329             output.setdefault('events', []).append(
   281                                                                                             self, MailtoLinksCounter))
   330                 get_json_paragraph_markers_refresh_event(self.context, self.request,
       
   331                                                          self, MailtoLinksCounter))
   282         return output
   332         return output
   283 
   333 
   284 
   334 
   285 @pagelet_config(name='properties.html', context=IMailtoLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
   335 @pagelet_config(name='properties.html', context=IMailtoLink, layer=IPyAMSLayer,
       
   336                 permission=VIEW_SYSTEM_PERMISSION)
   286 @ajax_config(name='properties.json', context=IMailtoLink, layer=IPyAMSLayer,
   337 @ajax_config(name='properties.json', context=IMailtoLink, layer=IPyAMSLayer,
   287              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
   338              permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm)
   288 @implementer(IPropertiesEditForm)
   339 @implementer(IPropertiesEditForm)
   289 class MailtoLinkPropertiesEditForm(AdminDialogEditForm):
   340 class MailtoLinkPropertiesEditForm(AdminDialogEditForm):
   290     """Mailto link properties edit form"""
   341     """Mailto link properties edit form"""
   292     prefix = 'mailtolink_properties.'
   343     prefix = 'mailtolink_properties.'
   293 
   344 
   294     legend = _("Edit mailto link properties")
   345     legend = _("Edit mailto link properties")
   295     icon_css_class = 'fa fa-fw fa-envelope-o'
   346     icon_css_class = 'fa fa-fw fa-envelope-o'
   296 
   347 
   297     fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description', 'pictogram_name')
   348     fields = field.Fields(IMailtoLink).select('address', 'address_name', 'title', 'description',
       
   349                                               'pictogram_name')
   298     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
   350     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
   299 
   351 
   300     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   352     edit_permission = None  # defined by IFormContextPermissionChecker adapter
   301 
   353 
   302     def get_ajax_output(self, changes):
   354     def get_ajax_output(self, changes):