Commit 8c95c2359b8e2fece844f150de9199d0fe38fe54

Authored by janek@kublik
1 parent 8dccb860

rodzaje w edycji wzoru

--HG--
branch : beta
common/static/css/slickgrid.css
... ... @@ -87,7 +87,9 @@ ul li:hover ul {
87 87 }
88 88  
89 89 #lexeme-edit-form p.main-field label,
90   -#pattern-edit-form p.main-field label {
  90 +#pattern-edit-form p.main-field label,
  91 +.genders-label
  92 +{
91 93 width: 6em;
92 94 line-height: 2em;
93 95 float: left;
... ...
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
... ... @@ -279,6 +279,9 @@ class Gender(Model):
279 279 def __unicode__(self):
280 280 return self.symbol
281 281  
  282 + class Meta:
  283 + ordering = ['symbol']
  284 +
282 285  
283 286 class Lexeme(Model):
284 287 STATUS_CANDIDATE = 'cand'
... ...
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
1 1 # -*- coding: utf-8 -*-
2 2 from django.forms import ModelForm, Form, SelectMultiple
  3 +from django.forms.widgets import CheckboxSelectMultiple
  4 +
3 5 from common.forms import disable_field
4 6 from dictionary.forms import QualifiersField
5 7 from dictionary.models import Qualifier
... ...
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'),
... ...