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) |