Commit ca4682686284a70d0908e43ea5b11ca5a8889b7d
Merge branch 'master' into tomek
Showing
26 changed files
with
1043 additions
and
558 deletions
LICENSE
1 | -Copyright (c) 2012, Bartłomiej Nitoń | 1 | +Copyright (c) 2015, Bartłomiej Nitoń |
2 | All rights reserved. | 2 | All rights reserved. |
3 | 3 | ||
4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: |
accounts/admin.py
@@ -39,7 +39,8 @@ class RealizedPhraseologyAdmin(admin.ModelAdmin): | @@ -39,7 +39,8 @@ class RealizedPhraseologyAdmin(admin.ModelAdmin): | ||
39 | readonly_fields = ('date',) | 39 | readonly_fields = ('date',) |
40 | search_fields = ('lemma__entry',) | 40 | search_fields = ('lemma__entry',) |
41 | 41 | ||
42 | -class RealizedSemanticsAdmin(admin.ModelAdmin): | 42 | +class RealizedSemanticsAdmin(admin.ModelAdmin): |
43 | + exclude = ('entry',) | ||
43 | list_filter = ('status', 'bonus',) | 44 | list_filter = ('status', 'bonus',) |
44 | search_fields = ('entry__name',) | 45 | search_fields = ('entry__name',) |
45 | 46 |
common/js_to_obj.py
@@ -43,7 +43,7 @@ def jsFrameToObj(frame, lemma_entry): | @@ -43,7 +43,7 @@ def jsFrameToObj(frame, lemma_entry): | ||
43 | for position in frame['positions']: | 43 | for position in frame['positions']: |
44 | if len(position['arguments']) > 0: | 44 | if len(position['arguments']) > 0: |
45 | pos_obj = jsPosToObj(position) | 45 | pos_obj = jsPosToObj(position) |
46 | - positions_objs.append(pos_obj) | 46 | + positions_objs.append(pos_obj) |
47 | 47 | ||
48 | sorted_positions = [] | 48 | sorted_positions = [] |
49 | sorted_pos_dict = sortPositions(positions_objs) | 49 | sorted_pos_dict = sortPositions(positions_objs) |
@@ -125,7 +125,7 @@ def jsArgToObj(argument): | @@ -125,7 +125,7 @@ def jsArgToObj(argument): | ||
125 | arg_obj = Argument.objects.get(text_rep=argument['text_rep']) | 125 | arg_obj = Argument.objects.get(text_rep=argument['text_rep']) |
126 | return arg_obj | 126 | return arg_obj |
127 | 127 | ||
128 | -def frameObjToSerializableDict(lemma, frame): | 128 | +def frameObjToSerializableDict(lemma, frame, with_connections=False): |
129 | frame_opinion = '' | 129 | frame_opinion = '' |
130 | frame_opinions_tab = lemma.frame_opinions.filter(frame__text_rep=frame.text_rep) | 130 | frame_opinions_tab = lemma.frame_opinions.filter(frame__text_rep=frame.text_rep) |
131 | if frame_opinions_tab: | 131 | if frame_opinions_tab: |
@@ -155,11 +155,16 @@ def frameObjToSerializableDict(lemma, frame): | @@ -155,11 +155,16 @@ def frameObjToSerializableDict(lemma, frame): | ||
155 | 'tooltip' : ''} | 155 | 'tooltip' : ''} |
156 | 156 | ||
157 | for argument in position['arguments']: | 157 | for argument in position['arguments']: |
158 | + connections = [] | ||
159 | + if with_connections: | ||
160 | + entry = lemma.entry_obj | ||
161 | + connections = entry.matching_connections(frame, position['position'], argument) | ||
158 | argument_dict = { 'id' : argument.id, | 162 | argument_dict = { 'id' : argument.id, |
159 | 'text_rep': argument.text_rep, | 163 | 'text_rep': argument.text_rep, |
160 | 'type' : argument.type, | 164 | 'type' : argument.type, |
161 | 'error' : False, | 165 | 'error' : False, |
162 | - 'tooltip' : ''} | 166 | + 'tooltip' : '', |
167 | + 'connections': connections} | ||
163 | position_dict['arguments'].append(argument_dict) | 168 | position_dict['arguments'].append(argument_dict) |
164 | 169 | ||
165 | frame_dict['positions'].append(position_dict) | 170 | frame_dict['positions'].append(position_dict) |
@@ -168,4 +173,4 @@ def frameObjToSerializableDict(lemma, frame): | @@ -168,4 +173,4 @@ def frameObjToSerializableDict(lemma, frame): | ||
168 | for char in frame_char_objs: | 173 | for char in frame_char_objs: |
169 | frame_dict['characteristics'].append(char.value.value) | 174 | frame_dict['characteristics'].append(char.value.value) |
170 | 175 | ||
171 | - return frame_dict | 176 | + return frame_dict |
dictionary/ajax_lemma_status.py
@@ -63,7 +63,8 @@ def get_lemma_status(request, id): | @@ -63,7 +63,8 @@ def get_lemma_status(request, id): | ||
63 | return {'lemma': selected_lemma, | 63 | return {'lemma': selected_lemma, |
64 | 'abort_status': abort_status, | 64 | 'abort_status': abort_status, |
65 | 'next_statuses': next_statuses, | 65 | 'next_statuses': next_statuses, |
66 | - 'pos': pos} | 66 | + 'pos': pos, |
67 | + 'status_changes': selected_lemma.status_history.order_by('-date')} | ||
67 | 68 | ||
68 | def phraseologic_status_changes(user, selected_lemma): | 69 | def phraseologic_status_changes(user, selected_lemma): |
69 | phraseologic_change = False | 70 | phraseologic_change = False |
dictionary/ajax_lemma_view.py
@@ -50,15 +50,20 @@ from dictionary.forms import AddPositionForm, FrameForm, Pos_Cat_Form, \ | @@ -50,15 +50,20 @@ from dictionary.forms import AddPositionForm, FrameForm, Pos_Cat_Form, \ | ||
50 | SimilarLemmasNewForm, ChangeUserFunctionForm, \ | 50 | SimilarLemmasNewForm, ChangeUserFunctionForm, \ |
51 | ExampleOpinionForm, \ | 51 | ExampleOpinionForm, \ |
52 | FrameConversionForm, CreatePositionForm, AssignPhraseologicFrameForm | 52 | FrameConversionForm, CreatePositionForm, AssignPhraseologicFrameForm |
53 | +from dictionary.saving import connect_example_operation, disconnect_all_examples_operations, \ | ||
54 | + get_semantic_operations, update_connections, reconnect_examples, \ | ||
55 | + disconnect_example_operation | ||
56 | + | ||
53 | from common.decorators import render, ajax, AjaxError | 57 | from common.decorators import render, ajax, AjaxError |
54 | from common.util import triple_arg_poss | 58 | from common.util import triple_arg_poss |
55 | from dictionary.validation import find_similar_frames, get_all_test_missing_frames, get_aspect_rel_lemmas, \ | 59 | from dictionary.validation import find_similar_frames, get_all_test_missing_frames, get_aspect_rel_lemmas, \ |
56 | get_wrong_aspect_frames, validate_B_frames, get_deriv_miss_frames_message, \ | 60 | get_wrong_aspect_frames, validate_B_frames, get_deriv_miss_frames_message, \ |
57 | validate_phraseology_binded_frames, validate_rule_5, \ | 61 | validate_phraseology_binded_frames, validate_rule_5, \ |
58 | validate_examples_and_mark_errors, validate_schemas_and_mark_errors, \ | 62 | validate_examples_and_mark_errors, validate_schemas_and_mark_errors, \ |
59 | - get_missing_aspects_msg | 63 | + get_missing_aspects_msg, validate_same_positions_schemata |
60 | 64 | ||
61 | from semantics.models import LexicalUnitExamples | 65 | from semantics.models import LexicalUnitExamples |
66 | + | ||
62 | from wordnet.models import LexicalUnit | 67 | from wordnet.models import LexicalUnit |
63 | 68 | ||
64 | from settings import PROJECT_PATH | 69 | from settings import PROJECT_PATH |
@@ -160,6 +165,7 @@ def prepareFrameTable(frame): | @@ -160,6 +165,7 @@ def prepareFrameTable(frame): | ||
160 | 165 | ||
161 | def nkjpExamplesObjToJs(nkjp_examples, user, lemma): | 166 | def nkjpExamplesObjToJs(nkjp_examples, user, lemma): |
162 | example_dict_list = [] | 167 | example_dict_list = [] |
168 | + lexical_units = lemma.entry_obj.lexical_units() | ||
163 | for example in nkjp_examples: | 169 | for example in nkjp_examples: |
164 | frame = example.frame; | 170 | frame = example.frame; |
165 | frame_table_id = 'frame_'+str(frame.id)+'_' | 171 | frame_table_id = 'frame_'+str(frame.id)+'_' |
@@ -193,11 +199,21 @@ def nkjpExamplesObjToJs(nkjp_examples, user, lemma): | @@ -193,11 +199,21 @@ def nkjpExamplesObjToJs(nkjp_examples, user, lemma): | ||
193 | 'opinion' : example.opinion.opinion, | 199 | 'opinion' : example.opinion.opinion, |
194 | 'comment' : comment, | 200 | 'comment' : comment, |
195 | 'confirmed' : confirmed, | 201 | 'confirmed' : confirmed, |
196 | - 'semantic' : example.semantic} | 202 | + 'semantic' : example.semantic, |
203 | + 'lexical_unit' : get_example_lexical_unit_id(lexical_units, example)} | ||
197 | example_dict_list.append(example_dict) | 204 | example_dict_list.append(example_dict) |
198 | 205 | ||
199 | return example_dict_list | 206 | return example_dict_list |
200 | 207 | ||
208 | +def get_example_lexical_unit_id(lexical_units, example): | ||
209 | + unit_id = -1 | ||
210 | + for lex_unit in lexical_units: | ||
211 | + if LexicalUnitExamples.objects.filter(example=example, | ||
212 | + lexical_unit=lex_unit).exists(): | ||
213 | + unit_id = lex_unit.id | ||
214 | + break | ||
215 | + return unit_id | ||
216 | + | ||
201 | def nkjpLemmaExamplesObjToJs(nkjp_examples, user, lemma): | 217 | def nkjpLemmaExamplesObjToJs(nkjp_examples, user, lemma): |
202 | example_dict_list = [] | 218 | example_dict_list = [] |
203 | for example in nkjp_examples: | 219 | for example in nkjp_examples: |
@@ -223,7 +239,9 @@ def nkjpLemmaExamplesObjToJs(nkjp_examples, user, lemma): | @@ -223,7 +239,9 @@ def nkjpLemmaExamplesObjToJs(nkjp_examples, user, lemma): | ||
223 | 'source' : example.source.source, | 239 | 'source' : example.source.source, |
224 | 'opinion' : example.opinion.opinion, | 240 | 'opinion' : example.opinion.opinion, |
225 | 'comment' : comment, | 241 | 'comment' : comment, |
226 | - 'confirmed' : confirmed} | 242 | + 'confirmed' : confirmed, |
243 | + 'semantic' : False, | ||
244 | + 'lexical_unit' : -1} | ||
227 | example_dict_list.append(example_dict) | 245 | example_dict_list.append(example_dict) |
228 | 246 | ||
229 | return example_dict_list | 247 | return example_dict_list |
@@ -369,7 +387,7 @@ def get_new_frames(request, id): | @@ -369,7 +387,7 @@ def get_new_frames(request, id): | ||
369 | 387 | ||
370 | serialized_frames = [] | 388 | serialized_frames = [] |
371 | for frame in new_frames: | 389 | for frame in new_frames: |
372 | - serialized_frames.append(frameObjToSerializableDict(selected_lemma, frame)) | 390 | + serialized_frames.append(frameObjToSerializableDict(selected_lemma, frame, True)) |
373 | json_frames = json_encode(serialized_frames) | 391 | json_frames = json_encode(serialized_frames) |
374 | 392 | ||
375 | # konwertowanie przykladow na zrozumiale przez java sript | 393 | # konwertowanie przykladow na zrozumiale przez java sript |
@@ -2067,7 +2085,7 @@ def frame_form_submit(request, form_data): | @@ -2067,7 +2085,7 @@ def frame_form_submit(request, form_data): | ||
2067 | text_rep = selected_frame.text_rep | 2085 | text_rep = selected_frame.text_rep |
2068 | json_frame = json_encode(frameObjToSerializableDict(lemma_obj, selected_frame)) | 2086 | json_frame = json_encode(frameObjToSerializableDict(lemma_obj, selected_frame)) |
2069 | json_examples = json_encode([]) | 2087 | json_examples = json_encode([]) |
2070 | - else: | 2088 | + elif form_dict['frame_str']: |
2071 | frame = json_decode(form_dict['frame_str']) | 2089 | frame = json_decode(form_dict['frame_str']) |
2072 | positions_objs = [] | 2090 | positions_objs = [] |
2073 | for position in frame['positions']: | 2091 | for position in frame['positions']: |
@@ -2104,6 +2122,8 @@ def frame_form_submit(request, form_data): | @@ -2104,6 +2122,8 @@ def frame_form_submit(request, form_data): | ||
2104 | frame_id = new_frame_obj.id | 2122 | frame_id = new_frame_obj.id |
2105 | text_rep = new_frame_obj.text_rep | 2123 | text_rep = new_frame_obj.text_rep |
2106 | json_examples = json_encode([]) | 2124 | json_examples = json_encode([]) |
2125 | + else: | ||
2126 | + raise AjaxError('data error') | ||
2107 | 2127 | ||
2108 | return {'id' : frame_id, | 2128 | return {'id' : frame_id, |
2109 | 'text_rep': text_rep, | 2129 | 'text_rep': text_rep, |
@@ -2405,7 +2425,8 @@ def save_new_frames(request, data, id, examples, lemma_examples): | @@ -2405,7 +2425,8 @@ def save_new_frames(request, data, id, examples, lemma_examples): | ||
2405 | for B_frame in old_object.B_frames.all(): | 2425 | for B_frame in old_object.B_frames.all(): |
2406 | new_lemma_ver.B_frames.add(B_frame) | 2426 | new_lemma_ver.B_frames.add(B_frame) |
2407 | 2427 | ||
2408 | - # tworzenie ramek i dolaczanie ich do czasownika | 2428 | + # tworzenie ramek i dolaczanie ich do czasownika |
2429 | + schemata_conversions = [] | ||
2409 | for frame in frames: | 2430 | for frame in frames: |
2410 | frame_obj = jsFrameToObj(frame, new_lemma_ver.entry) | 2431 | frame_obj = jsFrameToObj(frame, new_lemma_ver.entry) |
2411 | # blokuje zapisywanie ramek frazeologicznych bez argumentow frazeologicznych | 2432 | # blokuje zapisywanie ramek frazeologicznych bez argumentow frazeologicznych |
@@ -2424,8 +2445,14 @@ def save_new_frames(request, data, id, examples, lemma_examples): | @@ -2424,8 +2445,14 @@ def save_new_frames(request, data, id, examples, lemma_examples): | ||
2424 | frame_opinion_obj.save() | 2445 | frame_opinion_obj.save() |
2425 | new_lemma_ver.frame_opinions.add(frame_opinion_obj) | 2446 | new_lemma_ver.frame_opinions.add(frame_opinion_obj) |
2426 | new_lemma_ver.frames.add(frame_obj) | 2447 | new_lemma_ver.frames.add(frame_obj) |
2448 | + schemata_conversions.append({'js': frame, 'obj': frame_obj}) | ||
2449 | + | ||
2450 | + # reconnect semantics | ||
2451 | + sem_reconnect_operations = get_semantic_operations(new_lemma_ver, schemata_conversions) | ||
2452 | + update_connections(new_lemma_ver.id, sem_reconnect_operations, request.user) | ||
2427 | 2453 | ||
2428 | # dodawanie przykladow do ramek | 2454 | # dodawanie przykladow do ramek |
2455 | + reconnect_examples_operations = disconnect_all_examples_operations(old_object) | ||
2429 | for example in decoded_examples: | 2456 | for example in decoded_examples: |
2430 | frame_obj = jsFrameToObj(example['frame'], new_lemma_ver.entry) | 2457 | frame_obj = jsFrameToObj(example['frame'], new_lemma_ver.entry) |
2431 | # blokuje zapisywanie przykladow z ramek frazeologicznych bez argumentow frazeologicznych | 2458 | # blokuje zapisywanie przykladow z ramek frazeologicznych bez argumentow frazeologicznych |
@@ -2469,16 +2496,18 @@ def save_new_frames(request, data, id, examples, lemma_examples): | @@ -2469,16 +2496,18 @@ def save_new_frames(request, data, id, examples, lemma_examples): | ||
2469 | for argument in arg_selection['arguments']: | 2496 | for argument in arg_selection['arguments']: |
2470 | try: | 2497 | try: |
2471 | arg_obj = jsArgToObj(argument) | 2498 | arg_obj = jsArgToObj(argument) |
2472 | - argument_objs.append(arg_obj) | ||
2473 | - if len(nkjp_arg_sel_query.all()) > 0: # Q objectem to zalatwic | ||
2474 | - nkjp_arg_sel_query = nkjp_arg_sel_query.filter(arguments=arg_obj) | 2499 | + if arg_obj not in argument_objs: |
2500 | + argument_objs.append(arg_obj) | ||
2501 | + if len(nkjp_arg_sel_query.all()) > 0: # Q objectem to zalatwic | ||
2502 | + nkjp_arg_sel_query = nkjp_arg_sel_query.filter(arguments=arg_obj) | ||
2475 | except TypeError: | 2503 | except TypeError: |
2476 | pass | 2504 | pass |
2477 | - | 2505 | + |
2506 | + | ||
2478 | nkjp_arg_sel_obj = None | 2507 | nkjp_arg_sel_obj = None |
2479 | if len(nkjp_arg_sel_query.all()) > 0: | 2508 | if len(nkjp_arg_sel_query.all()) > 0: |
2480 | for nkjp_arg_sel in nkjp_arg_sel_query.all(): | 2509 | for nkjp_arg_sel in nkjp_arg_sel_query.all(): |
2481 | - if len(nkjp_arg_sel.arguments.all()) == len(argument_objs): | 2510 | + if len(nkjp_arg_sel.arguments.all()) == len(argument_objs): # zrobic list(set(argument_objs)) |
2482 | nkjp_arg_sel_obj = nkjp_arg_sel | 2511 | nkjp_arg_sel_obj = nkjp_arg_sel |
2483 | break | 2512 | break |
2484 | if not nkjp_arg_sel_obj: | 2513 | if not nkjp_arg_sel_obj: |
@@ -2518,7 +2547,13 @@ def save_new_frames(request, data, id, examples, lemma_examples): | @@ -2518,7 +2547,13 @@ def save_new_frames(request, data, id, examples, lemma_examples): | ||
2518 | nkjp_example_obj.save() | 2547 | nkjp_example_obj.save() |
2519 | for argument_selection in argument_selections: | 2548 | for argument_selection in argument_selections: |
2520 | nkjp_example_obj.arguments.add(argument_selection) | 2549 | nkjp_example_obj.arguments.add(argument_selection) |
2521 | - new_lemma_ver.nkjp_examples.add(nkjp_example_obj) | 2550 | + new_lemma_ver.nkjp_examples.add(nkjp_example_obj) |
2551 | + if example['lexical_unit'] > 0: | ||
2552 | + try: | ||
2553 | + reconnect_examples_operations.remove(disconnect_example_operation(example, nkjp_example_obj)) | ||
2554 | + except ValueError: | ||
2555 | + reconnect_examples_operations.append(connect_example_operation(example, nkjp_example_obj)) | ||
2556 | + reconnect_examples(reconnect_examples_operations) | ||
2522 | 2557 | ||
2523 | # dodawanie przykladow nkjp do czasownika | 2558 | # dodawanie przykladow nkjp do czasownika |
2524 | for example in decoded_lemma_examples: | 2559 | for example in decoded_lemma_examples: |
@@ -2544,23 +2579,23 @@ def save_new_frames(request, data, id, examples, lemma_examples): | @@ -2544,23 +2579,23 @@ def save_new_frames(request, data, id, examples, lemma_examples): | ||
2544 | nkjp_lemma_example_obj.save() | 2579 | nkjp_lemma_example_obj.save() |
2545 | new_lemma_ver.lemma_nkjp_examples.add(nkjp_lemma_example_obj) | 2580 | new_lemma_ver.lemma_nkjp_examples.add(nkjp_lemma_example_obj) |
2546 | 2581 | ||
2547 | - old_object.locker = None; | 2582 | + old_object.locker = None |
2548 | old_object.save() | 2583 | old_object.save() |
2549 | - new_lemma_ver.locker = None; | 2584 | + new_lemma_ver.locker = None |
2550 | try: | 2585 | try: |
2551 | new_lemma_ver = Lemma.objects.get(entry=old_object.entry, owner=old_object.owner, | 2586 | new_lemma_ver = Lemma.objects.get(entry=old_object.entry, owner=old_object.owner, |
2552 | vocabulary=old_object.vocabulary, status=old_object.status, | 2587 | vocabulary=old_object.vocabulary, status=old_object.status, |
2553 | old=False) | 2588 | old=False) |
2554 | raise AjaxError('concurrent access') | 2589 | raise AjaxError('concurrent access') |
2555 | except: | 2590 | except: |
2556 | - new_lemma_ver.old = False; | ||
2557 | - new_lemma_ver.save(); | 2591 | + new_lemma_ver.old = False |
2592 | + new_lemma_ver.save() | ||
2558 | 2593 | ||
2559 | return {'id' : new_lemma_ver.id, | 2594 | return {'id' : new_lemma_ver.id, |
2560 | 'entry' : new_lemma_ver.entry, | 2595 | 'entry' : new_lemma_ver.entry, |
2561 | 'error_message': '', | 2596 | 'error_message': '', |
2562 | 'frames' : ''} | 2597 | 'frames' : ''} |
2563 | - | 2598 | + |
2564 | ############## WALIDACJA ##################### | 2599 | ############## WALIDACJA ##################### |
2565 | 2600 | ||
2566 | @ajax(method='post') | 2601 | @ajax(method='post') |
@@ -2623,6 +2658,7 @@ def validate_new_frames(request, data, id, examples, lemma_examples, | @@ -2623,6 +2658,7 @@ def validate_new_frames(request, data, id, examples, lemma_examples, | ||
2623 | message_content += u'\t- %s\n' % (miss_frame.text_rep) | 2658 | message_content += u'\t- %s\n' % (miss_frame.text_rep) |
2624 | message_content += '\n' | 2659 | message_content += '\n' |
2625 | message_content += deriv_miss_frames_msg | 2660 | message_content += deriv_miss_frames_msg |
2661 | + message_content += validate_same_positions_schemata(old_object) | ||
2626 | frames_to_merge = find_similar_frames(old_object.frames.all()) | 2662 | frames_to_merge = find_similar_frames(old_object.frames.all()) |
2627 | if len(frames_to_merge) > 0: | 2663 | if len(frames_to_merge) > 0: |
2628 | message_content += u'Sugerowane jest połączenie poniższych schematów, zawierają one często koordynujące się typy fraz:\n' | 2664 | message_content += u'Sugerowane jest połączenie poniższych schematów, zawierają one często koordynujące się typy fraz:\n' |
@@ -3157,3 +3193,21 @@ def delete_user(request, user_id): | @@ -3157,3 +3193,21 @@ def delete_user(request, user_id): | ||
3157 | def deselect_preview_tab(request): | 3193 | def deselect_preview_tab(request): |
3158 | request.session['lemma_preview'] = False | 3194 | request.session['lemma_preview'] = False |
3159 | return {} | 3195 | return {} |
3196 | + | ||
3197 | +@ajax(method='get') | ||
3198 | +def get_schemata(request, lemma_id): | ||
3199 | + lemma = Lemma.objects.get(id=lemma_id) | ||
3200 | + schemata = lemma.frames.order_by('text_rep') | ||
3201 | + serialized_schemata = [frameObjToSerializableDict(lemma, schema, True) for schema in schemata] | ||
3202 | + json_schemata = json_encode(serialized_schemata) | ||
3203 | + return {'schemata': json_schemata, | ||
3204 | + 'can_modify': user_can_modify(lemma, request.user)} | ||
3205 | + | ||
3206 | +@ajax(method='get') | ||
3207 | +def get_examples(request, lemma_id): | ||
3208 | + lemma = Lemma.objects.get(id=lemma_id) | ||
3209 | + examples = lemma.nkjp_examples.all() | ||
3210 | + examples_js = nkjpExamplesObjToJs(examples, request.user, lemma) | ||
3211 | + json_examples = json_encode(examples_js) | ||
3212 | + return {'examples': json_examples, | ||
3213 | + 'can_modify': user_can_modify(lemma, request.user)} |
dictionary/models.py
@@ -328,7 +328,12 @@ class StatusChange(Model): | @@ -328,7 +328,12 @@ class StatusChange(Model): | ||
328 | blank=True, null=True) | 328 | blank=True, null=True) |
329 | 329 | ||
330 | def __unicode__(self): | 330 | def __unicode__(self): |
331 | - return self.lemma.entry + ':' + str(self.date) | 331 | + return self.lemma.entry + ':' + str(self.date) |
332 | + | ||
333 | + class Meta: | ||
334 | + permissions = ( | ||
335 | + ('view_status_changes', u'Może oglądać historię zmian statusu'), | ||
336 | + ) | ||
332 | 337 | ||
333 | class Frame_Opinion(Model): | 338 | class Frame_Opinion(Model): |
334 | frame = ForeignKey('Frame', db_column='ramka', related_name='opinions', | 339 | frame = ForeignKey('Frame', db_column='ramka', related_name='opinions', |
@@ -1387,6 +1392,20 @@ class Entry(Model): | @@ -1387,6 +1392,20 @@ class Entry(Model): | ||
1387 | frame_ids.extend([f.id for f in lexical_unit.actual_frames()]) | 1392 | frame_ids.extend([f.id for f in lexical_unit.actual_frames()]) |
1388 | return get_model('semantics', 'SemanticFrame').objects.filter(id__in=list(set(frame_ids))) | 1393 | return get_model('semantics', 'SemanticFrame').objects.filter(id__in=list(set(frame_ids))) |
1389 | 1394 | ||
1395 | + def matching_connections(self, schema, position, phrase_type): | ||
1396 | + frames = self.actual_frames() | ||
1397 | + matching_connections = [] | ||
1398 | + for frame in frames: | ||
1399 | + for compl in frame.complements.all(): | ||
1400 | + matching_realizations = compl.realizations.filter(frame=schema, | ||
1401 | + position=position, | ||
1402 | + argument=phrase_type) | ||
1403 | + if matching_realizations.exists(): | ||
1404 | + realizations_ids = [real.id for real in matching_realizations.all()] | ||
1405 | + matching_connections.append({'compl': compl.id, | ||
1406 | + 'realizations': realizations_ids}) | ||
1407 | + return matching_connections | ||
1408 | + | ||
1390 | def __unicode__(self): | 1409 | def __unicode__(self): |
1391 | return self.name | 1410 | return self.name |
1392 | 1411 |
dictionary/saving.py
0 → 100644
1 | +# -*- coding: utf-8 -*- | ||
2 | + | ||
3 | +from common.js_to_obj import jsPosToObj | ||
4 | +from dictionary.models import Argument | ||
5 | +from semantics.models import Complement, LexicalUnitExamples | ||
6 | +from semantics.saving import modify_frames, update_meanings | ||
7 | +from wordnet.models import LexicalUnit | ||
8 | + | ||
9 | +def get_semantic_operations(lemma, schemata_conversions): | ||
10 | + connections = [] | ||
11 | + operations = [] | ||
12 | + frames = lemma.entry_obj.actual_frames() | ||
13 | + for conv in schemata_conversions: | ||
14 | + schema_operations = get_reconnect_operations_and_extend_connections(frames, | ||
15 | + connections, | ||
16 | + conv['obj'], | ||
17 | + conv['js']) | ||
18 | + operations.extend(schema_operations) | ||
19 | + operations.extend(get_disconnect_operations(frames, connections)) | ||
20 | + return operations | ||
21 | + | ||
22 | +def get_reconnect_operations_and_extend_connections(frames, connections, schema, js_schema): | ||
23 | + operations = [] | ||
24 | + used_poss_ids = [] | ||
25 | + for js_position in js_schema['positions']: | ||
26 | + if len(js_position['arguments']) > 0: | ||
27 | + position = get_position(schema, js_position, used_poss_ids) | ||
28 | + for js_phrase_type in js_position['arguments']: | ||
29 | + phrase_type = Argument.objects.get(text_rep=js_phrase_type['text_rep']) | ||
30 | + new_connection_target = {'schema': schema, | ||
31 | + 'position': position, | ||
32 | + 'phrase_type': phrase_type} | ||
33 | + for conn in js_phrase_type['connections']: | ||
34 | + operations.extend(reconnect_operations(frames, conn, new_connection_target)) | ||
35 | + conn_dict = next((conn_dict | ||
36 | + for conn_dict in connections if conn_dict['compl'] == conn['compl']), None) | ||
37 | + if conn_dict: | ||
38 | + conn_dict['realizations'].extend(conn['realizations']) | ||
39 | + else: | ||
40 | + connections.append({'compl': conn['compl'], | ||
41 | + 'realizations': conn['realizations']}) | ||
42 | + return operations | ||
43 | + | ||
44 | +def get_position(schema, js_position, used_poss_ids): | ||
45 | + position = jsPosToObj(js_position) | ||
46 | + same_poss = schema.positions.filter(text_rep=position.text_rep) | ||
47 | + unused_same_poss = same_poss.exclude(id__in=used_poss_ids).order_by('id') | ||
48 | + position = unused_same_poss[0] | ||
49 | + used_poss_ids.append(position.id) | ||
50 | + return position | ||
51 | + | ||
52 | +def reconnect_operations(frames, connection, new_target): | ||
53 | + operations = [] | ||
54 | + compl = Complement.objects.get(id=connection['compl']) | ||
55 | + frame = frames.get(complements=compl) | ||
56 | + arg_ref = create_argument_ref(frame, compl) | ||
57 | + for real_id in connection['realizations']: | ||
58 | + realization = compl.realizations.get(id=real_id) | ||
59 | + old_phrase_type_ref = create_phrase_type_ref(realization.frame, realization.position, | ||
60 | + realization.argument, realization.alternation) | ||
61 | + new_phrase_type_ref = create_phrase_type_ref(new_target['schema'], new_target['position'], | ||
62 | + new_target['phrase_type'], realization.alternation) | ||
63 | + if new_phrase_type_ref != old_phrase_type_ref: | ||
64 | + operations.append(create_operation('disconnect', arg_ref, old_phrase_type_ref)) | ||
65 | + operations.append(create_operation('connect', arg_ref, new_phrase_type_ref)) | ||
66 | + return operations | ||
67 | + | ||
68 | +def create_argument_ref(frame, complement): | ||
69 | + return 'frame_%d_comp_%d_' % (frame.id, complement.id) | ||
70 | + | ||
71 | +def create_phrase_type_ref(schema, position, phrase_type, alternation): | ||
72 | + return 'schema_%d_pos_%d_arg_%d_alt_%d_' % (schema.id, position.id, | ||
73 | + phrase_type.id, alternation) | ||
74 | + | ||
75 | +def create_operation(operation, arg_ref, phrase_type_ref): | ||
76 | + return {'operation': operation, 'arg': arg_ref, 'connect': phrase_type_ref} | ||
77 | + | ||
78 | +def get_disconnect_operations(frames, connections): | ||
79 | + operations = [] | ||
80 | + for frame in frames: | ||
81 | + for compl in frame.complements.all(): | ||
82 | + conn_dict = next((conn_dict | ||
83 | + for conn_dict in connections if conn_dict['compl'] == compl.id), None) | ||
84 | + for real in compl.realizations.all(): | ||
85 | + if not conn_dict or not real.id in conn_dict['realizations']: | ||
86 | + phrase_type_ref = create_phrase_type_ref(real.frame, real.position, | ||
87 | + real.argument, real.alternation) | ||
88 | + arg_ref = create_argument_ref(frame, compl) | ||
89 | + operations.append(create_operation('disconnect', arg_ref, phrase_type_ref)) | ||
90 | + return operations | ||
91 | + | ||
92 | +def update_connections(lemma_id, reconnect_operations, user): | ||
93 | + modify_frames(lemma_id, reconnect_operations, user) | ||
94 | + | ||
95 | +def disconnect_all_examples_operations(lemma): | ||
96 | + operations = [] | ||
97 | + lex_units = lemma.entry_obj.lexical_units().all() | ||
98 | + for lu in lex_units: | ||
99 | + lu_examples = LexicalUnitExamples.objects.filter(lexical_unit=lu) | ||
100 | + for lu_ex in lu_examples: | ||
101 | + example = lu_ex.example | ||
102 | + operations.append({'operation': 'remove_example', | ||
103 | + 'unit': lu.id, | ||
104 | + 'example': example.id}) | ||
105 | + return operations | ||
106 | + | ||
107 | +def connect_example_operation(example_dict, example_obj): | ||
108 | + lu = LexicalUnit.objects.get(id=example_dict['lexical_unit']) | ||
109 | + return {'operation': 'add_example', 'unit': lu.id, 'example': example_obj.id} | ||
110 | + | ||
111 | +def disconnect_example_operation(example_dict, example_obj): | ||
112 | + lu = LexicalUnit.objects.get(id=example_dict['lexical_unit']) | ||
113 | + return {'operation': 'remove_example', 'unit': lu.id, 'example': example_obj.id} | ||
114 | + | ||
115 | +def reconnect_examples(operations): | ||
116 | + update_meanings(operations) | ||
117 | + | ||
0 | \ No newline at end of file | 118 | \ No newline at end of file |
dictionary/static/js/argument_form_utils.js
@@ -11,13 +11,14 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | @@ -11,13 +11,14 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||
11 | */ | 11 | */ |
12 | 12 | ||
13 | // argument class | 13 | // argument class |
14 | -function argument(id, text_rep, type) | 14 | +function argument(id, text_rep, type, connections) |
15 | { | 15 | { |
16 | this.id = id | 16 | this.id = id |
17 | this.text_rep = text_rep; | 17 | this.text_rep = text_rep; |
18 | this.type = type; | 18 | this.type = type; |
19 | this.error = false; | 19 | this.error = false; |
20 | this.tooltip = ''; | 20 | this.tooltip = ''; |
21 | + this.connections = connections; | ||
21 | } | 22 | } |
22 | 23 | ||
23 | function arguments_form_change(lastActualValueIdx, arg_id, this_form, lemma_id) { | 24 | function arguments_form_change(lastActualValueIdx, arg_id, this_form, lemma_id) { |
@@ -160,7 +161,7 @@ function argument_form_submit() { | @@ -160,7 +161,7 @@ function argument_form_submit() { | ||
160 | }, | 161 | }, |
161 | 162 | ||
162 | callback: function(result) { | 163 | callback: function(result) { |
163 | - var arg = new argument(result["id"], result["text_rep"], result["type"]); | 164 | + var arg = new argument(result["id"], result["text_rep"], result["type"], []); |
164 | 165 | ||
165 | // dodawanie argumentow | 166 | // dodawanie argumentow |
166 | if(this_dialog.dialog( "option" , "title").startsWith("Dodawanie")) | 167 | if(this_dialog.dialog( "option" , "title").startsWith("Dodawanie")) |
dictionary/static/js/lemma-view.js
@@ -75,6 +75,15 @@ var nkjp_source_tab = ax_nkjp_source_vals; | @@ -75,6 +75,15 @@ var nkjp_source_tab = ax_nkjp_source_vals; | ||
75 | function alertUserNotAuthenticated() { | 75 | function alertUserNotAuthenticated() { |
76 | error_alert('Przed wykonaniem działania odśwież okno przeglądarki, a następnie zaloguj się ponownie do narzędzia.'); | 76 | error_alert('Przed wykonaniem działania odśwież okno przeglądarki, a następnie zaloguj się ponownie do narzędzia.'); |
77 | } | 77 | } |
78 | + | ||
79 | +function resetLemmaVersions() { | ||
80 | + window.frames_modif = new Array(); | ||
81 | + window.frames_modif_idx = 0; | ||
82 | + var lemma_version = new Lemma_Version(window.schemas, | ||
83 | + window.nkjp_examples, | ||
84 | + window.nkjp_lemma_examples); | ||
85 | + frames_modif.push(lemma_version); | ||
86 | +} | ||
78 | 87 | ||
79 | function initiateFrameFilters() | 88 | function initiateFrameFilters() |
80 | { | 89 | { |
@@ -437,7 +446,7 @@ function load_content(id) { | @@ -437,7 +446,7 @@ function load_content(id) { | ||
437 | window.notesNotSaved = false; | 446 | window.notesNotSaved = false; |
438 | window.lemmaExNotSaved = false; | 447 | window.lemmaExNotSaved = false; |
439 | 448 | ||
440 | - $('#new_frames').load(ajax_new_frames, 'id='+id, function(){ | 449 | + $('#new_frames').load(ajax_new_frames, 'id='+id, function(){ |
441 | window.lemma_id = id; | 450 | window.lemma_id = id; |
442 | createSplitter('framesSplit','new-frame-tables', 'tabs'); | 451 | createSplitter('framesSplit','new-frame-tables', 'tabs'); |
443 | if(window.can_modify) | 452 | if(window.can_modify) |
@@ -578,9 +587,10 @@ function Nkjp_example(example_id, frame_id, arguments_ids, sentence, source, opi | @@ -578,9 +587,10 @@ function Nkjp_example(example_id, frame_id, arguments_ids, sentence, source, opi | ||
578 | this.opinion = opinion; | 587 | this.opinion = opinion; |
579 | this.comment = comment; | 588 | this.comment = comment; |
580 | this.semantic = semantic; | 589 | this.semantic = semantic; |
590 | + this.lexical_unit = -1; | ||
581 | } | 591 | } |
582 | 592 | ||
583 | -function Nkjp_example_ajax(frame, arg_selections, sentence, source, opinion, comment, semantic) | 593 | +function Nkjp_example_ajax(frame, arg_selections, sentence, source, opinion, comment, semantic, lexical_unit) |
584 | { | 594 | { |
585 | this.frame = frame; | 595 | this.frame = frame; |
586 | this.arg_selections = arg_selections; | 596 | this.arg_selections = arg_selections; |
@@ -589,6 +599,7 @@ function Nkjp_example_ajax(frame, arg_selections, sentence, source, opinion, com | @@ -589,6 +599,7 @@ function Nkjp_example_ajax(frame, arg_selections, sentence, source, opinion, com | ||
589 | this.opinion = opinion; | 599 | this.opinion = opinion; |
590 | this.comment = comment; | 600 | this.comment = comment; |
591 | this.semantic = semantic; | 601 | this.semantic = semantic; |
602 | + this.lexical_unit = lexical_unit; | ||
592 | } | 603 | } |
593 | 604 | ||
594 | function Nkjp_ArgSelection(position, arguments) | 605 | function Nkjp_ArgSelection(position, arguments) |
@@ -629,7 +640,7 @@ function frameToTableRows(frame) | @@ -629,7 +640,7 @@ function frameToTableRows(frame) | ||
629 | arguments_row.push(frame.positions[i].arguments[arg_number]); | 640 | arguments_row.push(frame.positions[i].arguments[arg_number]); |
630 | else | 641 | else |
631 | { | 642 | { |
632 | - arguments_row.push(new argument(new_elem_id, '', '')); | 643 | + arguments_row.push(new argument(new_elem_id, '', '', [])); |
633 | new_elem_id--; | 644 | new_elem_id--; |
634 | } | 645 | } |
635 | } | 646 | } |
@@ -866,8 +877,7 @@ function needConfirmation(nkjpInstance) { | @@ -866,8 +877,7 @@ function needConfirmation(nkjpInstance) { | ||
866 | function unpin_nkjp_example(example_tabId) | 877 | function unpin_nkjp_example(example_tabId) |
867 | { | 878 | { |
868 | if(example_tabId != -1 && | 879 | if(example_tabId != -1 && |
869 | - !checkIfSemChangedAndAlert() && | ||
870 | - !exampleGotAssignedSemantics(example_tabId)) | 880 | + !checkIfSemChangedAndAlert())// && !exampleGotAssignedSemantics(example_tabId)) |
871 | { | 881 | { |
872 | example_id = example_tabId.replace('nkjp_', ''); | 882 | example_id = example_tabId.replace('nkjp_', ''); |
873 | for(var i=0; i<window.nkjp_examples.length; i++) | 883 | for(var i=0; i<window.nkjp_examples.length; i++) |
@@ -992,60 +1002,6 @@ function getNkjpExampleInstance(nkjp_examples, example_id) | @@ -992,60 +1002,6 @@ function getNkjpExampleInstance(nkjp_examples, example_id) | ||
992 | return ''; | 1002 | return ''; |
993 | } | 1003 | } |
994 | 1004 | ||
995 | -//////////////////////// semantics ////////////////////////////// | ||
996 | - | ||
997 | -function schemaGotAssignedSemantics(element_id) | ||
998 | -{ | ||
999 | - var semanticsAssigned = true; | ||
1000 | - var id_map = parseId(element_id); | ||
1001 | - var schema_id = id_map['frame_id']; | ||
1002 | - if(schema_id < 0) { | ||
1003 | - semanticsAssigned = false; | ||
1004 | - } | ||
1005 | - else { | ||
1006 | - jQuery.ajax({ | ||
1007 | - type: 'get', | ||
1008 | - url: ajax_schema_got_assigned_semantics, | ||
1009 | - data: {lemma_id: window.lemma_id, | ||
1010 | - schema_id: schema_id}, | ||
1011 | - success: function(result) { | ||
1012 | - semanticsAssigned = result['got_assigned_semantics']; | ||
1013 | - }, | ||
1014 | - async: false | ||
1015 | - }); | ||
1016 | - } | ||
1017 | - if(semanticsAssigned) { | ||
1018 | - error_alert('Nie można zmodyfikować. Element jest wykorzystywany w ramkach semantycznych.'); | ||
1019 | - } | ||
1020 | - return semanticsAssigned; | ||
1021 | -} | ||
1022 | - | ||
1023 | -function exampleGotAssignedSemantics(example_tab_id) | ||
1024 | -{ | ||
1025 | - var semanticsAssigned = true; | ||
1026 | - var example_id = example_tab_id.replace('nkjp_', ''); | ||
1027 | - if (example_id < 0) { | ||
1028 | - semanticsAssigned = false; | ||
1029 | - } | ||
1030 | - else { | ||
1031 | - jQuery.ajax({ | ||
1032 | - type: 'get', | ||
1033 | - url: ajax_example_got_assigned_semantics, | ||
1034 | - data: {lemma_id: window.lemma_id, | ||
1035 | - example_id: example_id}, | ||
1036 | - success: function(result) { | ||
1037 | - semanticsAssigned = result['got_assigned_semantics']; | ||
1038 | - }, | ||
1039 | - async: false | ||
1040 | - }); | ||
1041 | - } | ||
1042 | - if(semanticsAssigned) { | ||
1043 | - error_alert('Nie można zmodyfikować. Przykład jest wykorzystywany w ramkach semantycznych.'); | ||
1044 | - } | ||
1045 | - return semanticsAssigned; | ||
1046 | -} | ||
1047 | -////////////////////////////////////////////////////// | ||
1048 | - | ||
1049 | function getNkjpLemmaExampleInstance(nkjp_examples, example_id) | 1005 | function getNkjpLemmaExampleInstance(nkjp_examples, example_id) |
1050 | { | 1006 | { |
1051 | var example_id = example_id.replace('nkjpLemma_', ''); | 1007 | var example_id = example_id.replace('nkjpLemma_', ''); |
@@ -1058,7 +1014,7 @@ function getNkjpLemmaExampleInstance(nkjp_examples, example_id) | @@ -1058,7 +1014,7 @@ function getNkjpLemmaExampleInstance(nkjp_examples, example_id) | ||
1058 | } | 1014 | } |
1059 | 1015 | ||
1060 | function remove_semantic_example(example_id) { | 1016 | function remove_semantic_example(example_id) { |
1061 | - if(example_id != -1 && !checkIfSemChangedAndAlert() && !exampleGotAssignedSemantics(example_id)) | 1017 | + if(example_id != -1 && !checkIfSemChangedAndAlert())// && !exampleGotAssignedSemantics(example_id)) |
1062 | { | 1018 | { |
1063 | example_id = example_id.replace('nkjp_', ''); | 1019 | example_id = example_id.replace('nkjp_', ''); |
1064 | for(var i=0; i<nkjp_examples.length; i++) | 1020 | for(var i=0; i<nkjp_examples.length; i++) |
@@ -1421,7 +1377,7 @@ function add_pos_form_submit() { | @@ -1421,7 +1377,7 @@ function add_pos_form_submit() { | ||
1421 | var arguments = new Array(); | 1377 | var arguments = new Array(); |
1422 | for(var i=0; i<argsObj.length; i++) | 1378 | for(var i=0; i<argsObj.length; i++) |
1423 | { | 1379 | { |
1424 | - arguments.push(new argument(argsObj[i].pk, argsObj[i].fields.text_rep, argsObj[i].fields.type)); | 1380 | + arguments.push(new argument(argsObj[i].pk, argsObj[i].fields.text_rep, argsObj[i].fields.type, [])); |
1425 | } | 1381 | } |
1426 | 1382 | ||
1427 | var cats = new Array(); | 1383 | var cats = new Array(); |
@@ -1570,7 +1526,11 @@ function can_add_position_category(lemma_id) { | @@ -1570,7 +1526,11 @@ function can_add_position_category(lemma_id) { | ||
1570 | } | 1526 | } |
1571 | 1527 | ||
1572 | function openEditForm(id) { | 1528 | function openEditForm(id) { |
1573 | - if(window.can_modify && !checkIfSemChangedAndAlert() && !schemaGotAssignedSemantics(id)) { | 1529 | + if(window.can_modify && !checkIfSemChangedAndAlert()) { |
1530 | + /*if(schemaGotAssignedSemantics(id)) { | ||
1531 | + semanticsAssignedAlert(); | ||
1532 | + }*/ | ||
1533 | + | ||
1574 | editedFrameInstance = getFrameInstance(id, window.schemas); | 1534 | editedFrameInstance = getFrameInstance(id, window.schemas); |
1575 | elemInstance = getElementInstance(id, window.schemas); | 1535 | elemInstance = getElementInstance(id, window.schemas); |
1576 | addSyntacticFramesPerm = user_has_perm('dictionary.add_syntactic_frames'); | 1536 | addSyntacticFramesPerm = user_has_perm('dictionary.add_syntactic_frames'); |
@@ -1699,7 +1659,7 @@ function convertExample(nkjp_example) | @@ -1699,7 +1659,7 @@ function convertExample(nkjp_example) | ||
1699 | var convertedExample = new Nkjp_example_ajax(frame['element'], argument_selections, | 1659 | var convertedExample = new Nkjp_example_ajax(frame['element'], argument_selections, |
1700 | nkjp_example.sentence, nkjp_example.source, | 1660 | nkjp_example.sentence, nkjp_example.source, |
1701 | nkjp_example.opinion, nkjp_example.comment, | 1661 | nkjp_example.opinion, nkjp_example.comment, |
1702 | - nkjp_example.semantic); | 1662 | + nkjp_example.semantic, nkjp_example.lexical_unit); |
1703 | 1663 | ||
1704 | return convertedExample; | 1664 | return convertedExample; |
1705 | } | 1665 | } |
@@ -1790,7 +1750,7 @@ function save_new_frames() { | @@ -1790,7 +1750,7 @@ function save_new_frames() { | ||
1790 | data: data, | 1750 | data: data, |
1791 | id: lemma_id, | 1751 | id: lemma_id, |
1792 | examples: examples_data, | 1752 | examples: examples_data, |
1793 | - lemma_examples: lemma_examples_data | 1753 | + lemma_examples: lemma_examples_data, |
1794 | }, | 1754 | }, |
1795 | 1755 | ||
1796 | callback: function(result) { | 1756 | callback: function(result) { |
@@ -1954,8 +1914,7 @@ function frame_form_submit() { | @@ -1954,8 +1914,7 @@ function frame_form_submit() { | ||
1954 | } | 1914 | } |
1955 | }); | 1915 | }); |
1956 | 1916 | ||
1957 | - if(window.addedFrame) | ||
1958 | - { | 1917 | + if(window.addedFrame) { |
1959 | frame = JSON.stringify(window.addedFrame); | 1918 | frame = JSON.stringify(window.addedFrame); |
1960 | } | 1919 | } |
1961 | else if(propose_phraseology) { | 1920 | else if(propose_phraseology) { |
@@ -2003,9 +1962,8 @@ function frame_form_submit() { | @@ -2003,9 +1962,8 @@ function frame_form_submit() { | ||
2003 | 1962 | ||
2004 | callback: function(result) { | 1963 | callback: function(result) { |
2005 | edited_frame_id = null; | 1964 | edited_frame_id = null; |
2006 | - old_edited_frame_id = ''; | ||
2007 | - if(window.addedFrame) | ||
2008 | - { | 1965 | + old_edited_frame_id = ''; |
1966 | + if(window.addedFrame) { | ||
2009 | edited_frame = $.evalJSON($.toJSON(window.addedFrame)); | 1967 | edited_frame = $.evalJSON($.toJSON(window.addedFrame)); |
2010 | edited_frame = serializedObjToObj(result['frame']); | 1968 | edited_frame = serializedObjToObj(result['frame']); |
2011 | edited_frame.id = window.addedFrame.id; | 1969 | edited_frame.id = window.addedFrame.id; |
@@ -2041,10 +1999,11 @@ function frame_form_submit() { | @@ -2041,10 +1999,11 @@ function frame_form_submit() { | ||
2041 | } | 1999 | } |
2042 | else { | 2000 | else { |
2043 | edited_frame = getElementInstance(edited_id, schemas); | 2001 | edited_frame = getElementInstance(edited_id, schemas); |
2044 | - old_edited_frame_id = edited_frame['element'].id; | ||
2045 | - edited_frame['element'].id = new_elem_id; | ||
2046 | - edited_frame_id = new_elem_id; | ||
2047 | - new_elem_id--; | 2002 | + var old_edited_frame_id = edited_frame['element'].id; |
2003 | + //edited_frame['element'].id = new_elem_id; tuta zmienilem | ||
2004 | + edited_frame['element'].id = result['id']; | ||
2005 | + edited_frame_id = edited_frame['element'].id; | ||
2006 | + //new_elem_id--; | ||
2048 | edited_frame['element'].text_rep = result['text_rep']; | 2007 | edited_frame['element'].text_rep = result['text_rep']; |
2049 | edited_frame['element'].characteristics = result['characteristics']; | 2008 | edited_frame['element'].characteristics = result['characteristics']; |
2050 | edited_frame['element'].opinion = result['opinion']; | 2009 | edited_frame['element'].opinion = result['opinion']; |
@@ -2071,7 +2030,12 @@ function frame_form_submit() { | @@ -2071,7 +2030,12 @@ function frame_form_submit() { | ||
2071 | HideProgressAnimation(); | 2030 | HideProgressAnimation(); |
2072 | error_alert('Wypełnij wszystkie niezbędne pola formularza.'); | 2031 | error_alert('Wypełnij wszystkie niezbędne pola formularza.'); |
2073 | return false; | 2032 | return false; |
2074 | - } | 2033 | + } |
2034 | + else if (result == 'data error') { | ||
2035 | + HideProgressAnimation(); | ||
2036 | + error_alert('Brakuje danych do stworzenia schematu.'); | ||
2037 | + return false; | ||
2038 | + } | ||
2075 | else | 2039 | else |
2076 | { | 2040 | { |
2077 | HideProgressAnimation(); | 2041 | HideProgressAnimation(); |
@@ -3687,6 +3651,7 @@ function restore_lemma() { | @@ -3687,6 +3651,7 @@ function restore_lemma() { | ||
3687 | to_copy_elem['type'] == 'frame') | 3651 | to_copy_elem['type'] == 'frame') |
3688 | { | 3652 | { |
3689 | var frame = $.evalJSON($.toJSON(to_copy_elem['element'])); | 3653 | var frame = $.evalJSON($.toJSON(to_copy_elem['element'])); |
3654 | + clearSemanticConnections(to_copy_elem['type'], frame); | ||
3690 | // kopiowanie schematu z podgladu (moze wymagac konwersji) | 3655 | // kopiowanie schematu z podgladu (moze wymagac konwersji) |
3691 | if(elem_in_bucket['lemma_id'] && | 3656 | if(elem_in_bucket['lemma_id'] && |
3692 | need_conversion && can_be_converted && | 3657 | need_conversion && can_be_converted && |
@@ -3711,6 +3676,7 @@ function restore_lemma() { | @@ -3711,6 +3676,7 @@ function restore_lemma() { | ||
3711 | to_copy_elem['type'] == 'argument' && !need_conversion) | 3676 | to_copy_elem['type'] == 'argument' && !need_conversion) |
3712 | { | 3677 | { |
3713 | var argument = $.evalJSON($.toJSON(to_copy_elem['element'])); | 3678 | var argument = $.evalJSON($.toJSON(to_copy_elem['element'])); |
3679 | + clearSemanticConnections(to_copy_elem['type'], argument); | ||
3714 | argument.id = new_elem_id; | 3680 | argument.id = new_elem_id; |
3715 | new_elem_id--; | 3681 | new_elem_id--; |
3716 | target_elem['element'].arguments.push(argument); | 3682 | target_elem['element'].arguments.push(argument); |
@@ -3721,6 +3687,7 @@ function restore_lemma() { | @@ -3721,6 +3687,7 @@ function restore_lemma() { | ||
3721 | to_copy_elem['type'] == 'position' && !need_conversion) | 3687 | to_copy_elem['type'] == 'position' && !need_conversion) |
3722 | { | 3688 | { |
3723 | var position = $.evalJSON($.toJSON(to_copy_elem['element'])); | 3689 | var position = $.evalJSON($.toJSON(to_copy_elem['element'])); |
3690 | + clearSemanticConnections(to_copy_elem['type'], position); | ||
3724 | position.id = new_elem_id; | 3691 | position.id = new_elem_id; |
3725 | new_elem_id--; | 3692 | new_elem_id--; |
3726 | target_elem['element'].positions.push(position); | 3693 | target_elem['element'].positions.push(position); |
@@ -3813,8 +3780,12 @@ function restore_lemma() { | @@ -3813,8 +3780,12 @@ function restore_lemma() { | ||
3813 | if(window.selected_id != -1) { | 3780 | if(window.selected_id != -1) { |
3814 | var assignedExamples = []; | 3781 | var assignedExamples = []; |
3815 | if(canModifyFrame(window.selected_id, window.schemas) && | 3782 | if(canModifyFrame(window.selected_id, window.schemas) && |
3816 | - !checkIfSemChangedAndAlert() && | ||
3817 | - !schemaGotAssignedSemantics(window.selected_id)) { | 3783 | + !checkIfSemChangedAndAlert()) { |
3784 | + | ||
3785 | + /*if(schemaGotAssignedSemantics(window.selected_id)) { | ||
3786 | + semanticsAssignedAlert(); | ||
3787 | + }*/ | ||
3788 | + | ||
3818 | assignedExamples = gotAssignedExample(nkjp_examples, selected_id, true); | 3789 | assignedExamples = gotAssignedExample(nkjp_examples, selected_id, true); |
3819 | if(assignedExamples.length == 0) { | 3790 | if(assignedExamples.length == 0) { |
3820 | schemas = removeFrameElement(selected_id, schemas); | 3791 | schemas = removeFrameElement(selected_id, schemas); |
@@ -3829,8 +3800,10 @@ function restore_lemma() { | @@ -3829,8 +3800,10 @@ function restore_lemma() { | ||
3829 | 3800 | ||
3830 | function addElement() { | 3801 | function addElement() { |
3831 | if(!checkIfSemChangedAndAlert() && | 3802 | if(!checkIfSemChangedAndAlert() && |
3832 | - (window.selected_id == -1 || (canModifyFrame(window.selected_id, window.schemas) && | ||
3833 | - !schemaGotAssignedSemantics(window.selected_id)))) { | 3803 | + (window.selected_id == -1 || canModifyFrame(window.selected_id, window.schemas))) { |
3804 | + /*if(schemaGotAssignedSemantics(window.selected_id)) { | ||
3805 | + semanticsAssignedAlert(); | ||
3806 | + }*/ | ||
3834 | window.schemas = addFrameElementDialog(window.selected_id, window.schemas); | 3807 | window.schemas = addFrameElementDialog(window.selected_id, window.schemas); |
3835 | } | 3808 | } |
3836 | } | 3809 | } |
@@ -3967,8 +3940,11 @@ function restore_lemma() { | @@ -3967,8 +3940,11 @@ function restore_lemma() { | ||
3967 | { | 3940 | { |
3968 | if(window.elem_in_bucket && !checkIfSemChangedAndAlert() && | 3941 | if(window.elem_in_bucket && !checkIfSemChangedAndAlert() && |
3969 | (window.selected_id == -1 || | 3942 | (window.selected_id == -1 || |
3970 | - (canModifyFrame(window.selected_id, window.schemas) && | ||
3971 | - !schemaGotAssignedSemantics(window.selected_id)))) { | 3943 | + canModifyFrame(window.selected_id, window.schemas))) { |
3944 | + | ||
3945 | + /*if(schemaGotAssignedSemantics(window.selected_id)) { | ||
3946 | + semanticsAssignedAlert(); | ||
3947 | + }*/ | ||
3972 | pasteFrameElement(selected_id, elem_in_bucket, schemas); | 3948 | pasteFrameElement(selected_id, elem_in_bucket, schemas); |
3973 | } | 3949 | } |
3974 | } | 3950 | } |
@@ -3999,9 +3975,17 @@ function restore_lemma() { | @@ -3999,9 +3975,17 @@ function restore_lemma() { | ||
3999 | canModifyFrame(window.selected_id, window.schemas) && | 3975 | canModifyFrame(window.selected_id, window.schemas) && |
4000 | !checkIfSemChangedAndAlert()) | 3976 | !checkIfSemChangedAndAlert()) |
4001 | { | 3977 | { |
3978 | + /*if(getElementInstance(selected_id, schemas)['type'] != 'frame' && | ||
3979 | + schemaGotAssignedSemantics(selected_id)) { | ||
3980 | + semanticsAssignedAlert(); | ||
3981 | + return; | ||
3982 | + }*/ | ||
3983 | + | ||
4002 | elem_in_bucket = getElementInstance(selected_id, schemas); | 3984 | elem_in_bucket = getElementInstance(selected_id, schemas); |
3985 | + | ||
4003 | var parent_elem = getParentInstance(selected_id, schemas); | 3986 | var parent_elem = getParentInstance(selected_id, schemas); |
4004 | var duplicate = $.evalJSON($.toJSON(elem_in_bucket['element'])); | 3987 | var duplicate = $.evalJSON($.toJSON(elem_in_bucket['element'])); |
3988 | + clearSemanticConnections(elem_in_bucket['type'], duplicate); | ||
4005 | duplicate.id = new_elem_id; | 3989 | duplicate.id = new_elem_id; |
4006 | new_elem_id--; | 3990 | new_elem_id--; |
4007 | 3991 | ||
@@ -4040,6 +4024,7 @@ function restore_lemma() { | @@ -4040,6 +4024,7 @@ function restore_lemma() { | ||
4040 | && !schema['element'].is_phraseologic | 4024 | && !schema['element'].is_phraseologic |
4041 | && user_has_perm('dictionary.add_phraseologic_frames')) { | 4025 | && user_has_perm('dictionary.add_phraseologic_frames')) { |
4042 | var duplicate = $.evalJSON($.toJSON(schema['element'])); | 4026 | var duplicate = $.evalJSON($.toJSON(schema['element'])); |
4027 | + clearSemanticConnections(schema['type'], duplicate); | ||
4043 | duplicate.id = new_elem_id; | 4028 | duplicate.id = new_elem_id; |
4044 | new_elem_id--; | 4029 | new_elem_id--; |
4045 | duplicate.is_phraseologic = true; | 4030 | duplicate.is_phraseologic = true; |
@@ -4108,7 +4093,7 @@ function restore_lemma() { | @@ -4108,7 +4093,7 @@ function restore_lemma() { | ||
4108 | 4093 | ||
4109 | function delete_nkjp_example(example_id) | 4094 | function delete_nkjp_example(example_id) |
4110 | { | 4095 | { |
4111 | - if(example_id != -1 && !checkIfSemChangedAndAlert() && !exampleGotAssignedSemantics(example_id)) | 4096 | + if(example_id != -1 && !checkIfSemChangedAndAlert())// && !exampleGotAssignedSemantics(example_id)) |
4112 | { | 4097 | { |
4113 | example_id = selected_example_id.replace('nkjp_', ''); | 4098 | example_id = selected_example_id.replace('nkjp_', ''); |
4114 | for(var i=0; i<nkjp_examples.length; i++) | 4099 | for(var i=0; i<nkjp_examples.length; i++) |
@@ -4143,8 +4128,8 @@ function restore_lemma() { | @@ -4143,8 +4128,8 @@ function restore_lemma() { | ||
4143 | function delete_all_nkjp_examples(frame_id) | 4128 | function delete_all_nkjp_examples(frame_id) |
4144 | { | 4129 | { |
4145 | if(canModifyFrame(frame_id, window.schemas) && | 4130 | if(canModifyFrame(frame_id, window.schemas) && |
4146 | - !checkIfSemChangedAndAlert() && | ||
4147 | - !schemaGotAssignedSemantics(frame_id)) { | 4131 | + !checkIfSemChangedAndAlert())// && !schemaGotAssignedSemantics(frame_id)) |
4132 | + { | ||
4148 | var new_example_tab = new Array(); | 4133 | var new_example_tab = new Array(); |
4149 | for(var i=0; i<nkjp_examples.length; i++) | 4134 | for(var i=0; i<nkjp_examples.length; i++) |
4150 | { | 4135 | { |
@@ -4202,7 +4187,7 @@ function restore_lemma() { | @@ -4202,7 +4187,7 @@ function restore_lemma() { | ||
4202 | 4187 | ||
4203 | function modify_nkjp_example(example_id) | 4188 | function modify_nkjp_example(example_id) |
4204 | { | 4189 | { |
4205 | - if(example_id != -1 && !checkIfSemChangedAndAlert() && !exampleGotAssignedSemantics(example_id)) | 4190 | + if(example_id != -1 && !checkIfSemChangedAndAlert())// && !exampleGotAssignedSemantics(example_id)) |
4206 | { | 4191 | { |
4207 | var example = ''; | 4192 | var example = ''; |
4208 | for(var i=0; i<window.nkjp_examples.length; i++) | 4193 | for(var i=0; i<window.nkjp_examples.length; i++) |
@@ -5092,21 +5077,6 @@ function gridPreviewContent(isPreview) { | @@ -5092,21 +5077,6 @@ function gridPreviewContent(isPreview) { | ||
5092 | return false; | 5077 | return false; |
5093 | } | 5078 | } |
5094 | 5079 | ||
5095 | -function semanticsChanged() { | ||
5096 | - if(window.frames_operations.length > 0) { | ||
5097 | - return true; | ||
5098 | - } | ||
5099 | - return false; | ||
5100 | -} | ||
5101 | - | ||
5102 | -function checkIfSemChangedAndAlert() { | ||
5103 | - if(semanticsChanged()) { | ||
5104 | - alert('Przed dokonaniem zmiany zapisz semantykę.'); | ||
5105 | - return true; | ||
5106 | - } | ||
5107 | - return false; | ||
5108 | -} | ||
5109 | - | ||
5110 | ///////////////////////////////////// | 5080 | ///////////////////////////////////// |
5111 | 5081 | ||
5112 | $(function(){ | 5082 | $(function(){ |
dictionary/static/js/semantics_coupling.js
0 → 100644
1 | +function schemaGotAssignedSemantics(element_id) { | ||
2 | + var semanticsAssigned = true; | ||
3 | + var id_map = parseId(element_id); | ||
4 | + var schema_id = id_map['frame_id']; | ||
5 | + if(schema_id < 0) { | ||
6 | + semanticsAssigned = false; | ||
7 | + } | ||
8 | + else { | ||
9 | + jQuery.ajax({ | ||
10 | + type: 'get', | ||
11 | + url: ajax_schema_got_assigned_semantics, | ||
12 | + data: {lemma_id: window.lemma_id, | ||
13 | + schema_id: schema_id}, | ||
14 | + success: function(result) { | ||
15 | + semanticsAssigned = result['got_assigned_semantics']; | ||
16 | + }, | ||
17 | + async: false | ||
18 | + }); | ||
19 | + } | ||
20 | + return semanticsAssigned; | ||
21 | +} | ||
22 | + | ||
23 | +function semanticsAssignedAlert() { | ||
24 | + error_alert('Działaj rozważnie, element jest wykorzystywany w ramach semantycznych.'); | ||
25 | +} | ||
26 | + | ||
27 | +function exampleGotAssignedSemantics(example_tab_id) | ||
28 | +{ | ||
29 | + var semanticsAssigned = true; | ||
30 | + var example_id = example_tab_id.replace('nkjp_', ''); | ||
31 | + if (example_id < 0) { | ||
32 | + semanticsAssigned = false; | ||
33 | + } | ||
34 | + else { | ||
35 | + jQuery.ajax({ | ||
36 | + type: 'get', | ||
37 | + url: ajax_example_got_assigned_semantics, | ||
38 | + data: {lemma_id: window.lemma_id, | ||
39 | + example_id: example_id}, | ||
40 | + success: function(result) { | ||
41 | + semanticsAssigned = result['got_assigned_semantics']; | ||
42 | + }, | ||
43 | + async: false | ||
44 | + }); | ||
45 | + } | ||
46 | + return semanticsAssigned; | ||
47 | +} | ||
48 | + | ||
49 | +function semanticsAssignedExampleAlert() { | ||
50 | + error_alert('Działaj rozważnie, przykład jest wykorzystywany w ramach semantycznych.'); | ||
51 | +} | ||
52 | + | ||
53 | +function semanticsChanged() { | ||
54 | + if(window.frames_operations.length > 0) { | ||
55 | + return true; | ||
56 | + } | ||
57 | + return false; | ||
58 | +} | ||
59 | + | ||
60 | +function checkIfSemChangedAndAlert() { | ||
61 | + if(semanticsChanged()) { | ||
62 | + alert('Przed dokonaniem zmiany zapisz semantykę.'); | ||
63 | + return true; | ||
64 | + } | ||
65 | + return false; | ||
66 | +} | ||
67 | + | ||
68 | +function clearSemanticConnections(type, schemaElement) { | ||
69 | + if(type == 'frame') { | ||
70 | + clearSchemaConnections(schemaElement); | ||
71 | + } | ||
72 | + else if(type == 'position') { | ||
73 | + clearPositionConnections(schemaElement); | ||
74 | + } | ||
75 | + else if(type == 'argument') { | ||
76 | + clearPhraseTypeConnections(schemaElement); | ||
77 | + } | ||
78 | +} | ||
79 | + | ||
80 | +function clearSchemaConnections(schema) { | ||
81 | + for(var i=0; i<schema.positions.length; i++) { | ||
82 | + clearPositionConnections(schema.positions[i]); | ||
83 | + } | ||
84 | +} | ||
85 | + | ||
86 | +function clearPositionConnections(position) { | ||
87 | + for(var i=0; i<position.arguments.length; i++) { | ||
88 | + clearPhraseTypeConnections(position.arguments[i]); | ||
89 | + } | ||
90 | +} | ||
91 | + | ||
92 | +function clearPhraseTypeConnections(phraseType) { | ||
93 | + phraseType.connections = []; | ||
94 | +} | ||
95 | + | ||
96 | +function updateSchemataConnections() { | ||
97 | + $('#new-frame-tables').empty(); | ||
98 | + $("#show_nkjp_table").empty(); | ||
99 | + $.ajaxJSON({ | ||
100 | + method: 'get', | ||
101 | + url: ajax_get_schemata, | ||
102 | + data: { | ||
103 | + lemma_id: window.lemma_id | ||
104 | + }, | ||
105 | + | ||
106 | + callback: function(result) { | ||
107 | + window.schemas = serializedObjToObj(result['schemata']); | ||
108 | + resetLemmaVersions(); | ||
109 | + var frame_class = 'InactiveFrameTable'; | ||
110 | + if(result['can_modify']) { | ||
111 | + frame_class = 'ActiveFrameTable'; | ||
112 | + } | ||
113 | + draw_filtered_frames(window.schemas, 'new-frame-tables', 'new-frame-table', | ||
114 | + 'frame_filter', window.nkjp_examples, frame_class, | ||
115 | + window.lemma_entry, window.lemma_entry); | ||
116 | + }, | ||
117 | + error_callback: function(xhr, status, error) { | ||
118 | + error_alert(status + ': ' + error); | ||
119 | + }, | ||
120 | + bad_data_callback: function(result) { | ||
121 | + return true; | ||
122 | + }, | ||
123 | + }); | ||
124 | +} | ||
125 | + | ||
126 | +function updateExamplesConnections() { | ||
127 | + $('#new-frame-tables').empty(); | ||
128 | + $("#show_nkjp_table").empty(); | ||
129 | + $.ajaxJSON({ | ||
130 | + method: 'get', | ||
131 | + url: ajax_get_examples, | ||
132 | + data: { | ||
133 | + lemma_id: window.lemma_id | ||
134 | + }, | ||
135 | + | ||
136 | + callback: function(result) { | ||
137 | + window.nkjp_examples = serializedNkjpToObj(result['examples']); | ||
138 | + resetLemmaVersions(); | ||
139 | + var frame_class = 'InactiveFrameTable'; | ||
140 | + if(result['can_modify']) { | ||
141 | + frame_class = 'ActiveFrameTable'; | ||
142 | + } | ||
143 | + draw_filtered_frames(window.schemas, 'new-frame-tables', 'new-frame-table', | ||
144 | + 'frame_filter', window.nkjp_examples, frame_class, | ||
145 | + window.lemma_entry, window.lemma_entry); | ||
146 | + }, | ||
147 | + error_callback: function(xhr, status, error) { | ||
148 | + error_alert(status + ': ' + error); | ||
149 | + }, | ||
150 | + bad_data_callback: function(result) { | ||
151 | + return true; | ||
152 | + }, | ||
153 | + }); | ||
154 | +} |
dictionary/templates/lemma_status.html
1 | -<div id="lemma-status"> | ||
2 | - <table class='StatusTable'> | ||
3 | - <tr> | ||
4 | - <td class='ColumnHeader'>Hasło:</td> | ||
5 | - <td>{{lemma.entry}}</td> | ||
6 | - </tr> | ||
7 | - <tr> | ||
8 | - <td class='ColumnHeader'>Właściciel:</td> | ||
9 | - <td> | ||
10 | - {% if lemma.owner %} | ||
11 | - {{lemma.owner.username}} | ||
12 | - {% else %} | ||
13 | - brak | ||
14 | - {% endif %} | ||
15 | - </td> | ||
16 | - </tr> | ||
17 | - <tr> | ||
18 | - <td class='ColumnHeader'>Frazeolog:</td> | ||
19 | - <td> | ||
20 | - {% if lemma.phraseologist %} | ||
21 | - {{lemma.phraseologist.username}} | ||
22 | - {% else %} | ||
23 | - brak | ||
24 | - {% endif %} | ||
25 | - </td> | ||
26 | - </tr> | ||
27 | - <tr> | ||
28 | - <td class='ColumnHeader'>Semantyk:</td> | ||
29 | - <td> | ||
30 | - {% if lemma.semanticist %} | ||
31 | - {{lemma.semanticist.username}} | ||
32 | - {% else %} | ||
33 | - brak | ||
34 | - {% endif %} | ||
35 | - </td> | ||
36 | - </tr> | ||
37 | - <tr> | ||
38 | - <td class='ColumnHeader'>Słownik:</td> | ||
39 | - <td>{{lemma.vocabulary.name}}</td> | ||
40 | - </tr> | ||
41 | - <tr> | ||
42 | - <td class='ColumnHeader'>Status:</td> | ||
43 | - <td>{{lemma.status.status}}</td> | ||
44 | - </tr> | ||
45 | - <tr> | ||
46 | - <td class='ColumnHeader'>Część mowy:</td> | ||
47 | - <td>{{pos.name}}</td> | ||
48 | - </tr> | ||
49 | - </table> | ||
50 | -</div> | ||
51 | -<div id="lemma-status-change"> | ||
52 | - {% if abort_status %} | ||
53 | - <button type="button" id="{{ abort_status.id }}" style="width:120px">Zmień na "{{ abort_status.status }}"</button> | ||
54 | - {% endif %} | ||
55 | - {% for next_status in next_statuses %} | ||
56 | - <button type="button" id="{{ next_status.id }}" style="width:120px">Zmień na "{{ next_status.status }}"</button> | ||
57 | - {% endfor %} | 1 | +<div style="display:flex;"> |
2 | + <div> | ||
3 | + <div id="lemma-status"> | ||
4 | + <table class='StatusTable'> | ||
5 | + <tr> | ||
6 | + <td class='ColumnHeader'>Hasło:</td> | ||
7 | + <td>{{lemma.entry}}</td> | ||
8 | + </tr> | ||
9 | + <tr> | ||
10 | + <td class='ColumnHeader'>Właściciel:</td> | ||
11 | + <td> | ||
12 | + {% if lemma.owner %} | ||
13 | + {{lemma.owner.username}} | ||
14 | + {% else %} | ||
15 | + brak | ||
16 | + {% endif %} | ||
17 | + </td> | ||
18 | + </tr> | ||
19 | + <tr> | ||
20 | + <td class='ColumnHeader'>Frazeolog:</td> | ||
21 | + <td> | ||
22 | + {% if lemma.phraseologist %} | ||
23 | + {{lemma.phraseologist.username}} | ||
24 | + {% else %} | ||
25 | + brak | ||
26 | + {% endif %} | ||
27 | + </td> | ||
28 | + </tr> | ||
29 | + <tr> | ||
30 | + <td class='ColumnHeader'>Semantyk:</td> | ||
31 | + <td> | ||
32 | + {% if lemma.semanticist %} | ||
33 | + {{lemma.semanticist.username}} | ||
34 | + {% else %} | ||
35 | + brak | ||
36 | + {% endif %} | ||
37 | + </td> | ||
38 | + </tr> | ||
39 | + <tr> | ||
40 | + <td class='ColumnHeader'>Słownik:</td> | ||
41 | + <td>{{lemma.vocabulary.name}}</td> | ||
42 | + </tr> | ||
43 | + <tr> | ||
44 | + <td class='ColumnHeader'>Status:</td> | ||
45 | + <td>{{lemma.status.status}}</td> | ||
46 | + </tr> | ||
47 | + <tr> | ||
48 | + <td class='ColumnHeader'>Część mowy:</td> | ||
49 | + <td>{{pos.name}}</td> | ||
50 | + </tr> | ||
51 | + </table> | ||
52 | + </div> | ||
53 | + <div id="lemma-status-change"> | ||
54 | + {% if abort_status %} | ||
55 | + <button type="button" id="{{ abort_status.id }}" style="width:120px">Zmień na "{{ abort_status.status }}"</button> | ||
56 | + {% endif %} | ||
57 | + {% for next_status in next_statuses %} | ||
58 | + <button type="button" id="{{ next_status.id }}" style="width:120px">Zmień na "{{ next_status.status }}"</button> | ||
59 | + {% endfor %} | ||
60 | + </div> | ||
61 | + </div> | ||
62 | + {% if perms.dictionary.view_status_changes and status_changes %} | ||
63 | + <div class="status-changes"> | ||
64 | + <table class='ChangeControlTable' style="margin:15px;"> | ||
65 | + <tr> | ||
66 | + <td class='ColumnHeader'>Czas zmiany:</td> | ||
67 | + <td class='ColumnHeader'>Docelowy status:</td> | ||
68 | + <td class='ColumnHeader'>Osoba dokonująca zmiany:</td> | ||
69 | + </tr> | ||
70 | + {% for change in status_changes %} | ||
71 | + <tr class='ChangeControlTableRow' id="change_{{version.id}}"> | ||
72 | + <td>{{ change.date }}</td> | ||
73 | + <td>{{ change.status.status }}</td> | ||
74 | + <td>{{ change.changer.username }}</td> | ||
75 | + </tr> | ||
76 | + {% endfor %} | ||
77 | + </table> | ||
78 | + </div> | ||
79 | + {% endif %} | ||
58 | </div> | 80 | </div> |
59 | <div id="ready-note-dialog"> | 81 | <div id="ready-note-dialog"> |
60 | </div> | 82 | </div> |
dictionary/templates/lemma_view.html
@@ -18,6 +18,7 @@ | @@ -18,6 +18,7 @@ | ||
18 | <script type="text/javascript" src="{{ STATIC_URL }}js/lib/jquery.multiselect.js"></script> | 18 | <script type="text/javascript" src="{{ STATIC_URL }}js/lib/jquery.multiselect.js"></script> |
19 | <script type="text/javascript" src="{{ STATIC_URL }}js/jqgrid-patch.js"></script> | 19 | <script type="text/javascript" src="{{ STATIC_URL }}js/jqgrid-patch.js"></script> |
20 | <script type="text/javascript" src="{{ STATIC_URL }}js/lemma_grid.js"></script> | 20 | <script type="text/javascript" src="{{ STATIC_URL }}js/lemma_grid.js"></script> |
21 | + <script type="text/javascript" src="{{ STATIC_URL }}js/semantics_coupling.js"></script> | ||
21 | <script type="text/javascript" src="{{ STATIC_URL }}js/lemma-view.js"></script> | 22 | <script type="text/javascript" src="{{ STATIC_URL }}js/lemma-view.js"></script> |
22 | 23 | ||
23 | {% endblock %} | 24 | {% endblock %} |
dictionary/validation.py
@@ -418,6 +418,30 @@ def create_miss_binded_frames_msg_content(missing_frames): | @@ -418,6 +418,30 @@ def create_miss_binded_frames_msg_content(missing_frames): | ||
418 | message_content += '\n' | 418 | message_content += '\n' |
419 | return message_content | 419 | return message_content |
420 | 420 | ||
421 | +####################### same positions validation ####################### | ||
422 | +def validate_same_positions_schemata(lemma): | ||
423 | + msg_content = '' | ||
424 | + same_positions_schemata = get_same_positions_schemata(lemma) | ||
425 | + if len(same_positions_schemata) > 0: | ||
426 | + msg_content = same_positions_message(same_positions_schemata) | ||
427 | + return msg_content | ||
428 | + | ||
429 | +def get_same_positions_schemata(lemma): | ||
430 | + same_positions_schemata = [] | ||
431 | + for schema in lemma.frames.all(): | ||
432 | + for pos in schema.positions.all(): | ||
433 | + if schema.positions.filter(text_rep=pos.text_rep).count() > 1: | ||
434 | + same_positions_schemata.append(schema) | ||
435 | + break | ||
436 | + return same_positions_schemata | ||
437 | + | ||
438 | +def same_positions_message(same_positions_schemata): | ||
439 | + message_content = u'W następujących schematach występuje więcej niż jedna identyczna pozycja:\n' | ||
440 | + for schema in same_positions_schemata: | ||
441 | + message_content += u'\t- [%d] %s\n' % (schema.id, schema.text_rep) | ||
442 | + message_content += '\n' | ||
443 | + return message_content | ||
444 | + | ||
421 | ####################### WALIDACJA ############################ | 445 | ####################### WALIDACJA ############################ |
422 | def get_napprv_examples(lemma): | 446 | def get_napprv_examples(lemma): |
423 | nApprovedExamples = lemma.nkjp_examples.filter(source__confirmation_required=True, | 447 | nApprovedExamples = lemma.nkjp_examples.filter(source__confirmation_required=True, |
@@ -436,7 +460,7 @@ def validate_examples_and_mark_errors(lemma, status_obj, selected_frame_id): | @@ -436,7 +460,7 @@ def validate_examples_and_mark_errors(lemma, status_obj, selected_frame_id): | ||
436 | error = False | 460 | error = False |
437 | serialized_frames = [] | 461 | serialized_frames = [] |
438 | for frame_obj in lemma.frames.all(): | 462 | for frame_obj in lemma.frames.all(): |
439 | - serialized_frame = frameObjToSerializableDict(lemma, frame_obj) | 463 | + serialized_frame = frameObjToSerializableDict(lemma, frame_obj, True) |
440 | if selected_frame_id and frame_obj.id != selected_frame_id: | 464 | if selected_frame_id and frame_obj.id != selected_frame_id: |
441 | serialized_frames.append(serialized_frame) | 465 | serialized_frames.append(serialized_frame) |
442 | continue | 466 | continue |
@@ -461,7 +485,7 @@ def validate_schemas_and_mark_errors(lemma, status, selected_frame_id): | @@ -461,7 +485,7 @@ def validate_schemas_and_mark_errors(lemma, status, selected_frame_id): | ||
461 | error = False | 485 | error = False |
462 | serialized_frames = [] | 486 | serialized_frames = [] |
463 | for frame_obj in lemma.frames.all(): | 487 | for frame_obj in lemma.frames.all(): |
464 | - serialized_frame = frameObjToSerializableDict(lemma, frame_obj) | 488 | + serialized_frame = frameObjToSerializableDict(lemma, frame_obj, True) |
465 | if selected_frame_id and frame_obj.id != selected_frame_id: | 489 | if selected_frame_id and frame_obj.id != selected_frame_id: |
466 | serialized_frames.append(serialized_frame) | 490 | serialized_frames.append(serialized_frame) |
467 | continue | 491 | continue |
dictionary/views.py
@@ -191,6 +191,8 @@ def lemma_view(request): | @@ -191,6 +191,8 @@ def lemma_view(request): | ||
191 | 'ajax_get_compatible_schema_chars' : reverse('get_compatible_schema_chars'), | 191 | 'ajax_get_compatible_schema_chars' : reverse('get_compatible_schema_chars'), |
192 | 192 | ||
193 | 'ajax_deselect_preview_tab': reverse('deselect_preview_tab'), | 193 | 'ajax_deselect_preview_tab': reverse('deselect_preview_tab'), |
194 | + 'ajax_get_schemata': reverse('get_schemata'), | ||
195 | + 'ajax_get_examples': reverse('get_examples'), | ||
194 | 196 | ||
195 | # powiazywanie hasel (nieczasownikowe) | 197 | # powiazywanie hasel (nieczasownikowe) |
196 | 'ajax_relate_entries' : reverse('relate_entries'), | 198 | 'ajax_relate_entries' : reverse('relate_entries'), |
semantics/admin.py
1 | from django.contrib import admin | 1 | from django.contrib import admin |
2 | 2 | ||
3 | -from models import FramePosition, SemanticRole, SelectivePreferenceRelations, \ | ||
4 | - SemanticRolesDisplay, GeneralSelectivePreference | 3 | +from models import FramePosition, GeneralSelectivePreference, LexicalUnitExamples, \ |
4 | + SelectivePreferenceRelations, SemanticFrame, SemanticRole, \ | ||
5 | + SemanticRolesDisplay | ||
6 | + | ||
5 | 7 | ||
6 | 8 | ||
7 | class SemanticRoleAdmin(admin.ModelAdmin): | 9 | class SemanticRoleAdmin(admin.ModelAdmin): |
8 | search_fields = ('role',) | 10 | search_fields = ('role',) |
9 | 11 | ||
10 | -admin.site.register(GeneralSelectivePreference) | ||
11 | admin.site.register(FramePosition) | 12 | admin.site.register(FramePosition) |
13 | +admin.site.register(GeneralSelectivePreference) | ||
14 | +admin.site.register(LexicalUnitExamples) | ||
15 | +admin.site.register(SemanticFrame) | ||
12 | admin.site.register(SelectivePreferenceRelations) | 16 | admin.site.register(SelectivePreferenceRelations) |
13 | admin.site.register(SemanticRolesDisplay) | 17 | admin.site.register(SemanticRolesDisplay) |
14 | admin.site.register(SemanticRole, SemanticRoleAdmin) | 18 | admin.site.register(SemanticRole, SemanticRoleAdmin) |
semantics/management/commands/find_hanging_connections.py
0 → 100644
1 | +#-*- coding:utf-8 -*- | ||
2 | + | ||
3 | +import datetime | ||
4 | + | ||
5 | +from django.core.management.base import BaseCommand | ||
6 | + | ||
7 | +from dictionary.models import Lemma | ||
8 | + | ||
9 | +class Command(BaseCommand): | ||
10 | + args = 'none' | ||
11 | + help = "" | ||
12 | + | ||
13 | + def handle(self, **options): | ||
14 | + find_hanging_connections() | ||
15 | + | ||
16 | +def find_hanging_connections(): | ||
17 | + lemmas = Lemma.objects.filter(old=False).order_by('entry_obj__name') | ||
18 | + for lemma in lemmas: | ||
19 | + frames = lemma.entry_obj.actual_frames() | ||
20 | + for frame in frames: | ||
21 | + for compl in frame.complements.all(): | ||
22 | + for real in compl.realizations.all(): | ||
23 | + match = False | ||
24 | + matching_schemata = lemma.frames.filter(id=real.frame.id).all() | ||
25 | + for schema in matching_schemata: | ||
26 | + matching_poss = schema.positions.filter(id=real.position.id, | ||
27 | + arguments=real.argument) | ||
28 | + if matching_poss.exists(): | ||
29 | + match = True | ||
30 | + break | ||
31 | + if not match: | ||
32 | + compl_ref = 'frame_%d_comp_%d_' % (frame.id, compl.id) | ||
33 | + print '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' | ||
34 | + print 'lemma: %s\tcomplement: %s\trealization: %s' % (lemma.entry_obj.name, | ||
35 | + compl_ref, | ||
36 | + unicode(real)) | ||
37 | + | ||
0 | \ No newline at end of file | 38 | \ No newline at end of file |
semantics/management/commands/find_hanging_examples.py
0 → 100644
1 | +#-*- coding:utf-8 -*- | ||
2 | + | ||
3 | +from django.core.management.base import BaseCommand | ||
4 | + | ||
5 | +from dictionary.models import Lemma | ||
6 | +from semantics.models import LexicalUnitExamples | ||
7 | + | ||
8 | +class Command(BaseCommand): | ||
9 | + args = 'none' | ||
10 | + help = "" | ||
11 | + | ||
12 | + def handle(self, **options): | ||
13 | + find_hanging_examples() | ||
14 | + | ||
15 | +def find_hanging_examples(): | ||
16 | + lemmas = Lemma.objects.filter(old=False).order_by('entry_obj__name') | ||
17 | + for lemma in lemmas: | ||
18 | + print_hanging_examples(lemma) | ||
19 | + | ||
20 | +def print_hanging_examples(lemma): | ||
21 | + lex_units = lemma.entry_obj.lexical_units().all() | ||
22 | + for lu in lex_units: | ||
23 | + lu_examples = LexicalUnitExamples.objects.filter(lexical_unit=lu) | ||
24 | + for lu_ex in lu_examples: | ||
25 | + example = lu_ex.example | ||
26 | + if not lemma.nkjp_examples.filter(id=example.id).exists(): | ||
27 | + print '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' | ||
28 | + print 'lemma: %s\tlu_ex_id: %d\texample: %s\tex_id: %d' % (lemma.entry_obj.name, | ||
29 | + lu_ex.id, | ||
30 | + example.sentence, | ||
31 | + example.id) | ||
32 | + | ||
0 | \ No newline at end of file | 33 | \ No newline at end of file |
semantics/models.py
@@ -49,6 +49,11 @@ class SemanticFrame(models.Model): | @@ -49,6 +49,11 @@ class SemanticFrame(models.Model): | ||
49 | return True | 49 | return True |
50 | return False | 50 | return False |
51 | 51 | ||
52 | + def opinion_selected(self): | ||
53 | + if not self.opinion: | ||
54 | + return False | ||
55 | + return True | ||
56 | + | ||
52 | def __unicode__(self): | 57 | def __unicode__(self): |
53 | complements_str_tab = [unicode(compl) for compl in self.complements.all()] | 58 | complements_str_tab = [unicode(compl) for compl in self.complements.all()] |
54 | return u'%d --> %s' % (self.id, u'+'.join(complements_str_tab)) | 59 | return u'%d --> %s' % (self.id, u'+'.join(complements_str_tab)) |
@@ -62,6 +67,10 @@ class FramePosition(models.Model): | @@ -62,6 +67,10 @@ class FramePosition(models.Model): | ||
62 | argument = models.ForeignKey(Argument) | 67 | argument = models.ForeignKey(Argument) |
63 | # numer alternacji | 68 | # numer alternacji |
64 | alternation = models.IntegerField(default=1) | 69 | alternation = models.IntegerField(default=1) |
70 | + | ||
71 | + def __unicode__(self): | ||
72 | + return 'schema_%d_pos_%d_arg_%d_alt_%d_' % (self.frame.id, self.position.id, | ||
73 | + self.argument.id, self.alternation) | ||
65 | 74 | ||
66 | class LexicalUnitExamples(models.Model): | 75 | class LexicalUnitExamples(models.Model): |
67 | example = models.ForeignKey(NKJP_Example) | 76 | example = models.ForeignKey(NKJP_Example) |
@@ -110,6 +119,12 @@ class Complement(models.Model): # pola z ramki | @@ -110,6 +119,12 @@ class Complement(models.Model): # pola z ramki | ||
110 | # realizacje tego argumentu w schematach składniowych | 119 | # realizacje tego argumentu w schematach składniowych |
111 | realizations = models.ManyToManyField(FramePosition) | 120 | realizations = models.ManyToManyField(FramePosition) |
112 | 121 | ||
122 | + def has_only_phraseologic_realizations(self): | ||
123 | + for real in self.realizations.all(): | ||
124 | + if not real.argument.is_phraseologic(): | ||
125 | + return False | ||
126 | + return True | ||
127 | + | ||
113 | def __unicode__(self): | 128 | def __unicode__(self): |
114 | return u'%d:%s' % (self.id, self.roles.all()) | 129 | return u'%d:%s' % (self.id, self.roles.all()) |
115 | 130 |
semantics/saving.py
0 → 100644
1 | +# -*- coding: utf-8 -*- | ||
2 | + | ||
3 | +from django.db.models import Min | ||
4 | + | ||
5 | +from dictionary.models import Argument, Frame, NKJP_Example, Position | ||
6 | +from semantics.change_log import store_old_versions | ||
7 | +from semantics.models import Complement, GeneralSelectivePreference, FramePosition,\ | ||
8 | + LexicalUnitExamples, RelationalSelectivePreference, \ | ||
9 | + SelectivePreference, SelectivePreferenceRelations, \ | ||
10 | + SemanticFrame, SemanticRole, FrameOpinion | ||
11 | +from wordnet.models import Hypernymy, LexicalUnit, Synonymy, Synset | ||
12 | + | ||
13 | +def modify_frames(lemma_id, operations, user): | ||
14 | + store_old_versions(lemma_id, operations, user) | ||
15 | + make_operations(operations) | ||
16 | + | ||
17 | +def make_operations(operations): | ||
18 | + translation = {'frame_id': {}, 'complement_id': {}, 'preference_id': {}} | ||
19 | + for operation in operations: | ||
20 | + if operation['operation'] == "create_frame": | ||
21 | + luids = [int(m['id']) for m in operation['meanings']] | ||
22 | + translation['frame_id'][int(operation['id'])] = create_frame(luids) | ||
23 | + elif operation['operation'] == "remove_frame": | ||
24 | + if int(operation['id']) in translation['frame_id']: | ||
25 | + frame_id = translation['frame_id'][int(operation['id'])] | ||
26 | + else: | ||
27 | + frame_id = int(operation['id']) | ||
28 | + remove_frame(frame_id) | ||
29 | + elif operation['operation'] == "add_argument": | ||
30 | + if int(operation['frame_id']) in translation['frame_id']: | ||
31 | + frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
32 | + else: | ||
33 | + frame_id = int(operation['frame_id']) | ||
34 | + roles = [int(r) for r in operation['role']] | ||
35 | + translation['complement_id'][int(operation['id'])] = add_argument(frame_id, roles) | ||
36 | + elif operation['operation'] == "remove_argument": | ||
37 | + if int(operation['frame_id']) in translation['frame_id']: | ||
38 | + frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
39 | + else: | ||
40 | + frame_id = int(operation['frame_id']) | ||
41 | + if int(operation['complement_id']) in translation['complement_id']: | ||
42 | + complement_id = translation['complement_id'][int(operation['complement_id'])] | ||
43 | + else: | ||
44 | + complement_id = int(operation['complement_id']) | ||
45 | + remove_argument(frame_id, complement_id) | ||
46 | + elif operation['operation'] == "connect": | ||
47 | + frame_data = operation['arg'].split('_') | ||
48 | + if int(frame_data[1]) in translation['frame_id']: | ||
49 | + frame_id = translation['frame_id'][int(frame_data[1])] | ||
50 | + else: | ||
51 | + frame_id = int(frame_data[1]) | ||
52 | + if int(frame_data[3]) in translation['complement_id']: | ||
53 | + complement_id = translation['complement_id'][int(frame_data[3])] | ||
54 | + else: | ||
55 | + complement_id = int(frame_data[3]) | ||
56 | + schema_data = operation['connect'].split('_') | ||
57 | + schema_id = int(schema_data[1]) | ||
58 | + position_id = int(schema_data[3]) | ||
59 | + argument_id = int(schema_data[5]) | ||
60 | + alternation = int(schema_data[7]) | ||
61 | + connect(frame_id, complement_id, schema_id, position_id, argument_id, alternation) | ||
62 | + elif operation['operation'] == "disconnect": | ||
63 | + frame_data = operation['arg'].split('_') | ||
64 | + if int(frame_data[1]) in translation['frame_id']: | ||
65 | + frame_id = translation['frame_id'][int(frame_data[1])] | ||
66 | + else: | ||
67 | + frame_id = int(frame_data[1]) | ||
68 | + if int(frame_data[3]) in translation['complement_id']: | ||
69 | + complement_id = translation['complement_id'][int(frame_data[3])] | ||
70 | + else: | ||
71 | + complement_id = int(frame_data[3]) | ||
72 | + schema_data = operation['connect'].split('_') | ||
73 | + schema_id = int(schema_data[1]) | ||
74 | + position_id = int(schema_data[3]) | ||
75 | + argument_id = int(schema_data[5]) | ||
76 | + alternation = int(schema_data[7]) | ||
77 | + disconnect(frame_id, complement_id, schema_id, position_id, argument_id, alternation) | ||
78 | + elif operation['operation'] == "assign_role": | ||
79 | + if int(operation['frame_id']) in translation['frame_id']: | ||
80 | + frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
81 | + else: | ||
82 | + frame_id = int(operation['frame_id']) | ||
83 | + if int(operation['complement_id']) in translation['complement_id']: | ||
84 | + complement_id = translation['complement_id'][int(operation['complement_id'])] | ||
85 | + else: | ||
86 | + complement_id = int(operation['complement_id']) | ||
87 | + roles = [int(r) for r in operation['role']] | ||
88 | + assign_role(frame_id, complement_id, roles) | ||
89 | + elif operation['operation'] == "change_units": | ||
90 | + if int(operation['frame_id']) in translation['frame_id']: | ||
91 | + frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
92 | + else: | ||
93 | + frame_id = int(operation['frame_id']) | ||
94 | + luids = [int(m) for m in operation['units']] | ||
95 | + change_units(frame_id, luids) | ||
96 | + elif operation['operation'] == "set_opinion": | ||
97 | + if int(operation['frame_id']) in translation['frame_id']: | ||
98 | + frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
99 | + else: | ||
100 | + frame_id = int(operation['frame_id']) | ||
101 | + opinion = operation['opinion'] | ||
102 | + set_opinion(frame_id, opinion) | ||
103 | + elif operation['operation'] == "add_preference": | ||
104 | + # {operation: 'add_preference', frame_id: frame_id, complement_id: complement_id, preference_id: preference_id, preference: preference} | ||
105 | + if int(operation['frame_id']) in translation['frame_id']: | ||
106 | + frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
107 | + else: | ||
108 | + frame_id = int(operation['frame_id']) | ||
109 | + if int(operation['complement_id']) in translation['complement_id']: | ||
110 | + complement_id = translation['complement_id'][int(operation['complement_id'])] | ||
111 | + else: | ||
112 | + complement_id = int(operation['complement_id']) | ||
113 | + preference_id = add_preference(frame_id, complement_id, operation['preference']['type'], operation['preference']['content']) | ||
114 | + translation['preference_id'][operation['preference_id']] = preference_id | ||
115 | + elif operation['operation'] == "remove_preference": | ||
116 | + # {operation: 'remove_preference', frame_id: frame_id, complement_id: complement_id, preference_id: preference_id} | ||
117 | + if int(operation['frame_id']) in translation['frame_id']: | ||
118 | + frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
119 | + else: | ||
120 | + frame_id = int(operation['frame_id']) | ||
121 | + if int(operation['complement_id']) in translation['complement_id']: | ||
122 | + complement_id = translation['complement_id'][int(operation['complement_id'])] | ||
123 | + else: | ||
124 | + complement_id = int(operation['complement_id']) | ||
125 | + if operation['preference_id'] in translation['preference_id']: | ||
126 | + preference_id = translation['preference_id'][operation['preference_id']] | ||
127 | + else: | ||
128 | + preference_id = (operation['preference_id'][0], int(operation['preference_id'][1:])) | ||
129 | + | ||
130 | + remove_preference(frame_id, complement_id, preference_id) | ||
131 | + else: | ||
132 | + pass | ||
133 | + | ||
134 | +def create_frame(luids): | ||
135 | + frame = SemanticFrame() | ||
136 | + frame.save() | ||
137 | + for id in luids: | ||
138 | + lu = LexicalUnit.objects.get(id=id) | ||
139 | + frame.lexical_units.add(lu) | ||
140 | + return frame.id | ||
141 | + | ||
142 | +def add_argument(frame_id, roles): | ||
143 | + if validate_roles(roles): | ||
144 | + frame = SemanticFrame.objects.get(id=frame_id) | ||
145 | + complement = Complement(frame=frame) | ||
146 | + complement.save() | ||
147 | + frame.complements.add(complement) | ||
148 | + role_objects = [] | ||
149 | + for r in roles: | ||
150 | + role_objects.append(SemanticRole.objects.get(id=r)) | ||
151 | + complement.roles = role_objects | ||
152 | + return complement.id | ||
153 | + | ||
154 | +def remove_frame(frame_id): | ||
155 | + frame = SemanticFrame.objects.get(id=frame_id) | ||
156 | + frame.removed = True | ||
157 | + frame.save() | ||
158 | + | ||
159 | +def remove_argument(frame_id, complement_id): | ||
160 | + Complement.objects.get(id=complement_id).delete() | ||
161 | + | ||
162 | +def connect(frame_id, complement_id, schema_id, position_id, argument_id, alternation): | ||
163 | + schema = Frame.objects.get(id=schema_id) | ||
164 | + position = Position.objects.get(id=position_id) | ||
165 | + argument = Argument.objects.get(id=argument_id) | ||
166 | + fpas = FramePosition.objects.filter(frame=schema, position=position, argument=argument, alternation=alternation) | ||
167 | + if len(fpas) > 0: | ||
168 | + fpa = fpas[0] | ||
169 | + else: | ||
170 | + fpa = FramePosition(frame=schema, position=position, argument=argument, alternation=alternation) | ||
171 | + fpa.save() | ||
172 | + complement = Complement.objects.get(id=complement_id) | ||
173 | + complement.realizations.add(fpa) | ||
174 | + | ||
175 | +def disconnect(frame_id, complement_id, schema_id, position_id, argument_id, alternation): | ||
176 | + schema = Frame.objects.get(id=schema_id) | ||
177 | + position = Position.objects.get(id=position_id) | ||
178 | + argument = Argument.objects.get(id=argument_id) | ||
179 | + fpas = FramePosition.objects.filter(frame=schema, position=position, argument=argument, alternation=alternation) | ||
180 | + if len(fpas) > 0: | ||
181 | + fpa = fpas[0] | ||
182 | + else: | ||
183 | + return | ||
184 | + complement = Complement.objects.get(id=complement_id) | ||
185 | + complement.realizations.remove(fpa) | ||
186 | + | ||
187 | +def assign_role(frame_id, complement_id, roles): | ||
188 | + if validate_roles(roles): | ||
189 | + role_objects = [] | ||
190 | + for r in roles: | ||
191 | + role_objects.append(SemanticRole.objects.get(id=r)) | ||
192 | + complement = Complement.objects.get(id=complement_id) | ||
193 | + complement.roles = role_objects | ||
194 | + | ||
195 | +def validate_roles(roles): | ||
196 | + role_objects = [] | ||
197 | + for r in roles: | ||
198 | + role_objects.append(SemanticRole.objects.get(id=r)) | ||
199 | + if len(role_objects) > 2: | ||
200 | + return False | ||
201 | + ok = False | ||
202 | + for r in role_objects: | ||
203 | + if not r.color == None: | ||
204 | + ok = not ok | ||
205 | + return ok | ||
206 | + | ||
207 | +def change_units(frame_id, luids): | ||
208 | + frame = SemanticFrame.objects.get(id=frame_id) | ||
209 | + frame.lexical_units = [] | ||
210 | + for id in luids: | ||
211 | + lu = LexicalUnit.objects.get(id=id) | ||
212 | + frame.lexical_units.add(lu) | ||
213 | + | ||
214 | +def set_opinion(frame_id, opinion): | ||
215 | + frame = SemanticFrame.objects.get(id=frame_id) | ||
216 | + frame_opinion = FrameOpinion.objects.get(short=opinion) | ||
217 | + frame.opinion = frame_opinion | ||
218 | + frame.save() | ||
219 | + | ||
220 | +# preference_id = add_preference(frame_id, complement_id, operation['preference']['type'], operation['preference']['content']) | ||
221 | +def add_preference(frame_id, complement_id, preference_type, preference_content): | ||
222 | + | ||
223 | + complement = Complement.objects.get(id=complement_id) | ||
224 | + if complement.selective_preference is None: | ||
225 | + sp = SelectivePreference() | ||
226 | + sp.save() | ||
227 | + complement.selective_preference = sp | ||
228 | + complement.save() | ||
229 | + | ||
230 | + if preference_type == 'g': | ||
231 | + general = GeneralSelectivePreference.objects.get(id=int(preference_content)) | ||
232 | + complement.selective_preference.generals.add(general) | ||
233 | + return ('g', general.id) | ||
234 | + elif preference_type == 's': | ||
235 | + synset = Synset.objects.get(id=int(preference_content)) | ||
236 | + complement.selective_preference.synsets.add(synset) | ||
237 | + return ('s', synset.id) | ||
238 | + elif preference_type == 'r': | ||
239 | + relation = SelectivePreferenceRelations.objects.get(id=int(preference_content['relation'])) | ||
240 | + argument = [int(a) for a in preference_content['to'].split(',')] | ||
241 | + frame = SemanticFrame.objects.get(id=frame_id) | ||
242 | + candidates = Complement.objects.filter(frame=frame) | ||
243 | + found = None | ||
244 | + for c in candidates: | ||
245 | + if len(c.roles.all()) == len(argument): | ||
246 | + roles = [r.id for r in c.roles.all()] | ||
247 | + ok = True | ||
248 | + for a in argument: | ||
249 | + if a not in roles: | ||
250 | + ok = False | ||
251 | + if ok: | ||
252 | + found = c | ||
253 | + break | ||
254 | + if found is not None: | ||
255 | + rsp = RelationalSelectivePreference(relation=relation, to=found) | ||
256 | + rsp.save() | ||
257 | + complement.selective_preference.relations.add(rsp) | ||
258 | + return ('r', rsp.id) | ||
259 | + else: | ||
260 | + return -1 | ||
261 | + else: | ||
262 | + return -1 | ||
263 | + | ||
264 | +# remove_preference(frame_id, complement_id, preference) | ||
265 | +def remove_preference(frame_id, complement_id, preference): | ||
266 | + preference_type, preference_id = preference | ||
267 | + if preference_type == 'g': | ||
268 | + complement = Complement.objects.get(id=complement_id) | ||
269 | + g = complement.selective_preference.generals.get(id = int(preference_id)) | ||
270 | + complement.selective_preference.generals.remove(g) | ||
271 | + elif preference_type == 's': | ||
272 | + complement = Complement.objects.get(id=complement_id) | ||
273 | + s = complement.selective_preference.synsets.get(id = int(preference_id)) | ||
274 | + complement.selective_preference.synsets.remove(s) | ||
275 | + elif preference_type == 'r': | ||
276 | + complement = Complement.objects.get(id=complement_id) | ||
277 | + r = complement.selective_preference.relations.get(id = int(preference_id)) | ||
278 | + complement.selective_preference.relations.remove(r) | ||
279 | + | ||
280 | + | ||
281 | +def update_meanings(operations): | ||
282 | + translation = {} | ||
283 | + for operation in operations: | ||
284 | + if operation['operation'] == "set_glossa": | ||
285 | + if int(operation['unit']) in translation: | ||
286 | + unit = translation[int(operation['unit'])] | ||
287 | + else: | ||
288 | + unit = int(operation['unit']) | ||
289 | + set_glossa(unit, operation['value']) | ||
290 | + elif operation['operation'] == "add_example": | ||
291 | + if int(operation['unit']) in translation: | ||
292 | + unit = translation[int(operation['unit'])] | ||
293 | + else: | ||
294 | + unit = int(operation['unit']) | ||
295 | + add_example(unit, operation['example']) | ||
296 | + elif operation['operation'] == "remove_example": | ||
297 | + if int(operation['unit']) in translation: | ||
298 | + unit = translation[int(operation['unit'])] | ||
299 | + else: | ||
300 | + unit = int(operation['unit']) | ||
301 | + remove_example(unit, operation['example']) | ||
302 | + elif operation['operation'] == "add_unit": | ||
303 | + translation[operation['unit']['id']] = add_unit(operation['unit']) | ||
304 | + elif operation['operation'] == "remove_unit": | ||
305 | + luid = int(operation['luid']) | ||
306 | + if luid in translation: | ||
307 | + remove_unit(translation[luid]) | ||
308 | + else: | ||
309 | + remove_unit(luid) | ||
310 | + else: | ||
311 | + pass | ||
312 | + | ||
313 | +def set_glossa(unit_id, new_glossa): | ||
314 | + unit = LexicalUnit.objects.get(id=unit_id) | ||
315 | + unit.glossa = new_glossa | ||
316 | + unit.save() | ||
317 | + | ||
318 | +def add_example(unit_id, example_id): | ||
319 | + unit = LexicalUnit.objects.get(id=unit_id) | ||
320 | + nkjp_example = NKJP_Example.objects.get(id=example_id) | ||
321 | + lue = LexicalUnitExamples(example=nkjp_example, lexical_unit=unit) | ||
322 | + lue.save() | ||
323 | + | ||
324 | +def remove_example(unit_id, example_id): | ||
325 | + unit = LexicalUnit.objects.get(id=unit_id) | ||
326 | + nkjp_example = NKJP_Example.objects.get(id=example_id) | ||
327 | + lue = LexicalUnitExamples.objects.get(example=nkjp_example, lexical_unit=unit) | ||
328 | + lue.delete() | ||
329 | + | ||
330 | +def add_unit(unit): # returns new id | ||
331 | + | ||
332 | + s1 = Synset(id=(min(Synset.objects.all().aggregate(Min('id'))['id__min'], 0) - 1)) | ||
333 | + s1.save() | ||
334 | + lu = LexicalUnit(base=unit['base'], sense=unit['sense'], pos=unit['pos'], glossa=unit['glossa'], luid=-1, synset=s1) | ||
335 | + lu.save() | ||
336 | + | ||
337 | + | ||
338 | + if int(unit['relation']) == 1: | ||
339 | + s2 = Synset.objects.get(id=int(unit['to'])) | ||
340 | + r = Synonymy(parent=s1, child=s2) | ||
341 | + r.save() | ||
342 | + r = Synonymy(parent=s2, child=s1) | ||
343 | + r.save() | ||
344 | + elif int(unit['relation']) == 0: | ||
345 | + s2 = Synset.objects.get(id=int(unit['to'])) | ||
346 | + r = Hypernymy(parent=s1, child=s2) | ||
347 | + r.save() | ||
348 | + else: | ||
349 | + pass | ||
350 | + | ||
351 | + return lu.id | ||
352 | + | ||
353 | +def remove_unit(luid): | ||
354 | + lu = LexicalUnit.objects.get(id=luid) | ||
355 | + if lu.luid is not None and lu.luid >= 0: | ||
356 | + return | ||
357 | + else: | ||
358 | + lu.delete() |
semantics/static/js/semantics_connections.js
1 | -var connected = {}; // dictionaries of connections and disconnections between frames and schemas | ||
2 | -var connected_reverse = {}; | 1 | + var connected = {}; // dictionaries of connections and disconnections between frames and schemas |
2 | + var connected_reverse = {}; | ||
3 | 3 | ||
4 | function memorizeConnections(arguments_connected, frames_connection){ | 4 | function memorizeConnections(arguments_connected, frames_connection){ |
5 | connected = arguments_connected; | 5 | connected = arguments_connected; |
semantics/static/js/semantics_frames.js
@@ -463,8 +463,8 @@ function saveFrames() { | @@ -463,8 +463,8 @@ function saveFrames() { | ||
463 | memorizeConnections(data.connections.connected, data.connections.connected_reverse); | 463 | memorizeConnections(data.connections.connected, data.connections.connected_reverse); |
464 | $("#semantic-frames-count").empty(); | 464 | $("#semantic-frames-count").empty(); |
465 | $("#semantic-frames-count").append(data.frames_count); | 465 | $("#semantic-frames-count").append(data.frames_count); |
466 | + updateSchemataConnections(); | ||
466 | }); | 467 | }); |
467 | frames_operations = []; | 468 | frames_operations = []; |
468 | } | 469 | } |
469 | } | 470 | } |
470 | - |
semantics/static/js/semantics_lexical_units.js
@@ -97,6 +97,7 @@ function saveMeanings() { | @@ -97,6 +97,7 @@ function saveMeanings() { | ||
97 | success: function(data){ | 97 | success: function(data){ |
98 | memorizeLexicalUnits(data.lexical_units); | 98 | memorizeLexicalUnits(data.lexical_units); |
99 | basicLexicalUnitsData(data.informations); | 99 | basicLexicalUnitsData(data.informations); |
100 | + updateExamplesConnections(); | ||
100 | }, | 101 | }, |
101 | async: false | 102 | async: false |
102 | }); | 103 | }); |
semantics/templates/opinions.json
0 → 100644
semantics/validation.py
@@ -2,12 +2,12 @@ | @@ -2,12 +2,12 @@ | ||
2 | 2 | ||
3 | from django.db.models import Max | 3 | from django.db.models import Max |
4 | 4 | ||
5 | -from dictionary.models import Lemma, reflex_phrase_types | 5 | +from dictionary.models import Lemma, reflex_phrase_types, Argument_Model |
6 | from semantics.models import LexicalUnitExamples | 6 | from semantics.models import LexicalUnitExamples |
7 | from semantics.utils import get_matching_frame | 7 | from semantics.utils import get_matching_frame |
8 | 8 | ||
9 | def validate_frames(lemma_id): | 9 | def validate_frames(lemma_id): |
10 | - lemma = Lemma.objects.get(id=lemma_id, old=False) | 10 | + lemma = Lemma.objects.get(id=lemma_id) |
11 | actual_frames = lemma.entry_obj.actual_frames() | 11 | actual_frames = lemma.entry_obj.actual_frames() |
12 | error_msg = u'' | 12 | error_msg = u'' |
13 | for frame in actual_frames.all(): | 13 | for frame in actual_frames.all(): |
@@ -21,6 +21,8 @@ def frame_valid(lemma, frame, actual_frames): | @@ -21,6 +21,8 @@ def frame_valid(lemma, frame, actual_frames): | ||
21 | complements = frame.complements.all() | 21 | complements = frame.complements.all() |
22 | if not arguments_exists(complements): | 22 | if not arguments_exists(complements): |
23 | error_msg = u'Semantyka: Rama semantyczna %d jest pusta.' % frame.id | 23 | error_msg = u'Semantyka: Rama semantyczna %d jest pusta.' % frame.id |
24 | + elif not frame.opinion_selected(): | ||
25 | + error_msg = u'Semantyka: Rama semantyczna %d nie ma wybranej opinii.' % frame.id | ||
24 | elif not roles_unique(complements): | 26 | elif not roles_unique(complements): |
25 | error_msg = u'Semantyka: Rama semantyczna %d nie zawiera unikalnych ról.' % frame.id | 27 | error_msg = u'Semantyka: Rama semantyczna %d nie zawiera unikalnych ról.' % frame.id |
26 | elif not arguments_pinned(complements): | 28 | elif not arguments_pinned(complements): |
@@ -62,7 +64,9 @@ def arguments_pinned(complements): | @@ -62,7 +64,9 @@ def arguments_pinned(complements): | ||
62 | 64 | ||
63 | def preferences_selected(complements): | 65 | def preferences_selected(complements): |
64 | for complement in complements: | 66 | for complement in complements: |
65 | - if not preference_valid(complement): | 67 | + if complement.realizations.exists() and complement.has_only_phraseologic_realizations(): |
68 | + pass | ||
69 | + elif not preference_valid(complement): | ||
66 | return False | 70 | return False |
67 | return True | 71 | return True |
68 | 72 |
semantics/views.py
1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
2 | 2 | ||
3 | -import locale | ||
4 | from semantics.models import SemanticRole, SemanticFrame, Complement, \ | 3 | from semantics.models import SemanticRole, SemanticFrame, Complement, \ |
5 | LexicalUnit, FrameRankings, SemanticRolesDisplay, \ | 4 | LexicalUnit, FrameRankings, SemanticRolesDisplay, \ |
6 | - LexicalUnitExamples, FramePosition, SelectivePreference, \ | ||
7 | - RelationalSelectivePreference, SelectivePreferenceRelations, \ | 5 | + LexicalUnitExamples, SelectivePreferenceRelations, \ |
8 | GeneralSelectivePreference, FrameOpinion | 6 | GeneralSelectivePreference, FrameOpinion |
7 | + | ||
9 | from dictionary.models import Frame_Char_Model, Lemma, Lemma_Status, \ | 8 | from dictionary.models import Frame_Char_Model, Lemma, Lemma_Status, \ |
10 | - sort_arguments, sort_positions, NKJP_Example, \ | ||
11 | - Frame, Position, Argument | ||
12 | -from wordnet.models import Hypernymy, Synonymy, Synset | 9 | + sort_arguments, sort_positions |
13 | from dictionary.ajax_lemma_view import user_can_modify | 10 | from dictionary.ajax_lemma_view import user_can_modify |
14 | from django.core.exceptions import SuspiciousOperation | 11 | from django.core.exceptions import SuspiciousOperation |
15 | from django.core.urlresolvers import reverse | 12 | from django.core.urlresolvers import reverse |
16 | from django.db.models import Q | 13 | from django.db.models import Q |
17 | -from datetime import datetime | ||
18 | -from django.db.models import Min | ||
19 | 14 | ||
20 | -from common.decorators import render, ajax, AjaxError | ||
21 | -from semantics.change_log import store_old_versions | 15 | +from common.decorators import render, ajax |
16 | +from semantics.saving import modify_frames, update_meanings | ||
22 | from semantics.validation import validate_schemas, validate_frames, validate_lexical_units | 17 | from semantics.validation import validate_schemas, validate_frames, validate_lexical_units |
23 | 18 | ||
24 | 19 | ||
@@ -469,357 +464,15 @@ def ajax_create_complement(request, lemma_id, frame, roles): | @@ -469,357 +464,15 @@ def ajax_create_complement(request, lemma_id, frame, roles): | ||
469 | 464 | ||
470 | @ajax(method='get', encode_result=False) | 465 | @ajax(method='get', encode_result=False) |
471 | def ajax_update_meanings(request, operations, lemma_id): | 466 | def ajax_update_meanings(request, operations, lemma_id): |
472 | - translation = {} | ||
473 | - for operation in operations: | ||
474 | - if operation['operation'] == "set_glossa": | ||
475 | - if int(operation['unit']) in translation: | ||
476 | - unit = translation[int(operation['unit'])] | ||
477 | - else: | ||
478 | - unit = int(operation['unit']) | ||
479 | - set_glossa(unit, operation['value']) | ||
480 | - elif operation['operation'] == "add_example": | ||
481 | - if int(operation['unit']) in translation: | ||
482 | - unit = translation[int(operation['unit'])] | ||
483 | - else: | ||
484 | - unit = int(operation['unit']) | ||
485 | - add_example(unit, operation['example']) | ||
486 | - elif operation['operation'] == "remove_example": | ||
487 | - if int(operation['unit']) in translation: | ||
488 | - unit = translation[int(operation['unit'])] | ||
489 | - else: | ||
490 | - unit = int(operation['unit']) | ||
491 | - remove_example(unit, operation['example']) | ||
492 | - elif operation['operation'] == "add_unit": | ||
493 | - translation[operation['unit']['id']] = add_unit(operation['unit']) | ||
494 | - elif operation['operation'] == "remove_unit": | ||
495 | - luid = int(operation['luid']) | ||
496 | - if luid in translation: | ||
497 | - remove_unit(translation[luid]) | ||
498 | - else: | ||
499 | - remove_unit(luid) | ||
500 | - else: | ||
501 | - pass | ||
502 | - | 467 | + update_meanings(operations) |
503 | return ajax_units(request) | 468 | return ajax_units(request) |
504 | - | ||
505 | -def set_glossa(unit_id, new_glossa): | ||
506 | - unit = LexicalUnit.objects.get(id=unit_id) | ||
507 | - unit.glossa = new_glossa | ||
508 | - unit.save() | ||
509 | - | ||
510 | -def add_example(unit_id, example_id): | ||
511 | - unit = LexicalUnit.objects.get(id=unit_id) | ||
512 | - nkjp_example = NKJP_Example.objects.get(id=example_id) | ||
513 | - lue = LexicalUnitExamples(example=nkjp_example, lexical_unit=unit) | ||
514 | - lue.save() | ||
515 | - | ||
516 | -def remove_example(unit_id, example_id): | ||
517 | - unit = LexicalUnit.objects.get(id=unit_id) | ||
518 | - nkjp_example = NKJP_Example.objects.get(id=example_id) | ||
519 | - lue = LexicalUnitExamples.objects.get(example=nkjp_example, lexical_unit=unit) | ||
520 | - lue.delete() | ||
521 | - | ||
522 | -def add_unit(unit): # returns new id | ||
523 | - | ||
524 | - s1 = Synset(id=(min(Synset.objects.all().aggregate(Min('id'))['id__min'], 0) - 1)) | ||
525 | - s1.save() | ||
526 | - lu = LexicalUnit(base=unit['base'], sense=unit['sense'], pos=unit['pos'], glossa=unit['glossa'], luid=-1, synset=s1) | ||
527 | - lu.save() | ||
528 | - | ||
529 | - | ||
530 | - if int(unit['relation']) == 1: | ||
531 | - s2 = Synset.objects.get(id=int(unit['to'])) | ||
532 | - r = Synonymy(parent=s1, child=s2) | ||
533 | - r.save() | ||
534 | - r = Synonymy(parent=s2, child=s1) | ||
535 | - r.save() | ||
536 | - elif int(unit['relation']) == 0: | ||
537 | - s2 = Synset.objects.get(id=int(unit['to'])) | ||
538 | - r = Hypernymy(parent=s1, child=s2) | ||
539 | - r.save() | ||
540 | - else: | ||
541 | - pass | ||
542 | - | ||
543 | - return lu.id | ||
544 | - | ||
545 | -def remove_unit(luid): | ||
546 | - lu = LexicalUnit.objects.get(id=luid) | ||
547 | - if lu.luid is not None and lu.luid >= 0: | ||
548 | - return | ||
549 | - else: | ||
550 | - lu.delete() | ||
551 | 469 | ||
552 | @ajax(method='get', encode_result=False) | 470 | @ajax(method='get', encode_result=False) |
553 | def ajax_modify_frames(request, operations, lemma_id): | 471 | def ajax_modify_frames(request, operations, lemma_id): |
554 | - | ||
555 | if not request.user.is_authenticated(): | 472 | if not request.user.is_authenticated(): |
556 | return 'user logged out' | 473 | return 'user logged out' |
557 | - | ||
558 | - store_old_versions(lemma_id, operations, request.user) | ||
559 | - | ||
560 | - translation = {'frame_id': {}, 'complement_id': {}, 'preference_id': {}} | ||
561 | - for operation in operations: | ||
562 | - if operation['operation'] == "create_frame": | ||
563 | - luids = [int(m['id']) for m in operation['meanings']] | ||
564 | - translation['frame_id'][int(operation['id'])] = create_frame(luids) | ||
565 | - elif operation['operation'] == "remove_frame": | ||
566 | - if int(operation['id']) in translation['frame_id']: | ||
567 | - frame_id = translation['frame_id'][int(operation['id'])] | ||
568 | - else: | ||
569 | - frame_id = int(operation['id']) | ||
570 | - remove_frame(frame_id) | ||
571 | - elif operation['operation'] == "add_argument": | ||
572 | - if int(operation['frame_id']) in translation['frame_id']: | ||
573 | - frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
574 | - else: | ||
575 | - frame_id = int(operation['frame_id']) | ||
576 | - roles = [int(r) for r in operation['role']] | ||
577 | - translation['complement_id'][int(operation['id'])] = add_argument(frame_id, roles) | ||
578 | - elif operation['operation'] == "remove_argument": | ||
579 | - if int(operation['frame_id']) in translation['frame_id']: | ||
580 | - frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
581 | - else: | ||
582 | - frame_id = int(operation['frame_id']) | ||
583 | - if int(operation['complement_id']) in translation['complement_id']: | ||
584 | - complement_id = translation['complement_id'][int(operation['complement_id'])] | ||
585 | - else: | ||
586 | - complement_id = int(operation['complement_id']) | ||
587 | - remove_argument(frame_id, complement_id) | ||
588 | - elif operation['operation'] == "connect": | ||
589 | - frame_data = operation['arg'].split('_') | ||
590 | - if int(frame_data[1]) in translation['frame_id']: | ||
591 | - frame_id = translation['frame_id'][int(frame_data[1])] | ||
592 | - else: | ||
593 | - frame_id = int(frame_data[1]) | ||
594 | - if int(frame_data[3]) in translation['complement_id']: | ||
595 | - complement_id = translation['complement_id'][int(frame_data[3])] | ||
596 | - else: | ||
597 | - complement_id = int(frame_data[3]) | ||
598 | - schema_data = operation['connect'].split('_') | ||
599 | - schema_id = int(schema_data[1]) | ||
600 | - position_id = int(schema_data[3]) | ||
601 | - argument_id = int(schema_data[5]) | ||
602 | - alternation = int(schema_data[7]) | ||
603 | - connect(frame_id, complement_id, schema_id, position_id, argument_id, alternation) | ||
604 | - elif operation['operation'] == "disconnect": | ||
605 | - frame_data = operation['arg'].split('_') | ||
606 | - if int(frame_data[1]) in translation['frame_id']: | ||
607 | - frame_id = translation['frame_id'][int(frame_data[1])] | ||
608 | - else: | ||
609 | - frame_id = int(frame_data[1]) | ||
610 | - if int(frame_data[3]) in translation['complement_id']: | ||
611 | - complement_id = translation['complement_id'][int(frame_data[3])] | ||
612 | - else: | ||
613 | - complement_id = int(frame_data[3]) | ||
614 | - schema_data = operation['connect'].split('_') | ||
615 | - schema_id = int(schema_data[1]) | ||
616 | - position_id = int(schema_data[3]) | ||
617 | - argument_id = int(schema_data[5]) | ||
618 | - alternation = int(schema_data[7]) | ||
619 | - disconnect(frame_id, complement_id, schema_id, position_id, argument_id, alternation) | ||
620 | - elif operation['operation'] == "assign_role": | ||
621 | - if int(operation['frame_id']) in translation['frame_id']: | ||
622 | - frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
623 | - else: | ||
624 | - frame_id = int(operation['frame_id']) | ||
625 | - if int(operation['complement_id']) in translation['complement_id']: | ||
626 | - complement_id = translation['complement_id'][int(operation['complement_id'])] | ||
627 | - else: | ||
628 | - complement_id = int(operation['complement_id']) | ||
629 | - roles = [int(r) for r in operation['role']] | ||
630 | - assign_role(frame_id, complement_id, roles) | ||
631 | - elif operation['operation'] == "change_units": | ||
632 | - if int(operation['frame_id']) in translation['frame_id']: | ||
633 | - frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
634 | - else: | ||
635 | - frame_id = int(operation['frame_id']) | ||
636 | - luids = [int(m) for m in operation['units']] | ||
637 | - change_units(frame_id, luids) | ||
638 | - elif operation['operation'] == "set_opinion": | ||
639 | - if int(operation['frame_id']) in translation['frame_id']: | ||
640 | - frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
641 | - else: | ||
642 | - frame_id = int(operation['frame_id']) | ||
643 | - opinion = operation['opinion'] | ||
644 | - set_opinion(frame_id, opinion) | ||
645 | - elif operation['operation'] == "add_preference": | ||
646 | - # {operation: 'add_preference', frame_id: frame_id, complement_id: complement_id, preference_id: preference_id, preference: preference} | ||
647 | - if int(operation['frame_id']) in translation['frame_id']: | ||
648 | - frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
649 | - else: | ||
650 | - frame_id = int(operation['frame_id']) | ||
651 | - if int(operation['complement_id']) in translation['complement_id']: | ||
652 | - complement_id = translation['complement_id'][int(operation['complement_id'])] | ||
653 | - else: | ||
654 | - complement_id = int(operation['complement_id']) | ||
655 | - preference_id = add_preference(frame_id, complement_id, operation['preference']['type'], operation['preference']['content']) | ||
656 | - translation['preference_id'][operation['preference_id']] = preference_id | ||
657 | - elif operation['operation'] == "remove_preference": | ||
658 | - # {operation: 'remove_preference', frame_id: frame_id, complement_id: complement_id, preference_id: preference_id} | ||
659 | - if int(operation['frame_id']) in translation['frame_id']: | ||
660 | - frame_id = translation['frame_id'][int(operation['frame_id'])] | ||
661 | - else: | ||
662 | - frame_id = int(operation['frame_id']) | ||
663 | - if int(operation['complement_id']) in translation['complement_id']: | ||
664 | - complement_id = translation['complement_id'][int(operation['complement_id'])] | ||
665 | - else: | ||
666 | - complement_id = int(operation['complement_id']) | ||
667 | - if operation['preference_id'] in translation['preference_id']: | ||
668 | - preference_id = translation['preference_id'][operation['preference_id']] | ||
669 | - else: | ||
670 | - preference_id = (operation['preference_id'][0], int(operation['preference_id'][1:])) | ||
671 | - | ||
672 | - remove_preference(frame_id, complement_id, preference_id) | ||
673 | - else: | ||
674 | - pass | ||
675 | - | 474 | + modify_frames(lemma_id, operations, request.user) |
676 | return ajax_frames(request) | 475 | return ajax_frames(request) |
677 | - | ||
678 | -def create_frame(luids): | ||
679 | - frame = SemanticFrame() | ||
680 | - frame.save() | ||
681 | - for id in luids: | ||
682 | - lu = LexicalUnit.objects.get(id=id) | ||
683 | - frame.lexical_units.add(lu) | ||
684 | - return frame.id | ||
685 | - | ||
686 | -def change_units(frame_id, luids): | ||
687 | - frame = SemanticFrame.objects.get(id=frame_id) | ||
688 | - frame.lexical_units = [] | ||
689 | - for id in luids: | ||
690 | - lu = LexicalUnit.objects.get(id=id) | ||
691 | - frame.lexical_units.add(lu) | ||
692 | - | ||
693 | -def set_opinion(frame_id, opinion): | ||
694 | - frame = SemanticFrame.objects.get(id=frame_id) | ||
695 | - frame_opinion = FrameOpinion.objects.get(short=opinion) | ||
696 | - frame.opinion = frame_opinion | ||
697 | - frame.save() | ||
698 | - | ||
699 | -def remove_frame(frame_id): | ||
700 | - frame = SemanticFrame.objects.get(id=frame_id) | ||
701 | - frame.removed = True | ||
702 | - frame.save() | ||
703 | - | ||
704 | -def add_argument(frame_id, roles): | ||
705 | - if validate_roles(roles): | ||
706 | - frame = SemanticFrame.objects.get(id=frame_id) | ||
707 | - complement = Complement(frame=frame) | ||
708 | - complement.save() | ||
709 | - frame.complements.add(complement) | ||
710 | - role_objects = [] | ||
711 | - for r in roles: | ||
712 | - role_objects.append(SemanticRole.objects.get(id=r)) | ||
713 | - complement.roles = role_objects | ||
714 | - return complement.id | ||
715 | - | ||
716 | -def remove_argument(frame_id, complement_id): | ||
717 | - Complement.objects.get(id=complement_id).delete() | ||
718 | - | ||
719 | -def connect(frame_id, complement_id, schema_id, position_id, argument_id, alternation): | ||
720 | - schema = Frame.objects.get(id=schema_id) | ||
721 | - position = Position.objects.get(id=position_id) | ||
722 | - argument = Argument.objects.get(id=argument_id) | ||
723 | - fpas = FramePosition.objects.filter(frame=schema, position=position, argument=argument, alternation=alternation) | ||
724 | - if len(fpas) > 0: | ||
725 | - fpa = fpas[0] | ||
726 | - else: | ||
727 | - fpa = FramePosition(frame=schema, position=position, argument=argument, alternation=alternation) | ||
728 | - fpa.save() | ||
729 | - complement = Complement.objects.get(id=complement_id) | ||
730 | - complement.realizations.add(fpa) | ||
731 | - | ||
732 | -def disconnect(frame_id, complement_id, schema_id, position_id, argument_id, alternation): | ||
733 | - schema = Frame.objects.get(id=schema_id) | ||
734 | - position = Position.objects.get(id=position_id) | ||
735 | - argument = Argument.objects.get(id=argument_id) | ||
736 | - fpas = FramePosition.objects.filter(frame=schema, position=position, argument=argument, alternation=alternation) | ||
737 | - if len(fpas) > 0: | ||
738 | - fpa = fpas[0] | ||
739 | - else: | ||
740 | - return | ||
741 | - complement = Complement.objects.get(id=complement_id) | ||
742 | - complement.realizations.remove(fpa) | ||
743 | - | ||
744 | -def assign_role(frame_id, complement_id, roles): | ||
745 | - if validate_roles(roles): | ||
746 | - role_objects = [] | ||
747 | - for r in roles: | ||
748 | - role_objects.append(SemanticRole.objects.get(id=r)) | ||
749 | - complement = Complement.objects.get(id=complement_id) | ||
750 | - complement.roles = role_objects | ||
751 | - | ||
752 | -def validate_roles(roles): | ||
753 | - role_objects = [] | ||
754 | - for r in roles: | ||
755 | - role_objects.append(SemanticRole.objects.get(id=r)) | ||
756 | - if len(role_objects) > 2: | ||
757 | - return False | ||
758 | - ok = False | ||
759 | - for r in role_objects: | ||
760 | - if not r.color == None: | ||
761 | - ok = not ok | ||
762 | - return ok | ||
763 | - | ||
764 | -# preference_id = add_preference(frame_id, complement_id, operation['preference']['type'], operation['preference']['content']) | ||
765 | -def add_preference(frame_id, complement_id, preference_type, preference_content): | ||
766 | - | ||
767 | - complement = Complement.objects.get(id=complement_id) | ||
768 | - if complement.selective_preference is None: | ||
769 | - sp = SelectivePreference() | ||
770 | - sp.save() | ||
771 | - complement.selective_preference = sp | ||
772 | - complement.save() | ||
773 | - | ||
774 | - if preference_type == 'g': | ||
775 | - general = GeneralSelectivePreference.objects.get(id=int(preference_content)) | ||
776 | - complement.selective_preference.generals.add(general) | ||
777 | - return ('g', general.id) | ||
778 | - elif preference_type == 's': | ||
779 | - synset = Synset.objects.get(id=int(preference_content)) | ||
780 | - complement.selective_preference.synsets.add(synset) | ||
781 | - return ('s', synset.id) | ||
782 | - elif preference_type == 'r': | ||
783 | - relation = SelectivePreferenceRelations.objects.get(id=int(preference_content['relation'])) | ||
784 | - argument = [int(a) for a in preference_content['to'].split(',')] | ||
785 | - frame = SemanticFrame.objects.get(id=frame_id) | ||
786 | - candidates = Complement.objects.filter(frame=frame) | ||
787 | - found = None | ||
788 | - for c in candidates: | ||
789 | - if len(c.roles.all()) == len(argument): | ||
790 | - roles = [r.id for r in c.roles.all()] | ||
791 | - ok = True | ||
792 | - for a in argument: | ||
793 | - if a not in roles: | ||
794 | - ok = False | ||
795 | - if ok: | ||
796 | - found = c | ||
797 | - break | ||
798 | - if found is not None: | ||
799 | - rsp = RelationalSelectivePreference(relation=relation, to=found) | ||
800 | - rsp.save() | ||
801 | - complement.selective_preference.relations.add(rsp) | ||
802 | - return ('r', rsp.id) | ||
803 | - else: | ||
804 | - return -1 | ||
805 | - else: | ||
806 | - return -1 | ||
807 | - | ||
808 | -# remove_preference(frame_id, complement_id, preference) | ||
809 | -def remove_preference(frame_id, complement_id, preference): | ||
810 | - preference_type, preference_id = preference | ||
811 | - if preference_type == 'g': | ||
812 | - complement = Complement.objects.get(id=complement_id) | ||
813 | - g = complement.selective_preference.generals.get(id = int(preference_id)) | ||
814 | - complement.selective_preference.generals.remove(g) | ||
815 | - elif preference_type == 's': | ||
816 | - complement = Complement.objects.get(id=complement_id) | ||
817 | - s = complement.selective_preference.synsets.get(id = int(preference_id)) | ||
818 | - complement.selective_preference.synsets.remove(s) | ||
819 | - elif preference_type == 'r': | ||
820 | - complement = Complement.objects.get(id=complement_id) | ||
821 | - r = complement.selective_preference.relations.get(id = int(preference_id)) | ||
822 | - complement.selective_preference.relations.remove(r) | ||
823 | 476 | ||
824 | @ajax(method='get', encode_result=True) | 477 | @ajax(method='get', encode_result=True) |
825 | def ajax_plWN_context_lookup(request, term): | 478 | def ajax_plWN_context_lookup(request, term): |
@@ -843,14 +496,17 @@ def get_ordered_lexical_units_bases(lexical_units_query): | @@ -843,14 +496,17 @@ def get_ordered_lexical_units_bases(lexical_units_query): | ||
843 | @ajax(method='get') | 496 | @ajax(method='get') |
844 | def validate_semantics(request, lemma_id, new_status_id): | 497 | def validate_semantics(request, lemma_id, new_status_id): |
845 | error_msg = '' | 498 | error_msg = '' |
846 | - try: | ||
847 | - status = Lemma_Status.objects.get(id=new_status_id) | ||
848 | - except Lemma_Status.DoesNotExist: | ||
849 | - status = None | ||
850 | - if status and status.check_semantics: | ||
851 | - error_msg = validate_frames(lemma_id) | ||
852 | - if not error_msg: | ||
853 | - error_msg = validate_lexical_units(lemma_id) | ||
854 | - if not error_msg: | ||
855 | - error_msg = validate_schemas(lemma_id) | 499 | + if Lemma.objects.get(id=lemma_id).old: |
500 | + error_msg = u'Odśwież hasło, widoczna wersja nie jest aktualna.' | ||
501 | + else: | ||
502 | + try: | ||
503 | + status = Lemma_Status.objects.get(id=new_status_id) | ||
504 | + except Lemma_Status.DoesNotExist: | ||
505 | + status = None | ||
506 | + if status and status.check_semantics: | ||
507 | + error_msg = validate_frames(lemma_id) | ||
508 | + if not error_msg: | ||
509 | + error_msg = validate_lexical_units(lemma_id) | ||
510 | + if not error_msg: | ||
511 | + error_msg = validate_schemas(lemma_id) | ||
856 | return {'error_message': error_msg} | 512 | return {'error_message': error_msg} |
urls.py
@@ -121,6 +121,8 @@ urlpatterns += patterns('dictionary.ajax_lemma_view', | @@ -121,6 +121,8 @@ urlpatterns += patterns('dictionary.ajax_lemma_view', | ||
121 | url(r'^ajax/user_is_authenticated/$', 'user_is_authenticated'), | 121 | url(r'^ajax/user_is_authenticated/$', 'user_is_authenticated'), |
122 | 122 | ||
123 | url(r'^ajax/deselect_preview_tab/$', 'deselect_preview_tab'), | 123 | url(r'^ajax/deselect_preview_tab/$', 'deselect_preview_tab'), |
124 | + url(r'^ajax/get_schemata/$', 'get_schemata'), | ||
125 | + url(r'^ajax/get_examples/$', 'get_examples'), | ||
124 | 126 | ||
125 | # powiazywanie hasel (nieczasownikowe) | 127 | # powiazywanie hasel (nieczasownikowe) |
126 | url(r'^ajax/relate_entries/$', 'relate_entries'), | 128 | url(r'^ajax/relate_entries/$', 'relate_entries'), |