src/pyams_content/component/links/zmi/container.py
changeset 0 7c0001cacf8e
child 7 cbc55162b64e
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.extfile.interfaces import IExtFileContainer, IExtFileContainerTarget
       
    20 from pyams_content.component.links.interfaces import ILinkContainerTarget, ILinkContainer, IInternalLink, \
       
    21     ILinkLinksContainerTarget, ILinkLinksContainer
       
    22 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
       
    23 from pyams_i18n.interfaces import II18n
       
    24 from pyams_skin.interfaces import IInnerPage, IPageHeader
       
    25 from pyams_skin.layer import IPyAMSLayer
       
    26 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
       
    27 from pyams_utils.interfaces.data import IObjectData
       
    28 from pyams_zmi.interfaces.menu import IPropertiesMenu
       
    29 from pyams_zmi.layer import IAdminLayer
       
    30 from z3c.table.interfaces import IColumn, IValues
       
    31 
       
    32 # import packages
       
    33 from pyams_content.component.links.zmi.widget import LinkLinkSelectFieldWidget
       
    34 from pyams_content.shared.common.zmi import WfModifiedContentColumnMixin
       
    35 from pyams_form.form import AJAXEditForm
       
    36 from pyams_form.security import ProtectedFormObjectMixin
       
    37 from pyams_pagelet.pagelet import pagelet_config
       
    38 from pyams_sequence.utility import get_sequence_dict
       
    39 from pyams_skin.page import DefaultPageHeaderAdapter
       
    40 from pyams_skin.table import BaseTable, I18nColumn, TrashColumn
       
    41 from pyams_skin.viewlet.menu import MenuItem
       
    42 from pyams_template.template import template_config
       
    43 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
       
    44 from pyams_utils.traversing import get_parent
       
    45 from pyams_utils.url import absolute_url
       
    46 from pyams_viewlet.viewlet import viewlet_config
       
    47 from pyams_zmi.form import AdminDialogEditForm
       
    48 from pyams_zmi.view import AdminView
       
    49 from pyramid.view import view_config
       
    50 from pyramid.decorator import reify
       
    51 from z3c.form import field
       
    52 from z3c.table.column import GetAttrColumn
       
    53 from zope.interface import implementer, alsoProvides, Interface
       
    54 
       
    55 from pyams_content import _
       
    56 
       
    57 
       
    58 @viewlet_config(name='links.menu', context=ILinkContainerTarget, layer=IAdminLayer,
       
    59                 manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=210)
       
    60 class LinkContainerMenu(MenuItem):
       
    61     """Links container menu"""
       
    62 
       
    63     label = _("Useful links...")
       
    64     icon_class = 'fa-link'
       
    65     url = '#links.html'
       
    66 
       
    67 
       
    68 #
       
    69 # Links container views
       
    70 #
       
    71 
       
    72 @view_config(name='get-links-list.json', context=Interface, request_type=IPyAMSLayer,
       
    73              renderer='json', xhr=True)
       
    74 def get_links_list(request):
       
    75     """Get links list in JSON format for TinyMCE editor"""
       
    76     result = []
       
    77     target = get_parent(request.context, IExtFileContainerTarget)
       
    78     if target is not None:
       
    79         container = IExtFileContainer(target)
       
    80         result.extend([{'title': II18n(file).query_attribute('title', request=request),
       
    81                         'value': absolute_url(II18n(file).query_attribute('data', request=request), request)}
       
    82                        for file in container.values()])
       
    83     target = get_parent(request.context, ILinkContainerTarget)
       
    84     if target is not None:
       
    85         container = ILinkContainer(target)
       
    86         result.extend([{'title': II18n(link).query_attribute('title', request=request),
       
    87                         'value': link.get_editor_url()}
       
    88                        for link in container.values()])
       
    89     return sorted(result, key=lambda x: x['title'])
       
    90 
       
    91 
       
    92 @pagelet_config(name='links.html', context=ILinkContainerTarget, layer=IPyAMSLayer,
       
    93                 permission=VIEW_SYSTEM_PERMISSION)
       
    94 @template_config(template='templates/container.pt', layer=IPyAMSLayer)
       
    95 @implementer(IInnerPage)
       
    96 class LinkContainerView(AdminView):
       
    97     """Links container view"""
       
    98 
       
    99     title = _("Useful links list")
       
   100 
       
   101     def __init__(self, context, request):
       
   102         super(LinkContainerView, self).__init__(context, request)
       
   103         self.links_table = LinkContainerTable(context, request)
       
   104 
       
   105     def update(self):
       
   106         super(LinkContainerView, self).update()
       
   107         self.links_table.update()
       
   108 
       
   109 
       
   110 class LinkContainerTable(BaseTable):
       
   111     """Links container table"""
       
   112 
       
   113     hide_header = True
       
   114     cssClasses = {'table': 'table table-bordered table-striped table-hover table-tight'}
       
   115 
       
   116     def __init__(self, context, request):
       
   117         super(LinkContainerTable, self).__init__(context, request)
       
   118         self.object_data = {'ams-widget-toggle-button': 'false'}
       
   119         alsoProvides(self, IObjectData)
       
   120 
       
   121     @property
       
   122     def data_attributes(self):
       
   123         attributes = super(LinkContainerTable, self).data_attributes
       
   124         attributes['table'] = {'data-ams-location': absolute_url(ILinkContainer(self.context), self.request),
       
   125                                'data-ams-datatable-sort': 'false',
       
   126                                'data-ams-datatable-pagination': 'false'}
       
   127         return attributes
       
   128 
       
   129     @reify
       
   130     def values(self):
       
   131         return list(super(LinkContainerTable, self).values)
       
   132 
       
   133     def render(self):
       
   134         if not self.values:
       
   135             translate = self.request.localizer.translate
       
   136             return translate(_("No currently defined link."))
       
   137         return super(LinkContainerTable, self).render()
       
   138 
       
   139 
       
   140 @adapter_config(name='name', context=(ILinkContainerTarget, IPyAMSLayer, LinkContainerTable), provides=IColumn)
       
   141 class LinkContainerNameColumn(I18nColumn, WfModifiedContentColumnMixin, GetAttrColumn):
       
   142     """Links container name column"""
       
   143 
       
   144     _header = _("Title")
       
   145 
       
   146     weight = 10
       
   147 
       
   148     def getValue(self, obj):
       
   149         return II18n(obj).query_attribute('title', request=self.request)
       
   150 
       
   151 
       
   152 @adapter_config(name='target', context=(ILinkContainerTarget, IPyAMSLayer, LinkContainerTable), provides=IColumn)
       
   153 class LinkContainerTargetColumn(I18nColumn, GetAttrColumn):
       
   154     """Links container target column"""
       
   155 
       
   156     _header = _("Link target")
       
   157 
       
   158     weight = 20
       
   159 
       
   160     def getValue(self, obj):
       
   161         if IInternalLink.providedBy(obj):
       
   162             mapping = get_sequence_dict(obj.get_target())
       
   163             return mapping['text']
       
   164         else:
       
   165             return obj.url
       
   166 
       
   167 
       
   168 @adapter_config(name='trash', context=(ILinkContainerTarget, IPyAMSLayer, LinkContainerTable), provides=IColumn)
       
   169 class LinkContainerTrashColumn(ProtectedFormObjectMixin, TrashColumn):
       
   170     """Links container trash column"""
       
   171 
       
   172 
       
   173 @adapter_config(context=(ILinkContainerTarget, IPyAMSLayer, LinkContainerTable), provides=IValues)
       
   174 class LinkContainerValues(ContextRequestViewAdapter):
       
   175     """Links container values"""
       
   176 
       
   177     @property
       
   178     def values(self):
       
   179         return ILinkContainer(self.context).values()
       
   180 
       
   181 
       
   182 @adapter_config(context=(ILinkContainerTarget, IPyAMSLayer, LinkContainerView), provides=IPageHeader)
       
   183 class LinkHeaderAdapter(DefaultPageHeaderAdapter):
       
   184     """Links container header adapter"""
       
   185 
       
   186     back_url = '#properties.html'
       
   187     icon_class = 'fa fa-fw fa-link'
       
   188 
       
   189 
       
   190 #
       
   191 # Links links edit form
       
   192 #
       
   193 
       
   194 @pagelet_config(name='link-links.html', context=ILinkLinksContainerTarget, layer=IPyAMSLayer,
       
   195                 permission=VIEW_SYSTEM_PERMISSION)
       
   196 class LinkLinksContainerLinksEditForm(AdminDialogEditForm):
       
   197     """Links links container edit form"""
       
   198 
       
   199     legend = _("Edit useful links links")
       
   200 
       
   201     fields = field.Fields(ILinkLinksContainer)
       
   202     fields['links'].widgetFactory = LinkLinkSelectFieldWidget
       
   203 
       
   204     ajax_handler = 'link-links.json'
       
   205     edit_permission = MANAGE_CONTENT_PERMISSION
       
   206 
       
   207 
       
   208 @view_config(name='link-links.json', context=ILinkLinksContainerTarget, request_type=IPyAMSLayer,
       
   209              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   210 class LinkLinksContainerAJAXEditForm(AJAXEditForm, LinkLinksContainerLinksEditForm):
       
   211     """Links links container edit form, JSON renderer"""