Skip to content
Closed
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
36 changes: 5 additions & 31 deletions arches/app/models/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
from uuid import UUID
from types import SimpleNamespace
from django.db import transaction
from django.db.models import Count, F, Prefetch, Q
from django.db.models import Count, F, Q
from django.contrib.auth.models import User, Group
from django.forms.models import model_to_dict
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
Expand All @@ -41,7 +41,6 @@
from arches.app.tasks import index_resource
from arches.app.utils import import_class_from_string, task_management
from arches.app.utils import permission_backend
from arches.app.utils.i18n import rank_label
from arches.app.utils.label_based_graph import LabelBasedGraph
from arches.app.utils.label_based_graph_v2 import LabelBasedGraph as LabelBasedGraphV2
from arches.app.utils.permission_backend import (
Expand All @@ -58,6 +57,7 @@
get_filtered_instances,
get_nodegroups_by_perm,
)
from arches.app.utils.resource_relationship_utils import get_resource_relationship_type_label
import django.dispatch
from arches.app.datatypes.datatypes import DataTypeFactory

Expand Down Expand Up @@ -939,36 +939,10 @@ def get_relations(
for relation in permitted_relation_dicts
if relation["relationshiptype"]
}
relationship_type_values = (
models.Value.objects.filter(
value__in=relationship_types,
)
.select_related("concept")
.prefetch_related(
Prefetch(
"concept__value_set",
# Begin with an order, so that if rank_label()
# produces ties, we still have a deterministic result.
queryset=models.Value.objects.order_by("pk"),
),
)

preflabel_lookup = get_resource_relationship_type_label(
relationship_types, lang
)
preflabel_lookup = {
str(rel_type.pk): (
sorted(
rel_type.concept.value_set.all(),
key=lambda label: rank_label(
kind=label.valuetype_id,
source_lang=label.language_id,
target_lang=lang,
),
reverse=True,
)[0].value
if rel_type.concept.value_set.all()
else ""
)
for rel_type in relationship_type_values
}

for relation in permitted_relation_dicts:
relation["relationshiptype_label"] = preflabel_lookup.get(
Expand Down
61 changes: 61 additions & 0 deletions arches/app/utils/resource_relationship_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
from django.core.exceptions import ValidationError
from django.db.models import Prefetch

from arches.app.models.models import Value
from arches.app.utils.i18n import rank_label, get_language

from arches_controlled_lists.models import (
ListItem,
) # TODO: ListItem needs to be moved to arches


def get_resource_relationship_type_label(relationship_types, lang=None):
preflabel_lookup = {}
if lang is None:
lang = get_language()
try:
relationship_type_values = (
Value.objects.filter(
valueid__in=relationship_types,
)
.select_related("concept")
.prefetch_related(
Prefetch(
"concept__value_set",
queryset=Value.objects.order_by("pk"),
),
)
)
preflabel_lookup = {
str(rel_type.pk): (
sorted(
rel_type.concept.value_set.all(),
key=lambda label: rank_label(
kind=label.valuetype_id,
source_lang=label.language_id,
target_lang=lang,
),
reverse=True,
)[0].value
if rel_type.concept.value_set.all()
else ""
)
for rel_type in relationship_type_values
}
except ValidationError:
# If relationship_type is not a uuid, ListItem or Ontology Property
try:
relationship_type_values = ListItem.objects.filter(
uri__in=relationship_types,
).prefetch_related("list_item_values")
preflabel_lookup = {
str(rel_type.uri): ListItem.find_best_label_from_set(
rel_type.list_item_values.all(), language=lang
)
for rel_type in relationship_type_values
}
except ListItem.DoesNotExist:
# Ontology Property or generic string
pass

return preflabel_lookup
28 changes: 17 additions & 11 deletions arches/app/views/api/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,13 @@
user_can_edit_resource,
user_can_delete_resource,
get_nodegroups_by_perm,
user_is_resource_reviewer,
)
from arches.app.utils.permission_backend import get_nodegroups_by_perm
from arches.app.utils.permission_backend import user_is_resource_reviewer
from arches.app.utils.resource_relationship_utils import get_resource_relationship_type_label
from arches.app.utils.response import JSONResponse, JSONErrorResponse
from arches.app.views.api import APIBase
from arches.app.views.resource import (
RelatedResourcesView,
get_resource_relationship_types,
)
from arches.app.views.resource import RelatedResourcesView


logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -726,12 +724,20 @@ def _generate_related_resources_summary(
for resource_model in resource_models
]

resource_relationship_types = {
resource_relationship_type["id"]: resource_relationship_type["text"]
for resource_relationship_type in get_resource_relationship_types()[
"values"
]
inverse_relationship = {
relation["inverserelationshiptype"]
for relation in resource_relationships
if relation["inverserelationshiptype"]
}
forward_relationship = {
relation["relationshiptype"]
for relation in resource_relationships
if relation["relationshiptype"]
}
relationship_types = list(inverse_relationship | forward_relationship)
resource_relationship_types = get_resource_relationship_type_label(
relationship_types
)

for related_resource in related_resources:
for summary in related_resource_summary:
Expand Down
Loading