From 266378e6ac53afd0919accf1088c55a1a16801e4 Mon Sep 17 00:00:00 2001 From: dcz <dcz@ipipan.waw.pl> Date: Wed, 8 Jun 2022 23:09:57 +0200 Subject: [PATCH] Correct slowal frame argument display (unification view). Replace slowal frame argument position. Slowal frame status change implementation. --- entries/static/entries/js/unification.js | 188 ++++++++++++++++++++++- unifier/models.py | 1 + unifier/urls.py | 3 + unifier/views.py | 65 +++++++- 4 files changed, 252 insertions(+), 5 deletions(-) diff --git a/entries/static/entries/js/unification.js b/entries/static/entries/js/unification.js index 3869d82..d6872cf 100644 --- a/entries/static/entries/js/unification.js +++ b/entries/static/entries/js/unification.js @@ -1,6 +1,156 @@ "use strict"; var unified_view_frame_content; +var curr_unified_frame; + + +function change_slowal2unified_fram_argument_mapping(slowal_frame_id) { + var argument_ids = []; + $('.argument.active').each(function() { + var id = $(this).data('argument_id').split('-')[1]; + if(id.startsWith('_')) { + id = -parseInt(id.split('_')[1]) + } else { + id = parseInt(id) + } + argument_ids.push(id); + }); + var choosed_slowal_frame_id = null; + $('.frame.active').each(function() { + choosed_slowal_frame_id = $(this).data('frame_id'); + }); + if(choosed_slowal_frame_id == slowal_frame_id && argument_ids.length == 2) { + change_slowal2unified_fram_argument_mapping_post(curr_unified_frame.id, choosed_slowal_frame_id, argument_ids); + get_unified_frame(curr_unified_frame.id); + } +} + +function frames2dom_unidief_view(frames) { + var fragment = document.createDocumentFragment(); + for (var i in frames) { + let frameDiv = frame2dom(frames[i]); + var table = document.createElement('table'); + table.className = 'table m-0 table-borderless border border-secondary text-dark'; + var tbody = document.createElement('tbody'); + + // roles and selectional preferences + var roles_row = document.createElement('tr'); + + var frame_col = document.createElement('th'); + frame_col.scope = 'row'; + frame_col.class = 'py-0 px-1 text-secondary'; + frame_col.append(frameDiv) + + var button_col = document.createElement('th'); + button_col.scope = 'row'; + button_col.class = 'py-0 px-1 text-secondary'; + + var button_col_div = document.createElement('div'); + button_col_div.innerHTML = '<div class="custom-control custom-checkbox">\n' + + ' <input type="checkbox" id="defaultUnchecked" class="custom-control-input" '+(frames[i].verified ? 'checked' : '')+' onclick="change_slowal2unified_mapping_verification('+frames[i].id+', this.checked)">\n' + + ' <label class="custom-control-label" for="defaultUnchecked">Zweryfikowane</label>\n' + + ' <br><br>' + + ' <a href="#" class="btn btn-sm btn-dark" role="button" onclick="change_slowal2unified_fram_argument_mapping('+frames[i].id+')">Z</a>' + + '</div>'; + + button_col.append(button_col_div); + + roles_row.append(frame_col); + roles_row.append(button_col); + tbody.append(roles_row); + table.append(tbody); + + fragment.append(table); + + } + if (fragment.childNodes.length === 0) { + return '<p>(' + gettext('brak ram') + ')</p>'; + } + return fragment; +} + +function show_semantics_unified_view(frames, subentries) { + $('#semantics-no-examples').hide(); + var schemata_dom = subentries2dom(subentries); + $('#semantics-schemata').append($(schemata_dom)); + var frames_dom = frames2dom_unidief_view(frames); + + $('#semantics-frames').append($(frames_dom)); + + $('.frame').mouseenter(function() { + var frame = $(this); + if (!frame.hasClass('active')) { + $(this).addClass('highlight bg-highlight'); + show_info(gettext('Kliknij, aby wyświetlić przykłady dla tej ramy oraz jej realizacje składniowe.')); + } + }).mouseleave(function() { + $(this).removeClass('highlight bg-highlight'); + clear_info(); + }).click(function() { + var frame = $(this); + if (!frame.hasClass('active')) { + select_frame(frame); + } + clear_info(); + }); + + $('.lu-plwn, .synset-plwn').click(function(event) { + // don’t make link click select the frame + event.stopPropagation(); + }); + + // if there’s one frame, select it immediately + if ($('.frame').length === 1) { + select_frame($('.frame').first()); + } + + // if there’s no frames, disable the tab + if ($('.frame').length === 0) { + $('#semantics-tab').addClass('disabled'); + } else { + $('#semantics-tab').removeClass('disabled'); + } +} + + +function change_slowal2unified_fram_argument_mapping_post(unified_frame_id, slowal_frame_id, slowal_frame_selected_arguments) { + check_import_status(); + show_entry_spinners(); + var data = { 'unified_frame_id' : unified_frame_id, 'slowal_frame_id' : slowal_frame_id, 'slowal_frame_selected_arguments' : JSON.stringify(slowal_frame_selected_arguments) }; + $.ajax({ + type : 'post', + url : '/' + lang + '/unifier/change_slowal2unified_fram_argument_mapping/', + dataType : 'json', + data : data, + timeout : 60000, + success : function(response) { + + }, + error: function(request, errorType, errorMessage) { + show_error(errorType + ' (' + errorMessage + ')'); + } + }); +} + +function change_slowal2unified_mapping_verification(slowal_frame_id, verified) { + check_import_status(); + show_entry_spinners(); + var data = { 'unified_frame_id' : curr_unified_frame.id, 'slowal_frame_id' : slowal_frame_id, 'verified' : verified }; + $.ajax({ + type : 'post', + url : '/' + lang + '/unifier/change_slowal2unified_mapping_verification/', + dataType : 'json', + data : data, + timeout : 60000, + success : function(response) { + + }, + error: function(request, errorType, errorMessage) { + show_error(errorType + ' (' + errorMessage + ')'); + } + }); +} + function get_unified_frame(unified_frame_id, related) { check_import_status(); @@ -15,7 +165,8 @@ function get_unified_frame(unified_frame_id, related) { data : data, timeout : 60000, success : function(response) { - unified_view_frame_content = response.frames; + curr_unified_frame = response.unified_frame; + unified_view_frame_content = response.frames curr_entry = unified_frame_id; curr_no_filters = related; clear_info(); @@ -30,7 +181,8 @@ function get_unified_frame(unified_frame_id, related) { // show_syntax(response.subentries); show_unified_frame(response.unified_frame, response.frames) show_unified_frame_lexical_units(response.frames) - show_semantics(response.frames, response.subentries); + fulfill_slowal_frames_arguments_with_empty_elems(response.unified_frame, response.frames) + show_semantics_unified_view(response.frames, response.subentries); // show_unmatched_examples(); // if current tab is empty, switch to an active tab @@ -80,6 +232,38 @@ function slowal_frames2selecional_preferencies(unified_frame, slowal_frames) { return unified_argument_2_selecional_preferencies; } + +function fulfill_slowal_frames_arguments_with_empty_elems(unified_frame, slowal_frames) { + for (var i in unified_frame.slowal_frame_mapping) { + var 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 (var j in unified_frame.arguments) { + var 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); + } + + new_slowal_frame_arguments.push(slowal_frame_argument) + } + slowal_frame.arguments = new_slowal_frame_arguments; + } +} + function unifiedFrame2dom(unifiedFrame, slowal_frames) { var div = document.createElement('div'); div.className = 'unifiedFrame mb-3'; diff --git a/unifier/models.py b/unifier/models.py index f9a2967..98efe6d 100644 --- a/unifier/models.py +++ b/unifier/models.py @@ -107,6 +107,7 @@ class UnifiedRelationalSelectionalPreference(models.Model): class UnifiedFrame2SlowalFrameMapping(models.Model): + verified = models.BooleanField(default=False) unified_frame = models.ForeignKey(UnifiedFrame, related_name='unified_frame_2_slowal_frame', on_delete=models.PROTECT) slowal_frame = models.OneToOneField(Frame, related_name='slowal_frame_2_unified_frame', on_delete=models.PROTECT) diff --git a/unifier/urls.py b/unifier/urls.py index 6902b09..2f1276b 100644 --- a/unifier/urls.py +++ b/unifier/urls.py @@ -11,5 +11,8 @@ urlpatterns = [ path('get_unified_frames/', views.get_unified_frames, name='get_unified_frames'), path('get_unified_frame/', views.get_unified_frame, name='get_unified_frame'), path('extract_frames_to_new_frame/', views.extract_frames_to_new_frame, name='extract_frames_to_new_frame'), + path('change_slowal2unified_fram_argument_mapping/', views.change_slowal2unified_fram_argument_mapping, name='change_slowal2unified_fram_argument_mapping'), + path('change_slowal2unified_mapping_verification/', views.change_slowal2unified_mapping_verification, name='change_slowal2unified_mapping_verification'), + ] diff --git a/unifier/views.py b/unifier/views.py index 069dc40..25d3338 100644 --- a/unifier/views.py +++ b/unifier/views.py @@ -8,7 +8,7 @@ from entries.views import get_scroller_params, get_alternations, get_prefs_list, from semantics.models import Frame from syntax.models import Schema from unifier.models import UnifiedFrameArgument, UnifiedRelationalSelectionalPreference, UnifiedFrame, \ - UnifiedFrame2SlowalFrameMapping + UnifiedFrame2SlowalFrameMapping, UnifiedFrameArgumentSlowalFrameMapping @ajax_required @@ -157,11 +157,20 @@ 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()] + slowal_frames_and_verified = [(connection.slowal_frame, connection.verified) for connection in unifiedFrame.unified_frame_2_slowal_frame.all()] + + slowal_frames = [tuple[0] for tuple in slowal_frames_and_verified] all_schema_objects = Schema.objects.filter(schema_hooks__argument_connections__argument__frame__in=slowal_frames).distinct() - slowal_frames_dict = [frame2dict(slowal_frame, slowal_frame.lexical_units.all()) for slowal_frame in slowal_frames] + slowal_frames_dict = [] + for slowal_frame_and_verified in slowal_frames_and_verified: + slowal_frame = slowal_frame_and_verified[0] + verified = slowal_frame_and_verified[1] + dict = frame2dict(slowal_frame, slowal_frame.lexical_units.all()) + dict['verified'] = verified + slowal_frames_dict.append(dict) + alternations, realisation_phrases, realisation_descriptions = get_alternations(all_schema_objects, slowal_frames) examples = get_examples(slowal_frames) @@ -205,3 +214,53 @@ def extract_frames_to_new_frame(request): new_frame_fullfiled_and_saved = unified_frame.extract_frames_to(slowal_frames=slowal_frames, new_frame=new_unified_frame) return JsonResponse(get_unified_frame_json(new_frame_fullfiled_and_saved, request)) return JsonResponse({}) + +@ajax_required +def change_slowal2unified_fram_argument_mapping(request): + if request.method == 'POST': + unified_frame_id = request.POST['unified_frame_id'] + slowal_frame_id = request.POST['slowal_frame_id'] + slowal_frame_selected_arguments = json.loads(request.POST['slowal_frame_selected_arguments']) + + + unifiedFrame2SlowalFrameMapping = UnifiedFrame2SlowalFrameMapping.objects.get(unified_frame_id=unified_frame_id, slowal_frame=slowal_frame_id) + + arg1_id = int(slowal_frame_selected_arguments[0]) + arg2_id = int(slowal_frame_selected_arguments[1]) + + unifiedFrameArgumentMapping1 = UnifiedFrameArgumentSlowalFrameMapping.objects.get(unified_frame_mapping=unifiedFrame2SlowalFrameMapping, + slowal_agrument_id=arg1_id) if arg1_id >= 0 else None + unifiedFrameArgumentMapping2 = UnifiedFrameArgumentSlowalFrameMapping.objects.get(unified_frame_mapping=unifiedFrame2SlowalFrameMapping, + slowal_agrument_id=arg2_id) if arg2_id >= 0 else None + + if unifiedFrameArgumentMapping1 is not None and unifiedFrameArgumentMapping2 is not None: + #mamy oba argumenty, zamieniamy miescami + unifiedFrameArgumentMapping1.slowal_agrument_id = arg2_id + unifiedFrameArgumentMapping2.slowal_agrument_id = arg1_id + unifiedFrameArgumentMapping1.save() + unifiedFrameArgumentMapping2.save() + elif unifiedFrameArgumentMapping1 is not None and unifiedFrameArgumentMapping2 is None: + #mamy lewy argument, prawy jest Empty + unifiedFrameArgumentMapping1.unified_agrument_id = -arg2_id + unifiedFrameArgumentMapping1.save() + elif unifiedFrameArgumentMapping1 is None and unifiedFrameArgumentMapping2 is not None: + #mamy prawy argument, lewy jest Empty + unifiedFrameArgumentMapping2.unified_agrument_id = -arg1_id + unifiedFrameArgumentMapping2.save() + + return JsonResponse({}) + return JsonResponse({}) + +@ajax_required +def change_slowal2unified_mapping_verification(request): + if request.method == 'POST': + unified_frame_id = request.POST['unified_frame_id'] + slowal_frame_id = request.POST['slowal_frame_id'] + verified = request.POST['verified'] + + unifiedFrame2SlowalFrameMapping = UnifiedFrame2SlowalFrameMapping.objects.get(unified_frame_id=unified_frame_id, slowal_frame=slowal_frame_id) + + unifiedFrame2SlowalFrameMapping.verified = True if verified == 'true' else False + unifiedFrame2SlowalFrameMapping.save() + return JsonResponse({}) + return JsonResponse({}) -- GitLab