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!")), ) |