diff --git a/apis_core/apis_entities/templatetags/apis_templatetags.py b/apis_core/apis_entities/templatetags/apis_templatetags.py index ad4d5c3d5..c295b5d9d 100644 --- a/apis_core/apis_entities/templatetags/apis_templatetags.py +++ b/apis_core/apis_entities/templatetags/apis_templatetags.py @@ -32,6 +32,4 @@ def entities_list_links(): @register.simple_tag(takes_context=True) def object_relations(context, detail=True): obj = context["object"] - return triple_sidebar( - obj.pk, obj.__class__.__name__.lower(), context["request"], detail - ) + return triple_sidebar(obj, context["request"], detail) diff --git a/apis_core/utils/helpers.py b/apis_core/utils/helpers.py index 5299679d2..6b5c94cfc 100644 --- a/apis_core/utils/helpers.py +++ b/apis_core/utils/helpers.py @@ -20,17 +20,17 @@ @functools.lru_cache -def get_classes_with_allowed_relation_from( - entity_name: str, -) -> list[object]: - """Returns a list of classes to which the given class may be related by a Property""" +def get_content_types_with_allowed_relation_from( + content_type: ContentType, +) -> list[ContentType]: + """Returns a list of ContentTypes to which the given ContentTypes may be related by a Property""" # Find all the properties where the entity is either subject or object properties_with_entity_as_subject = Property.objects.filter( - subj_class__model=entity_name + subj_class=content_type ).prefetch_related("obj_class") properties_with_entity_as_object = Property.objects.filter( - obj_class__model=entity_name + obj_class=content_type ).prefetch_related("subj_class") content_type_querysets = [] @@ -45,10 +45,7 @@ def get_classes_with_allowed_relation_from( content_type_querysets.append(subjs) # Join querysets with itertools.chain, call set to make unique, and extract the model class - return [ - content_type.model_class() - for content_type in set(itertools.chain(*content_type_querysets)) - ] + return set(itertools.chain(*content_type_querysets)) def get_member_for_entity( @@ -140,39 +137,38 @@ def datadump_serializer(additional_app_labels: list = [], serialier_format="json ) -def triple_sidebar(pk: int, entity_name: str, request, detail=True): +def triple_sidebar(obj: object, request, detail=True): + content_type = ContentType.objects.get_for_model(obj) side_bar = [] triples_related_all = ( - TempTriple.objects_inheritance.filter(Q(subj__pk=pk) | Q(obj__pk=pk)) + TempTriple.objects_inheritance.filter(Q(subj__pk=obj.pk) | Q(obj__pk=obj.pk)) .all() .select_subclasses() ) - for entity_class in get_classes_with_allowed_relation_from(entity_name): - entity_content_type = ContentType.objects.get_for_model(entity_class) - - other_entity_class_name = entity_class.__name__.lower() - + for other_content_type in get_content_types_with_allowed_relation_from( + content_type + ): triples_related_by_entity = triples_related_all.filter( - (Q(subj__self_contenttype=entity_content_type) & Q(obj__pk=pk)) - | (Q(obj__self_contenttype=entity_content_type) & Q(subj__pk=pk)) + (Q(subj__self_contenttype=other_content_type) & Q(obj__pk=obj.pk)) + | (Q(obj__self_contenttype=other_content_type) & Q(subj__pk=obj.pk)) ) table_class = get_generic_triple_table( - other_entity_class_name=other_entity_class_name, - entity_pk_self=pk, + other_entity_class_name=other_content_type.model, + entity_pk_self=obj.pk, detail=detail, ) - prefix = f"{other_entity_class_name}" + prefix = f"{other_content_type.model}" title_card = prefix tb_object = table_class(data=triples_related_by_entity, prefix=prefix) tb_object_open = request.GET.get(prefix + "page", None) - entity_settings = get_entity_settings_by_modelname(entity_class.__name__) + entity_settings = get_entity_settings_by_modelname(content_type.model) per_page = entity_settings.get("relations_per_page", 10) RequestConfig(request, paginate={"per_page": per_page}).configure(tb_object) - tab_id = f"triple_form_{entity_name}_to_{other_entity_class_name}" + tab_id = f"triple_form_{content_type.model}_to_{other_content_type.model}" side_bar.append( ( title_card,