From 3a46882dcfadf1a3063ac6a2c4ae7980a761b4b1 Mon Sep 17 00:00:00 2001
From: dcz <dcz@ipipan.waw.pl>
Date: Thu, 7 Jul 2022 19:09:23 +0200
Subject: [PATCH] Change statuses bugfix.

---
 .environment-dev                              |  2 +-
 .../js/components/LexicalUnitDisplay.js       | 44 ++++++++++---------
 .../entries/js/components/LexicalUnitEdit.js  | 21 ++++-----
 .../js/components/UnificationEntriesList.js   |  3 +-
 importer/WalentyXML.py                        |  5 ++-
 reset_db.sh                                   |  1 -
 semantics/choices.py                          |  2 +
 semantics/urls.py                             |  4 ++
 semantics/views.py                            | 44 ++++++++++++++++++-
 syntax/management/commands/import_tei.py      |  4 +-
 users/models.py                               |  6 +++
 11 files changed, 96 insertions(+), 40 deletions(-)

diff --git a/.environment-dev b/.environment-dev
index d92b941..0a39c2a 100644
--- a/.environment-dev
+++ b/.environment-dev
@@ -1,4 +1,4 @@
-ALLOWED_HOSTS=localhost,127.0.0.1
+ALLOWED_HOSTS=localhost,127.0.0.1,10.1.49.248
 DATABASE_HOST=shellvalier-postgresql
 DATABASE_NAME=shellvalier
 DATABASE_PASSWORD=shellvalier
diff --git a/entries/static/entries/js/components/LexicalUnitDisplay.js b/entries/static/entries/js/components/LexicalUnitDisplay.js
index f64ba1a..f975605 100644
--- a/entries/static/entries/js/components/LexicalUnitDisplay.js
+++ b/entries/static/entries/js/components/LexicalUnitDisplay.js
@@ -14,14 +14,6 @@ export default {
     goToEdit (unifiedFrameId, entryId, lexicalUnitId) {
       window.location = `/${lang}/entries/unification?unified_frame_id=${unifiedFrameId}&entry_id=${entryId}&lexical_unit_id=${lexicalUnitId}`;
     },
-    markAsInvalid () {
-      $.ajax({
-        type: 'post',
-        url: `/${lang}/semantics/frame_mark_as_invalid/${this.frame.id}/`,
-        dataType: 'json',
-        timeout: 60000,
-      }).then(() => { this.setup(); this.$emit('refreshEntriesList'); });
-    },
     take () {
       $.ajax({
         type     : 'post',
@@ -37,21 +29,31 @@ export default {
         }
       });
     },
-    confirmInvalid () {
+    statusChange(api_method) {
       $.ajax({
         type: 'post',
-        url: `/${lang}/semantics/frame_confirm_invalid/${this.frame.id}/`,
+        url: `/${lang}/semantics/${api_method}/${this.frame.id}/`,
         dataType: 'json',
         timeout: 60000,
       }).then(() => { this.setup(); this.$emit('refreshEntriesList'); });
     },
+    markAsInvalid () {
+      this.statusChange('frame_mark_as_invalid');
+    },
+    markAsBad () {
+      this.statusChange('frame_mark_as_bad');
+    },
+    confirmInvalid () {
+      this.statusChange('frame_confirm_invalid');
+    },
+    frame_confirm_as_not_matching_unified_frame () {
+      this.statusChange('frame_confirm_as_not_matching_unified_frame');
+    },
     rejectInvalid () {
-      $.ajax({
-        type: 'post',
-        url: `/${lang}/semantics/frame_reject_invalid/${this.frame.id}/`,
-        dataType: 'json',
-        timeout: 60000,
-      }).then(() => { this.setup(); this.$emit('refreshEntriesList'); });
+      this.statusChange('frame_reject_invalid');
+    },
+    frame_reject_as_not_matching_unified_frame () {
+      this.statusChange('frame_reject_as_not_matching_unified_frame');
     },
     isReadyToProcess () {
       return (!this.isLeksykograf() && this.unifiedFrame?.status === 'G') || (this.isLeksykograf() && this.frame?.status === 'O');
@@ -97,7 +99,7 @@ export default {
       <div id="semantics-frames"></div>
       <div class="text-center mb-3">
         <div>
-          <a class="btn btn-sm btn-outline-dark mr-2" v-if="frame?.status === 'N'" @click="markAsInvalid">{{ !isLeksykograf() ? gettext('Zła') : gettext('Błędna') }}</a>
+          <a class="btn btn-sm btn-outline-dark mr-2" v-if="frame?.status === 'N'" @click="isLeksykograf() ? markAsInvalid() : markAsBad()">{{ !isLeksykograf() ? gettext('Zła') : gettext('Błędna') }}</a>
           <a class="btn btn-sm btn-outline-dark mr-2" v-if="isReadyToGet() && unifiedFrame === null" @click="take">{{ gettext('Pobierz') }}</a>
           <a
             class="btn btn-sm btn-outline-dark mr-2"
@@ -115,15 +117,15 @@ export default {
           </a>
           <a
             class="btn btn-sm btn-outline-dark mr-2"
-            v-if="(frame?.status === 'B' || frame?.status === 'Z') && hasPermission('semantics.manage_invalid_lexical_units')"
-            @click="confirmInvalid"
+            v-if="(frame?.status === 'B' || frame?.status === 'C') && hasPermission('semantics.manage_invalid_lexical_units')"
+            @click="frame?.status === 'C' ? frame_confirm_as_not_matching_unified_frame() : confirmInvalid()"
           >
             {{ gettext('Potwierdź') }}
           </a>
           <a
             class="btn btn-sm btn-outline-dark mr-2"
-            v-if="frame?.status === 'B' && hasPermission('semantics.manage_invalid_lexical_units')"
-            @click="rejectInvalid"
+            v-if="(frame?.status === 'B' || frame?.status === 'C') && hasPermission('semantics.manage_invalid_lexical_units')"
+            @click="frame?.status === 'C' ? frame_reject_as_not_matching_unified_frame() : rejectInvalid()"
           >
             {{ gettext('Odrzuć') }}
           </a>
diff --git a/entries/static/entries/js/components/LexicalUnitEdit.js b/entries/static/entries/js/components/LexicalUnitEdit.js
index 1439170..12ef716 100644
--- a/entries/static/entries/js/components/LexicalUnitEdit.js
+++ b/entries/static/entries/js/components/LexicalUnitEdit.js
@@ -625,6 +625,8 @@ Object.assign(LexicalUnitEdit, {
             show_error(errorType + ' (' + errorMessage + ')');
           }
         });
+      } else {
+        alert(gettext("Zamiany pozycji argumentu w ramie wymaga zaznaczenia dokładnie 2 argumentów."));
       }
     },
     isSuperLeksykograf() {
@@ -698,7 +700,7 @@ Object.assign(LexicalUnitEdit, {
       });
     },
     isFrameVisible(status) {
-      return (status != 'B' && status != 'Z') || this.isSuperLeksykograf();
+      return (status != 'B' && status != 'C') || this.isSuperLeksykograf();
     },
     changeStatusButtonTitleToDefault() {
       const isSuperLeksykograf = this.isSuperLeksykograf();
@@ -946,27 +948,22 @@ Object.assign(LexicalUnitEdit, {
       <div id="semantics-slowal-frames-pane" class="col w-100 p-0 overflow-auto">
         <table v-if="!readOnly && unified_frame.id" class="table-button-menu sticky-top" cellspacing="1">
           <tr style="background-color: white;">
-            <td id="wrong-frame" style="padding: 10px 15px 10px 15px; color: #000000;" @click="change_slowal_frame_status('Z')">Błędna</td>
-            <td
-              style="padding: 10px 15px 10px 15px; color: #000000;"
-            >
-              Rozdziel
-            </td>
-            <td id="hide-slowal-frame" style="padding: 10px 15px 10px 15px; color: #000000;"  @click="changeShowVerifiedFrames(false)">Ukryj</td>
+            <td id="wrong-frame" style="padding: 10px 15px 10px 15px; color: #000000;" @click="change_slowal_frame_status('B')">Błędna</td>
+            <td id="hide-slowal-frame" style="padding: 10px 15px 10px 15px; color: #000000;"  @click="changeShowVerifiedFrames(false)">Ukryj gotowe</td>
             <td id="ready-slowal-frame" style="padding: 10px 15px 10px 15px; color: #000000;" @click="slowal_frame_ready_rollback">{{ statusButtonTitle }}</td>
             <td id="filter-slowal-frames" style="padding: 10px 15px 10px 15px; color: #000000;">Filtruj</td>
           </tr>
           <tr style="background-color: white;">
-            <td id="inccorect-slowal-frame" style="padding: 10px 15px 10px 15px; color: #000000;" @click="change_slowal_frame_status('B')">
+            <td id="inccorect-slowal-frame" style="padding: 10px 15px 10px 15px; color: #000000;" @click="change_slowal_frame_status('C')">
                 NiepasujÄ…ca
             </td>
+            <td id="show-slowal-frame" style="padding: 10px 15px 10px 15px; color: #000000;" @click="changeShowVerifiedFrames(true)">
+                Pokaż wszystkie
+            </td>
             <td id="move-slowal-frame" style="padding: 10px 15px 10px 15px; color: #000000;"
                 @click="extract_frame_to_preview_frame()">
                 Przerzuć
             </td>
-            <td id="show-slowal-frame" style="padding: 10px 15px 10px 15px; color: #000000;" @click="changeShowVerifiedFrames(true)">
-                Pokaż
-            </td>
             <td id="reollback-slowal-frame" style="padding: 10px 15px 10px 15px; color: #000000;">
                 Przywróć
             </td>
diff --git a/entries/static/entries/js/components/UnificationEntriesList.js b/entries/static/entries/js/components/UnificationEntriesList.js
index 8a0b452..5bec789 100644
--- a/entries/static/entries/js/components/UnificationEntriesList.js
+++ b/entries/static/entries/js/components/UnificationEntriesList.js
@@ -20,12 +20,11 @@ export default {
     return {
       gettext: window.gettext,
       canViewAssignment: has_permission("users.view_assignment"),
-      datatableObject: Object,
     }
   },
   emits: ['lexicalUnitSelected'],
   mounted () {
-    this.datatableObject = setup_entries_list({
+    setup_entries_list({
       table: this.$refs.table,
       lexicalUnitSelected: (entryId, lexicalUnitId) => { this.$emit('lexicalUnitSelected', entryId, lexicalUnitId); },
       selectEntryId: this.initialEntryId
diff --git a/importer/WalentyXML.py b/importer/WalentyXML.py
index 189910e..4978ae4 100644
--- a/importer/WalentyXML.py
+++ b/importer/WalentyXML.py
@@ -75,7 +75,10 @@ class WalentyTeiHandler(handler.ContentHandler):
                 base = self._subtree._children[0]._children[0]._content
                 try:
                     entry = Entry(self._subtree, self._entry_meanings, self._meanings, self._frames, self._examples_in, self._examples_out, self._misconnected_out)
-                    entry.store(self._meanings, self._stored_positions)
+                    if entry._status == '(S) sprawdzone' or entry._status == '(S) gotowe':
+                        entry.store(self._meanings, self._stored_positions)
+                    else:
+                        print("Odrzucono niegotowe: {}, status: {}".format(entry._base, entry._status))
                 except Exception as e:
                     #raise
                     traceback.print_exc()
diff --git a/reset_db.sh b/reset_db.sh
index 1e129cc..db53290 100755
--- a/reset_db.sh
+++ b/reset_db.sh
@@ -18,7 +18,6 @@ time python manage.py start_import
 time python manage.py import_expansions
 time python manage.py import_plWordnet
 time python manage.py import_tei
-time python manage.py import_unification
 
 head import.log
 wc import.log
diff --git a/semantics/choices.py b/semantics/choices.py
index 2d644ab..bb13df5 100644
--- a/semantics/choices.py
+++ b/semantics/choices.py
@@ -8,4 +8,6 @@ class FrameStatus(models.TextChoices):
     READY = "G", _("gotowe")
     VERIFIED = "S", _("sprawdzone")
     INVALID = "B", _("błędna")  # set by lexicographs
+    NOT_MATCHING_UNIFIED_FRAME = "C", _("niepasujÄ…ca")  # set by lexicographs
     BAD = "Z", _("zła")  # confirmed by super lexicographs
+
diff --git a/semantics/urls.py b/semantics/urls.py
index 8386f8f..85f92f1 100644
--- a/semantics/urls.py
+++ b/semantics/urls.py
@@ -8,4 +8,8 @@ urlpatterns = [
     path('frame_mark_as_invalid/<int:frame_pk>/', views.frame_mark_as_invalid, name='frame_mark_as_invalid'),
     path('frame_confirm_invalid/<int:frame_pk>/', views.frame_confirm_invalid, name='frame_confirm_invalid'),
     path('frame_reject_invalid/<int:frame_pk>/', views.frame_reject_invalid, name='frame_reject_invalid'),
+    path('frame_mark_as_bad/<int:frame_pk>/', views.frame_mark_as_bad, name='frame_mark_as_bad'),
+    path('frame_reject_as_not_matching_unified_frame/<int:frame_pk>/', views.frame_reject_as_not_matching_unified_frame, name='frame_reject_as_not_matching_unified_frame'),
+    path('frame_confirm_as_not_matching_unified_frame/<int:frame_pk>/', views.frame_confirm_as_not_matching_unified_frame, name='frame_confirm_as_not_matching_unified_frame'),
+
 ]
diff --git a/semantics/views.py b/semantics/views.py
index f2043b9..9b6f7ce 100644
--- a/semantics/views.py
+++ b/semantics/views.py
@@ -4,7 +4,7 @@ from django.db import transaction
 from django.shortcuts import get_object_or_404
 
 from common.decorators import ajax
-from unifier.models import UnifiedFrame, UnifiedFrame2SlowalFrameMapping
+from unifier.models import UnifiedFrame, UnifiedFrame2SlowalFrameMapping, UnifiedFrameArgumentSlowalFrameMapping
 from users.models import Assignment
 
 from . import choices
@@ -26,6 +26,7 @@ def frame_confirm_invalid(request, frame_pk):
     frame = get_object_or_404(Frame.objects.filter(status=choices.FrameStatus.INVALID).select_for_update(), pk=frame_pk)
     frame.status = choices.FrameStatus.BAD
     frame.save()
+    removeSlovalFrameMappingsAndAssigments(frame_pk)
     return {}
 
 
@@ -36,4 +37,45 @@ def frame_reject_invalid(request, frame_pk):
     frame = get_object_or_404(Frame.objects.filter(status=choices.FrameStatus.INVALID).select_for_update(), pk=frame_pk)
     frame.status = choices.FrameStatus.NEW
     frame.save()
+    removeSlovalFrameMappingsAndAssigments(frame_pk)
     return {}
+
+@ajax(login_required=True, method='post')
+@transaction.atomic
+@permission_required('semantics.manage_invalid_lexical_units')
+def frame_mark_as_bad(request, frame_pk):
+    frame = get_object_or_404(Frame.objects.filter(status=choices.FrameStatus.NEW).select_for_update(), pk=frame_pk)
+    frame.status = choices.FrameStatus.BAD
+    frame.save()
+    removeSlovalFrameMappingsAndAssigments(frame_pk)
+    return {}
+
+def removeSlovalFrameMappingsAndAssigments(frame_pk):
+    #odpianie z ramy zunifikowanej
+    unifiedFrame2SlowalFrameMappings = UnifiedFrame2SlowalFrameMapping.objects.filter(slowal_frame_id=frame_pk)
+    for unifiedFrame2SlowalFrameMapping in unifiedFrame2SlowalFrameMappings:
+        unifiedFrameArgumentSlowalFrameMappings = UnifiedFrameArgumentSlowalFrameMapping.objects.filter(unified_frame_mapping=unifiedFrame2SlowalFrameMapping)
+        for unifiedFrameArgumentSlowalFrameMapping in unifiedFrameArgumentSlowalFrameMappings:
+            unifiedFrameArgumentSlowalFrameMapping.delete()
+        unifiedFrame2SlowalFrameMapping.delete()
+    Assignment.delete(subject_id=frame_pk)
+
+@ajax(login_required=True, method='post')
+@transaction.atomic
+@permission_required('semantics.manage_invalid_lexical_units')
+def frame_reject_as_not_matching_unified_frame(request, frame_pk):
+    frame = get_object_or_404(Frame.objects.filter(status=choices.FrameStatus.NOT_MATCHING_UNIFIED_FRAME).select_for_update(), pk=frame_pk)
+    frame.status = choices.FrameStatus.PROCESSING
+    frame.save()
+    return {}
+
+@ajax(login_required=True, method='post')
+@transaction.atomic
+@permission_required('semantics.manage_invalid_lexical_units')
+def frame_confirm_as_not_matching_unified_frame(request, frame_pk):
+    frame = get_object_or_404(Frame.objects.filter(status=choices.FrameStatus.NOT_MATCHING_UNIFIED_FRAME).select_for_update(), pk=frame_pk)
+    frame.status = choices.FrameStatus.NEW
+    frame.save()
+    removeSlovalFrameMappingsAndAssigments(frame_pk)
+    return {}
+
diff --git a/syntax/management/commands/import_tei.py b/syntax/management/commands/import_tei.py
index 98c3916..e030440 100644
--- a/syntax/management/commands/import_tei.py
+++ b/syntax/management/commands/import_tei.py
@@ -34,8 +34,10 @@ def import_tei():
     logging.basicConfig(filename='import.log', level=logging.DEBUG)
 
     #xml_file = os.path.join(BASE_DIR, 'data', 'walenty', 'walenty_20200926_smaller.xml')
-    xml_file = os.path.join(BASE_DIR, 'data', 'walenty', 'walenty_20210913_smaller.xml')
+    # xml_file = os.path.join(BASE_DIR, 'data', 'walenty', 'walenty_20210913_smaller.xml')
     # xml_file = os.path.join(BASE_DIR, 'data', 'walenty', 'walenty_20210913_smallest.xml')
+    xml_file = os.path.join(BASE_DIR, 'data', 'walenty', 'walenty_20210913.xml')
+
 
     xml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), xml_file)
 
diff --git a/users/models.py b/users/models.py
index 6d99a10..b6dde51 100644
--- a/users/models.py
+++ b/users/models.py
@@ -24,6 +24,12 @@ class Assignment(models.Model):
             subject_id=subject.pk,
         )
 
+    @classmethod
+    def delete(cls, subject_id):
+        Assignment.objects.filter(
+            subject_id=subject_id,
+        ).delete()
+
 
 class NoteQuerySet(models.QuerySet):
     def for_user(self, user):
-- 
GitLab