src/pyams_thesaurus/zmi/term.py
changeset 87 dfe19304d980
parent 74 9f4143b02965
child 125 53d8795a704d
equal deleted inserted replaced
86:04f176e237cc 87:dfe19304d980
    24 from pyams_utils.interfaces import VIEW_PERMISSION
    24 from pyams_utils.interfaces import VIEW_PERMISSION
    25 from pyams_zmi.layer import IAdminLayer
    25 from pyams_zmi.layer import IAdminLayer
    26 from z3c.form.interfaces import IDataExtractedEvent, DISPLAY_MODE
    26 from z3c.form.interfaces import IDataExtractedEvent, DISPLAY_MODE
    27 
    27 
    28 # import packages
    28 # import packages
    29 from pyams_form.form import AJAXAddForm, AJAXEditForm
    29 from pyams_form.form import AJAXAddForm, ajax_config
    30 from pyams_pagelet.pagelet import pagelet_config
    30 from pyams_pagelet.pagelet import pagelet_config
    31 from pyams_skin.viewlet.toolbar import ToolbarAction
    31 from pyams_skin.viewlet.toolbar import ToolbarAction
    32 from pyams_thesaurus.term import ThesaurusTerm
    32 from pyams_thesaurus.term import ThesaurusTerm
    33 from pyams_thesaurus.zmi.thesaurus import ThesaurusTermsView
    33 from pyams_thesaurus.zmi.thesaurus import ThesaurusTermsView
    34 from pyams_utils.traversing import get_parent
    34 from pyams_utils.traversing import get_parent
    35 from pyams_utils.url import absolute_url
    35 from pyams_utils.url import absolute_url
    36 from pyams_viewlet.viewlet import viewlet_config
    36 from pyams_viewlet.viewlet import viewlet_config
    37 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    37 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
    38 from pyramid.events import subscriber
    38 from pyramid.events import subscriber
    39 from pyramid.view import view_config
       
    40 from z3c.form import field
    39 from z3c.form import field
    41 from zope.interface import Invalid
    40 from zope.interface import Invalid
    42 
    41 
    43 from pyams_thesaurus import _
    42 from pyams_thesaurus import _
    44 
    43 
    51     label = _("Add term")
    50     label = _("Add term")
    52     url = 'add-term.html'
    51     url = 'add-term.html'
    53     modal_target = True
    52     modal_target = True
    54 
    53 
    55 
    54 
    56 @pagelet_config(name='add-term.html', context=IThesaurus, layer=IPyAMSLayer, permission=MANAGE_THESAURUS_CONTENT_PERMISSION)
    55 @pagelet_config(name='add-term.html', context=IThesaurus, layer=IPyAMSLayer,
       
    56                 permission=MANAGE_THESAURUS_CONTENT_PERMISSION)
       
    57 @ajax_config(name='add-term.json', context=IThesaurus, layer=IPyAMSLayer,
       
    58              permission=MANAGE_THESAURUS_CONTENT_PERMISSION, base=AJAXAddForm)
    57 class ThesaurusTermAddForm(AdminDialogAddForm):
    59 class ThesaurusTermAddForm(AdminDialogAddForm):
    58     """Thesaurus term add form"""
    60     """Thesaurus term add form"""
    59 
    61 
    60     @property
    62     @property
    61     def title(self):
    63     def title(self):
    62         return self.context.title
    64         return self.context.title
    63 
    65 
    64     legend = _("Add new term")
    66     legend = _("Add new term")
    65     icon_css_class = 'fa fa-fw fa-tag'
    67     icon_css_class = 'fa fa-fw fa-tag'
    66 
    68 
    67     fields = field.Fields(IThesaurusTerm).select('label', 'alt', 'definition', 'note', 'generic', 'associations',
    69     fields = field.Fields(IThesaurusTerm).select('label', 'alt', 'definition', 'note', 'generic', 'order',
    68                                                  'usage', 'extensions', 'status', 'created')
    70                                                  'associations', 'usage', 'extensions', 'status', 'created')
    69 
    71 
    70     ajax_handler = 'add-term.json'
    72     ajax_handler = 'add-term.json'
    71     edit_permission = None
    73     edit_permission = None
    72 
    74 
    73     def updateWidgets(self, prefix=None):
    75     def updateWidgets(self, prefix=None):
    98         self.context.terms[object.label] = object
   100         self.context.terms[object.label] = object
    99 
   101 
   100     def nextURL(self):
   102     def nextURL(self):
   101         return absolute_url(self.context, self.request, 'terms.html')
   103         return absolute_url(self.context, self.request, 'terms.html')
   102 
   104 
   103 
       
   104 @subscriber(IDataExtractedEvent, form_selector=ThesaurusTermAddForm)
       
   105 def handle_new_term_data_extraction(event):
       
   106     """Handle new term data extraction"""
       
   107     data = event.data
       
   108     if data.get('label') in event.form.context.terms:
       
   109         event.form.widgets.errors += (Invalid(_("Specified label is already used!")), )
       
   110 
       
   111 
       
   112 @view_config(name='add-term.json', context=IThesaurus, request_type=IPyAMSLayer,
       
   113              permission=MANAGE_THESAURUS_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   114 class ThesaurusTermAJAXAddForm(AJAXAddForm, ThesaurusTermAddForm):
       
   115     """Thesaurus term add form, AJAX view"""
       
   116 
       
   117     def get_ajax_output(self, changes):
   105     def get_ajax_output(self, changes):
   118         if changes.generic is None:
   106         if changes.generic is None:
   119             return super(ThesaurusTermAJAXAddForm, self).get_ajax_output(changes)
   107             return super(self.__class__, self).get_ajax_output(changes)
   120         else:
   108         else:
   121             label = changes.label.replace("'", "'")
   109             label = changes.label.replace("'", "'")
   122             return {
   110             return {
   123                 'status': 'callback',
   111                 'status': 'callback',
   124                 'callback': 'PyAMS_thesaurus.tree.findTerm',
   112                 'callback': 'PyAMS_thesaurus.tree.findTerm',
   126                     'term': label
   114                     'term': label
   127                 }
   115                 }
   128             }
   116             }
   129 
   117 
   130 
   118 
       
   119 @subscriber(IDataExtractedEvent, form_selector=ThesaurusTermAddForm)
       
   120 def handle_new_term_data_extraction(event):
       
   121     """Handle new term data extraction"""
       
   122     data = event.data
       
   123     if data.get('label') in event.form.context.terms:
       
   124         event.form.widgets.errors += (Invalid(_("Specified label is already used!")), )
       
   125 
       
   126 
   131 @pagelet_config(name='properties.html', context=IThesaurusTerm, layer=IPyAMSLayer, permission=VIEW_PERMISSION)
   127 @pagelet_config(name='properties.html', context=IThesaurusTerm, layer=IPyAMSLayer, permission=VIEW_PERMISSION)
       
   128 @ajax_config(name='properties.json', context=IThesaurusTerm, layer=IPyAMSLayer)
   132 class ThesaurusTermEditForm(AdminDialogEditForm):
   129 class ThesaurusTermEditForm(AdminDialogEditForm):
   133     """Thesaurus term edit form"""
   130     """Thesaurus term edit form"""
   134 
   131 
   135     prefix = 'term_properties.'
   132     prefix = 'term_properties.'
   136 
   133 
   139         return self.context.label
   136         return self.context.label
   140 
   137 
   141     legend = _("Edit term properties")
   138     legend = _("Edit term properties")
   142     icon_css_class = 'fa fa-fw fa-tag'
   139     icon_css_class = 'fa fa-fw fa-tag'
   143 
   140 
   144     fields = field.Fields(IThesaurusTerm).select('label', 'alt', 'definition', 'note', 'generic', 'specifics',
   141     fields = field.Fields(IThesaurusTerm).select('label', 'alt', 'definition', 'note', 'generic', 'order', 'specifics',
   145                                                  'associations', 'usage', 'used_for', 'extracts', 'extensions',
   142                                                  'associations', 'usage', 'used_for', 'extracts', 'extensions',
   146                                                  'status', 'level', 'created', 'modified')
   143                                                  'status', 'level', 'created', 'modified')
   147 
   144 
   148     ajax_handler = 'properties.json'
       
   149     edit_permission = MANAGE_THESAURUS_CONTENT_PERMISSION
   145     edit_permission = MANAGE_THESAURUS_CONTENT_PERMISSION
   150 
   146 
   151     generic_changed = False
   147     generic_changed = False
   152     usage_changed = False
   148     usage_changed = False
   153 
   149 
   231                 # Add term to usage synonyms
   227                 # Add term to usage synonyms
   232                 if term not in term.usage.used_for:
   228                 if term not in term.usage.used_for:
   233                     term.usage.used_for += [term, ]
   229                     term.usage.used_for += [term, ]
   234         return changes
   230         return changes
   235 
   231 
   236 
       
   237 @subscriber(IDataExtractedEvent, form_selector=ThesaurusTermEditForm)
       
   238 def handle_term_properties_data_extraction(event):
       
   239     """Handle term properties data extraction"""
       
   240     context = event.form.context
       
   241     thesaurus = get_parent(context, IThesaurus)
       
   242     label = event.data.get('label')
       
   243     if (label != context.label) and (label in thesaurus.terms):
       
   244         event.form.widgets.errors += (Invalid(_("Specified new label is already used!")), )
       
   245 
       
   246 
       
   247 @pagelet_config(name='properties.json', context=IThesaurusTerm, request_type=IPyAMSLayer,
       
   248                 permission=MANAGE_THESAURUS_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   249 class ThesaurusTermAJAXEditForm(AJAXEditForm, ThesaurusTermEditForm):
       
   250     """Thesaurus term edit form, AJAX view"""
       
   251 
       
   252     def get_ajax_output(self, changes):
   232     def get_ajax_output(self, changes):
   253         if self.generic_changed:
   233         term_changes = changes.get(IThesaurusTerm, ())
       
   234         if self.generic_changed or ('order' in term_changes):
   254             label = self.context.label.replace("'", "'")
   235             label = self.context.label.replace("'", "'")
   255             return {
   236             return {
   256                 'status': 'reload',
   237                 'status': 'reload',
   257                 'callback': 'PyAMS_thesaurus.tree.findTerm',
   238                 'post_reload': 'PyAMS_thesaurus.tree.findTerm',
   258                 'options': {
   239                 'post_reload_options': {
   259                     'term': label
   240                     'term': label
   260                 }
   241                 }
   261             }
   242             }
   262         else:
   243         else:
   263             term_changes = changes.get(IThesaurusTerm, ())
       
   264             if ('status' in term_changes) or ('label' in term_changes) or ('extensions' in term_changes):
   244             if ('status' in term_changes) or ('label' in term_changes) or ('extensions' in term_changes):
   265                 label = (self.context.generic or self.context).label.replace("'", "'")
   245                 label = (self.context.generic or self.context).label.replace("'", "'")
   266                 return {
   246                 return {
   267                     'status': 'callback',
   247                     'status': 'callback',
   268                     'callback': 'PyAMS_thesaurus.tree.updateTerm',
   248                     'callback': 'PyAMS_thesaurus.tree.updateTerm',
   269                     'options': {
   249                     'options': {
   270                         'term': label
   250                         'term': label
   271                     }
   251                     }
   272                 }
   252                 }
   273             else:
   253             else:
   274                 return super(ThesaurusTermAJAXEditForm, self).get_ajax_output(changes)
   254                 return super(self.__class__, self).get_ajax_output(changes)
       
   255 
       
   256 
       
   257 @subscriber(IDataExtractedEvent, form_selector=ThesaurusTermEditForm)
       
   258 def handle_term_properties_data_extraction(event):
       
   259     """Handle term properties data extraction"""
       
   260     context = event.form.context
       
   261     thesaurus = get_parent(context, IThesaurus)
       
   262     label = event.data.get('label')
       
   263     if (label != context.label) and (label in thesaurus.terms):
       
   264         event.form.widgets.errors += (Invalid(_("Specified new label is already used!")), )