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 from django.shortcuts import get_object_or_404 from django.test import override_settings from django.views.decorators.csrf import csrf_exempt from common.decorators import ajax_required, ajax from connections.models import SchemaHook, ExampleConnection 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_local_schema_filter_form, get_local_frame_filter_form 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, \ PredefinedSelectionalPreference, Argument from syntax.models import Schema from unifier.models import UnifiedFrameArgument, UnifiedRelationalSelectionalPreference, UnifiedFrame, \ UnifiedFrame2SlowalFrameMapping, UnifiedFrameArgumentSlowalFrameMapping, HierarchyModel from users.models import Assignment from . import choices from xml.etree.ElementTree import Element, SubElement, tostring import io from xml.sax import handler, make_parser from django.db.models import Q, Prefetch from django.conf import settings import logging from django.views.decorators.csrf import csrf_exempt import urllib3 from .apps import synset_hierarchy_dict, SynsetHierarchy from .choices import UnifiedFrameStatus def get_predefined_preference_synsets(predefined, list_to_fill): for pp in predefined: if pp.members: synsets_all = pp.members.synsets.all() list_to_fill.extend(list(map(lambda s: s.id, synsets_all))) generals_all = pp.members.generals.all() if generals_all: get_predefined_preference_synsets(generals_all, list_to_fill) @ajax_required @transaction.atomic def save_synset_preference(request): if request.method == 'POST': frame_id = request.POST['frame_id'] complement_id = request.POST['complement_id'] synset_preference_id = request.POST['synset_preference_id'] check_sysnet_hierarchy_constraints_ret = save_synset_preference_base(frame_id, complement_id, synset_preference_id) return JsonResponse(check_sysnet_hierarchy_constraints_ret) return JsonResponse({}) def save_synset_preference_base(frame_id, complement_id, synset_preference_id): unified_frame_argument = UnifiedFrameArgument.objects.get(unified_frame_id=int(frame_id), id=int(complement_id)) check_sysnet_hierarchy_constraints_ret = check_sysnet_hierarchy_constraints([synset_preference_id], unified_frame_argument) 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 check_sysnet_hierarchy_constraints_ret 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, conflict_exists = synset_hierarchy_constraint_check(int(synset_preference_id), set(synset_ids_list)) if conflict_hyponym is None and conflict_hyperonym is None and conflict_exists is None: return {"succ": True} else: conflict_exists_lu_str = conflict_lu_to_str(conflict_exists) conflict_hyponym_lu_str = conflict_lu_to_str(conflict_hyponym) conflict_hyperonym_lu_str = conflict_lu_to_str(conflict_hyperonym) ret = {"succ": False, "conflict_hyponym": conflict_hyponym_lu_str, "conflict_hyperonym": conflict_hyperonym_lu_str, "conflict_exists": "Wybrana preferencja selekcyjna nie mogła zostać zapisana ponieważ widnieje już na liście preferencji selekcyjnych: " + conflict_exists_lu_str if conflict_exists_lu_str is not None else None} return ret def conflict_lu_to_str(conflict_lu): conflict_hyponym_lu = LexicalUnit.objects.filter( synset_id=conflict_lu) if conflict_lu is not None else None return ','.join( map(lambda s: str(s), conflict_hyponym_lu.all())) if conflict_lu is not None else None # class MyException(Exception): # def __init__(self, message, errors): # super().__init__(message) # self.errors = errors @ajax_required @transaction.atomic def save_bunch_of_preferences(request): if request.method == 'POST': frame_id = request.POST['frame_id'] complement_id = request.POST['complement_id'] predefined_preference_ids = json.loads(request.POST['predefined_preference_ids']) synset_ids = json.loads(request.POST['synset_preference_ids']) check_sysnet_hierarchy_constraints_ret = save_bunch_of_preferences_base(frame_id, complement_id, predefined_preference_ids, synset_ids) return JsonResponse(check_sysnet_hierarchy_constraints_ret) return JsonResponse({}) @transaction.atomic def save_bunch_of_preferences_base(frame_id, complement_id, predefined_preference_ids, synset_ids): for predefined_preference_id in predefined_preference_ids: check_sysnet_hierarchy_constraints_ret = save_predefined_preference_base(frame_id, complement_id, predefined_preference_id) if check_sysnet_hierarchy_constraints_ret['succ'] is False: transaction.set_rollback(True) return check_sysnet_hierarchy_constraints_ret for synset_id in synset_ids: check_sysnet_hierarchy_constraints_ret = save_synset_preference_base(frame_id, complement_id, synset_id) if check_sysnet_hierarchy_constraints_ret['succ'] is False: transaction.set_rollback(True) return check_sysnet_hierarchy_constraints_ret return {'succ': True} @ajax_required @transaction.atomic def save_predefined_preference(request): if request.method == 'POST': frame_id = request.POST['frame_id'] complement_id = request.POST['complement_id'] predefined_preference_id = request.POST['predefined_preference_id'] check_sysnet_hierarchy_constraints_ret = save_predefined_preference_base(frame_id, complement_id, predefined_preference_id) return JsonResponse(check_sysnet_hierarchy_constraints_ret) return JsonResponse({}) @transaction.atomic def save_predefined_preference_base(frame_id, complement_id, predefined_preference_id): unified_frame_argument = UnifiedFrameArgument.objects.get(unified_frame_id=int(frame_id), id=int(complement_id)) predefined_synset_ids = [] pred_sel_pref = PredefinedSelectionalPreference.objects.get(id=predefined_preference_id) if pred_sel_pref.name == 'ALL' and len(unified_frame_argument.predefined.all()) > 0: return {"succ": False, "conflict_hyponym": None, "conflict_hyperonym": None, "conflict_exists": "Predefiniowana preferencja selekcyjna ALL może być dodana tylko, gdy nie na liście nie widnieją inne preferencje selekcyjne."} else: get_predefined_preference_synsets([pred_sel_pref], 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 check_sysnet_hierarchy_constraints_ret @ajax_required @transaction.atomic def save_relational_selectional_preference(request): if request.method == 'POST': frame_id = request.POST['frame_id'] complement_id_from = request.POST['complement_id_from'] complement_id_to = request.POST['complement_id_to'] relation_id = request.POST['relation_id'] unified_frame_argument = UnifiedFrameArgument.objects.get(unified_frame_id=int(frame_id), id=int(complement_id_from)) relational_selectional_preference = UnifiedRelationalSelectionalPreference(to_id=complement_id_to, relation_id=relation_id) relational_selectional_preference.save() unified_frame_argument.relations.add(relational_selectional_preference) unified_frame_argument.save() update_argument_preferences_count(unified_frame_argument) return JsonResponse({}) @ajax_required def get_unified_frames(request): if request.method == 'POST': scroller_params = get_scroller_params(request.POST) exclude_status = request.GET.get('exclude_status') restrict_to_user = request.GET.get('restrict_to_user') scroller_params = get_scroller_params(request.POST) first_index, last_index = scroller_params['start'], scroller_params['start'] + scroller_params['length'] order_field, order_dir = scroller_params['order'] if order_field == 0: order_field = 'title' elif order_field == 1: order_field = 'status' else: order_field = None if order_dir == 'desc' and order_field is not None: order_field = '-' + order_field errors_dict = dict() if 'unified_frame_form' in request.session: forms = collect_forms(request.session['unified_frame_form'], errors_dict) unified_frames = get_filtered_objects(forms).filter() else: unified_frames = UnifiedFrame.objects records_total = unified_frames.count() if order_field is not None: unified_frames = unified_frames.order_by(order_field) unified_frames = unified_frames.all() if scroller_params['filter']: unified_frames = unified_frames.filter(title__startswith=scroller_params['filter']) # 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 unified_frames: user = assignment.user.username if ( assignment := unifiedFrame.assignments.first()) else None res[unifiedFrame.id] = { 'id': str(unifiedFrame.id), 'title': unifiedFrame.title, 'status': unifiedFrame.status, 'assignee_username': user, 'hierarchy_exists': unifiedFrame.hasHierarchyElems, } res_processed = [] for key, value in res.items(): if ((exclude_status is None or value['status'] != exclude_status) and (restrict_to_user is None or value['assignee_username'] == restrict_to_user)) or \ value['status'] == choices.UnifiedFrameStatus.VERIFIED: res_processed.append(value) records_filtered = len(res_processed) res_processed = res_processed[first_index:last_index] ret = { 'draw': scroller_params['draw'], 'recordsTotal': records_total, 'recordsFiltered': records_filtered, 'data': res_processed } return JsonResponse(ret) return JsonResponse({}) def unified_frame_2_dict(frame): return { 'id': frame.id, 'title': frame.title, 'status': str(frame.status), 'assignee_username': assignment.user.username if (assignment := frame.assignments.first()) else None, 'arguments': [ { 'str': str(a), 'id': a.id, 'role': { 'str': '{}{}{}'.format(a.role.role.role.lower(), ' ' + a.role.attribute.attribute.lower() if a.role.attribute else '', ' (' + a.role.sub_attribute.sub_attribute.lower() + ')' if a.role.sub_attribute else '') if a.role is not None else None, 'id': str(a.role.id) } if a.role is not None else None, 'role_type': a.role_type.type.lower() if a.role_type is not None else '', 'preferences': get_prefs_list(a), 'proposed_roles': [{ 'str': '{}{}'.format(r.role.role.lower(), ' ' + r.attribute.attribute.lower() if r.attribute else ''), 'id': str(r.id) } for r in a.proposed_roles.all()], } for a in sorted(frame.unified_arguments.all(), key=lambda x: x.id) ], 'slowal_frame_mapping': [ { 'slowal_frame_id': slowal_frame_mapping.slowal_frame.id, 'slowal_frame_argument_mapping': [ { 'unified_frame_agrument_id': slowal_frame_arg_mapping.unified_agrument.id, 'slowal_frame_agrument_id': slowal_frame_arg_mapping.slowal_agrument.id, } for slowal_frame_arg_mapping in slowal_frame_mapping.unified_frame_argument_mapping.all() ] } for slowal_frame_mapping in frame.unified_frame_2_slowal_frame.all() ] } def get_examples(frames): examples = [] for frame in frames: for argument in frame.arguments.all(): for connection in argument.example_connections.all(): example = connection.example frame_ids, argument_ids, lu_ids = set(), set(), set() schema_ids, phrases, phrases_syntax = set(), set(), set() positions = set() for example_connection in example.example_connections.all(): for conn_argument in example_connection.arguments.all(): frame_ids.add(conn_argument.frame.id) argument_ids.add('{}-{}'.format(conn_argument.frame.id, conn_argument.id)) if example_connection.lexical_unit: lu_ids.add(example_connection.lexical_unit.id) for hook in example_connection.schema_connections.all(): schema_ids.add(hook.schema.id) phrases.add('{}-{}-{}-{}'.format(hook.schema.id, hook.position.id, hook.phrase_type.id, hook.alternation - 1)) phrases_syntax.add('{}-{}-{}'.format(hook.schema.id, hook.position.id, hook.phrase_type.id)) positions.add('{}-{}'.format(hook.schema.id, hook.position.id)) elem = { 'id': str(example.id), 'sentence': example.sentence, 'source': EXAMPLE_SOURCE()[example.source.key], 'opinion': EXAMPLE_OPINION()[example.opinion.key], 'note': example.note, 'frame_ids': sorted(frame_ids), 'argument_ids': sorted(argument_ids), 'lu_ids': sorted(lu_ids), 'schema_ids': sorted(schema_ids), 'phrases': sorted(phrases), 'phrases_syntax': sorted(phrases_syntax), 'positions': sorted(positions), } if elem not in examples: examples.append(elem) return sorted(examples, key=lambda x: x['sentence']) def to_lemma(lexical_units): return ", ".join(map(lambda l: l['str'], lexical_units)) # @override_settings(DEBUG=True) def get_unified_frame_json(unified_frame, request): local_schema_filter_form = None local_frame_filter_form = None if 'no_filters' in request.POST: 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=unified_frame.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_db = slowal_frames_db.select_related("opinion") # slowal_frames_db = slowal_frames_db.prefetch_related( # Prefetch( # 'lexical_units', # queryset=LexicalUnit.objects # ), # Prefetch( # 'arguments', # queryset=Argument.objects.select_related("role", "role__role", "role__attribute", "role__sub_attribute").prefetch_related( # Prefetch( # 'example_connections', # queryset=ExampleConnection.objects.select_related('example', 'lexical_unit').prefetch_related( # Prefetch( # 'arguments', # queryset=Argument.objects # ), # Prefetch( # 'schema_connections', # queryset=SchemaHook.objects # ) # ) # ) # ) # ) # ) slowal_frames_db = slowal_frames_db.prefetch_related("arguments__role__role") slowal_frames_db = slowal_frames_db.prefetch_related("arguments__role__attribute") slowal_frames_db = slowal_frames_db.prefetch_related("arguments__role__sub_attribute") slowal_frames_db = slowal_frames_db.prefetch_related("arguments__example_connections__example") slowal_frames_db = slowal_frames_db.prefetch_related("arguments__example_connections__example__example_connections__arguments") slowal_frames_db = slowal_frames_db.prefetch_related("arguments__example_connections__example__example_connections__lexical_unit") slowal_frames_db = slowal_frames_db.prefetch_related("arguments__example_connections__example__example_connections__schema_connections") slowal_frames = slowal_frames_db.all() slowal_frames_dict = [] for slowal_frame in slowal_frames: dict = frame2dict(slowal_frame, slowal_frame.lexical_units.all()) slowal_frames_dict.append(dict) 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) all_schema_objects = all_schema_objects.select_related("opinion") all_schema_objects = all_schema_objects.prefetch_related("positions") all_schema_objects = all_schema_objects.prefetch_related("schema_hooks") all_schema_objects = all_schema_objects.prefetch_related("schema_hooks__argument_connections") all_schema_objects = all_schema_objects.prefetch_related("positions__function") all_schema_objects = all_schema_objects.prefetch_related("positions__control") all_schema_objects = all_schema_objects.prefetch_related("positions__pred_control") all_schema_objects = all_schema_objects.prefetch_related("positions__phrase_types") all_schema_objects = all_schema_objects.prefetch_related("positions__phrase_types__main_type") all_schema_objects = all_schema_objects.prefetch_related("positions__phrase_types__attributes") all_schema_objects = all_schema_objects.prefetch_related("positions__phrase_types__lexicalized_phrase") all_schema_objects = all_schema_objects.prefetch_related("positions__phrase_types__lemma_operator") all_schema_objects = all_schema_objects.prefetch_related("positions__phrase_types__lemma_cooccur") all_schema_objects = all_schema_objects.prefetch_related("positions__phrase_types__lemmata") slowal_frames_dict = sorted(slowal_frames_dict, key=lambda x: to_lemma(x['lexical_units'])) alternations, realisation_phrases, realisation_descriptions = get_alternations(all_schema_objects, slowal_frames) examples = get_examples(slowal_frames) all_schema_objects_dict = [schema2dict(schema, schema.subentries.all()[0].negativity, request.LANGUAGE_CODE) for schema in all_schema_objects] subentries = [{ 'str': None, 'schemata': all_schema_objects_dict }] unified_frame_dict = unified_frame_2_dict(unified_frame) return {'unified_frame_id': unified_frame.id, 'unified_frame': unified_frame_dict, 'subentries': subentries, 'frames': slowal_frames_dict, 'alternations': alternations, 'realisation_phrases': realisation_phrases, 'realisation_descriptions': realisation_descriptions, 'examples': examples, 'last_visited': request.session['last_visited']} @ajax_required @login_required def get_unified_frame(request): if request.method == 'POST': # TODO (*) # form = EntryForm(request.POST) unified_frame_id = request.POST['unified_frame_id'] # TODO (*) if unified_frame_id.isdigit(): # and form.is_valid(): unified_frame_id = int(unified_frame_id) request.session.modified = True unified_frame = UnifiedFrame.objects.get(id=unified_frame_id) return JsonResponse(get_unified_frame_json(unified_frame, request)) return JsonResponse({}) @ajax_required @transaction.atomic def extract_frames_to_new_frame(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] target_unified_frame_id = request.POST['target_unified_frame_id'] slowal_frame_ids = json.loads(request.POST['slowal_frame_ids']) unified_frame = UnifiedFrame.objects.get(id=unified_frame_id) slowal_frames = Frame.objects.filter(id__in=slowal_frame_ids) new_unified_frame = None if target_unified_frame_id != '': new_unified_frame = UnifiedFrame.objects.get(id=target_unified_frame_id) 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 @transaction.atomic def remove_selectional_preference(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] argument_id = request.POST['argument_id'] preference_ids = json.loads(request.POST['preference_ids']) unified_frame_argument = UnifiedFrameArgument.objects.get(id=argument_id, unified_frame=unified_frame_id) unified_frame_argument.predefined.set(unified_frame_argument.predefined.exclude(id__in=preference_ids)) unified_frame_argument.synsets.set(unified_frame_argument.synsets.exclude(id__in=preference_ids)) unified_frame_argument.relations.set(unified_frame_argument.relations.exclude(id__in=preference_ids)) unified_frame_argument.save() update_argument_preferences_count(unified_frame_argument) return JsonResponse({}) return JsonResponse({}) def update_argument_preferences_count(unified_frame_argument): unified_frame_argument.preferences_count = unified_frame_argument.predefined.count() + \ unified_frame_argument.synsets.count() + \ unified_frame_argument.relations.count() unified_frame_argument.save() @ajax_required @transaction.atomic def duplicate_unified_frame(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] target_unified_frame_title = request.POST['target_unified_frame_title'] unified_frame = UnifiedFrame.objects.get(id=unified_frame_id) new_frame = unified_frame.duplicate(new_frame_title=target_unified_frame_title) Assignment.assign(user=request.user, subject=new_frame) return JsonResponse(get_unified_frame_json(new_frame, request)) return JsonResponse({}) @ajax_required @transaction.atomic 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']) unified_frame2_slowal_frame_mapping = 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]) unified_frame_argument_mapping1 = UnifiedFrameArgumentSlowalFrameMapping.objects.get( unified_frame_mapping=unified_frame2_slowal_frame_mapping, slowal_agrument_id=arg1_id) if arg1_id >= 0 else None unified_frame_argument_mapping2 = UnifiedFrameArgumentSlowalFrameMapping.objects.get( unified_frame_mapping=unified_frame2_slowal_frame_mapping, slowal_agrument_id=arg2_id) if arg2_id >= 0 else None if unified_frame_argument_mapping1 is not None and unified_frame_argument_mapping2 is not None: # mamy oba argumenty, zamieniamy miescami unified_frame_argument_mapping1.slowal_agrument_id = arg2_id unified_frame_argument_mapping2.slowal_agrument_id = arg1_id unified_frame_argument_mapping1.save() unified_frame_argument_mapping2.save() elif unified_frame_argument_mapping1 is not None and unified_frame_argument_mapping2 is None: # mamy lewy argument, prawy jest Empty unified_frame_argument_mapping1.unified_agrument_id = -arg2_id unified_frame_argument_mapping1.save() elif unified_frame_argument_mapping1 is None and unified_frame_argument_mapping2 is not None: # mamy prawy argument, lewy jest Empty unified_frame_argument_mapping2.unified_agrument_id = -arg1_id unified_frame_argument_mapping2.save() return JsonResponse({}) return JsonResponse({}) @ajax_required @transaction.atomic def change_slowal_frame_status(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] slowal_frame_id = request.POST['slowal_frame_id'] status = request.POST['status'] frame = Frame.objects.get(pk=slowal_frame_id) frame.status = status frame.save() return JsonResponse({}) return JsonResponse({}) @ajax_required @transaction.atomic def save_unified_frame_title(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] unified_frame_title = request.POST['unified_frame_title'] unified_frame = UnifiedFrame.objects.get(id=unified_frame_id) if unified_frame: unified_frame.title = unified_frame_title unified_frame.save() return JsonResponse({}) @ajax_required @transaction.atomic def check_unified_frame_title_uniq(request): if request.method == 'POST': unified_frame_title = request.POST['unified_frame_title'] unified_frames = UnifiedFrame.objects.filter(title=unified_frame_title) return JsonResponse({"exists": len(unified_frames) > 0}) return JsonResponse({}) @ajax_required @transaction.atomic def save_selected_role(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] complement_id = request.POST['complement_id'] role_id = request.POST['role_id'] unified_frame_argument = UnifiedFrameArgument.objects.get(unified_frame_id=int(unified_frame_id), id=int(complement_id)) unified_frame_argument.role_id = role_id unified_frame_argument.save() return JsonResponse({}) @ajax_required @transaction.atomic def save_new_role(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] complement_id = request.POST['complement_id'] role_id = request.POST['role_id'] role_type = request.POST['role_type'] attribute_id = request.POST.get('attribute_id', None) sub_attribute_id = request.POST.get('sub_attribute_id', None) argument_role = ArgumentRole.objects.filter(role_id=role_id, attribute_id=attribute_id, sub_attribute_id=sub_attribute_id).first() if argument_role is None: argument_role = ArgumentRole(role=SemanticRole.objects.get(pk=role_id), attribute=None if attribute_id is None else RoleAttribute.objects.get(pk=attribute_id), sub_attribute=RoleSubAttribute.objects.get(pk=sub_attribute_id)) argument_role.save() unified_frame_argument = UnifiedFrameArgument.objects.get(unified_frame_id=unified_frame_id, id=complement_id) unified_frame_argument.role = argument_role unified_frame_argument.role_type = RoleType.objects.get(type=role_type) unified_frame_argument.save() return JsonResponse({}) @ajax_required @transaction.atomic def add_argument(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] unified_frame = UnifiedFrame.objects.get(pk=unified_frame_id) new_unified_frame_argument = UnifiedFrameArgument.objects.create(unified_frame=unified_frame) new_unified_frame_argument.save() unified_frame.arguments_count = unified_frame.arguments_count + 1 unified_frame.save() return JsonResponse({}) @ajax_required @transaction.atomic def remove_argument(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] complement_id = request.POST['complement_id'] new_unified_frame_argument = UnifiedFrameArgument.objects.get(id=complement_id) new_unified_frame_argument.delete() unified_frame = UnifiedFrame.objects.get(pk=unified_frame_id) unified_frame.arguments_count = unified_frame.arguments_count - 1 unified_frame.save() return JsonResponse({}) @ajax_required @transaction.atomic def change_unified_frame_status_to_ready(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] unified_frame = UnifiedFrame.objects.get(pk=unified_frame_id) unified_frame.status = UnifiedFrameStatus.READY unified_frame.save() return JsonResponse({}) @ajax_required @transaction.atomic def reject_unified_frame_ready_status(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] slowal_frame_id = int(request.POST['slowal_frame_id']) unified_frame = UnifiedFrame.objects.get(pk=unified_frame_id) unified_frame.status = UnifiedFrameStatus.PROCESSING unified_frame.save() if slowal_frame_id != -1: # Gdy -1 to zmieniamy tylko status ramy zunikowanej pozwalajac leksykografai na dlasza prace nad nia slowal_frame = Frame.objects.get(pk=slowal_frame_id) slowal_frame.status = FrameStatus.PROCESSING slowal_frame.save() mappings = UnifiedFrame2SlowalFrameMapping.objects.filter(unified_frame=unified_frame) for mapping in mappings.all(): id = mapping.slowal_frame.id if id != mapping.slowal_frame.id and mapping.slowal_frame.status == 'S': # Umozliwiamy ponowna prace nad rama dla leksykografa loaded_slowal_frame = Frame.objects.get(pk=id) loaded_slowal_frame.status = FrameStatus.READY loaded_slowal_frame.save() return JsonResponse({}) @ajax_required @transaction.atomic def change_unified_frame_status_to_verified_by_superleksykograf(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] unified_frame = UnifiedFrame.objects.get(pk=unified_frame_id) unified_frame.status = choices.UnifiedFrameStatus.VERIFIED # save fin statement info for current active fin statement fin_statements = FinStatement.objects.filter(is_active=True) if fin_statements.count() == 1: active_fin_statement = fin_statements[0] unified_frame.fin_statement = active_fin_statement unified_frame.save() return JsonResponse({}) @csrf_exempt def create_unified_frame(frame_id): print('Requesting unified frame creation service, frame_id: {}, service_url: {}' .format(frame_id, settings.UNIFIED_FRAME_SERVICE_URL + str(frame_id) + settings.SLOWAL_FRAME_SERVICE_SYSTEM_TYPE_ARG)) http = urllib3.PoolManager() r = http.request('GET', settings.UNIFIED_FRAME_SERVICE_URL + str(frame_id) + settings.SLOWAL_FRAME_SERVICE_SYSTEM_TYPE_ARG) response = r.data.decode('utf-8') print("Received xml data from api: {}".format(response)) parser = make_parser() parser.setFeature(handler.feature_external_ges, False) unified_frame_xml_handler = UnificationPreprocessHandler() parser.setContentHandler(unified_frame_xml_handler) f = io.StringIO(response) parser.parse(f) unified_frame_id = unified_frame_xml_handler.unified_frame_ids[0] return unified_frame_id @csrf_exempt def frame_statuses_free(request): if request.method == 'GET': return HttpResponse() @csrf_exempt def frame_statuses_take(request): if request.method == 'GET': return HttpResponse() @csrf_exempt def build_unified_frame_xml(request): if request.method == 'GET': frame_id = request.GET.get('frame_id') frames = Frame.objects.filter(id=frame_id) # lu = LexicalUnit.objects.get(pk=lu_id) # frames = list(lu.frames.all()) if len(frames) > 0: matching_elem = Element('matching') unifier_frame_elem = SubElement(matching_elem, 'unifier_frame') frame = frames[0] arguments = list(frame.arguments.all()) arg_cnt = len(arguments) for id in range(arg_cnt): argument_elem = SubElement(unifier_frame_elem, 'argument', attrib={'id': str(id)}) semantic_role_type_elem = SubElement(argument_elem, 'semantic_role', attrib={'type': 'role'}) roles_elem = SubElement(argument_elem, 'roles') role_elem1 = SubElement(roles_elem, 'role', attrib={'name': 'Initiator'}) role_elem2 = SubElement(roles_elem, 'role', attrib={'name': 'Manner'}) connections_elem = SubElement(unifier_frame_elem, 'connections') slowal_frame_elem = SubElement(connections_elem, 'slowal_frame', attrib={'id': str(frame.id)}) arguments_connections_elem = SubElement(slowal_frame_elem, 'argument_connections') for id, argument in enumerate(arguments): arguments_connection_elem = SubElement(arguments_connections_elem, 'argument_connection', attrib={'unifier_argument_id': str(id), 'slowal_id': str(argument.id)}) xml = tostring(matching_elem) return HttpResponse(xml) return HttpResponse() # @ajax_required # @transaction.atomic # def save_unified_frame_title(request): # if request.method == 'POST': # unified_frame_id = request.POST['unified_frame_id'] # unified_frame_title = request.POST['unified_frame_title'] # # unified_frame = UnifiedFrame.objects.get(id=unified_frame_id) # # if unified_frame: # unified_frame.title = unified_frame_title # unified_frame.save() # return JsonResponse({}) @ajax_required @transaction.atomic def frame_assign(request): if request.method == 'POST': lu_id = request.POST['lu_id'] frame_id = request.POST['frame_id'] unified_frame_title = request.POST['unified_frame_title'] unified_frame_pk = create_unified_frame(frame_id) unified_frame = get_object_or_404( UnifiedFrame.objects, pk=unified_frame_pk, ) unified_frame.title = unified_frame_title unified_frame.save() Assignment.assign(user=request.user, subject=unified_frame) slowal_frames = [connection.slowal_frame for connection in unified_frame.unified_frame_2_slowal_frame.all()] for slowal_frame in slowal_frames: slowal_frame.status = FrameStatus.PROCESSING Assignment.assign(user=request.user, subject=slowal_frame) slowal_frame.save() ret = { 'unified_frame_id': unified_frame_pk } return JsonResponse(ret) return JsonResponse({}) def remove_unified_frame_mappings_and_assigments(unified_frame): unified_frame_id = unified_frame.pk # odpianie z ramy zunifikowanej unified_frame2_slowal_frame_mappings = UnifiedFrame2SlowalFrameMapping.objects.filter( unified_frame_id=unified_frame_id) for unifiedFrame2SlowalFrameMapping in unified_frame2_slowal_frame_mappings: unifiedFrame2SlowalFrameMapping.slowal_frame.status = 'N' unifiedFrame2SlowalFrameMapping.slowal_frame.save() Assignment.delete(subject=unifiedFrame2SlowalFrameMapping.slowal_frame) unified_frame_argument_slowal_frame_mappings = UnifiedFrameArgumentSlowalFrameMapping.objects.filter( unified_frame_mapping=unifiedFrame2SlowalFrameMapping) unified_frame_argument_slowal_frame_mappings.delete() unifiedFrame2SlowalFrameMapping.delete() Assignment.delete(subject=unified_frame) @ajax(login_required=True, method='post') @transaction.atomic def delete_unified_frame(request, unified_frame_id): unified_frame = UnifiedFrame.objects.get(id=unified_frame_id) remove_unified_frame_mappings_and_assigments(unified_frame) UnifiedFrameArgument.objects.filter(unified_frame_id=unified_frame_id).delete() slowal_frames = UnifiedFrame2SlowalFrameMapping.objects.filter(unified_frame_id=unified_frame_id).all() slowal_frames_ids = ','.join(list(map(lambda slowal_frame: slowal_frame.id, slowal_frames))) if len(slowal_frames_ids) > 0: http = urllib3.PoolManager() r = http.request('GET', settings.SLOWAL_FRAME_REMOVE_SERVICE_URL + slowal_frames_ids + settings.SLOWAL_FRAME_SERVICE_SYSTEM_TYPE_ARG) unified_frame.delete() return {} @ajax_required @transaction.atomic def hierarchy_assign(request): """ Assign hierarchy relationship. The request has to contain 'hyponym_id' and 'hypernym_id' that represent unified frames taking part in the relationship. :param request: http request :return: Json response containg single field 'succ': (true|false) or 'exists': 'true' """ if request.method == 'POST': hyponym_id = request.POST['hyponym_id'] hyperonym_id = request.POST['hyperonym_id'] curr1 = HierarchyModel.objects.filter(hyponym_id=hyponym_id, hyperonym_id=hyperonym_id) curr2 = HierarchyModel.objects.filter(hyponym_id=hyperonym_id, hyperonym_id=hyponym_id) if curr1 or curr2: return JsonResponse({'exists': 'true'}) hierarchy = HierarchyModel() hierarchy.hyponym_id = hyponym_id hierarchy.hyperonym_id = hyperonym_id hierarchy.save() set_hierarchy_exists_info(hyponym_id) set_hierarchy_exists_info(hyperonym_id) return JsonResponse({'succ': 'true'}) return JsonResponse({}) def set_hierarchy_exists_info(unified_fram_id): unified_frame = UnifiedFrame.objects.get(pk=unified_fram_id) unified_frame.hasHierarchyElems = True unified_frame.save() @ajax_required @transaction.atomic def hierarchy_unassign(request): """ Unassign hierarchy relationship. The request has to contain 'rel1_id' and 'rel2_id' that represent unified frame IDs hierarchy pair. :param request: http request :return: Json response containg single field 'succ' = (true|false) """ if request.method == 'POST': rel1_id = request.POST['rel1_id'] rel2_id = request.POST['rel2_id'] curr1 = HierarchyModel.objects.filter(hyponym_id=rel1_id, hyperonym_id=rel2_id) succ = False if curr1: curr1.delete() succ = True else: curr2 = HierarchyModel.objects.filter(hyponym_id=rel2_id, hyperonym_id=rel1_id) if curr2: curr2.delete() succ = True # check if there is any heierarchy elements for unified frames from request set_no_hierarchy_exists_info(rel1_id) set_no_hierarchy_exists_info(rel2_id) return JsonResponse({'succ': succ}) def set_no_hierarchy_exists_info(unified_frame_id): """ Set unified frame field 'hasHierarchyElems' as false if needed. :param unified_frame_id: Unified frame id """ rel_1_hierarchy_count = HierarchyModel.objects.filter(Q(hyponym_id=unified_frame_id) | Q(hyperonym_id=unified_frame_id)).count() if rel_1_hierarchy_count == 0: # set info of no hierarchy elems in unified frame -> used to color unified frame list component unified_frame = UnifiedFrame.objects.get(pk=unified_frame_id) unified_frame.hasHierarchyElems = False unified_frame.save() @ajax_required @transaction.atomic def get_hierarchy_hyponyms(request, unified_frame_id): """ Returning hierarchy hyponyms for a given unified_frame_id :param request: http request :param unified_frame_id: Unifird fram id for witch hyponyms will be returned :return: Json response containing list of unified frames as hyponyms """ hyponyms = HierarchyModel.objects.filter(hyperonym_id=unified_frame_id) res = [] for unifiedFrame in hyponyms: res.append(get_unified_frame_json(unifiedFrame.hyponym, request)) res = { 'hyponyms': res } return JsonResponse(res) @ajax_required @transaction.atomic def get_hierarchy_hyperonyms(request, unified_frame_id): """ Returning hierarchy hypernyms for a given unified_frame_id. :param request: http request :param unified_frame_id: Unifird fram id for witch hyperonyms will be returned :return: Json response containing list of unified frames as hyperonyms """ hyperonyms = HierarchyModel.objects.filter(hyponym_id=unified_frame_id) res = [] for unifiedFrame in hyperonyms: res.append(get_unified_frame_json(unifiedFrame.hyperonym, request)) res = { 'hyperonyms': res } return JsonResponse(res) @ajax_required @transaction.atomic def attach_lu_to_unified_frame(request): if request.method == 'POST': unified_frame_id = request.POST['unified_frame_id'] lu_base_sense = request.POST['lu_base'] lu_base_sense_split = lu_base_sense.split('-') lu_base = lu_base_sense_split[0] lu_sense = lu_base_sense_split[1] unified_frame = UnifiedFrame.objects.get(pk=unified_frame_id) lu = LexicalUnit.objects.get(base=lu_base, sense=lu_sense, entry__isnull=False) frames = list(lu.frames.all()) for frame in frames: frame.status = FrameStatus.PROCESSING Assignment.assign(user=request.user, subject=frame) frame.save() mapping = UnifiedFrame2SlowalFrameMapping(unified_frame=unified_frame, slowal_frame=frame) UnifiedFrame2SlowalFrameMapping.save(mapping) slowal_frame_arguments = list(frame.arguments.all()) unified_frame_arguments = list(unified_frame.unified_arguments.all()) slowal_frame_argument_cnt = len(slowal_frame_arguments) for ind in range(slowal_frame_argument_cnt): if ind >= len(unified_frame_arguments): # create additional argument in unified frame unified_frame_argument = UnifiedFrameArgument(unified_frame=unified_frame) UnifiedFrameArgument.save(unified_frame_argument) else: unified_frame_argument = unified_frame_arguments[ind] unified_frame_argument_slowal_frame_mapping = \ UnifiedFrameArgumentSlowalFrameMapping(unified_frame_mapping=mapping, unified_agrument=unified_frame_argument, slowal_agrument=slowal_frame_arguments[ind]) UnifiedFrameArgumentSlowalFrameMapping.save(unified_frame_argument_slowal_frame_mapping) for frame in frames: http = urllib3.PoolManager() r = http.request('GET', settings.SLOWAL_FRAME_TAKE_SERVICE_URL + str(frame.id) + settings.SLOWAL_FRAME_SERVICE_SYSTEM_TYPE_ARG) return JsonResponse({}) return JsonResponse({}) def synset_hierarchy_constraint_check(lu_id, pref_lu_ids): conflict_exists = None if lu_id in pref_lu_ids: conflict_exists = lu_id conflict_hyponym = None if lu_id in synset_hierarchy_dict: synset_hierarchy = synset_hierarchy_dict[lu_id] conflict_hyponym = hierarchy_constraint_check_hypo(synset_hierarchy, lu_id, pref_lu_ids) conflict_hyperonym = None if lu_id in synset_hierarchy_dict: synset_hierarchy = synset_hierarchy_dict[lu_id] conflict_hyperonym = hierarchy_constraint_check_hyperonyms(synset_hierarchy, lu_id, pref_lu_ids) return conflict_hyponym, conflict_hyperonym, conflict_exists def hierarchy_constraint_check_hyperonyms(synset_hierarchy: SynsetHierarchy, lu_id: int, pref_lu_ids: []): for synset in synset_hierarchy.hyperonyms: if synset.id in pref_lu_ids: return synset.id for synset in synset_hierarchy.hyperonyms: ret = hierarchy_constraint_check_hyperonyms(synset_hierarchy_dict[synset.id], lu_id, pref_lu_ids) if ret is not None: return ret return None def hierarchy_constraint_check_hypo(synset_hierarchy: SynsetHierarchy, lu_id: int, pref_lu_ids: []): for synset in synset_hierarchy.hyponyms: if synset.id in pref_lu_ids: return synset.id for synset in synset_hierarchy.hyponyms: ret = hierarchy_constraint_check_hypo(synset_hierarchy_dict[synset.id], lu_id, pref_lu_ids) if ret is not None: return ret return None