src/pyams_thesaurus/zmi/thesaurus.py
changeset 29 01a2ab1f4bd8
parent 24 e1a86d99c7d4
child 37 5dacc2c05600
equal deleted inserted replaced
28:b10a699c5559 29:01a2ab1f4bd8
    21 # import interfaces
    21 # import interfaces
    22 from pyams_form.interfaces.form import IWidgetForm
    22 from pyams_form.interfaces.form import IWidgetForm
    23 from pyams_skin.interfaces import IPageHeader, IInnerPage
    23 from pyams_skin.interfaces import IPageHeader, IInnerPage
    24 from pyams_skin.interfaces.container import ITableElementName, ITableElementEditor
    24 from pyams_skin.interfaces.container import ITableElementName, ITableElementEditor
    25 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
    25 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
    26 from pyams_thesaurus.interfaces import MANAGE_THESAURUS_CONTENT_PERMISSION
    26 from pyams_thesaurus.interfaces import ADMIN_THESAURUS_PERMISSION, MANAGE_THESAURUS_EXTRACT_PERMISSION
    27 from pyams_thesaurus.interfaces.loader import IThesaurusLoader, IThesaurusUpdaterConfiguration, \
    27 from pyams_thesaurus.interfaces.loader import IThesaurusLoader, IThesaurusUpdaterConfiguration, \
    28     IThesaurusExporterConfiguration, IThesaurusExporter
    28     IThesaurusExporterConfiguration, IThesaurusExporter
    29 from pyams_thesaurus.interfaces.thesaurus import IThesaurusInfo, IThesaurus, IThesaurusExtracts
    29 from pyams_thesaurus.interfaces.thesaurus import IThesaurusInfo, IThesaurus, IThesaurusExtracts
    30 from pyams_thesaurus.zmi.interfaces import IThesaurusTermsMenu, IThesaurusView
    30 from pyams_thesaurus.zmi.interfaces import IThesaurusTermsMenu, IThesaurusView
    31 from pyams_utils.interfaces import VIEW_PERMISSION, VIEW_SYSTEM_PERMISSION, MANAGE_SYSTEM_PERMISSION
    31 from pyams_utils.interfaces import VIEW_PERMISSION, VIEW_SYSTEM_PERMISSION, MANAGE_SYSTEM_PERMISSION
    57 from pyams_zmi.control_panel import UtilitiesTable
    57 from pyams_zmi.control_panel import UtilitiesTable
    58 from pyams_zmi.form import AdminDialogAddForm, AdminEditForm
    58 from pyams_zmi.form import AdminDialogAddForm, AdminEditForm
    59 from pyams_zmi.view import InnerAdminView
    59 from pyams_zmi.view import InnerAdminView
    60 from pyramid.events import subscriber
    60 from pyramid.events import subscriber
    61 from pyramid.exceptions import NotFound
    61 from pyramid.exceptions import NotFound
    62 from pyramid.httpexceptions import HTTPBadRequest
    62 from pyramid.httpexceptions import HTTPBadRequest, HTTPUnauthorized
    63 from pyramid.response import Response
    63 from pyramid.response import Response
    64 from pyramid.url import resource_url
    64 from pyramid.url import resource_url
    65 from pyramid.view import view_config
    65 from pyramid.view import view_config
    66 from z3c.form import field, button
    66 from z3c.form import field, button
    67 from zope.component.interfaces import ISite
    67 from zope.component.interfaces import ISite
   200     icon_css_class = 'fa fa-fw fa-language'
   200     icon_css_class = 'fa fa-fw fa-language'
   201 
   201 
   202     fields = field.Fields(IThesaurusInfo).select('name', 'title', 'subject', 'description', 'language', 'creator',
   202     fields = field.Fields(IThesaurusInfo).select('name', 'title', 'subject', 'description', 'language', 'creator',
   203                                                  'publisher', 'created')
   203                                                  'publisher', 'created')
   204     ajax_handler = 'properties.json'
   204     ajax_handler = 'properties.json'
   205     edit_permission = MANAGE_SYSTEM_PERMISSION
   205     edit_permission = ADMIN_THESAURUS_PERMISSION
   206 
   206 
   207     def updateWidgets(self, prefix=None):
   207     def updateWidgets(self, prefix=None):
   208         super(ThesaurusPropertiesEditForm, self).updateWidgets(prefix)
   208         super(ThesaurusPropertiesEditForm, self).updateWidgets(prefix)
   209         if 'name' in self.widgets:
   209         if 'name' in self.widgets:
   210             self.widgets['name'].mode = DISPLAY_MODE
   210             self.widgets['name'].mode = DISPLAY_MODE
   211         if 'description' in self.widgets:
   211         if 'description' in self.widgets:
   212             self.widgets['description'].widget_css_class = 'input textarea'
   212             self.widgets['description'].widget_css_class = 'input textarea'
   213 
   213 
   214 
   214 
   215 @view_config(name='properties.json', context=IThesaurus, request_type=IPyAMSLayer,
   215 @view_config(name='properties.json', context=IThesaurus, request_type=IPyAMSLayer,
   216              permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
   216              permission=ADMIN_THESAURUS_PERMISSION, renderer='json', xhr=True)
   217 class ThesaurusPropertiesAJAXEditForm(AJAXEditForm, ThesaurusPropertiesEditForm):
   217 class ThesaurusPropertiesAJAXEditForm(AJAXEditForm, ThesaurusPropertiesEditForm):
   218     """Thesaurus properties edit form, AJAX view"""
   218     """Thesaurus properties edit form, AJAX view"""
   219 
   219 
   220 
   220 
   221 #
   221 #
   330                     'nodes': result,
   330                     'nodes': result,
   331                     'parent': label}
   331                     'parent': label}
   332 
   332 
   333 
   333 
   334 @view_config(name='switch-extract.json', context=IThesaurus, request_type=IPyAMSLayer,
   334 @view_config(name='switch-extract.json', context=IThesaurus, request_type=IPyAMSLayer,
   335              permission=MANAGE_THESAURUS_CONTENT_PERMISSION, renderer='json', xhr=True)
   335              permission=VIEW_PERMISSION, renderer='json', xhr=True)
   336 def switch_term_extract(request):
   336 def switch_term_extract(request):
   337     """Term extract switcher"""
   337     """Term extract switcher"""
   338     label = request.params.get('term')
   338     label = request.params.get('term')
   339     extract_name = request.params.get('extract')
   339     extract_name = request.params.get('extract')
   340     if not (label and extract_name):
   340     if not (label and extract_name):
   344     if term is None:
   344     if term is None:
   345         raise HTTPBadRequest("Term not found")
   345         raise HTTPBadRequest("Term not found")
   346     extract = IThesaurusExtracts(thesaurus).get(extract_name)
   346     extract = IThesaurusExtracts(thesaurus).get(extract_name)
   347     if extract is None:
   347     if extract is None:
   348         raise HTTPBadRequest("Extract not found")
   348         raise HTTPBadRequest("Extract not found")
       
   349     if not request.has_permission(MANAGE_THESAURUS_EXTRACT_PERMISSION, context=extract):
       
   350         raise HTTPUnauthorized("You are not authorized to update this extract")
   349     if extract.name in (term.extracts or ()):
   351     if extract.name in (term.extracts or ()):
   350         extract.remove_term(term)
   352         extract.remove_term(term)
   351     else:
   353     else:
   352         extract.add_term(term)
   354         extract.add_term(term)
   353     return {'term': term.label,
   355     return {'term': term.label,
   359 #
   361 #
   360 # Terms import views
   362 # Terms import views
   361 #
   363 #
   362 
   364 
   363 @viewlet_config(name='import.menu', context=IThesaurus, layer=IAdminLayer, manager=IThesaurusTermsMenu,
   365 @viewlet_config(name='import.menu', context=IThesaurus, layer=IAdminLayer, manager=IThesaurusTermsMenu,
   364                 permission=MANAGE_SYSTEM_PERMISSION, weight=10)
   366                 permission=ADMIN_THESAURUS_PERMISSION, weight=10)
   365 class ThesaurusImportMenuItem(MenuItem):
   367 class ThesaurusImportMenuItem(MenuItem):
   366     """Thesaurus import menu"""
   368     """Thesaurus import menu"""
   367 
   369 
   368     label = _("Import terms...")
   370     label = _("Import terms...")
   369     icon_class = 'fa-upload'
   371     icon_class = 'fa-upload'
   377 
   379 
   378     close = CloseButton(name='close', title=_("Close"))
   380     close = CloseButton(name='close', title=_("Close"))
   379     add = button.Button(name='add', title=_("Import terms"))
   381     add = button.Button(name='add', title=_("Import terms"))
   380 
   382 
   381 
   383 
   382 @pagelet_config(name='import.html', context=IThesaurus, layer=IPyAMSLayer, permission=MANAGE_SYSTEM_PERMISSION)
   384 @pagelet_config(name='import.html', context=IThesaurus, layer=IPyAMSLayer,
       
   385                 permission=ADMIN_THESAURUS_PERMISSION)
   383 class ThesaurusImportForm(AdminDialogAddForm):
   386 class ThesaurusImportForm(AdminDialogAddForm):
   384     """Thesaurus import form"""
   387     """Thesaurus import form"""
   385 
   388 
   386     title = _("Thesaurus")
   389     title = _("Thesaurus")
   387     legend = _("Import thesaurus terms")
   390     legend = _("Import thesaurus terms")
   418     def nextURL(self):
   421     def nextURL(self):
   419         return absolute_url(self.context, self.request, 'admin#terms.html')
   422         return absolute_url(self.context, self.request, 'admin#terms.html')
   420 
   423 
   421 
   424 
   422 @view_config(name='import.json', context=IThesaurus, request_type=IPyAMSLayer,
   425 @view_config(name='import.json', context=IThesaurus, request_type=IPyAMSLayer,
   423              permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True)
   426              permission=ADMIN_THESAURUS_PERMISSION, renderer='json', xhr=True)
   424 class ThesaurusImportAJAXForm(AJAXAddForm, ThesaurusImportForm):
   427 class ThesaurusImportAJAXForm(AJAXAddForm, ThesaurusImportForm):
   425     """Thesaurus import form, AJAX view"""
   428     """Thesaurus import form, AJAX view"""
   426 
   429 
   427 
   430 
   428 #
   431 #
   470         configuration = self.configuration = ThesaurusExporterConfiguration(data)
   473         configuration = self.configuration = ThesaurusExporterConfiguration(data)
   471         exporter = self.exporter = get_utility(IThesaurusExporter, name=configuration.format)
   474         exporter = self.exporter = get_utility(IThesaurusExporter, name=configuration.format)
   472         return exporter.export(self.context, configuration)
   475         return exporter.export(self.context, configuration)
   473 
   476 
   474 
   477 
   475 @view_config(name='export.xml', context=IThesaurus, request_type=IPyAMSLayer, permission=MANAGE_SYSTEM_PERMISSION)
   478 @view_config(name='export.xml', context=IThesaurus, request_type=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
   476 class ThesaurusExportAJAXForm(AJAXAddForm, ThesaurusExportForm):
   479 class ThesaurusExportAJAXForm(AJAXAddForm, ThesaurusExportForm):
   477     """Thesaurus export form, AJAX view"""
   480     """Thesaurus export form, AJAX view"""
   478 
   481 
   479     def get_ajax_output(self, changes):
   482     def get_ajax_output(self, changes):
   480         changes.seek(0)
   483         changes.seek(0)