Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(utils): use contenttype instead of model name for helper #739

Merged
merged 1 commit into from
Jun 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -53,6 +53,4 @@ def entities_verbose_name_plural_listview_url():
@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)
4 changes: 1 addition & 3 deletions apis_core/history/templatetags/apis_history_templatetags.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@
@register.simple_tag(takes_context=True)
def object_relations_history(context, detail=True):
obj = context["object"]
return triple_sidebar_history(
obj.pk, obj.__class__.__name__.lower(), context["request"], detail
)
return triple_sidebar_history(obj, context["request"], detail)


@register.filter
Expand Down
48 changes: 21 additions & 27 deletions apis_core/history/utils.py
Original file line number Diff line number Diff line change
@@ -1,52 +1,46 @@
from apis_core.apis_relations.tables import get_generic_triple_table
from apis_core.utils.helpers import get_classes_with_allowed_relation_from
from apis_core.utils.helpers import get_content_types_with_allowed_relation_from
from apis_core.utils.settings import get_entity_settings_by_modelname
from django.contrib.contenttypes.models import ContentType
from django.db.models import Q
from django_tables2 import RequestConfig


def triple_sidebar_history(pk: int, entity_name: str, request, detail=True):
def triple_sidebar_history(obj: object, request, detail=True):
side_bar = []
entity_name = entity_name.replace("version", "")

historical_entity = (
ContentType.objects.get(model=entity_name)
.model_class()
.history.get(history_id=pk)
)
triples_related_all = historical_entity.get_triples_for_version()
if historical_entity.version_tag is not None:
triples_related_all = obj.get_triples_for_version()
if obj.version_tag is not None:
triples_related_all = triples_related_all.filter(
Q(version_tag=historical_entity.version_tag)
| Q(version_tag__contains=f"{historical_entity.version_tag},")
Q(version_tag=obj.version_tag)
| Q(version_tag__contains=f"{obj.version_tag},")
)
pk = historical_entity.instance.pk

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()

content_type = ContentType.objects.get_for_model(obj.instance_type)
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.instance.pk))
| (
Q(obj__self_contenttype=other_content_type)
& Q(subj__pk=obj.instance.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.instance.pk,
detail=detail,
)

prefix = f"{other_entity_class_name}"
title_card = prefix
prefix = f"{other_content_type.model}"
title_card = other_content_type.name
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
46 changes: 21 additions & 25 deletions apis_core/utils/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,17 @@
from django_tables2 import RequestConfig


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 @@ -44,10 +44,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 @@ -139,39 +136,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}"
title_card = entity_class._meta.verbose_name
prefix = f"{other_content_type.model}"
title_card = other_content_type.name
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
Loading