src/pyams_content/component/extfile/zmi/__init__.py
changeset 0 7c0001cacf8e
child 32 66baddd786d5
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 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
       
    13 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
       
    14 
       
    15 __docformat__ = 'restructuredtext'
       
    16 
       
    17 
       
    18 # import standard library
       
    19 
       
    20 # import interfaces
       
    21 from pyams_content.component.extfile.interfaces import IExtFileContainer, IExtFileContainerTarget, IBaseExtFile, IExtFile, \
       
    22     IExtImage
       
    23 from pyams_file.interfaces import IFileInfo
       
    24 from pyams_i18n.interfaces import INegotiator, II18n
       
    25 from pyams_skin.interfaces.viewlet import IWidgetTitleViewletManager
       
    26 from pyams_skin.layer import IPyAMSLayer
       
    27 from z3c.form.interfaces import NOT_CHANGED
       
    28 
       
    29 # import packages
       
    30 from pyams_content.component.extfile import EXTERNAL_FILES_FACTORIES
       
    31 from pyams_content.component.extfile.zmi.container import ExtFileContainerView
       
    32 from pyams_form.form import AJAXAddForm, AJAXEditForm
       
    33 from pyams_form.security import ProtectedFormObjectMixin
       
    34 from pyams_pagelet.pagelet import pagelet_config
       
    35 from pyams_skin.viewlet.toolbar import ToolbarAction
       
    36 from pyams_utils.registry import query_utility
       
    37 from pyams_utils.traversing import get_parent
       
    38 from pyams_viewlet.viewlet import viewlet_config
       
    39 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
       
    40 from pyramid.view import view_config
       
    41 from z3c.form import field
       
    42 from zope.interface import Interface
       
    43 from zope.schema import Choice
       
    44 
       
    45 from pyams_content import _
       
    46 
       
    47 
       
    48 #
       
    49 # External file view
       
    50 #
       
    51 
       
    52 class IExtFileFactoryChooser(Interface):
       
    53     """External file factory chooser interface"""
       
    54 
       
    55     factory = Choice(title=_("External file type"),
       
    56                      vocabulary='PyAMS files factories',
       
    57                      default='file',
       
    58                      required=True)
       
    59 
       
    60 
       
    61 @viewlet_config(name='add-extfile.menu', context=IExtFileContainerTarget, view=ExtFileContainerView,
       
    62                 layer=IPyAMSLayer, manager=IWidgetTitleViewletManager, weight=50)
       
    63 class ExtFileAddMenu(ProtectedFormObjectMixin, ToolbarAction):
       
    64     """External file add menu"""
       
    65 
       
    66     label = _("Add external file")
       
    67 
       
    68     url = 'add-extfile.html'
       
    69     modal_target = True
       
    70 
       
    71 
       
    72 @pagelet_config(name='add-extfile.html', context=IExtFileContainerTarget, layer=IPyAMSLayer,
       
    73                 permission=MANAGE_CONTENT_PERMISSION)
       
    74 class ExtFileAddForm(AdminDialogAddForm):
       
    75     """External file add form"""
       
    76 
       
    77     legend = _("Add new external file")
       
    78     icon_css_class = 'fa fa-fw fa-file-text-o'
       
    79 
       
    80     fields = field.Fields(IExtFileFactoryChooser) + \
       
    81              field.Fields(IExtFile).omit('__parent__', '__name__')
       
    82 
       
    83     @property
       
    84     def ajax_handler(self):
       
    85         origin = self.request.params.get('origin')
       
    86         if origin == 'link':
       
    87             return 'add-extfile-link.json'
       
    88         else:
       
    89             return 'add-extfile.json'
       
    90 
       
    91     edit_permission = MANAGE_CONTENT_PERMISSION
       
    92 
       
    93     def updateWidgets(self, prefix=None):
       
    94         super(ExtFileAddForm, self).updateWidgets(prefix)
       
    95         self.widgets['description'].label_css_class = 'textarea'
       
    96 
       
    97     def create(self, data):
       
    98         factory = EXTERNAL_FILES_FACTORIES.get(data.get('factory'))
       
    99         if factory is not None:
       
   100             return factory[0]()
       
   101 
       
   102     def update_content(self, content, data):
       
   103         data['factory'] = NOT_CHANGED
       
   104         return super(ExtFileAddForm, self).update_content(content, data)
       
   105 
       
   106     def add(self, object):
       
   107         IExtFileContainer(self.context)['none'] = object
       
   108         i18n = query_utility(INegotiator)
       
   109         if i18n is not None:
       
   110             lang = i18n.server_language
       
   111             data = II18n(object).get_attribute('data', lang, self.request)
       
   112             if data:
       
   113                 info = IFileInfo(data)
       
   114                 info.title = II18n(object).get_attribute('title', lang, self.request)
       
   115                 info.description = II18n(object).get_attribute('description', lang, self.request)
       
   116             for lang, data in object.data.items():
       
   117                 if data is not None:
       
   118                     IFileInfo(data).language = lang
       
   119 
       
   120 
       
   121 @view_config(name='add-extfile.json', context=IExtFileContainerTarget, request_type=IPyAMSLayer,
       
   122              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   123 class ExtFileAJAXAddForm(AJAXAddForm, ExtFileAddForm):
       
   124     """External file add form, JSON renderer"""
       
   125 
       
   126     def get_ajax_output(self, changes):
       
   127         return {'status': 'reload',
       
   128                 'location': '#external-files.html'}
       
   129 
       
   130 
       
   131 @view_config(name='add-extfile-link.json', context=IExtFileContainerTarget, request_type=IPyAMSLayer,
       
   132              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   133 class ExtFileLinkAJAXAddForm(AJAXAddForm, ExtFileAddForm):
       
   134     """External file link add form, JSON renderer"""
       
   135 
       
   136     def get_ajax_output(self, changes):
       
   137         target = get_parent(self.context, IExtFileContainerTarget)
       
   138         container = IExtFileContainer(target)
       
   139         files = [{'id': file.__name__,
       
   140                   'text': II18n(file).query_attribute('title', request=self.request)}
       
   141                  for file in container.values()]
       
   142         return {'status': 'callback',
       
   143                 'callback': 'PyAMS_content.extfiles.refresh',
       
   144                 'options': {'files': files,
       
   145                             'new_file': {'id': changes.__name__,
       
   146                                          'text': II18n(changes).query_attribute('title', request=self.request)}}}
       
   147 
       
   148 
       
   149 @pagelet_config(name='properties.html', context=IExtFile, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
       
   150 class ExtFilePropertiesEditForm(AdminDialogEditForm):
       
   151     """External file properties edit form"""
       
   152 
       
   153     legend = _("Update file properties")
       
   154     icon_css_class = 'fa fa-fw fa-file-text-o'
       
   155     dialog_class = 'modal-large'
       
   156 
       
   157     fields = field.Fields(IExtFile).omit('__parent__', '__file__')
       
   158     ajax_handler = 'properties.json'
       
   159     edit_permission = MANAGE_CONTENT_PERMISSION
       
   160 
       
   161     def updateWidgets(self, prefix=None):
       
   162         super(ExtFilePropertiesEditForm, self).updateWidgets(prefix)
       
   163         self.widgets['description'].label_css_class = 'textarea'
       
   164 
       
   165     def update_content(self, content, data):
       
   166         changes = super(ExtFilePropertiesEditForm, self).update_content(content, data)
       
   167         if changes:
       
   168             i18n = query_utility(INegotiator)
       
   169             if i18n is not None:
       
   170                 lang = i18n.server_language
       
   171                 data = II18n(content).get_attribute('data', lang, self.request)
       
   172                 if data:
       
   173                     info = IFileInfo(data)
       
   174                     info.title = II18n(content).get_attribute('title', lang, self.request)
       
   175                     info.description = II18n(content).get_attribute('description', lang, self.request)
       
   176             for lang, data in content.data.items():
       
   177                 if data and not IFileInfo(data).language:
       
   178                     IFileInfo(data).language = lang
       
   179         return changes
       
   180 
       
   181 
       
   182 @pagelet_config(name='properties.html', context=IExtImage, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
       
   183 class ExtImagePropertiesEditForm(ExtFilePropertiesEditForm):
       
   184     """External image properties edit form"""
       
   185 
       
   186     legend = _("Update image properties")
       
   187     icon_css_class = 'fa fa-fw fa-picture-o'
       
   188 
       
   189     fields = field.Fields(IExtImage).omit('__parent__', '__name__')
       
   190 
       
   191 
       
   192 @view_config(name='properties.json', context=IExtFile, request_type=IPyAMSLayer,
       
   193              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   194 class ExtFilePropertiesAJAXEditForm(AJAXEditForm, ExtFilePropertiesEditForm):
       
   195     """External file properties edit form, JSON renderer"""
       
   196 
       
   197     def get_ajax_output(self, changes):
       
   198         if ('title' in changes.get(IBaseExtFile, ())) or \
       
   199            ('data' in changes.get(IExtFile, ())):
       
   200             return {'status': 'reload',
       
   201                     'location': '#external-files.html'}
       
   202         else:
       
   203             return super(ExtFilePropertiesAJAXEditForm, self).get_ajax_output(changes)