Commit ac9edb28faff6c08c15ecfcdf126a181f4d35b77

Authored by Bartłomiej Nitoń
1 parent 09020185

Added multi positions message in syntactic validation.

common/js_to_obj.py
@@ -43,7 +43,8 @@ def jsFrameToObj(frame, lemma_entry): @@ -43,7 +43,8 @@ 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 + position['id'] = pos_obj.id
47 48
48 sorted_positions = [] 49 sorted_positions = []
49 sorted_pos_dict = sortPositions(positions_objs) 50 sorted_pos_dict = sortPositions(positions_objs)
dictionary/ajax_lemma_view.py
@@ -59,7 +59,7 @@ from dictionary.validation import find_similar_frames, get_all_test_missing_fram @@ -59,7 +59,7 @@ from dictionary.validation import find_similar_frames, get_all_test_missing_fram
59 get_wrong_aspect_frames, validate_B_frames, get_deriv_miss_frames_message, \ 59 get_wrong_aspect_frames, validate_B_frames, get_deriv_miss_frames_message, \
60 validate_phraseology_binded_frames, validate_rule_5, \ 60 validate_phraseology_binded_frames, validate_rule_5, \
61 validate_examples_and_mark_errors, validate_schemas_and_mark_errors, \ 61 validate_examples_and_mark_errors, validate_schemas_and_mark_errors, \
62 - get_missing_aspects_msg 62 + get_missing_aspects_msg, validate_same_positions_schemata
63 63
64 from semantics.models import LexicalUnitExamples 64 from semantics.models import LexicalUnitExamples
65 65
@@ -2650,6 +2650,7 @@ def validate_new_frames(request, data, id, examples, lemma_examples, @@ -2650,6 +2650,7 @@ def validate_new_frames(request, data, id, examples, lemma_examples,
2650 message_content += u'\t- %s\n' % (miss_frame.text_rep) 2650 message_content += u'\t- %s\n' % (miss_frame.text_rep)
2651 message_content += '\n' 2651 message_content += '\n'
2652 message_content += deriv_miss_frames_msg 2652 message_content += deriv_miss_frames_msg
  2653 + message_content += validate_same_positions_schemata(old_object)
2653 frames_to_merge = find_similar_frames(old_object.frames.all()) 2654 frames_to_merge = find_similar_frames(old_object.frames.all())
2654 if len(frames_to_merge) > 0: 2655 if len(frames_to_merge) > 0:
2655 message_content += u'Sugerowane jest połączenie poniższych schematów, zawierają one często koordynujące się typy fraz:\n' 2656 message_content += u'Sugerowane jest połączenie poniższych schematów, zawierają one często koordynujące się typy fraz:\n'
dictionary/saving.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 2
3 from common.js_to_obj import jsPosToObj 3 from common.js_to_obj import jsPosToObj
4 -from dictionary.models import Argument 4 +from dictionary.models import Argument, Position
5 from semantics.models import Complement, LexicalUnitExamples 5 from semantics.models import Complement, LexicalUnitExamples
6 from semantics.saving import modify_frames, update_meanings 6 from semantics.saving import modify_frames, update_meanings
7 from wordnet.models import LexicalUnit 7 from wordnet.models import LexicalUnit
@@ -21,7 +21,8 @@ def get_semantic_operations(lemma, schemata_conversions): @@ -21,7 +21,8 @@ def get_semantic_operations(lemma, schemata_conversions):
21 def get_reconnect_operations_and_extend_connections(connections, schema, js_schema): 21 def get_reconnect_operations_and_extend_connections(connections, schema, js_schema):
22 operations = [] 22 operations = []
23 for js_position in js_schema['positions']: 23 for js_position in js_schema['positions']:
24 - position = jsPosToObj(js_position) 24 + #position = jsPosToObj(js_position)
  25 + position = schema.positions.get(id=js_position['id'])
25 for js_phrase_type in js_position['arguments']: 26 for js_phrase_type in js_position['arguments']:
26 phrase_type = Argument.objects.get(id=js_phrase_type['id']) 27 phrase_type = Argument.objects.get(id=js_phrase_type['id'])
27 new_connection_target = {'schema': schema, 28 new_connection_target = {'schema': schema,
@@ -46,10 +47,11 @@ def reconnect_operations(connection, new_target): @@ -46,10 +47,11 @@ def reconnect_operations(connection, new_target):
46 realization = compl.realizations.get(id=real_id) 47 realization = compl.realizations.get(id=real_id)
47 old_phrase_type_ref = create_phrase_type_ref(realization.frame, realization.position, 48 old_phrase_type_ref = create_phrase_type_ref(realization.frame, realization.position,
48 realization.argument, realization.alternation) 49 realization.argument, realization.alternation)
49 - operations.append(create_operation('disconnect', arg_ref, old_phrase_type_ref))  
50 new_phrase_type_ref = create_phrase_type_ref(new_target['schema'], new_target['position'], 50 new_phrase_type_ref = create_phrase_type_ref(new_target['schema'], new_target['position'],
51 new_target['phrase_type'], realization.alternation) 51 new_target['phrase_type'], realization.alternation)
52 - operations.append(create_operation('connect', arg_ref, new_phrase_type_ref)) 52 + if new_phrase_type_ref != old_phrase_type_ref:
  53 + operations.append(create_operation('disconnect', arg_ref, old_phrase_type_ref))
  54 + operations.append(create_operation('connect', arg_ref, new_phrase_type_ref))
53 return operations 55 return operations
54 56
55 def create_argument_ref(complement): 57 def create_argument_ref(complement):
dictionary/static/js/argument_form_utils.js
@@ -11,14 +11,14 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND @@ -11,14 +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, complements) 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.complements = complements; 21 + this.connections = connections;
22 } 22 }
23 23
24 function arguments_form_change(lastActualValueIdx, arg_id, this_form, lemma_id) { 24 function arguments_form_change(lastActualValueIdx, arg_id, this_form, lemma_id) {
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,
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))
@@ -114,6 +119,12 @@ class Complement(models.Model): # pola z ramki @@ -114,6 +119,12 @@ class Complement(models.Model): # pola z ramki
114 # realizacje tego argumentu w schematach składniowych 119 # realizacje tego argumentu w schematach składniowych
115 realizations = models.ManyToManyField(FramePosition) 120 realizations = models.ManyToManyField(FramePosition)
116 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 +
117 def __unicode__(self): 128 def __unicode__(self):
118 return u'%d:%s' % (self.id, self.roles.all()) 129 return u'%d:%s' % (self.id, self.roles.all())
119 130
semantics/validation.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
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
@@ -21,7 +21,7 @@ def frame_valid(lemma, frame, actual_frames): @@ -21,7 +21,7 @@ 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 opinion_selected(frame): 24 + elif not frame.opinion_selected():
25 error_msg = u'Semantyka: Rama semantyczna %d nie ma wybranej opinii.' % frame.id 25 error_msg = u'Semantyka: Rama semantyczna %d nie ma wybranej opinii.' % frame.id
26 elif not roles_unique(complements): 26 elif not roles_unique(complements):
27 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
@@ -44,11 +44,6 @@ def frame_valid(lemma, frame, actual_frames): @@ -44,11 +44,6 @@ def frame_valid(lemma, frame, actual_frames):
44 def arguments_exists(complements): 44 def arguments_exists(complements):
45 return complements.exists() 45 return complements.exists()
46 46
47 -def opinion_selected(frame):  
48 - if not frame.opinion:  
49 - return False  
50 - return True  
51 -  
52 def roles_unique(complements): 47 def roles_unique(complements):
53 roles = set() 48 roles = set()
54 for complement in complements: 49 for complement in complements:
@@ -69,7 +64,9 @@ def arguments_pinned(complements): @@ -69,7 +64,9 @@ def arguments_pinned(complements):
69 64
70 def preferences_selected(complements): 65 def preferences_selected(complements):
71 for complement in complements: 66 for complement in complements:
72 - if not preference_valid(complement): 67 + if complement.realizations.exists() and complement.has_only_phraseologic_realizations():
  68 + pass
  69 + elif not preference_valid(complement):
73 return False 70 return False
74 return True 71 return True
75 72