src/pyams_content/component/links/zmi/__init__.py
changeset 0 7c0001cacf8e
child 53 4acef7070de7
equal deleted inserted replaced
-1:000000000000 0:7c0001cacf8e
       
     1 #
       
     2 # Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
       
     3 # All Rights Reserved.
       
     4 #
       
     5 # This software is subject to the provisions of the Zope Public License,
       
     6 # Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
       
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
       
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
       
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
       
    10 # FOR A PARTICULAR PURPOSE.
       
    11 #
       
    12 
       
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 
       
    16 # import standard library
       
    17 
       
    18 # import interfaces
       
    19 from pyams_content.component.links.interfaces import ILinkContainerTarget, IInternalLink, ILinkContainer, IBaseLink, \
       
    20     IExternalLink
       
    21 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
       
    22 from pyams_i18n.interfaces import II18n
       
    23 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
       
    24 from pyams_skin.layer import IPyAMSLayer
       
    25 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
       
    26 
       
    27 # import packages
       
    28 from pyams_content.component.links import InternalLink, ExternalLink
       
    29 from pyams_content.component.links.zmi.container import LinkContainerView
       
    30 from pyams_form.form import AJAXAddForm, AJAXEditForm
       
    31 from pyams_form.security import ProtectedFormObjectMixin
       
    32 from pyams_pagelet.pagelet import pagelet_config
       
    33 from pyams_skin.viewlet.toolbar import ToolbarMenuItem
       
    34 from pyams_utils.traversing import get_parent
       
    35 from pyams_viewlet.viewlet import viewlet_config
       
    36 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
       
    37 from pyramid.view import view_config
       
    38 from z3c.form import field
       
    39 
       
    40 from pyams_content import _
       
    41 
       
    42 
       
    43 #
       
    44 # Internal links views
       
    45 #
       
    46 
       
    47 @viewlet_config(name='add-internal-link.menu', context=ILinkContainerTarget, view=LinkContainerView,
       
    48                 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50)
       
    49 class InternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem):
       
    50     """Internal link add menu"""
       
    51 
       
    52     label = _("Add internal link")
       
    53     label_css_class = 'fa fa-fw fa-link'
       
    54 
       
    55     url = 'add-internal-link.html'
       
    56     modal_target = True
       
    57 
       
    58 
       
    59 @pagelet_config(name='add-internal-link.html', context=ILinkContainerTarget, layer=IPyAMSLayer,
       
    60                 permission=MANAGE_CONTENT_PERMISSION)
       
    61 class InternalLinkAddForm(AdminDialogAddForm):
       
    62     """Internal link add form"""
       
    63 
       
    64     legend = _("Add new internal link")
       
    65     icon_css_class = 'fa fa-fw fa-link'
       
    66 
       
    67     fields = field.Fields(IInternalLink).omit('__parent__', '__name__')
       
    68 
       
    69     @property
       
    70     def ajax_handler(self):
       
    71         origin = self.request.params.get('origin')
       
    72         if origin == 'link':
       
    73             return 'add-internal-link-link.json'
       
    74         else:
       
    75             return 'add-internal-link.json'
       
    76 
       
    77     edit_permission = MANAGE_CONTENT_PERMISSION
       
    78 
       
    79     def updateWidgets(self, prefix=None):
       
    80         super(InternalLinkAddForm, self).updateWidgets(prefix)
       
    81         self.widgets['description'].label_css_class = 'textarea'
       
    82 
       
    83     def create(self, data):
       
    84         return InternalLink()
       
    85 
       
    86     def add(self, object):
       
    87         ILinkContainer(self.context)['none'] = object
       
    88 
       
    89 
       
    90 @view_config(name='add-internal-link.json', context=ILinkContainerTarget, request_type=IPyAMSLayer,
       
    91              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
    92 class InternalLinkAJAXAddForm(AJAXAddForm, InternalLinkAddForm):
       
    93     """Internal link add form, JSON renderer"""
       
    94 
       
    95     def get_ajax_output(self, changes):
       
    96         return {'status': 'reload',
       
    97                 'location': '#links.html'}
       
    98 
       
    99 
       
   100 @view_config(name='add-internal-link-link.json', context=ILinkContainerTarget, request_type=IPyAMSLayer,
       
   101              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   102 class InternalLinkLinkAJAXAddForm(AJAXAddForm, InternalLinkAddForm):
       
   103     """Internal link link add form, JSON renderer"""
       
   104 
       
   105     def get_ajax_output(self, changes):
       
   106         target = get_parent(self.context, ILinkContainerTarget)
       
   107         container = ILinkContainer(target)
       
   108         links = [{'id': link.__name__,
       
   109                   'text': II18n(link).query_attribute('title', request=self.request)}
       
   110                  for link in container.values()]
       
   111         return {'status': 'callback',
       
   112                 'callback': 'PyAMS_content.links.refresh',
       
   113                 'options': {'links': links,
       
   114                             'new_link': {'id': changes.__name__,
       
   115                                          'text': II18n(changes).query_attribute('title', request=self.request)}}}
       
   116 
       
   117 
       
   118 @pagelet_config(name='properties.html', context=IInternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
       
   119 class InternalLinkPropertiesEditForm(AdminDialogEditForm):
       
   120     """Internal link properties edit form"""
       
   121 
       
   122     legend = _("Edit link properties")
       
   123     icon_css_class = 'fa fa-fw fa-link'
       
   124 
       
   125     fields = field.Fields(IInternalLink).omit('__parent__', '__name__')
       
   126     ajax_handler = 'properties.json'
       
   127     edit_permission = MANAGE_CONTENT_PERMISSION
       
   128 
       
   129     def updateWidgets(self, prefix=None):
       
   130         super(InternalLinkPropertiesEditForm, self).updateWidgets(prefix)
       
   131         self.widgets['description'].label_css_class = 'textarea'
       
   132 
       
   133 
       
   134 @view_config(name='properties.json', context=IInternalLink, request_type=IPyAMSLayer,
       
   135              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   136 class InternalLinkPropertiesAJAXEditForm(AJAXEditForm, InternalLinkPropertiesEditForm):
       
   137     """Internal link properties edit form, JSON renderer"""
       
   138 
       
   139     def get_ajax_output(self, changes):
       
   140         if ('title' in changes.get(IBaseLink, ())) or \
       
   141            ('reference' in changes.get(IInternalLink, ())):
       
   142             return {'status': 'reload',
       
   143                     'location': '#links.html'}
       
   144         else:
       
   145             return super(InternalLinkPropertiesAJAXEditForm, self).get_ajax_output(changes)
       
   146 
       
   147 
       
   148 #
       
   149 # External links views
       
   150 #
       
   151 
       
   152 @viewlet_config(name='add-external-link.menu', context=ILinkContainerTarget, view=LinkContainerView,
       
   153                 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=51)
       
   154 class ExternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem):
       
   155     """External link add menu"""
       
   156 
       
   157     label = _("Add external link")
       
   158     label_css_class = 'fa fa-fw fa-external-link'
       
   159 
       
   160     url = 'add-external-link.html'
       
   161     modal_target = True
       
   162 
       
   163 
       
   164 @pagelet_config(name='add-external-link.html', context=ILinkContainerTarget, layer=IPyAMSLayer,
       
   165                 permission=MANAGE_CONTENT_PERMISSION)
       
   166 class ExternalLinkAddForm(AdminDialogAddForm):
       
   167     """External link add form"""
       
   168 
       
   169     legend = _("Add new External link")
       
   170     icon_css_class = 'fa fa-fw fa-external-link'
       
   171 
       
   172     fields = field.Fields(IExternalLink).omit('__parent__', '__name__')
       
   173 
       
   174     @property
       
   175     def ajax_handler(self):
       
   176         origin = self.request.params.get('origin')
       
   177         if origin == 'link':
       
   178             return 'add-external-link-link.json'
       
   179         else:
       
   180             return 'add-external-link.json'
       
   181 
       
   182     edit_permission = MANAGE_CONTENT_PERMISSION
       
   183 
       
   184     def updateWidgets(self, prefix=None):
       
   185         super(ExternalLinkAddForm, self).updateWidgets(prefix)
       
   186         self.widgets['description'].label_css_class = 'textarea'
       
   187 
       
   188     def create(self, data):
       
   189         return ExternalLink()
       
   190 
       
   191     def add(self, object):
       
   192         ILinkContainer(self.context)['none'] = object
       
   193 
       
   194 
       
   195 @view_config(name='add-external-link.json', context=ILinkContainerTarget, request_type=IPyAMSLayer,
       
   196              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   197 class ExternalLinkAJAXAddForm(AJAXAddForm, ExternalLinkAddForm):
       
   198     """External link add form, JSON renderer"""
       
   199 
       
   200     def get_ajax_output(self, changes):
       
   201         return {'status': 'reload',
       
   202                 'location': '#links.html'}
       
   203 
       
   204 
       
   205 @view_config(name='add-external-link-link.json', context=ILinkContainerTarget, request_type=IPyAMSLayer,
       
   206              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   207 class ExternalLinkLinkAJAXAddForm(AJAXAddForm, ExternalLinkAddForm):
       
   208     """External link link add form, JSON renderer"""
       
   209 
       
   210     def get_ajax_output(self, changes):
       
   211         target = get_parent(self.context, ILinkContainerTarget)
       
   212         container = ILinkContainer(target)
       
   213         links = [{'id': link.__name__,
       
   214                   'text': II18n(link).query_attribute('title', request=self.request)}
       
   215                  for link in container.values()]
       
   216         return {'status': 'callback',
       
   217                 'callback': 'PyAMS_content.links.refresh',
       
   218                 'options': {'links': links,
       
   219                             'new_link': {'id': changes.__name__,
       
   220                                          'text': II18n(changes).query_attribute('title', request=self.request)}}}
       
   221 
       
   222 
       
   223 @pagelet_config(name='properties.html', context=IExternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
       
   224 class ExternalLinkPropertiesEditForm(AdminDialogEditForm):
       
   225     """External link properties edit form"""
       
   226 
       
   227     legend = _("Edit link properties")
       
   228     icon_css_class = 'fa fa-fw fa-external-link'
       
   229 
       
   230     fields = field.Fields(IExternalLink).omit('__parent__', '__name__')
       
   231     ajax_handler = 'properties.json'
       
   232     edit_permission = MANAGE_CONTENT_PERMISSION
       
   233 
       
   234     def updateWidgets(self, prefix=None):
       
   235         super(ExternalLinkPropertiesEditForm, self).updateWidgets(prefix)
       
   236         self.widgets['description'].label_css_class = 'textarea'
       
   237 
       
   238 
       
   239 @view_config(name='properties.json', context=IExternalLink, request_type=IPyAMSLayer,
       
   240              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   241 class ExternalLinkPropertiesAJAXEditForm(AJAXEditForm, ExternalLinkPropertiesEditForm):
       
   242     """External link properties edit form, JSON renderer"""
       
   243 
       
   244     def get_ajax_output(self, changes):
       
   245         if ('title' in changes.get(IBaseLink, ())) or \
       
   246            ('reference' in changes.get(IExternalLink, ())):
       
   247             return {'status': 'reload',
       
   248                     'location': '#links.html'}
       
   249         else:
       
   250             return super(ExternalLinkPropertiesAJAXEditForm, self).get_ajax_output(changes)