Commit 8c95c2359b8e2fece844f150de9199d0fe38fe54
1 parent
8dccb860
rodzaje w edycji wzoru
--HG-- branch : beta
Showing
10 changed files
with
150 additions
and
33 deletions
common/static/css/slickgrid.css
dictionary/migrations/0020_auto_20151223_1151.py
0 → 100644
1 | +# -*- coding: utf-8 -*- | |
2 | +from __future__ import unicode_literals | |
3 | + | |
4 | +from django.db import migrations, models | |
5 | + | |
6 | + | |
7 | +class Migration(migrations.Migration): | |
8 | + | |
9 | + dependencies = [ | |
10 | + ('dictionary', '0019_auto_20151216_1424'), | |
11 | + ] | |
12 | + | |
13 | + operations = [ | |
14 | + migrations.AlterModelOptions( | |
15 | + name='gender', | |
16 | + options={'ordering': ['symbol']}, | |
17 | + ), | |
18 | + ] | |
... | ... |
dictionary/models.py
patterns/ajax_pattern_view.py
... | ... | @@ -19,7 +19,8 @@ from patterns.models import InflectionType, BaseFormLabel, PatternType, \ |
19 | 19 | from dictionary.util import check_query_params |
20 | 20 | from patterns.forms import PatternEditForm, QualifierForm |
21 | 21 | |
22 | -COLOR_SCHEMES = dict(InflectionType.objects.values_list('symbol', 'color_scheme')) | |
22 | +COLOR_SCHEMES = dict( | |
23 | + InflectionType.objects.values_list('symbol', 'color_scheme')) | |
23 | 24 | |
24 | 25 | |
25 | 26 | class PatternQuery(SlickGridQuery): |
... | ... | @@ -29,7 +30,8 @@ class PatternQuery(SlickGridQuery): |
29 | 30 | default_columns = ('name', 'type') |
30 | 31 | column_data = { |
31 | 32 | 'id': lambda pattern: pattern.id, |
32 | - 'scheme': lambda pattern: COLOR_SCHEMES[pattern.type.inflection_type_id], | |
33 | + 'scheme': | |
34 | + lambda pattern: COLOR_SCHEMES[pattern.type.inflection_type_id], | |
33 | 35 | 'name': lambda pattern: pattern.name, |
34 | 36 | 'type': lambda pattern: pattern.type.symbol, |
35 | 37 | 'inflection_type': lambda pattern: pattern.type.inflection_type_id, |
... | ... | @@ -208,6 +210,7 @@ def update_pattern(request, form_data): |
208 | 210 | form.save() |
209 | 211 | p.deleted = False |
210 | 212 | p.save() |
213 | + p.genders = form_dict['genders'] | |
211 | 214 | for ending_pk in form_dict['deleted']: |
212 | 215 | Ending.objects.get(pk=int(ending_pk)).delete() |
213 | 216 | endings_changed = True |
... | ... | @@ -302,4 +305,24 @@ def clone_pattern(request, pattern_id): |
302 | 305 | pattern=new_pattern, index=ending.index, |
303 | 306 | base_form_label=ending.base_form_label, string=ending.string) |
304 | 307 | new_ending.qualifiers = ending.qualifiers.all() |
305 | - return {'new_id': new_pattern.id} | |
306 | 308 | \ No newline at end of file |
309 | + return {'new_id': new_pattern.id} | |
310 | + | |
311 | + | |
312 | +@ajax(method='get') | |
313 | +def check_pattern_type(request, pattern_id, type_id): | |
314 | + pattern = Pattern.objects.get(id=pattern_id) | |
315 | + pattern_type = PatternType.objects.get(id=type_id) | |
316 | + pattern_genders = pattern.genders.all() | |
317 | + type_genders = pattern_type.genders.all() | |
318 | + for gender in set(pattern_genders) - set(type_genders): | |
319 | + if Inflection.objects.filter(gender=gender, pattern=pattern).exists(): | |
320 | + return {'match': 'fail'} | |
321 | + return {'match': 'ok'} | |
322 | + | |
323 | + | |
324 | +@render_ajax(template='pattern_genders.html', method='get') | |
325 | +def genders_list(request, type_id, gender_ids): | |
326 | + return { | |
327 | + 'pattern_type': PatternType.objects.get(id=type_id), | |
328 | + 'selected_genders': Gender.objects.filter(id__in=gender_ids), | |
329 | + } | |
... | ... |
patterns/forms.py
patterns/static/js/pattern-edit.js
... | ... | @@ -21,6 +21,78 @@ $.extend(edit, { |
21 | 21 | form_cancel_class: 'pattern-edit-cancel', |
22 | 22 | form_submit_class: 'pattern-edit-submit', |
23 | 23 | |
24 | + get_genders: function() { | |
25 | + return $('[name=genders]').map(function(i, item) { | |
26 | + if ($(item).value()) | |
27 | + return item.value; | |
28 | + }).toArray(); | |
29 | + }, | |
30 | + | |
31 | + reload_genders: function() { | |
32 | + $.ajaxJSON({ | |
33 | + type: 'get', | |
34 | + url: $dj.ajax_genders_list, | |
35 | + data: { | |
36 | + type_id: $('#id_type').val(), | |
37 | + gender_ids: edit.get_genders() | |
38 | + }, | |
39 | + dest: $('#pattern-genders') | |
40 | + }); | |
41 | + }, | |
42 | + | |
43 | + check_genders: function(input, success_callback) { | |
44 | + $.ajaxJSON({ | |
45 | + type: 'get', | |
46 | + url: $dj.ajax_check_type, | |
47 | + data: {'pattern_id': slickgrid.get_id(), type_id: input.val()}, | |
48 | + callback: function(data) { | |
49 | + if (data.match === 'fail') { | |
50 | + window.alert(gettext("Selected pattern type doesn't match" + | |
51 | + " genders of existing lexemes.")); | |
52 | + common.revert_selection(input); | |
53 | + } else { | |
54 | + if (success_callback()) { | |
55 | + edit.reload_genders(); | |
56 | + } | |
57 | + } | |
58 | + } | |
59 | + }); | |
60 | + }, | |
61 | + | |
62 | + check_bfls: function(input) { | |
63 | + var confirmed; | |
64 | + var old_bfls = $dj.base_form_labels[common.previous_value(input)]; | |
65 | + var new_bfls = $dj.base_form_labels[input.val()]; | |
66 | + var stale_bfls = [], fresh_bfls = []; | |
67 | + $.each(old_bfls, function (i, bfl) { | |
68 | + if (new_bfls.indexOf(bfl) === -1) | |
69 | + stale_bfls.push(bfl); | |
70 | + }); | |
71 | + $.each(new_bfls, function (i, bfl) { | |
72 | + if (old_bfls.indexOf(bfl) === -1) | |
73 | + fresh_bfls.push(bfl); | |
74 | + }); | |
75 | + if (stale_bfls.length > 0) { | |
76 | + var fmt = ngettext( | |
77 | + "Label: %s will be removed.", | |
78 | + "Labels: %s will be removed.", stale_bfls.length); | |
79 | + var bfl_symbols = $.map( | |
80 | + stale_bfls, function (bfl_id) { | |
81 | + return $dj.bfl_symbols[bfl_id]; | |
82 | + }); | |
83 | + confirmed = window.confirm( | |
84 | + interpolate(fmt, [bfl_symbols.join(', ')]) + | |
85 | + ' ' + gettext("Continue?")); | |
86 | + if (!confirmed) { | |
87 | + return false; | |
88 | + } | |
89 | + } | |
90 | + if (confirmed || stale_bfls.length === 0) { | |
91 | + reload_endings(stale_bfls, fresh_bfls); | |
92 | + return true; | |
93 | + } | |
94 | + }, | |
95 | + | |
24 | 96 | init_form_widgets: function() { |
25 | 97 | "use strict"; |
26 | 98 | $(document).on('click', 'span.remove', function () { |
... | ... | @@ -51,37 +123,15 @@ $.extend(edit, { |
51 | 123 | }); |
52 | 124 | $(document).on('change', '#id_type', function () { |
53 | 125 | var $t = $(this); |
54 | - var old_bfls = $dj.base_form_labels[common.previous_value($t)]; | |
55 | - var new_bfls = $dj.base_form_labels[$t.val()]; | |
56 | - var stale_bfls = [], fresh_bfls = []; | |
57 | - var confirmed; | |
58 | - $.each(old_bfls, function(i, bfl) { | |
59 | - if (new_bfls.indexOf(bfl) === -1) | |
60 | - stale_bfls.push(bfl); | |
61 | - }); | |
62 | - $.each(new_bfls, function(i, bfl) { | |
63 | - if (old_bfls.indexOf(bfl) === -1) | |
64 | - fresh_bfls.push(bfl); | |
65 | - }); | |
66 | - if (stale_bfls.length > 0) { | |
67 | - var fmt = ngettext( | |
68 | - "Label: %s will be removed.", | |
69 | - "Labels: %s will be removed.", stale_bfls.length); | |
70 | - var bfl_symbols = $.map( | |
71 | - stale_bfls, function(bfl_id) { | |
72 | - return $dj.bfl_symbols[bfl_id]; | |
73 | - }); | |
74 | - confirmed = window.confirm( | |
75 | - interpolate(fmt, [bfl_symbols.join(', ')]) + | |
76 | - ' ' + gettext("Continue?")); | |
77 | - if (!confirmed) { | |
126 | + edit.check_genders($t, function() { | |
127 | + if (edit.check_bfls($t)) { | |
128 | + common.confirm_selection($t); | |
129 | + return true; | |
130 | + } else { | |
78 | 131 | common.revert_selection($t); |
132 | + return false; | |
79 | 133 | } |
80 | - } | |
81 | - if (confirmed || stale_bfls.length === 0) { | |
82 | - common.confirm_selection($t); | |
83 | - reload_endings(stale_bfls, fresh_bfls); | |
84 | - } | |
134 | + }); | |
85 | 135 | }); |
86 | 136 | }, |
87 | 137 | |
... | ... | @@ -133,6 +183,7 @@ $.extend(edit, { |
133 | 183 | |
134 | 184 | form_submit: function(form_data) { |
135 | 185 | "use strict"; |
186 | + form_data.push({name: 'genders', value: edit.get_genders()}); | |
136 | 187 | form_data.push({name: 'deleted', value: deleted}); |
137 | 188 | deleted = []; |
138 | 189 | var ending_list = []; |
... | ... |
patterns/templates/pattern_edit_form.html
... | ... | @@ -3,6 +3,9 @@ |
3 | 3 | <p><input type="hidden" name="id" value="{{ pattern.id }}"/></p> |
4 | 4 | |
5 | 5 | <div id="pattern-properties"> |
6 | + <p id="pattern-genders"> | |
7 | + {% include "pattern_genders.html" with pattern_type=pattern.type selected_genders=pattern.genders.all %} | |
8 | + </p> | |
6 | 9 | {{ type_form.as_p }} |
7 | 10 | {% for field in form %} |
8 | 11 | {% if field.name != 'basic_form_ending' %} |
... | ... |
patterns/templates/pattern_genders.html
0 → 100644
1 | +{% load i18n %} | |
2 | + | |
3 | +{% if pattern_type.genders.all %} | |
4 | + <span class="genders-label">{% trans "Genders:" %}</span> | |
5 | + {% for gender in pattern_type.genders.all %} | |
6 | + <label for="gender{{ gender.id }}">{{ gender.symbol }}</label> | |
7 | + <input type="checkbox" id="gender{{ gender.id }}" | |
8 | + name="genders" value="{{ gender.id }}" | |
9 | + {% if gender in selected_genders %}checked="checked"{% endif %}/> | |
10 | + {% endfor %} | |
11 | +{% endif %} | |
0 | 12 | \ No newline at end of file |
... | ... |
patterns/urls.py
... | ... | @@ -16,9 +16,11 @@ urlpatterns += patterns( |
16 | 16 | url(r'^ajax/pattern-edit-form/$', 'pattern_edit_form'), |
17 | 17 | url(r'^ajax/new-ending-row/$', 'new_ending_row'), |
18 | 18 | url(r'^ajax/new-bfl-row/$', 'new_ending_table_row'), |
19 | + url(r'^ajax/genders-list/$', 'genders_list'), | |
19 | 20 | url(r'^ajax/update-pattern/$', 'update_pattern'), |
20 | 21 | url(r'^ajax/create-pattern/$', 'create_pattern'), |
21 | 22 | url(r'^ajax/clone-pattern/$', 'clone_pattern'), |
22 | 23 | url(r'^ajax/pattern-preview/$', 'pattern_preview'), |
23 | 24 | url(r'^ajax/get-name/$', 'get_name'), |
25 | + url(r'^ajax/check-type/$', 'check_pattern_type'), | |
24 | 26 | ) |
... | ... |
patterns/views.py
... | ... | @@ -51,6 +51,8 @@ def pattern_view(request): |
51 | 51 | 'ajax_create_pattern': reverse('create_pattern'), |
52 | 52 | 'ajax_clone_pattern': reverse('clone_pattern'), |
53 | 53 | 'ajax_history_table': reverse('pattern_table'), |
54 | + 'ajax_check_type': reverse('check_pattern_type'), | |
55 | + 'ajax_genders_list': reverse('genders_list'), | |
54 | 56 | 'ajax_save_filter': reverse('save_filter'), |
55 | 57 | 'ajax_get_filters': reverse('get_filters'), |
56 | 58 | 'ajax_delete_filter': reverse('delete_filter'), |
... | ... |