Commit 902704d20310f6fd9caee77948e60f12bd9a4cc8
1 parent
d4668dfb
ostrzeganie przed usunięciem klasyfikacji, poprawki z powodu zmienionych tabel
Showing
10 changed files
with
126 additions
and
48 deletions
.idea/sqldialects.xml
| 1 | <?xml version="1.0" encoding="UTF-8"?> | 1 | <?xml version="1.0" encoding="UTF-8"?> |
| 2 | <project version="4"> | 2 | <project version="4"> |
| 3 | <component name="SqlDialectMappings"> | 3 | <component name="SqlDialectMappings"> |
| 4 | - <file url="file://$PROJECT_DIR$/sql/history.sql" dialect="PostgreSQL" /> | 4 | + <file url="file://$PROJECT_DIR$/sql" dialect="PostgreSQL" /> |
| 5 | </component> | 5 | </component> |
| 6 | </project> | 6 | </project> |
| 7 | 7 |
dictionary/ajax_lexeme_view.py
| @@ -145,6 +145,14 @@ def lexeme_edit_form(request, id): | @@ -145,6 +145,14 @@ def lexeme_edit_form(request, id): | ||
| 145 | to_return['cross_references'] = crs | 145 | to_return['cross_references'] = crs |
| 146 | return to_return | 146 | return to_return |
| 147 | 147 | ||
| 148 | +@ajax(method='get') | ||
| 149 | +def check_classifications(request, owner_id, pos): | ||
| 150 | + part_of_speech = PartOfSpeech.objects.get(symbol=pos) | ||
| 151 | + owner = Vocabulary.objects.get(pk=owner_id) | ||
| 152 | + classifications = owner.classifications.filter( | ||
| 153 | + parts_of_speech=part_of_speech) | ||
| 154 | + return {'classifications': list(classifications.values_list('pk', flat=True))} | ||
| 155 | + | ||
| 148 | def make_classification_forms(lexeme, vocabulary=None, part_of_speech=None, | 156 | def make_classification_forms(lexeme, vocabulary=None, part_of_speech=None, |
| 149 | editable=True): | 157 | editable=True): |
| 150 | if not vocabulary: | 158 | if not vocabulary: |
dictionary/export.py
| @@ -89,10 +89,10 @@ def export_lexemes(data=None, output_file=None): | @@ -89,10 +89,10 @@ def export_lexemes(data=None, output_file=None): | ||
| 89 | cursor = connection.cursor() | 89 | cursor = connection.cursor() |
| 90 | query = """ | 90 | query = """ |
| 91 | select distinct haslo, prefiks||rdzen||zak||sufiks, l.pos, ch.charfl, tag, | 91 | select distinct haslo, prefiks||rdzen||zak||sufiks, l.pos, ch.charfl, tag, |
| 92 | - l.id as leksem_id, refl.lexemeattributevalue_id %(clas_field)s | 92 | + l.id as leksem_id, refl.attribute_value_id %(clas_field)s |
| 93 | from leksemy l | 93 | from leksemy l |
| 94 | join leksemy_w_slownikach ls on (ls.l_id = l.id) | 94 | join leksemy_w_slownikach ls on (ls.l_id = l.id) |
| 95 | - left outer join dictionary_lexemeattributevalue_lexemes refl | 95 | + left outer join dictionary_lexemeav refl |
| 96 | on (l.id = refl.lexeme_id and %(refl)s) | 96 | on (l.id = refl.lexeme_id and %(refl)s) |
| 97 | join odmieniasie o on (o.l_id = l.id) | 97 | join odmieniasie o on (o.l_id = l.id) |
| 98 | join charfle ch on ch.id = o.charfl | 98 | join charfle ch on ch.id = o.charfl |
| @@ -111,13 +111,13 @@ def export_lexemes(data=None, output_file=None): | @@ -111,13 +111,13 @@ def export_lexemes(data=None, output_file=None): | ||
| 111 | union all | 111 | union all |
| 112 | -- wymagające gniazdowania przy hasłowaniu: adjcom, advcom, derywaty: | 112 | -- wymagające gniazdowania przy hasłowaniu: adjcom, advcom, derywaty: |
| 113 | select distinct g.haslo as haslo, prefiks||rdzen||zak||sufiks, l.pos, | 113 | select distinct g.haslo as haslo, prefiks||rdzen||zak||sufiks, l.pos, |
| 114 | - ch.charfl, tag, l.id as leksem_id, refl.lexemeattributevalue_id | 114 | + ch.charfl, tag, l.id as leksem_id, refl.attribute_value_id |
| 115 | %(clas_field)s | 115 | %(clas_field)s |
| 116 | from leksemy l | 116 | from leksemy l |
| 117 | join leksemy_w_slownikach ls on (ls.l_id = l.id) | 117 | join leksemy_w_slownikach ls on (ls.l_id = l.id) |
| 118 | join odsylacze on l.id=l_id_od | 118 | join odsylacze on l.id=l_id_od |
| 119 | join leksemy g on (l_id_do=g.id and g.usuniety = false) | 119 | join leksemy g on (l_id_do=g.id and g.usuniety = false) |
| 120 | - left outer join dictionary_lexemeattributevalue_lexemes refl | 120 | + left outer join dictionary_lexemeav refl |
| 121 | on (g.id = refl.lexeme_id and %(refl)s) | 121 | on (g.id = refl.lexeme_id and %(refl)s) |
| 122 | join odmieniasie o on l.id=o.l_id | 122 | join odmieniasie o on l.id=o.l_id |
| 123 | join charfle ch on ch.id = o.charfl | 123 | join charfle ch on ch.id = o.charfl |
| @@ -138,13 +138,13 @@ def export_lexemes(data=None, output_file=None): | @@ -138,13 +138,13 @@ def export_lexemes(data=None, output_file=None): | ||
| 138 | 'x_qual': qualifier_clauses, | 138 | 'x_qual': qualifier_clauses, |
| 139 | 'magic': magic_qualifier_clauses, | 139 | 'magic': magic_qualifier_clauses, |
| 140 | 'crtype_ids': ', '.join(str(pk) for pk in crtype_ids), # brzydko, oj tam | 140 | 'crtype_ids': ', '.join(str(pk) for pk in crtype_ids), # brzydko, oj tam |
| 141 | - 'clas_field': ', classificationvalue_id' if data['commonness'] else '', | 141 | + 'clas_field': ', classification_value_id' if data['commonness'] else '', |
| 142 | 'clas_join': | 142 | 'clas_join': |
| 143 | - 'left outer join wartosci_klasyfikacji_lexemes wkl ' | ||
| 144 | - 'on (wkl.lexeme_id=l.id and wkl.classificationvalue_id in (%s))' | 143 | + 'left outer join dictionary_lexemecv wkl ' |
| 144 | + 'on (wkl.lexeme_id=l.id and wkl.classification_value_id in (%s))' | ||
| 145 | % ', '.join(str(pk) for pk in cv_ids) if data['commonness'] else '', | 145 | % ', '.join(str(pk) for pk in cv_ids) if data['commonness'] else '', |
| 146 | 'refl': | 146 | 'refl': |
| 147 | - 'refl.lexemeattributevalue_id in (%s)' | 147 | + 'refl.attribute_value_id in (%s)' |
| 148 | % ', '.join(str(pk) for pk in refls), | 148 | % ', '.join(str(pk) for pk in refls), |
| 149 | } | 149 | } |
| 150 | params_part = (list(data['vocabs']) + list(data['antivocabs']) + | 150 | params_part = (list(data['vocabs']) + list(data['antivocabs']) + |
dictionary/history.py
| @@ -106,10 +106,10 @@ def prepare_value(table, column, value): | @@ -106,10 +106,10 @@ def prepare_value(table, column, value): | ||
| 106 | prepared = InflectionCharacteristic.objects.get(pk=int(value)).symbol | 106 | prepared = InflectionCharacteristic.objects.get(pk=int(value)).symbol |
| 107 | elif column == 'w_id': | 107 | elif column == 'w_id': |
| 108 | prepared = Pattern.objects.get(pk=int(value)).name | 108 | prepared = Pattern.objects.get(pk=int(value)).name |
| 109 | - elif column == 'classificationvalue_id': | 109 | + elif column in ('classification_value_id', 'classificationvalue_id'): |
| 110 | cv = ClassificationValue.all_objects.get(pk=int(value)) | 110 | cv = ClassificationValue.all_objects.get(pk=int(value)) |
| 111 | prepared = (cv.label, cv.classification.name) | 111 | prepared = (cv.label, cv.classification.name) |
| 112 | - elif column == 'lexemeattributevalue_id': | 112 | + elif column == 'attribute_value_id': |
| 113 | av = LexemeAttributeValue.objects.get(pk=int(value)) | 113 | av = LexemeAttributeValue.objects.get(pk=int(value)) |
| 114 | prepared = (av.value, av.attribute.name) | 114 | prepared = (av.value, av.attribute.name) |
| 115 | else: | 115 | else: |
| @@ -152,9 +152,9 @@ def transaction_table(transaction_data): | @@ -152,9 +152,9 @@ def transaction_table(transaction_data): | ||
| 152 | if item1.row_id not in lips: | 152 | if item1.row_id not in lips: |
| 153 | lips[item1.row_id] = {} | 153 | lips[item1.row_id] = {} |
| 154 | lips[item1.row_id][attr] = before_after | 154 | lips[item1.row_id][attr] = before_after |
| 155 | - if column == 'lexemeattributevalue_id': | 155 | + if column == 'attribute_value_id': |
| 156 | extra_attributes.append(before_after) | 156 | extra_attributes.append(before_after) |
| 157 | - if column == 'classificationvalue_id': | 157 | + if column in ('classification_value_id', 'classificationvalue_id'): |
| 158 | classifications.append(before_after) | 158 | classifications.append(before_after) |
| 159 | if table == 'kwalifikatory_leksemow' and column == 'qualifier_id': | 159 | if table == 'kwalifikatory_leksemow' and column == 'qualifier_id': |
| 160 | qualifiers.append(before_after) | 160 | qualifiers.append(before_after) |
dictionary/views.py
| @@ -65,6 +65,7 @@ def lexeme_view(request): | @@ -65,6 +65,7 @@ def lexeme_view(request): | ||
| 65 | 'ajax_prompter_list': reverse('prompter_list'), | 65 | 'ajax_prompter_list': reverse('prompter_list'), |
| 66 | 'ajax_check_pos': reverse('check_pos'), | 66 | 'ajax_check_pos': reverse('check_pos'), |
| 67 | 'ajax_check_pattern': reverse('check_pattern'), | 67 | 'ajax_check_pattern': reverse('check_pattern'), |
| 68 | + 'ajax_check_classifications': reverse('check_classifications'), | ||
| 68 | 'ajax_get_ics': reverse('get_ics'), | 69 | 'ajax_get_ics': reverse('get_ics'), |
| 69 | 'ajax_save_default_owner': reverse('save_default_owner'), | 70 | 'ajax_save_default_owner': reverse('save_default_owner'), |
| 70 | 'ajax_create_lexeme': reverse('create_lexeme'), | 71 | 'ajax_create_lexeme': reverse('create_lexeme'), |
dictionary/wsjp.py
| @@ -20,8 +20,8 @@ def make_data(entries): | @@ -20,8 +20,8 @@ def make_data(entries): | ||
| 20 | as rodzaj, podparad, row, col, rowspan, colspan, kskl | 20 | as rodzaj, podparad, row, col, rowspan, colspan, kskl |
| 21 | from | 21 | from |
| 22 | leksemy l | 22 | leksemy l |
| 23 | - left outer join dictionary_lexemeattributevalue_lexemes refl | ||
| 24 | - on (l.id = refl.lexeme_id and refl.lexemeattributevalue_id in (%(refl)s)) | 23 | + left outer join dictionary_lexemeav refl |
| 24 | + on (l.id = refl.lexeme_id and refl.attribute_value_id in (%(refl)s)) | ||
| 25 | join odmieniasie o on (l.id = o.l_id) | 25 | join odmieniasie o on (l.id = o.l_id) |
| 26 | join charfle ch on (o.charfl = ch.id) | 26 | join charfle ch on (o.charfl = ch.id) |
| 27 | join wzory on (o.w_id = wzory.id) | 27 | join wzory on (o.w_id = wzory.id) |
| @@ -40,8 +40,8 @@ def make_data(entries): | @@ -40,8 +40,8 @@ def make_data(entries): | ||
| 40 | join odsylacze ods on l.id = l_id_od | 40 | join odsylacze ods on l.id = l_id_od |
| 41 | join typyodsylaczy tods on ods.typods_id = tods.id | 41 | join typyodsylaczy tods on ods.typods_id = tods.id |
| 42 | join leksemy g on l_id_do = g.id | 42 | join leksemy g on l_id_do = g.id |
| 43 | - left outer join dictionary_lexemeattributevalue_lexemes refl | ||
| 44 | - on (g.id = refl.lexeme_id and refl.lexemeattributevalue_id in (%(refl)s)) | 43 | + left outer join dictionary_lexemeav refl |
| 44 | + on (g.id = refl.lexeme_id and refl.attribute_value_id in (%(refl)s)) | ||
| 45 | join odmieniasie o on l.id = o.l_id | 45 | join odmieniasie o on l.id = o.l_id |
| 46 | join charfle ch on (o.charfl = ch.id) | 46 | join charfle ch on (o.charfl = ch.id) |
| 47 | join wzory on (o.w_id = wzory.id) | 47 | join wzory on (o.w_id = wzory.id) |
| @@ -57,7 +57,7 @@ def make_data(entries): | @@ -57,7 +57,7 @@ def make_data(entries): | ||
| 57 | 'haslo': 'haslo', | 57 | 'haslo': 'haslo', |
| 58 | 'entry_placeholders': entry_placeholders, | 58 | 'entry_placeholders': entry_placeholders, |
| 59 | 'leks_clause': '''l.pos not in ('skrl','skrw') and | 59 | 'leks_clause': '''l.pos not in ('skrl','skrw') and |
| 60 | - (l.pos != 'v' or refl.lexemeattributevalue_id in (%s))''' | 60 | + (l.pos != 'v' or refl.attribute_value_id in (%s))''' |
| 61 | % nonrefl_ids, | 61 | % nonrefl_ids, |
| 62 | 'refl': refl_ids, | 62 | 'refl': refl_ids, |
| 63 | }, | 63 | }, |
| @@ -69,7 +69,7 @@ def make_data(entries): | @@ -69,7 +69,7 @@ def make_data(entries): | ||
| 69 | 'haslo_tab': u"haslo||' się'", | 69 | 'haslo_tab': u"haslo||' się'", |
| 70 | 'haslo': 'haslo', | 70 | 'haslo': 'haslo', |
| 71 | 'entry_placeholders': entry_placeholders, | 71 | 'entry_placeholders': entry_placeholders, |
| 72 | - 'leks_clause': '''(l.pos='v' and refl.lexemeattributevalue_id <> %s)''', | 72 | + 'leks_clause': '''(l.pos='v' and refl.attribute_value_id <> %s)''', |
| 73 | 'refl': refl_ids, | 73 | 'refl': refl_ids, |
| 74 | }, | 74 | }, |
| 75 | entries + [empty_refl, 's'] | 75 | entries + [empty_refl, 's'] |
| @@ -80,7 +80,7 @@ def make_data(entries): | @@ -80,7 +80,7 @@ def make_data(entries): | ||
| 80 | 'haslo_tab': "'nie '||haslo", | 80 | 'haslo_tab': "'nie '||haslo", |
| 81 | 'haslo': "'nie '||haslo", | 81 | 'haslo': "'nie '||haslo", |
| 82 | 'entry_placeholders': entry_placeholders, | 82 | 'entry_placeholders': entry_placeholders, |
| 83 | - 'leks_clause': '''l.pos='v' and refl.lexemeattributevalue_id in (%s)''' | 83 | + 'leks_clause': '''l.pos='v' and refl.attribute_value_id in (%s)''' |
| 84 | % nonrefl_ids, | 84 | % nonrefl_ids, |
| 85 | 'refl': refl_ids, | 85 | 'refl': refl_ids, |
| 86 | }, | 86 | }, |
| @@ -92,7 +92,7 @@ def make_data(entries): | @@ -92,7 +92,7 @@ def make_data(entries): | ||
| 92 | 'haslo_tab': u"'nie '||haslo||' się'", | 92 | 'haslo_tab': u"'nie '||haslo||' się'", |
| 93 | 'haslo': "'nie '||haslo", | 93 | 'haslo': "'nie '||haslo", |
| 94 | 'entry_placeholders': entry_placeholders, | 94 | 'entry_placeholders': entry_placeholders, |
| 95 | - 'leks_clause': '''(l.pos='v' and refl.lexemeattributevalue_id <> %s)''', | 95 | + 'leks_clause': '''(l.pos='v' and refl.attribute_value_id <> %s)''', |
| 96 | 'refl': refl_ids, | 96 | 'refl': refl_ids, |
| 97 | }, | 97 | }, |
| 98 | entries + [empty_refl, 'ns'] | 98 | entries + [empty_refl, 'ns'] |
| @@ -104,7 +104,7 @@ def make_data(entries): | @@ -104,7 +104,7 @@ def make_data(entries): | ||
| 104 | 'entry_placeholders': entry_placeholders, | 104 | 'entry_placeholders': entry_placeholders, |
| 105 | 'main_clause': '''typods in ('comadj','comadv','ppasver') and | 105 | 'main_clause': '''typods in ('comadj','comadv','ppasver') and |
| 106 | l.pos in ('adjcom','advcom','ppas') and | 106 | l.pos in ('adjcom','advcom','ppas') and |
| 107 | - (l.pos != 'ppas' or refl.lexemeattributevalue_id in (%s))''' | 107 | + (l.pos != 'ppas' or refl.attribute_value_id in (%s))''' |
| 108 | % nonrefl_ids, | 108 | % nonrefl_ids, |
| 109 | 'refl': refl_ids, | 109 | 'refl': refl_ids, |
| 110 | }, | 110 | }, |
| @@ -116,7 +116,7 @@ def make_data(entries): | @@ -116,7 +116,7 @@ def make_data(entries): | ||
| 116 | 'haslo': u"g.haslo||' się'", | 116 | 'haslo': u"g.haslo||' się'", |
| 117 | 'entry_placeholders': entry_placeholders, | 117 | 'entry_placeholders': entry_placeholders, |
| 118 | 'main_clause': '''(typods ='ppasver' and l.pos ='ppas' and | 118 | 'main_clause': '''(typods ='ppasver' and l.pos ='ppas' and |
| 119 | - refl.lexemeattributevalue_id <> %s)''', | 119 | + refl.attribute_value_id <> %s)''', |
| 120 | 'refl': refl_ids, | 120 | 'refl': refl_ids, |
| 121 | }, | 121 | }, |
| 122 | entries + [empty_refl] | 122 | entries + [empty_refl] |
media/js/lexeme-view.js
| 1 | var prompter_ctrl, created; | 1 | var prompter_ctrl, created; |
| 2 | 2 | ||
| 3 | +function init_selection(jq) { | ||
| 4 | + "use strict"; | ||
| 5 | + jq.find('option:selected').addClass('last-selected'); | ||
| 6 | +} | ||
| 7 | + | ||
| 8 | +function revert_selection(jq) { | ||
| 9 | + "use strict"; | ||
| 10 | + jq.find('option.last-selected').prop('selected', true); | ||
| 11 | +} | ||
| 12 | + | ||
| 13 | +function confirm_selection(jq) { | ||
| 14 | + "use strict"; | ||
| 15 | + jq.find('option.last-selected').removeClass('last-selected'); | ||
| 16 | + jq.find('option:selected').addClass('last-selected'); | ||
| 17 | +} | ||
| 18 | + | ||
| 3 | function selected_qualifiers_text(num, total, checked) { | 19 | function selected_qualifiers_text(num, total, checked) { |
| 4 | "use strict"; | 20 | "use strict"; |
| 5 | if (num >= 4) | 21 | if (num >= 4) |
| @@ -227,6 +243,11 @@ function get_entry() { | @@ -227,6 +243,11 @@ function get_entry() { | ||
| 227 | return $('#id_entry').val(); | 243 | return $('#id_entry').val(); |
| 228 | } | 244 | } |
| 229 | 245 | ||
| 246 | +function get_owner() { | ||
| 247 | + "use strict"; | ||
| 248 | + return $('#id_new_owner').val(); | ||
| 249 | +} | ||
| 250 | + | ||
| 230 | function join_attrs(attrs) { | 251 | function join_attrs(attrs) { |
| 231 | "use strict"; | 252 | "use strict"; |
| 232 | return $.map(attrs, function(attr) { | 253 | return $.map(attrs, function(attr) { |
| @@ -234,6 +255,13 @@ function join_attrs(attrs) { | @@ -234,6 +255,13 @@ function join_attrs(attrs) { | ||
| 234 | }).join(', '); | 255 | }).join(', '); |
| 235 | } | 256 | } |
| 236 | 257 | ||
| 258 | +function join_classifications(clas_ids) { | ||
| 259 | + "use strict"; | ||
| 260 | + return $.map(clas_ids, function(c_id) { | ||
| 261 | + return $("[for='id_cl" + c_id + "-values']").text().replace(':', ''); | ||
| 262 | + }).join(', '); | ||
| 263 | +} | ||
| 264 | + | ||
| 237 | function init_form_widgets() { | 265 | function init_form_widgets() { |
| 238 | "use strict"; | 266 | "use strict"; |
| 239 | $(document).on('click', '.lip-row span.remove', function() { | 267 | $(document).on('click', '.lip-row span.remove', function() { |
| @@ -259,8 +287,7 @@ function init_form_widgets() { | @@ -259,8 +287,7 @@ function init_form_widgets() { | ||
| 259 | $(document).on('click', '#add-row', function() { | 287 | $(document).on('click', '#add-row', function() { |
| 260 | var id = lexeme_id(); | 288 | var id = lexeme_id(); |
| 261 | var new_row = $(get_new_row_html(id)); | 289 | var new_row = $(get_new_row_html(id)); |
| 262 | - new_row.find('.inflection-characteristic option:selected') | ||
| 263 | - .addClass('last-selected'); | 290 | + init_selection(new_row.find('.inflection-characteristic')); |
| 264 | var pattern_list = $('#pattern-list'); | 291 | var pattern_list = $('#pattern-list'); |
| 265 | pattern_list.append(new_row); | 292 | pattern_list.append(new_row); |
| 266 | var elem = pattern_list.find('.lip-qualifiers').last(); | 293 | var elem = pattern_list.find('.lip-qualifiers').last(); |
| @@ -381,7 +408,21 @@ function init_form_widgets() { | @@ -381,7 +408,21 @@ function init_form_widgets() { | ||
| 381 | $('#move-lexeme').toggleClass('move-hidden'); | 408 | $('#move-lexeme').toggleClass('move-hidden'); |
| 382 | }); | 409 | }); |
| 383 | $(document).on('change', '#id_part_of_speech', check_pos); | 410 | $(document).on('change', '#id_part_of_speech', check_pos); |
| 384 | - $(document).on('change', '#id_new_owner', reload_classifications); | 411 | + $(document).on('change', '#id_new_owner', function() { |
| 412 | + var stale_classifications = check_classifications(), confirmed; | ||
| 413 | + if (stale_classifications.length > 0) { | ||
| 414 | + confirmed = window.confirm( | ||
| 415 | + 'Zostaną usunięte klasyfikacje: ' + | ||
| 416 | + join_classifications(stale_classifications) + 'Kontynuować?'); | ||
| 417 | + if (!confirmed) { | ||
| 418 | + revert_selection($(this)); | ||
| 419 | + } | ||
| 420 | + } | ||
| 421 | + if (confirmed || stale_classifications.length === 0) { | ||
| 422 | + confirm_selection($(this)); | ||
| 423 | + reload_classifications(); | ||
| 424 | + } | ||
| 425 | + }); | ||
| 385 | $(document).on('change', '.inflection-characteristic', function() { | 426 | $(document).on('change', '.inflection-characteristic', function() { |
| 386 | var new_ics = get_ic_symbols(); | 427 | var new_ics = get_ic_symbols(); |
| 387 | var stale_attrs = check_attrs(new_ics); | 428 | var stale_attrs = check_attrs(new_ics); |
| @@ -390,12 +431,11 @@ function init_form_widgets() { | @@ -390,12 +431,11 @@ function init_form_widgets() { | ||
| 390 | confirmed = window.confirm("Atrybuty: " + join_attrs(stale_attrs) + | 431 | confirmed = window.confirm("Atrybuty: " + join_attrs(stale_attrs) + |
| 391 | ' zostaną usunięte. Kontynouwać?'); | 432 | ' zostaną usunięte. Kontynouwać?'); |
| 392 | if (!confirmed) { | 433 | if (!confirmed) { |
| 393 | - $(this).find('option.last-selected').prop('selected', true); | 434 | + revert_selection($(this)); |
| 394 | } | 435 | } |
| 395 | } | 436 | } |
| 396 | if (confirmed || stale_attrs.length === 0) { | 437 | if (confirmed || stale_attrs.length === 0) { |
| 397 | - $(this).find('option.last-selected').removeClass('last-selected'); | ||
| 398 | - $(this).find('option:selected').addClass('last-selected'); | 438 | + confirm_selection($(this)); |
| 399 | reload_attributes(); | 439 | reload_attributes(); |
| 400 | } | 440 | } |
| 401 | }); | 441 | }); |
| @@ -413,7 +453,7 @@ function reload_classifications() { | @@ -413,7 +453,7 @@ function reload_classifications() { | ||
| 413 | "use strict"; | 453 | "use strict"; |
| 414 | var data = { | 454 | var data = { |
| 415 | lexeme_id: lexeme_id(), | 455 | lexeme_id: lexeme_id(), |
| 416 | - vocab_id: $('#id_new_owner').val(), | 456 | + vocab_id: get_owner(), |
| 417 | pos: get_pos() | 457 | pos: get_pos() |
| 418 | }; | 458 | }; |
| 419 | $.ajaxJSON({ | 459 | $.ajaxJSON({ |
| @@ -527,8 +567,9 @@ function edit_form_init() { | @@ -527,8 +567,9 @@ function edit_form_init() { | ||
| 527 | deleted = []; | 567 | deleted = []; |
| 528 | deleted_cr = []; | 568 | deleted_cr = []; |
| 529 | created = false; | 569 | created = false; |
| 530 | - $('#id_part_of_speech').find('option:selected').addClass('last-selected'); | ||
| 531 | - $('.inflection-characteristic option:selected').addClass('last-selected'); | 570 | + init_selection($('#id_part_of_speech')); |
| 571 | + init_selection($('.inflection-characteristic')); | ||
| 572 | + init_selection(new_owner_elem); | ||
| 532 | jqgrid.hide_changed(); | 573 | jqgrid.hide_changed(); |
| 533 | if (jqgrid.ctrl) | 574 | if (jqgrid.ctrl) |
| 534 | jqgrid.ctrl.remove(); | 575 | jqgrid.ctrl.remove(); |
| @@ -902,6 +943,26 @@ function input_prompter_pattern() { | @@ -902,6 +943,26 @@ function input_prompter_pattern() { | ||
| 902 | } | 943 | } |
| 903 | } | 944 | } |
| 904 | 945 | ||
| 946 | +function check_classifications() { | ||
| 947 | + "use strict"; | ||
| 948 | + var new_classifications = $.ajaxJSON({ | ||
| 949 | + method: 'get', | ||
| 950 | + url: $dj.ajax_check_classifications, | ||
| 951 | + data: {lexeme_id: lexeme_id(), pos: get_pos(), owner_id: get_owner()}, | ||
| 952 | + async: false | ||
| 953 | + }).classifications; | ||
| 954 | + var old_classifications = $('#classifications').find('.classification-values') | ||
| 955 | + .map(function(i, el) { | ||
| 956 | + return parseInt(el.id.replace('id_cl', '').replace('-values', ''), 10); | ||
| 957 | + }); | ||
| 958 | + var stale_classifications = []; | ||
| 959 | + old_classifications.each(function(i, c_id) { | ||
| 960 | + if (new_classifications.indexOf(c_id) === -1) | ||
| 961 | + stale_classifications.push(c_id); | ||
| 962 | + }); | ||
| 963 | + return stale_classifications; | ||
| 964 | +} | ||
| 965 | + | ||
| 905 | function check_attrs(ics) { | 966 | function check_attrs(ics) { |
| 906 | "use strict"; | 967 | "use strict"; |
| 907 | var new_attrs = $.ajaxJSON({ | 968 | var new_attrs = $.ajaxJSON({ |
| @@ -914,7 +975,7 @@ function check_attrs(ics) { | @@ -914,7 +975,7 @@ function check_attrs(ics) { | ||
| 914 | return parseInt(el.id.split('-')[0].substring('id_attr'.length), 10); | 975 | return parseInt(el.id.split('-')[0].substring('id_attr'.length), 10); |
| 915 | }); | 976 | }); |
| 916 | var stale_attrs = []; | 977 | var stale_attrs = []; |
| 917 | - $.each(old_attrs, function(i, attr) { | 978 | + old_attrs.each(function(i, attr) { |
| 918 | if (new_attrs.indexOf(attr) === -1) | 979 | if (new_attrs.indexOf(attr) === -1) |
| 919 | stale_attrs.push(attr); | 980 | stale_attrs.push(attr); |
| 920 | }); | 981 | }); |
| @@ -943,7 +1004,9 @@ var check_pos = function() { | @@ -943,7 +1004,9 @@ var check_pos = function() { | ||
| 943 | good_ics.push(ic_symbol); | 1004 | good_ics.push(ic_symbol); |
| 944 | }); | 1005 | }); |
| 945 | var stale_attrs = check_attrs(good_ics); | 1006 | var stale_attrs = check_attrs(good_ics); |
| 946 | - if (bad_lips.length > 0 || cr_row_elems.length > 0 || stale_attrs.length > 0) { | 1007 | + var stale_classifications = check_classifications(); |
| 1008 | + if (bad_lips.length > 0 || cr_row_elems.length > 0 || | ||
| 1009 | + stale_attrs.length > 0 || stale_classifications.length > 0) { | ||
| 947 | var lips_text = '', cr_text = '', lips = []; | 1010 | var lips_text = '', cr_text = '', lips = []; |
| 948 | if (bad_lips.length > 0) { | 1011 | if (bad_lips.length > 0) { |
| 949 | $.each(bad_lips, function(i, t) { | 1012 | $.each(bad_lips, function(i, t) { |
| @@ -956,21 +1019,25 @@ var check_pos = function() { | @@ -956,21 +1019,25 @@ var check_pos = function() { | ||
| 956 | if (cr_row_elems.length > 0) { | 1019 | if (cr_row_elems.length > 0) { |
| 957 | cr_text += "wszystkie odsyłacze\n"; | 1020 | cr_text += "wszystkie odsyłacze\n"; |
| 958 | } | 1021 | } |
| 959 | - // TODO ostrzegać przed znikaniem klasyfikacji [kiedyś] (?) | ||
| 960 | var attr_text = ''; | 1022 | var attr_text = ''; |
| 961 | if (stale_attrs.length > 0) { | 1023 | if (stale_attrs.length > 0) { |
| 962 | attr_text = "atrybuty: " + join_attrs(stale_attrs) + '\n'; | 1024 | attr_text = "atrybuty: " + join_attrs(stale_attrs) + '\n'; |
| 963 | } | 1025 | } |
| 1026 | + var clas_text = ''; | ||
| 1027 | + if (stale_classifications.length > 0) { | ||
| 1028 | + clas_text = "klasyfikacje: " + | ||
| 1029 | + join_classifications(stale_classifications) + '\n'; | ||
| 1030 | + } | ||
| 964 | confirmed = window.confirm( | 1031 | confirmed = window.confirm( |
| 965 | - 'Zostaną usunięte:\n' + lips_text + cr_text + attr_text + 'Kontynuować?'); | 1032 | + 'Zostaną usunięte:\n' + lips_text + cr_text + attr_text + clas_text + |
| 1033 | + 'Kontynuować?'); | ||
| 966 | if (!confirmed) { | 1034 | if (!confirmed) { |
| 967 | - $(this).find('option.last-selected').prop('selected', true); | 1035 | + revert_selection($(this)); |
| 968 | } | 1036 | } |
| 969 | } | 1037 | } |
| 970 | if (confirmed || !(bad_lips.length > 0 || cr_row_elems.length > 0 || | 1038 | if (confirmed || !(bad_lips.length > 0 || cr_row_elems.length > 0 || |
| 971 | - stale_attrs.length > 0)) { | ||
| 972 | - $(this).find('option.last-selected').removeClass('last-selected'); | ||
| 973 | - $(this).find('option:selected').addClass('last-selected'); | 1039 | + stale_attrs.length > 0 || stale_classifications.length > 0)) { |
| 1040 | + confirm_selection($(this)); | ||
| 974 | var result = $.ajax({ // znowu brzydko... | 1041 | var result = $.ajax({ // znowu brzydko... |
| 975 | type: 'get', | 1042 | type: 'get', |
| 976 | url: $dj.ajax_get_ics, | 1043 | url: $dj.ajax_get_ics, |
sql/drop.sql
| 1 | +-- bardzo nieaktualne! | ||
| 1 | drop table "auth_group_permissions" cascade; | 2 | drop table "auth_group_permissions" cascade; |
| 2 | drop table "auth_group" cascade; | 3 | drop table "auth_group" cascade; |
| 3 | drop table "auth_user_user_permissions" cascade; | 4 | drop table "auth_user_user_permissions" cascade; |
| @@ -11,7 +12,7 @@ | @@ -11,7 +12,7 @@ | ||
| 11 | drop table "klasygramatyczne" cascade; | 12 | drop table "klasygramatyczne" cascade; |
| 12 | drop table "kwalifikatory_leksemow" cascade; | 13 | drop table "kwalifikatory_leksemow" cascade; |
| 13 | drop table "kwalifikatory_odmieniasiow" cascade; | 14 | drop table "kwalifikatory_odmieniasiow" cascade; |
| 14 | - drop table "wartosci_klasyfikacji_lexemes" cascade; | 15 | + drop table "dictionary_lexemecv" cascade; |
| 15 | drop table "odmieniasie" cascade; | 16 | drop table "odmieniasie" cascade; |
| 16 | drop table "zakonczenia" cascade; | 17 | drop table "zakonczenia" cascade; |
| 17 | drop table "kwalifikatory_zakonczen" cascade; | 18 | drop table "kwalifikatory_zakonczen" cascade; |
sql/history.sql
| @@ -40,7 +40,7 @@ BEGIN | @@ -40,7 +40,7 @@ BEGIN | ||
| 40 | lexemeId := temp.id; | 40 | lexemeId := temp.id; |
| 41 | ELSIF (TG_TABLE_NAME IN ('odmieniasie', 'leksemy_w_slownikach')) THEN | 41 | ELSIF (TG_TABLE_NAME IN ('odmieniasie', 'leksemy_w_slownikach')) THEN |
| 42 | lexemeId := temp.l_id; | 42 | lexemeId := temp.l_id; |
| 43 | - ELSIF (TG_TABLE_NAME IN ('kwalifikatory_leksemow', 'wartosci_klasyfikacji_lexemes', 'dictionary_lexemeattributevalue_lexemes')) THEN | 43 | + ELSIF (TG_TABLE_NAME IN ('kwalifikatory_leksemow', 'dictionary_lexemeav', 'dictionary_lexemecv')) THEN |
| 44 | lexemeId := temp.lexeme_id; | 44 | lexemeId := temp.lexeme_id; |
| 45 | ELSIF (TG_TABLE_NAME = 'odsylacze') THEN | 45 | ELSIF (TG_TABLE_NAME = 'odsylacze') THEN |
| 46 | lexemeId := temp.l_id_od; | 46 | lexemeId := temp.l_id_od; |
| @@ -116,16 +116,16 @@ CREATE TRIGGER leksemy_w_slownikach_trigger_history_ | @@ -116,16 +116,16 @@ CREATE TRIGGER leksemy_w_slownikach_trigger_history_ | ||
| 116 | AFTER INSERT OR UPDATE OR DELETE ON leksemy_w_slownikach | 116 | AFTER INSERT OR UPDATE OR DELETE ON leksemy_w_slownikach |
| 117 | FOR EACH ROW EXECUTE PROCEDURE make_history_(); | 117 | FOR EACH ROW EXECUTE PROCEDURE make_history_(); |
| 118 | 118 | ||
| 119 | -CREATE TRIGGER wartosci_klasyfikacji_lexemes_trigger_history_ | ||
| 120 | -AFTER INSERT OR UPDATE OR DELETE ON wartosci_klasyfikacji_lexemes -- ta tabela zmieni nazwę | 119 | +CREATE TRIGGER dictionary_lexemecv_trigger_history_ |
| 120 | +AFTER INSERT OR UPDATE OR DELETE ON dictionary_lexemecv | ||
| 121 | FOR EACH ROW EXECUTE PROCEDURE make_history_(); | 121 | FOR EACH ROW EXECUTE PROCEDURE make_history_(); |
| 122 | 122 | ||
| 123 | CREATE TRIGGER odsylacze_trigger_history_ | 123 | CREATE TRIGGER odsylacze_trigger_history_ |
| 124 | AFTER INSERT OR UPDATE OR DELETE ON odsylacze | 124 | AFTER INSERT OR UPDATE OR DELETE ON odsylacze |
| 125 | FOR EACH ROW EXECUTE PROCEDURE make_history_(); | 125 | FOR EACH ROW EXECUTE PROCEDURE make_history_(); |
| 126 | 126 | ||
| 127 | -CREATE TRIGGER lexemeattributevalue_lexemes_trigger_history_ | ||
| 128 | -AFTER INSERT OR UPDATE OR DELETE ON dictionary_lexemeattributevalue_lexemes | 127 | +CREATE TRIGGER dictionary_lexemeav_trigger_history_ |
| 128 | +AFTER INSERT OR UPDATE OR DELETE ON dictionary_lexemeav | ||
| 129 | FOR EACH ROW EXECUTE PROCEDURE make_history_(); | 129 | FOR EACH ROW EXECUTE PROCEDURE make_history_(); |
| 130 | 130 | ||
| 131 | -- wzory | 131 | -- wzory |
urls.py
| @@ -5,8 +5,8 @@ from django.conf import settings | @@ -5,8 +5,8 @@ from django.conf import settings | ||
| 5 | from common.util import url | 5 | from common.util import url |
| 6 | 6 | ||
| 7 | # Uncomment the next two lines to enable the admin: | 7 | # Uncomment the next two lines to enable the admin: |
| 8 | -from django.contrib import admin | ||
| 9 | -admin.autodiscover() | 8 | +#from django.contrib import admin |
| 9 | +#admin.autodiscover() | ||
| 10 | 10 | ||
| 11 | urlpatterns = patterns('', | 11 | urlpatterns = patterns('', |
| 12 | # Example: | 12 | # Example: |
| @@ -39,6 +39,7 @@ urlpatterns += patterns('dictionary.ajax_lexeme_view', | @@ -39,6 +39,7 @@ urlpatterns += patterns('dictionary.ajax_lexeme_view', | ||
| 39 | url(r'^ajax/delete_lexeme/$', 'delete_lexeme'), | 39 | url(r'^ajax/delete_lexeme/$', 'delete_lexeme'), |
| 40 | url(r'^ajax/check-pos/$', 'check_pos'), | 40 | url(r'^ajax/check-pos/$', 'check_pos'), |
| 41 | url(r'^ajax/check-pattern/$', 'check_pattern'), | 41 | url(r'^ajax/check-pattern/$', 'check_pattern'), |
| 42 | + url(r'^ajax/check-classifications/$', 'check_classifications'), | ||
| 42 | url(r'^ajax/get-ics/$', 'get_ics'), | 43 | url(r'^ajax/get-ics/$', 'get_ics'), |
| 43 | url(r'^ajax/create-lexeme/$', 'create_lexeme'), | 44 | url(r'^ajax/create-lexeme/$', 'create_lexeme'), |
| 44 | url(r'^ajax/classification-forms/$', 'classification_forms'), | 45 | url(r'^ajax/classification-forms/$', 'classification_forms'), |