From 9b0938a7973caa751c7c6bfe521979dc5c82a515 Mon Sep 17 00:00:00 2001
From: dcz <dcz@ipipan.waw.pl>
Date: Tue, 17 Jan 2023 08:49:53 +0100
Subject: [PATCH] Local filters applied for unified frame display.

---
 entries/templates/entries_base.html           | 15 ++++--
 entries/views.py                              | 47 ++++++++++-------
 .../Unification/LexicalUnitEdit.vue           | 50 ++++++++++---------
 .../components/unification/shared/utils.js    | 22 ++++----
 unifier/views.py                              | 28 ++++++++++-
 5 files changed, 104 insertions(+), 58 deletions(-)

diff --git a/entries/templates/entries_base.html b/entries/templates/entries_base.html
index 19bdd4f..3bcc6b7 100644
--- a/entries/templates/entries_base.html
+++ b/entries/templates/entries_base.html
@@ -39,13 +39,20 @@
         <a href="#" class="dropdown-item font-weight-bold text-dark text-uppercase" id="filter-button" data-toggle="modal" data-target="#entry-filters">
             {% trans "Hasła" %}
         </a>
-        <a href="#" class="dropdown-item font-weight-bold text-dark text-uppercase" id="filter-frames-button" data-toggle="modal" data-target="#frame-filters">
-            {% trans "Ramy" %}
-        </a>
         <a href="#" class="dropdown-item font-weight-bold text-dark text-uppercase" id="filter-unified-frames-button" data-toggle="modal" data-target="#unified-frame-filters">
             {% trans "Ramy zunifikowane" %}
         </a>
-        <a href="#" class="dropdown-item font-weight-bold text-dark text-uppercase" id="filter-schemata-button" data-toggle="modal" data-target="#schema-filters">
+    </div>
+</li>
+<li class="nav-item dropdown">
+    <a class="nav-link dropdown-toggle" href="#" id="nav-filters-local" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+        {% trans "Filtrowanie lokalne" %}
+    </a>
+    <div class="dropdown-menu" id="filters-local-visited-dropdown" aria-labelledby="nav-filters-local">
+        <a href="#" class="dropdown-item font-weight-bold text-dark text-uppercase" id="filter-local-frames-button" data-toggle="modal" data-target="#frame-filters-local">
+            {% trans "Ramy" %}
+        </a>
+        <a href="#" class="dropdown-item font-weight-bold text-dark text-uppercase" id="filter-local-schemata-button" data-toggle="modal" data-target="#schema-filters-local">
             {% trans "Schematy" %}
         </a>
     </div>
diff --git a/entries/views.py b/entries/views.py
index 659cfe4..a0c9f1c 100644
--- a/entries/views.py
+++ b/entries/views.py
@@ -854,21 +854,11 @@ def get_entry(request):
                     argument_forms = argument_forms[0]
                     frame_forms += argument_forms2frame_forms(argument_forms)
                 filter_frames = len(frame_forms) > 0
-            
-            
-            local_schema_form = None
-            if apply_filters and 'schema_form' in request.session:
-                errors_dict = dict()
-                local_schema_form = collect_forms(request.session['schema_form'], errors_dict)
-                print(local_schema_form)
-                assert(not errors_dict)
-            
-            local_frame_form = None
-            if apply_filters and 'frame_form' in request.session:
-                errors_dict = dict()
-                local_frame_form = collect_forms(request.session['frame_form'], errors_dict)
-                assert(not errors_dict)
-            
+
+            local_schema_filter_form = get_local_schema_filter_form(apply_filters, request)
+
+            local_frame_filter_form = get_local_frame_filter_form(apply_filters, request)
+
             subentries = []
             all_schema_objects = []
             for subentry in entry.subentries.all():
@@ -877,8 +867,8 @@ def get_entry(request):
                 # filter out schemata by schema properties
                 if filter_schemata:
                     schema_objects = get_filtered_objects2(schema_forms, schema_objects)
-                if local_schema_form:
-                    schema_objects = get_filtered_objects(local_schema_form, schema_objects)
+                if local_schema_filter_form:
+                    schema_objects = get_filtered_objects(local_schema_filter_form, schema_objects)
                 for schema in schema_objects:
                     schemata.append(schema2dict(schema, subentry.negativity, request.LANGUAGE_CODE))
                 if schemata:
@@ -890,8 +880,8 @@ def get_entry(request):
                 frame_objects = get_filtered_objects2(frame_forms, frame_objects)
             if lexical_unit:
                 frame_objects = frame_objects.filter(lexical_units=lexical_unit)
-            if local_frame_form:
-                frame_objects = get_filtered_objects(local_frame_form, frame_objects)
+            if local_frame_filter_form:
+                frame_objects = get_filtered_objects(local_frame_filter_form, frame_objects)
             frames = [frame2dict(frame, entry.lexical_units.all()) for frame in frame_objects]
             alternations, realisation_phrases, realisation_descriptions = get_alternations(all_schema_objects, frame_objects)
             examples = get_examples(entry)
@@ -911,6 +901,25 @@ def get_entry(request):
             return JsonResponse({ 'subentries' : subentries, 'frames' : frames, 'alternations' : alternations, 'realisation_phrases' : realisation_phrases, 'realisation_descriptions' : realisation_descriptions, 'examples' : examples, 'unified_frame': unified_frame, 'last_visited' : request.session['last_visited'] })
     return JsonResponse({})
 
+
+def get_local_frame_filter_form(apply_filters, request):
+    local_frame_form = None
+    if apply_filters and 'frame_form' in request.session:
+        errors_dict = dict()
+        local_frame_form = collect_forms(request.session['frame_form'], errors_dict)
+        assert (not errors_dict)
+    return local_frame_form
+
+
+def get_local_schema_filter_form(apply_filters, request):
+    local_schema_form = None
+    if apply_filters and 'schema_form' in request.session:
+        errors_dict = dict()
+        local_schema_form = collect_forms(request.session['schema_form'], errors_dict)
+        assert (not errors_dict)
+    return local_schema_form
+
+
 '''
 @ajax_required
 def filter_schemata(request):
diff --git a/frontend/src/components/unification/Unification/LexicalUnitEdit.vue b/frontend/src/components/unification/Unification/LexicalUnitEdit.vue
index c8f7d21..9cee053 100644
--- a/frontend/src/components/unification/Unification/LexicalUnitEdit.vue
+++ b/frontend/src/components/unification/Unification/LexicalUnitEdit.vue
@@ -73,7 +73,7 @@ Object.assign(LexicalUnitEdit, {
     },
     async loadFrame() {
       try {
-        const data = {'unified_frame_id': this.unifiedFrameId};
+        const data = {'unified_frame_id': this.unifiedFrameId, 'no_filters' : false};
         $.ajax({
           type: 'post',
           url: '/' + lang + '/unifier/get_unified_frame/',
@@ -423,11 +423,13 @@ Object.assign(LexicalUnitEdit, {
       for (let i in this.unified_frame.slowal_frame_mapping) {
         const slowal_frame_mapping = this.unified_frame.slowal_frame_mapping[i];
         const slowalFrame = this.frames.find(frame => frame.id === slowal_frame_mapping.slowal_frame_id);
-        for (let j in slowal_frame_mapping.slowal_frame_argument_mapping) {
-          const slowal_frame_argument_mapping = slowal_frame_mapping.slowal_frame_argument_mapping[j];
-          if (slowal_frame_argument_mapping.unified_frame_agrument_id == unified_frame_argument.id) {
-            const slowalFrameArgument = slowalFrame.arguments.find(arg => arg.argument_id === slowal_frame_argument_mapping.slowal_frame_agrument_id);
-            slowalFrameArgumentIds.push(slowalFrameArgument);
+        if(slowalFrame != null) {
+          for (let j in slowal_frame_mapping.slowal_frame_argument_mapping) {
+            const slowal_frame_argument_mapping = slowal_frame_mapping.slowal_frame_argument_mapping[j];
+            if (slowal_frame_argument_mapping.unified_frame_agrument_id == unified_frame_argument.id) {
+              const slowalFrameArgument = slowalFrame.arguments.find(arg => arg.argument_id === slowal_frame_argument_mapping.slowal_frame_agrument_id);
+              slowalFrameArgumentIds.push(slowalFrameArgument);
+            }
           }
         }
       }
@@ -854,26 +856,28 @@ Object.assign(LexicalUnitEdit, {
       for (let i in unified_frame.slowal_frame_mapping) {
         const slowal_frame_mapping = unified_frame.slowal_frame_mapping[i];
         let slowal_frame = slowal_frames.find(o => o.id === slowal_frame_mapping.slowal_frame_id);
-        let new_slowal_frame_arguments = [];
-        for (let j in unified_frame.arguments) {
-          const unified_frame_argument = unified_frame.arguments[j];
-          let unified_frame_argument_mapping = slowal_frame_mapping.slowal_frame_argument_mapping.find(o => o.unified_frame_agrument_id === unified_frame_argument.id);
-          let slowal_frame_argument = null;
-          if (unified_frame_argument_mapping == null) {
-            slowal_frame_argument = {
-              'str': 'Empty',
-              'id': slowal_frame.id + '-_' + (unified_frame_argument.id),
-              'role': 'Empty',
-              'role_type': 'Empty',
-              'preferences': [],
-              'proposed_roles': [],
+        if(slowal_frame != null) {
+          let new_slowal_frame_arguments = [];
+          for (let j in unified_frame.arguments) {
+            const unified_frame_argument = unified_frame.arguments[j];
+            let unified_frame_argument_mapping = slowal_frame_mapping.slowal_frame_argument_mapping.find(o => o.unified_frame_agrument_id === unified_frame_argument.id);
+            let slowal_frame_argument = null;
+            if (unified_frame_argument_mapping == null) {
+              slowal_frame_argument = {
+                'str': 'Empty',
+                'id': slowal_frame.id + '-_' + (unified_frame_argument.id),
+                'role': 'Empty',
+                'role_type': 'Empty',
+                'preferences': [],
+                'proposed_roles': [],
+              }
+            } else {
+              slowal_frame_argument = slowal_frame.arguments.find(o => o.argument_id === unified_frame_argument_mapping.slowal_frame_agrument_id);
             }
-          } else {
-            slowal_frame_argument = slowal_frame.arguments.find(o => o.argument_id === unified_frame_argument_mapping.slowal_frame_agrument_id);
+            new_slowal_frame_arguments.push(slowal_frame_argument)
           }
-          new_slowal_frame_arguments.push(slowal_frame_argument)
+          slowal_frame.arguments = new_slowal_frame_arguments;
         }
-        slowal_frame.arguments = new_slowal_frame_arguments;
       }
     }
   },
diff --git a/frontend/src/components/unification/shared/utils.js b/frontend/src/components/unification/shared/utils.js
index cee844c..c6ca4bc 100644
--- a/frontend/src/components/unification/shared/utils.js
+++ b/frontend/src/components/unification/shared/utils.js
@@ -3,20 +3,22 @@ function slowal_frames2selecional_preferencies(unified_frame, slowal_frames) {
   for (let i in unified_frame.slowal_frame_mapping) {
     const slowal_frame_mapping = unified_frame.slowal_frame_mapping[i];
     let slowal_frame = slowal_frames.find(o => o.id === slowal_frame_mapping.slowal_frame_id);
-    for (let j in slowal_frame_mapping.slowal_frame_argument_mapping) {
-      const slowal_frame_argument_mapping = slowal_frame_mapping.slowal_frame_argument_mapping[j];
+    if(slowal_frame != null) {
+      for (let j in slowal_frame_mapping.slowal_frame_argument_mapping) {
+        const slowal_frame_argument_mapping = slowal_frame_mapping.slowal_frame_argument_mapping[j];
 
-      let slowal_frame_argument = slowal_frame.arguments.find(o => o.argument_id === slowal_frame_argument_mapping.slowal_frame_agrument_id);
-      let unified_frame_argument = unified_frame.arguments.find(o => o.id === slowal_frame_argument_mapping.unified_frame_agrument_id);
+        let slowal_frame_argument = slowal_frame.arguments.find(o => o.argument_id === slowal_frame_argument_mapping.slowal_frame_agrument_id);
+        let unified_frame_argument = unified_frame.arguments.find(o => o.id === slowal_frame_argument_mapping.unified_frame_agrument_id);
 
-      const unified_frame_argument_preferences = new Set(unified_frame_argument.preferences.map(preference => preference.str));
+        const unified_frame_argument_preferences = new Set(unified_frame_argument.preferences.map(preference => preference.str));
 
-      let preferenceEntry = unified_argument_2_selecional_preferencies[slowal_frame_argument_mapping.unified_frame_agrument_id];
-      if (preferenceEntry == null) {
-        preferenceEntry = [];
-        unified_argument_2_selecional_preferencies[slowal_frame_argument_mapping.unified_frame_agrument_id] = preferenceEntry
+        let preferenceEntry = unified_argument_2_selecional_preferencies[slowal_frame_argument_mapping.unified_frame_agrument_id];
+        if (preferenceEntry == null) {
+          preferenceEntry = [];
+          unified_argument_2_selecional_preferencies[slowal_frame_argument_mapping.unified_frame_agrument_id] = preferenceEntry
+        }
+        preferenceEntry.push.apply(preferenceEntry, slowal_frame_argument.preferences.filter(preference => !unified_frame_argument_preferences.has(preference.str)))
       }
-      preferenceEntry.push.apply(preferenceEntry, slowal_frame_argument.preferences.filter(preference => !unified_frame_argument_preferences.has(preference.str)))
     }
   }
   return unified_argument_2_selecional_preferencies;
diff --git a/unifier/views.py b/unifier/views.py
index 51a14be..1c842b1 100644
--- a/unifier/views.py
+++ b/unifier/views.py
@@ -1,5 +1,6 @@
 import json
 import requests
+import simplejson
 from django.contrib.auth.decorators import login_required
 from django.db import transaction
 from django.http import JsonResponse, HttpResponse
@@ -9,7 +10,7 @@ from django.views.decorators.csrf import csrf_exempt
 from common.decorators import ajax_required, ajax
 from entries.polish_strings import EXAMPLE_SOURCE, EXAMPLE_OPINION
 from entries.views import get_scroller_params, get_alternations, get_prefs_list, schema2dict, frame2dict, collect_forms, \
-    get_filtered_objects
+    get_filtered_objects, get_local_schema_filter_form, get_local_frame_filter_form
 from importer.unification.UnificationPreprocessXML import UnificationPreprocessHandler
 from meanings.models import LexicalUnit
 from semantics.choices import FrameStatus
@@ -90,6 +91,17 @@ def get_unified_frames(request):
         else:
             unifiedFrames = UnifiedFrame.objects.all();
 
+        # TODO: zapytać, czy mamy zaciągać powiązane ramy zunifikowane poprzez Enrty (slowal_frame -> lexical_units -> entries -> related_entries)
+        # linked_ids = set()
+        # if request.session['show_linked_entries']:
+        #     entries_linked = Entry.objects.filter(pk__in=(
+        #         Entry.objects
+        #             .filter(subentries__schema_hooks__argument_connections__schema_connections__subentry__entry__in=entries)
+        #             .exclude(id__in=entries)
+        #     )).distinct()
+        #     entries = entries | entries_linked
+        #     linked_ids = set(entries_linked.values_list('id', flat=True))
+
         res = {}
 
         for unifiedFrame in unifiedFrames:
@@ -193,10 +205,22 @@ def get_examples(frames):
 
 def get_unified_frame_json(unifiedFrame, request):
 
-    slowal_frames = [connection.slowal_frame for connection in unifiedFrame.unified_frame_2_slowal_frame.all()]
+    apply_filters = not simplejson.loads(request.POST['no_filters'])
+    local_schema_filter_form = get_local_schema_filter_form(apply_filters, request)
+    local_frame_filter_form = get_local_frame_filter_form(apply_filters, request)
+
+    slowal_frames_db = Frame.objects.filter(id__in=unifiedFrame.unified_frame_2_slowal_frame.values("slowal_frame_id")).distinct()
+
+    if local_frame_filter_form:
+        slowal_frames_db = get_filtered_objects(local_frame_filter_form, slowal_frames_db)
+
+    slowal_frames = slowal_frames_db.all()
 
     all_schema_objects = Schema.objects.filter(schema_hooks__argument_connections__argument__frame__in=slowal_frames).distinct()
 
+    if local_schema_filter_form:
+        all_schema_objects = get_filtered_objects(local_schema_filter_form, all_schema_objects)
+
     slowal_frames_dict = []
     for slowal_frame in slowal_frames:
         dict = frame2dict(slowal_frame, slowal_frame.lexical_units.all())
-- 
GitLab