Skip to content

Commit

Permalink
refactor(utils): use contenttype instead of model name for helper
Browse files Browse the repository at this point in the history
The `get_classes_with_allowed_relation_from` method created a list of
possible related models based on the name of one model. It then returned
the names of those models as strings. It makes more sense to simply use
contenttypes instead of model names, especially since the Property model
stores the possible subj and obj classes as ContentTypes.
This commit refactors the method and also updates `triple_sidebar` which
is the only funciton that uses the
`get_classes_with_allowed_relation_from` method.

Closes: #254
  • Loading branch information
b1rger committed Mar 21, 2024
1 parent 252266e commit 7af6000
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 27 deletions.
4 changes: 1 addition & 3 deletions apis_core/apis_entities/templatetags/apis_templatetags.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
44 changes: 20 additions & 24 deletions apis_core/utils/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand All @@ -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(
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 7af6000

Please sign in to comment.