From af109359c1ed794df345c881f3123e3700fd6531 Mon Sep 17 00:00:00 2001
From: dcz <dcz@ipipan.waw.pl>
Date: Thu, 21 Sep 2023 18:17:01 +0200
Subject: [PATCH] Bugfix: swap arguments when onr is empty. Predefined
 selectional preference hierarchy check.

---
 .../Unification/LexicalUnitEdit.vue           | 10 +-
 .../Unification/SelectionalPreference.js      | 93 ++++++++++---------
 unifier/views.py                              | 65 ++++++++-----
 3 files changed, 98 insertions(+), 70 deletions(-)

diff --git a/frontend/src/components/unification/Unification/LexicalUnitEdit.vue b/frontend/src/components/unification/Unification/LexicalUnitEdit.vue
index fc30aba..28b8106 100644
--- a/frontend/src/components/unification/Unification/LexicalUnitEdit.vue
+++ b/frontend/src/components/unification/Unification/LexicalUnitEdit.vue
@@ -636,11 +636,15 @@ Object.assign(LexicalUnitEdit, {
       }
     },
     change_slowal2unified_frame_argument_mapping(slowal_frame) {
-      if (slowal_frame === this.active_slowal_frame && this.selectedFrameArguments && this.selectedFrameArguments.length == 2) {
+      if (this.active_slowal_frame === null) {
+        alert(gettext("Zamiany pozycji argumentów w ramie wymaga wybrania ramy."));
+      } else if (slowal_frame !== this.active_slowal_frame) {
+        alert(gettext("Zamiany pozycji argumentów w ramie jest możliwa tylko dla wskazanej wczesniej ramy."));
+      } else if (this.selectedFrameArguments && this.selectedFrameArguments.length == 2) {
         const data = {
           'unified_frame_id': this.unified_frame.id,
           'slowal_frame_id': slowal_frame.id,
-          'slowal_frame_selected_arguments': JSON.stringify(this.selectedFrameArguments.map(arg => arg.argument_id))
+          'slowal_frame_selected_arguments': JSON.stringify(this.selectedFrameArguments.map(arg => arg.argument_id ? arg.argument_id : -arg.unified_frame_argument_id)),
         };
         $.ajax({
           type: 'post',
@@ -937,6 +941,7 @@ Object.assign(LexicalUnitEdit, {
             if (unified_frame_argument_mapping == null) {
               slowal_frame_argument = {
                 'str': 'Empty',
+                'unified_frame_argument_id': unified_frame_argument.id,
                 'id': slowal_frame.id + '-_' + (unified_frame_argument.id),
                 'role': 'Empty',
                 'role_type': 'Empty',
@@ -945,6 +950,7 @@ Object.assign(LexicalUnitEdit, {
               }
             } else {
               slowal_frame_argument = slowal_frame.arguments.find(o => o.argument_id === unified_frame_argument_mapping.slowal_frame_agrument_id);
+              slowal_frame_argument['unified_frame_argument_id'] = unified_frame_argument.id;
             }
             new_slowal_frame_arguments.push(slowal_frame_argument)
           }
diff --git a/frontend/src/components/unification/Unification/SelectionalPreference.js b/frontend/src/components/unification/Unification/SelectionalPreference.js
index 46d1485..3adb76a 100644
--- a/frontend/src/components/unification/Unification/SelectionalPreference.js
+++ b/frontend/src/components/unification/Unification/SelectionalPreference.js
@@ -311,38 +311,34 @@ export default class SelectionalPreference {
       'complement_id': complement_id,
       'synset_preference_id': synset_preference_id
     };
-    $.ajax({
-      type: 'post',
-      url: '/' + lang + '/unifier/save_synset_preference/',
-      dataType: 'json',
-      data: data,
-      timeout: 60000,
-      success: function (response) {
-        const succ = response.succ;
-        if(succ) {
-          show_info('Preferencja zosała zapisana');
-        } else {
-          const conflict_hyponym = response.conflict_hyponym;
-          const conflict_hyperonym = response.conflict_hyperonym;
-          let typeStr = 'hiponimii';
-          if(conflict_hyperonym != null){
-            typeStr = 'hieronimii';
-          }
-          let errorStr = conflict_hyponym;
-          if(conflict_hyperonym != null){
-            errorStr = conflict_hyperonym;
+
+    send_post_request('/unifier/save_synset_preference/',
+        data,
+        (response) => {
+          const succ = response.succ;
+          if(succ) {
+            show_info('Preferencja zosała zapisana');
+          } else {
+            const conflict_hyponym = response.conflict_hyponym;
+            const conflict_hyperonym = response.conflict_hyperonym;
+            let typeStr = 'hiponimii';
+            if(conflict_hyperonym != null){
+              typeStr = 'hieronimii';
+            }
+            let errorStr = conflict_hyponym;
+            if(conflict_hyperonym != null){
+              errorStr = conflict_hyperonym;
+            }
+            alert('Wybrana preferencja selekcyjna nie mogła zostać zapisana ponieważ wystąpił konflikt w relacji ' +
+                typeStr +
+                ' z istniejÄ…cÄ… preferencjÄ… selekcyjnÄ…: ' +
+                errorStr)
+            show_info('Preferencja nie zosała zapisana. Wystąpił konflikt w hierarchii ontologicznej.');
           }
-          alert('Wybrana preferencja selekcyjna nie mogła zostać zapisana ponieważ wystąpił konflikt w relacji ' +
-              typeStr +
-              ' z istniejÄ…cÄ… preferencjÄ… selekcyjnÄ…: ' +
-              errorStr)
-          show_info('Preferencja nie zosała zapisana. Wystąpił konflikt w hierarchii ontologicznej.');
-        }
-      },
-      error: function (request, errorType, errorMessage) {
-        show_error(errorType + ' (' + errorMessage + ')');
-      }
-    });
+        },
+        (request, errorType, errorMessage) => {
+          show_error(errorType + ' (' + errorMessage + ')');
+        })
   }
 
   savePredefinedPreference(frame_id, complement_id, predefined_preference_id) {
@@ -355,25 +351,30 @@ export default class SelectionalPreference {
     send_post_request('/unifier/save_predefined_preference/',
         data,
         (response) => {
-          show_info('Preferencja zosała zapisana');
+          const succ = response.succ;
+          if(succ) {
+            show_info('Preferencja zosała zapisana');
+          } else {
+            const conflict_hyponym = response.conflict_hyponym;
+            const conflict_hyperonym = response.conflict_hyperonym;
+            let typeStr = 'hiponimii';
+            if (conflict_hyperonym != null) {
+              typeStr = 'hieronimii';
+            }
+            let errorStr = conflict_hyponym;
+            if (conflict_hyperonym != null) {
+              errorStr = conflict_hyperonym;
+            }
+            alert('Wybrana preferencja selekcyjna nie mogła zostać zapisana ponieważ wystąpił konflikt w relacji ' +
+                typeStr +
+                ' z istniejÄ…cÄ… preferencjÄ… selekcyjnÄ…: ' +
+                errorStr)
+            show_info('Preferencja nie zosała zapisana. Wystąpił konflikt w hierarchii ontologicznej.');
+          }
         },
         (request, errorType, errorMessage) => {
           show_error(errorType + ' (' + errorMessage + ')');
         })
-
-    // $.ajax({
-    //   type: 'post',
-    //   url: '/' + lang + '/unifier/save_predefined_preference/',
-    //   dataType: 'json',
-    //   data: data,
-    //   timeout: 60000,
-    //   success: function (response) {
-    //     show_info('Preferencja zosała zapisana');
-    //   },
-    //   error: function (request, errorType, errorMessage) {
-    //     show_error(errorType + ' (' + errorMessage + ')');
-    //   }
-    // });
   }
 
   saveRelationalSelectionalPreference(frame_id, complement_id_from, complement_id_to, relation_id) {
diff --git a/unifier/views.py b/unifier/views.py
index 99c2add..959b0e2 100644
--- a/unifier/views.py
+++ b/unifier/views.py
@@ -15,7 +15,8 @@ from financial_settlement.models import FinStatement
 from importer.unification.UnificationPreprocessXML import UnificationPreprocessHandler
 from meanings.models import LexicalUnit
 from semantics.choices import FrameStatus
-from semantics.models import Frame, ArgumentRole, SemanticRole, RoleAttribute, RoleType, RoleSubAttribute
+from semantics.models import Frame, ArgumentRole, SemanticRole, RoleAttribute, RoleType, RoleSubAttribute, \
+    PredefinedSelectionalPreference
 from syntax.models import Schema
 from unifier.models import UnifiedFrameArgument, UnifiedRelationalSelectionalPreference, UnifiedFrame, \
     UnifiedFrame2SlowalFrameMapping, UnifiedFrameArgumentSlowalFrameMapping, HierarchyModel
@@ -57,33 +58,45 @@ def save_synset_preference(request):
 
         unified_frame_argument = UnifiedFrameArgument.objects.get(unified_frame_id=int(frame_id), id=int(complement_id))
 
-        synset_ids_map = map(lambda s: s.id, unified_frame_argument.synsets.all())
+        check_sysnet_hierarchy_constraints_ret = check_sysnet_hierarchy_constraints([synset_preference_id], unified_frame_argument)
 
-        predefined_synset_ids = []
-        get_predefined_preference_synsets(unified_frame_argument.predefined.all(), predefined_synset_ids)
-
-        synset_ids_list = list(synset_ids_map)
-        synset_ids_list.extend(predefined_synset_ids)
-
-        conflict_hyponym, conflict_hyperonym = synset_hierarchy_constraint_check(int(synset_preference_id), set(synset_ids_list))
-
-        if conflict_hyponym is None and conflict_hyperonym is None:
+        if check_sysnet_hierarchy_constraints_ret['succ'] is True:
             unified_frame_argument.synsets.add(int(synset_preference_id))
             unified_frame_argument.save()
             update_argument_preferences_count(unified_frame_argument)
-            return JsonResponse({"succ": True})
-        else:
-            conflict_hyponym_lu = LexicalUnit.objects.filter(synset_id=conflict_hyponym) if conflict_hyponym is not None else None
-            conflict_hyperonym_lu = LexicalUnit.objects.filter(synset_id=conflict_hyperonym) if conflict_hyperonym is not None else None
 
-            conflict_hyponym_lu_str = ','.join(map(lambda s: str(s), conflict_hyponym_lu.all())) if conflict_hyponym is not None else None
-            conflict_hyperonym_lu_str = ','.join(map(lambda s: str(s), conflict_hyperonym_lu.all())) if conflict_hyperonym is not None else None
-
-            return JsonResponse({"succ": False, "conflict_hyponym": conflict_hyponym_lu_str, "conflict_hyperonym": conflict_hyperonym_lu_str})
+        return JsonResponse(check_sysnet_hierarchy_constraints_ret)
 
     return JsonResponse({})
 
 
+def check_sysnet_hierarchy_constraints(synset_preference_ids, unified_frame_argument):
+    synset_ids_map = map(lambda s: s.id, unified_frame_argument.synsets.all())
+    predefined_synset_ids = []
+    get_predefined_preference_synsets(unified_frame_argument.predefined.all(), predefined_synset_ids)
+    synset_ids_list = list(synset_ids_map)
+    synset_ids_list.extend(predefined_synset_ids)
+
+    for synset_preference_id in synset_preference_ids:
+        conflict_hyponym, conflict_hyperonym = synset_hierarchy_constraint_check(int(synset_preference_id),
+                                                                                 set(synset_ids_list))
+        if conflict_hyponym is not None or conflict_hyperonym is not None:
+            conflict_hyponym_lu = LexicalUnit.objects.filter(
+                synset_id=conflict_hyponym) if conflict_hyponym is not None else None
+            conflict_hyperonym_lu = LexicalUnit.objects.filter(
+                synset_id=conflict_hyperonym) if conflict_hyperonym is not None else None
+
+            conflict_hyponym_lu_str = ','.join(
+                map(lambda s: str(s), conflict_hyponym_lu.all())) if conflict_hyponym is not None else None
+            conflict_hyperonym_lu_str = ','.join(
+                map(lambda s: str(s), conflict_hyperonym_lu.all())) if conflict_hyperonym is not None else None
+
+            return {"succ": False, "conflict_hyponym": conflict_hyponym_lu_str,
+                                   "conflict_hyperonym": conflict_hyperonym_lu_str}
+
+    return {"succ": True}
+
+
 @ajax_required
 @transaction.atomic
 def save_predefined_preference(request):
@@ -93,10 +106,18 @@ def save_predefined_preference(request):
         predefined_preference_id = request.POST['predefined_preference_id']
 
         unified_frame_argument = UnifiedFrameArgument.objects.get(unified_frame_id=int(frame_id), id=int(complement_id))
-        unified_frame_argument.predefined.add(int(predefined_preference_id))
-        unified_frame_argument.save()
 
-        update_argument_preferences_count(unified_frame_argument)
+        predefined_synset_ids = []
+        get_predefined_preference_synsets([PredefinedSelectionalPreference.objects.get(id=predefined_preference_id)], predefined_synset_ids)
+
+        check_sysnet_hierarchy_constraints_ret = check_sysnet_hierarchy_constraints(predefined_synset_ids, unified_frame_argument)
+
+        if check_sysnet_hierarchy_constraints_ret['succ'] is True:
+            unified_frame_argument.predefined.add(int(predefined_preference_id))
+            unified_frame_argument.save()
+            update_argument_preferences_count(unified_frame_argument)
+
+        return JsonResponse(check_sysnet_hierarchy_constraints_ret)
 
     return JsonResponse({})
 
-- 
GitLab