Source code for apis_core.apis_relations.views

import json
import re
import inspect

from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.contrib.contenttypes.models import ContentType
from django.http import HttpResponse, Http404
from django.template.loader import render_to_string
from apis_core.apis_relations import forms as relation_form_module

from apis_core.apis_entities.models import Person, Institution, Place, Event, Work, AbstractEntity
from apis_core.apis_labels.models import Label
from apis_core.apis_metainfo.models import Uri
from .forms2 import GenericRelationForm
from .models import (
    PersonPlace, PersonPerson, PersonInstitution, InstitutionPlace,
    InstitutionInstitution, PlacePlace, PersonEvent, InstitutionEvent, PlaceEvent, PersonWork,
    InstitutionWork, PlaceWork, EventWork, WorkWork
)
#from .forms import PersonLabelForm, InstitutionLabelForm, PlaceLabelForm, EventLabelForm
from .tables import LabelTableEdit

form_module_list = [relation_form_module]

if 'apis_highlighter' in settings.INSTALLED_APPS:
    from apis_highlighter.highlighter import highlight_text_new
    from apis_highlighter import forms as highlighter_form_module
    form_module_list.append(highlighter_form_module)


[docs]def turn_form_modules_into_dict(form_module_list): """ Since form classes are loaded dynamically from the respective modules and it's settings-dependent which modules are imported and which not, it's better to differentiate here which modules are imported close to their imports and then providing a dict for later extraction of the required form class. """ form_class_dict = {} for m in form_module_list: for name, cls in inspect.getmembers(m, inspect.isclass): form_class_dict[name] = cls return form_class_dict
form_class_dict = turn_form_modules_into_dict(form_module_list) ############################################################################ ############################################################################ # # Generic views for AjaxForms # ############################################################################ ############################################################################ ###################################################### # test for class-ignoring _ajax_form-functions ###################################################### # Model-classes must be registered together with their ModelForm-classes registered_forms = {'WorkWorkForm': [WorkWork, Work, Work], 'PersonPlaceForm': [PersonPlace, Person, Place], 'PersonPlaceHighlighterForm': [PersonPlace, Person, Place], 'PersonPersonForm': [PersonPerson, Person, Person], 'PersonPersonHighlighterForm': [PersonPerson, Person, Person], 'PersonInstitutionForm': [PersonInstitution, Person, Institution], 'PersonEventForm': [PersonEvent, Person, Event], 'PersonWorkForm': [PersonWork, Person, Work], 'PersonInstitutionHighlighterForm': [PersonInstitution, Person, Institution], 'PersonWorkHighlighterForm': [PersonWork, Person, Work], 'PlaceWorkHighlighterForm': [PlaceWork, Place, Work], 'InstitutionWorkHighlighterForm': [InstitutionWork, Institution, Work], 'InstitutionPlaceForm': [InstitutionPlace, Institution, Place], 'InstitutionInstitutionForm': [ InstitutionInstitution, Institution, Institution], 'InstitutionPersonForm': [PersonInstitution, Institution, Person], 'InstitutionEventForm': [InstitutionEvent, Institution, Event], 'InstitutionWorkForm': [InstitutionWork, Institution, Work], 'PlaceEventForm': [PlaceEvent, Place, Event], 'PlaceWorkForm': [PlaceWork, Place, Work], 'PlacePlaceForm': [PlacePlace, Place, Place], 'EventWorkForm': [EventWork, Event, Work], 'InstitutionLabelForm': [Label, Institution, Label], 'PersonLabelForm': [Label, Person, Label], 'EventLabelForm': [Label, Event, Label], 'PersonResolveUriForm': [Uri, Person, Uri], 'SundayHighlighterForm': [ ], 'AddRelationHighlighterPersonForm': [], #'PlaceHighlighterForm': [Annotation, ], #'PersonHighlighterForm': [Annotation, ] }
[docs]@login_required def get_form_ajax(request): '''Returns forms rendered in html''' FormName = request.POST.get('FormName') SiteID = request.POST.get('SiteID') ButtonText = request.POST.get('ButtonText') ObjectID = request.POST.get('ObjectID') entity_type_str = request.POST.get('entity_type') form_match = re.match(r'([A-Z][a-z]+)([A-Z][a-z]+)(Highlighter)?Form', FormName) form_match2 = re.match(r'([A-Z][a-z]+)(Highlighter)?Form', FormName) if FormName and form_match: entity_type_v1 = ContentType.objects.filter( model='{}{}'.format(form_match.group(1).lower(), form_match.group(2)).lower(), app_label='apis_relations') entity_type_v2 = ContentType.objects.none() elif FormName and form_match2: entity_type_v2 = ContentType.objects.filter( model='{}'.format( form_match.group(1).lower(), app_label='apis_entities')) entity_type_v1 = ContentType.objects.none() else: entity_type_v1 = ContentType.objects.none() entity_type_v2 = ContentType.objects.none() if ObjectID == 'false' or ObjectID is None or ObjectID == 'None': ObjectID = False form_dict = {'entity_type': entity_type_str} elif entity_type_v1.count() > 0: d = entity_type_v1[0].model_class().objects.get(pk=ObjectID) form_dict = {'instance': d, 'siteID': SiteID, 'entity_type': entity_type_str} elif entity_type_v2.count() > 0: d = entity_type_v2[0].model_class().objects.get(pk=ObjectID) form_dict = {'instance': d, 'siteID': SiteID, 'entity_type': entity_type_str} else: if FormName not in registered_forms.keys(): raise Http404 d = registered_forms[FormName][0].objects.get(pk=ObjectID) form_dict = {'instance': d, 'siteID': SiteID, 'entity_type': entity_type_str} if entity_type_v1.count() > 0: form_dict['relation_form'] = '{}{}'.format(form_match.group(1), form_match.group(2)) if form_match.group(3) == 'Highlighter': form_dict['highlighter'] = True form = GenericRelationForm(**form_dict) else: form_class = form_class_dict[FormName] form = form_class(**form_dict) tab = FormName[:-4] data = {'tab': tab, 'form': render_to_string("apis_relations/_ajax_form.html", { "entity_type": entity_type_str, "form": form, 'type1': FormName, 'url2': 'save_ajax_'+FormName, 'button_text': ButtonText, 'ObjectID': ObjectID, 'SiteID': SiteID})} return HttpResponse(json.dumps(data), content_type='application/json')
[docs]@login_required def save_ajax_form(request, entity_type, kind_form, SiteID, ObjectID=False): '''Tests validity and saves AjaxForms, returns them when validity test fails''' if kind_form not in registered_forms.keys(): raise Http404 button_text = "create/modify" if not ObjectID: instance_id = '' else: instance_id = ObjectID entity_type_str = entity_type entity_type = AbstractEntity.get_entity_class_of_name(entity_type) form_match = re.match(r'([A-Z][a-z]+)([A-Z][a-z]+)?(Highlighter)?Form', kind_form) form_dict = {'data': request.POST, 'entity_type': entity_type, 'request': request} test_form_relations = ContentType.objects.filter( model='{}{}'.format(form_match.group(1).lower(), form_match.group(2)).lower(), app_label='apis_relations') tab = re.match(r'(.*)Form', kind_form).group(1) call_function = 'EntityRelationForm_response' if test_form_relations.count() > 0: relation_form = test_form_relations[0].model_class() form_dict['relation_form'] = relation_form if form_match.group(3) == 'Highlighter': form_dict['highlighter'] = True tab = form_match.group(1)+form_match.group(2) call_function = 'HighlForm_response' form = GenericRelationForm(**form_dict) else: form_class = form_class_dict[kind_form] form = form_class(**form_dict) if form.is_valid(): site_instance = entity_type.objects.get(pk=SiteID) set_ann_proj = request.session.get('annotation_project', 1) entity_types_highlighter = request.session.get('entity_types_highlighter') users_show = request.session.get('users_show_highlighter', None) hl_text = None if ObjectID: instance = form.save(instance=ObjectID, site_instance=site_instance) else: instance = form.save(site_instance=site_instance) right_card = True if test_form_relations.count() > 0: table_html = form.get_html_table(entity_type_str, request, site_instance, form_match) if 'Highlighter' in tab or form_match.group(3) == 'Highlighter': hl_text = { 'text': highlight_text_new(form.get_text_id(), users_show=users_show, set_ann_proj=set_ann_proj, types=entity_types_highlighter)[0].strip(), 'id': form.get_text_id()} if tab == 'PersonLabel': table_html = LabelTableEdit( data=site_instance.label_set.all(), prefix='PL-') elif tab == 'InstitutionLabel': table_html = LabelTableEdit( data=site_instance.label_set.all(), prefix='IL-') elif tab == 'PersonResolveUri': table_html = EntityUriTable( Uri.objects.filter(entity=site_instance), prefix='PURI-' ) elif tab == 'AddRelationHighlighterPerson' or tab == 'PlaceHighlighter' or tab == 'PersonHighlighter' or tab == 'SundayHighlighter': table_html = None right_card = False call_function = 'PAddRelation_response' instance = None if instance: instance2 = instance.get_web_object() else: instance2 = None if table_html: table_html2 = table_html.as_html(request) else: table_html2 = None data = {'test': True, 'tab': tab, 'call_function': call_function, 'instance': instance2, 'table_html': table_html2, 'text': hl_text, 'right_card': right_card} else: if 'Highlighter' in tab: call_function = 'HighlForm_response' data = {'test': False, 'call_function': call_function, 'DivID': 'div_'+kind_form+instance_id, 'form': render_to_string("apis_relations/_ajax_form.html", context={ "entity_type": entity_type_str, "form": form, 'type1': kind_form, 'url2': 'save_ajax_'+kind_form, 'button_text': button_text, 'ObjectID': ObjectID, 'SiteID': SiteID}, request=request)} # except Exception as e: # print('Error in save method') # print(e) # data = {'test': False, 'error': json.dumps(str(e))} return HttpResponse(json.dumps(data), content_type='application/json')