diff --git a/apis_ontology/api_views.py b/apis_ontology/api_views.py index e35c508..ecf5668 100644 --- a/apis_ontology/api_views.py +++ b/apis_ontology/api_views.py @@ -28,16 +28,34 @@ class SicprodModelViewSet(ModelViewSet): We override the generic ModelViewSet so we can add the facet information to the -list output """ - facet_attributes = ["gender", "type"] + facet_attributes = ["gender", "type", "related_persons", "related_functions", "related_places", "related_institutions", "related_events", "related_salaries"] def generate_facet_data(self): facets = {} for el in self.filter_queryset(self.get_queryset()): for attribute in self.facet_attributes: - val = getattr(el, attribute, None) - if val is not None: + values = getattr(el, attribute, []) + if isinstance(values, str): + values = [values] + if values == None: + values = [] + + for value in values: facets[attribute] = facets.get(attribute, {}) - facets[attribute][val] = facets[attribute].get(val, 0) + 1 + match value: + case dict(): + facetdict = facets[attribute].get(value["id"], {"name": value["name"], "count": 0 }) + facetdict["count"] += 1 + facets[attribute][value["id"]] = facetdict + case str(): + id = value or "emtpy" + facetdict = facets[attribute].get(id, {"name": value, "count": 0}) + facetdict["count"] += 1 + facets[attribute][id] = facetdict + case None: + pass + case other: + print(f"Unusable value for facetlist: {other}") return {"facets": facets} def list(self, request, *args, **kwargs): diff --git a/apis_ontology/querysets.py b/apis_ontology/querysets.py index 44f04c7..f4e0626 100644 --- a/apis_ontology/querysets.py +++ b/apis_ontology/querysets.py @@ -1,2 +1,26 @@ +from django.contrib.postgres.expressions import ArraySubquery +from django.db.models import OuterRef, Value +from django.db.models.functions import JSONObject, Concat +from apis_ontology.models import Person, Function, Place, Institution, Event, Salary + + def SalaryViewSetQueryset(queryset): return queryset.filter(typ__in=["Sold", "Provision", "Sonstiges"]) + + +def LegacyStuffMixinViewSetQueryset(queryset): + space = Value(" ") + person_subquery = Person.objects.filter(triple_set_from_obj__subj_id=OuterRef("pk")).values(json=JSONObject(name=Concat("first_name", space, "name"), id="id")) + function_subquery = Function.objects.filter(triple_set_from_obj__subj_id=OuterRef("pk")).values(json=JSONObject(name="name", id="id")) + place_subquery = Place.objects.filter(triple_set_from_obj__subj_id=OuterRef("pk")).values(json=JSONObject(name="name", id="id")) + institution_subquery = Institution.objects.filter(triple_set_from_obj__subj_id=OuterRef("pk")).values(json=JSONObject(name="name", id="id")) + event_subquery = Event.objects.filter(triple_set_from_obj__subj_id=OuterRef("pk")).values(json=JSONObject(name="name", id="id")) + salary_subquery = Salary.objects.filter(triple_set_from_obj__subj_id=OuterRef("pk")).values(json=JSONObject(name="name", id="id")) + return queryset.annotate( + related_persons=ArraySubquery(person_subquery), + related_functions=ArraySubquery(function_subquery), + related_places=ArraySubquery(place_subquery), + related_institutions=ArraySubquery(institution_subquery), + related_events=ArraySubquery(event_subquery), + related_salaries=ArraySubquery(salary_subquery), + )