Skip to content

Commit 342bb63

Browse files
committed
fix(display): ensure subjectClass is properly passed to grouped triples
- Add subject_class parameter to process_display_rule and process_default_property - Pass highest_priority_class as subject_class throughout the call chain - Set subjectClass field in all grouped_triples data structures - Update unit tests to include subjectClass in mock data Fixes issue where subjectClass was always None in Jinja templates
1 parent 61bdb81 commit 342bb63

File tree

2 files changed

+35
-15
lines changed

2 files changed

+35
-15
lines changed

heritrace/utils/display_rules_utils.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,8 @@ def get_grouped_triples(
292292
fetched_values_map,
293293
historical_snapshot,
294294
highest_priority_shape,
295-
object_shape
295+
object_shape,
296+
highest_priority_class
296297
)
297298
if is_ordered:
298299
grouped_triples[display_name_nested]["is_draggable"] = True
@@ -312,6 +313,7 @@ def get_grouped_triples(
312313
grouped_triples[display_name_nested] = {
313314
"property": prop_uri,
314315
"triples": [],
316+
"subjectClass": highest_priority_class,
315317
"subjectShape": highest_priority_shape,
316318
"objectShape": display_rule_nested.get("shape")
317319
}
@@ -343,11 +345,12 @@ def get_grouped_triples(
343345
fetched_values_map,
344346
historical_snapshot,
345347
highest_priority_shape,
346-
object_shape
348+
object_shape,
349+
highest_priority_class
347350
)
348351
if "orderedBy" in current_prop_config:
349352
if display_name_simple not in grouped_triples:
350-
grouped_triples[display_name_simple] = {"property": prop_uri, "triples": [], "subjectShape": highest_priority_shape, "objectShape": current_prop_config.get("shape")}
353+
grouped_triples[display_name_simple] = {"property": prop_uri, "triples": [], "subjectClass": highest_priority_class, "subjectShape": highest_priority_shape, "objectShape": current_prop_config.get("shape")}
351354
grouped_triples[display_name_simple]["is_draggable"] = True
352355
grouped_triples[display_name_simple]["ordered_by"] = current_prop_config.get("orderedBy")
353356
process_ordering(
@@ -362,16 +365,16 @@ def get_grouped_triples(
362365
)
363366
if "intermediateRelation" in current_prop_config:
364367
if display_name_simple not in grouped_triples:
365-
grouped_triples[display_name_simple] = {"property": prop_uri, "triples": [], "subjectShape": highest_priority_shape, "objectShape": current_prop_config.get("shape")}
368+
grouped_triples[display_name_simple] = {"property": prop_uri, "triples": [], "subjectClass": highest_priority_class, "subjectShape": highest_priority_shape, "objectShape": current_prop_config.get("shape")}
366369
grouped_triples[display_name_simple]["intermediateRelation"] = current_prop_config["intermediateRelation"]
367370
else:
368371
# Property without specific configuration - add to relevant_properties
369372
relevant_properties.add(prop_uri)
370-
process_default_property(prop_uri, triples, grouped_triples, highest_priority_shape)
373+
process_default_property(prop_uri, triples, grouped_triples, highest_priority_shape, highest_priority_class)
371374
else:
372375
# No display rules or no matching rule - add all properties to relevant_properties
373376
relevant_properties.add(prop_uri)
374-
process_default_property(prop_uri, triples, grouped_triples, highest_priority_shape)
377+
process_default_property(prop_uri, triples, grouped_triples, highest_priority_shape, highest_priority_class)
375378

376379
grouped_triples = OrderedDict(grouped_triples)
377380
return grouped_triples, relevant_properties
@@ -388,11 +391,13 @@ def process_display_rule(
388391
historical_snapshot=None,
389392
subject_shape=None,
390393
object_shape=None,
394+
subject_class=None,
391395
):
392396
if display_name not in grouped_triples:
393397
grouped_triples[display_name] = {
394398
"property": prop_uri,
395399
"triples": [],
400+
"subjectClass": subject_class,
396401
"subjectShape": subject_shape,
397402
"objectShape": object_shape,
398403
"intermediateRelation": rule.get("intermediateRelation"),
@@ -419,6 +424,7 @@ def process_display_rule(
419424
"triple": new_triple,
420425
"external_entity": external_entity,
421426
"object": object_uri,
427+
"subjectClass": subject_class,
422428
"subjectShape": subject_shape,
423429
"objectShape": object_shape,
424430
}
@@ -436,6 +442,7 @@ def process_display_rule(
436442
new_triple_data = {
437443
"triple": (str(triple[0]), str(triple[1]), result),
438444
"object": object_uri,
445+
"subjectClass": subject_class,
439446
"subjectShape": subject_shape,
440447
"objectShape": object_shape,
441448
}
@@ -535,11 +542,12 @@ def get_ordered_sequence(order_results):
535542
)
536543

537544

538-
def process_default_property(prop_uri, triples, grouped_triples, subject_shape=None):
545+
def process_default_property(prop_uri, triples, grouped_triples, subject_shape=None, subject_class=None):
539546
display_name = prop_uri
540547
grouped_triples[display_name] = {
541548
"property": prop_uri,
542549
"triples": [],
550+
"subjectClass": subject_class,
543551
"subjectShape": subject_shape,
544552
"objectShape": None
545553
}
@@ -548,6 +556,7 @@ def process_default_property(prop_uri, triples, grouped_triples, subject_shape=N
548556
new_triple_data = {
549557
"triple": (str(triple[0]), str(triple[1]), str(triple[2])),
550558
"object": str(triple[2]),
559+
"subjectClass": subject_class,
551560
"subjectShape": subject_shape,
552561
"objectShape": None,
553562
}

tests/unit/test_display_rules_utils.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -785,18 +785,21 @@ def test_get_grouped_triples_with_rules(
785785
grouped_triples["Person Name"] = {
786786
"property": "http://example.org/name",
787787
"triples": [{"triple": ("http://example.org/person1", "http://example.org/name", "mock_value")}],
788+
"subjectClass": "http://example.org/Person",
788789
"subjectShape": "http://example.org/PersonShape",
789790
"objectShape": None,
790791
}
791792
grouped_triples["Person Age"] = {
792793
"property": "http://example.org/age",
793794
"triples": [{"triple": ("http://example.org/person1", "http://example.org/age", "mock_value")}],
795+
"subjectClass": "http://example.org/Person",
794796
"subjectShape": "http://example.org/PersonShape",
795797
"objectShape": None,
796798
}
797799
grouped_triples["Person Knows"] = {
798800
"property": "http://example.org/knows",
799801
"triples": [{"triple": ("http://example.org/person1", "http://example.org/knows", "mock_value")}],
802+
"subjectClass": "http://example.org/Person",
800803
"subjectShape": "http://example.org/PersonShape",
801804
"objectShape": None,
802805
}
@@ -817,12 +820,13 @@ def test_get_grouped_triples_no_rules(
817820
"""Test getting grouped triples with no display rules."""
818821
self.get_display_rules_patch.return_value = []
819822

820-
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None):
823+
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None, subject_class=None):
821824
display_name = prop_uri.split("/")[-1]
822825
if display_name not in grouped_triples:
823826
grouped_triples[display_name] = {
824827
"property": prop_uri,
825828
"triples": [{"triple": ("http://example.org/person1", prop_uri, "mock_value")}],
829+
"subjectClass": self.highest_priority_class,
826830
"subjectShape": self.subject_shape,
827831
"objectShape": None,
828832
}
@@ -869,12 +873,13 @@ def test_get_grouped_triples_no_matching_rule(
869873
# Mock find_matching_rule to return None (no matching rule)
870874
self.mock_find_matching_rule.return_value = None
871875

872-
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None):
876+
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None, subject_class=None):
873877
display_name = prop_uri.split("/")[-1]
874878
if display_name not in grouped_triples:
875879
grouped_triples[display_name] = {
876880
"property": prop_uri,
877881
"triples": [{"triple": ("http://example.org/person1", prop_uri, "mock_value")}],
882+
"subjectClass": self.highest_priority_class,
878883
"subjectShape": self.subject_shape,
879884
"objectShape": None,
880885
}
@@ -909,12 +914,13 @@ def test_type_consistency_for_filtering_in_entity_about(
909914
# Simulate no display rules (the scenario where the bug occurred)
910915
self.get_display_rules_patch.return_value = []
911916

912-
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None):
917+
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None, subject_class=None):
913918
display_name = prop_uri.split("/")[-1]
914919
if display_name not in grouped_triples:
915920
grouped_triples[display_name] = {
916921
"property": prop_uri,
917922
"triples": [{"triple": ("http://example.org/person1", prop_uri, "mock_value")}],
923+
"subjectClass": self.highest_priority_class,
918924
"subjectShape": self.subject_shape,
919925
"objectShape": None,
920926
}
@@ -976,13 +982,14 @@ def test_get_grouped_triples_with_intermediate_relation(
976982
"shouldBeDisplayed": True,
977983
}
978984

979-
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None):
985+
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None, subject_class=None):
980986
if prop_uri == "http://example.org/knows":
981987
display_name = "Knows"
982988
if display_name not in grouped_triples:
983989
grouped_triples[display_name] = {
984990
"property": prop_uri,
985991
"triples": [{"triple": ("http://example.org/person1", prop_uri, "mock_value")}],
992+
"subjectClass": subject_class,
986993
"subjectShape": subject_shape,
987994
"objectShape": "http://example.org/PersonShape",
988995
"intermediateRelation": {"class": "http://example.org/Relationship"},
@@ -1036,13 +1043,14 @@ def test_top_level_intermediate_relation_condition(self,
10361043
def mock_execute_sparql_query(query, subject, value):
10371044
return "Label for " + str(value), None
10381045

1039-
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None):
1046+
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None, subject_class=None):
10401047
if prop_uri == "http://example.org/knows":
10411048
display_name = "Knows"
10421049
if display_name not in grouped_triples:
10431050
grouped_triples[display_name] = {
10441051
"property": prop_uri,
10451052
"triples": [{"triple": ("http://example.org/person1", prop_uri, "mock_value")}],
1053+
"subjectClass": subject_class,
10461054
"subjectShape": subject_shape,
10471055
"objectShape": None,
10481056
"intermediateRelation": {"class": "http://example.org/Relationship"},
@@ -1095,13 +1103,14 @@ def test_nested_intermediate_relation_condition(
10951103
"shouldBeDisplayed": True,
10961104
}
10971105

1098-
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None):
1106+
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None, subject_class=None):
10991107
if prop_uri == "http://example.org/knows":
11001108
display_name = "Knows (with relationship)"
11011109
if display_name not in grouped_triples:
11021110
grouped_triples[display_name] = {
11031111
"property": prop_uri,
11041112
"triples": [{"triple": ("http://example.org/person1", prop_uri, "mock_value")}],
1113+
"subjectClass": subject_class,
11051114
"subjectShape": subject_shape,
11061115
"objectShape": "http://example.org/PersonShape",
11071116
"intermediateRelation": {"class": "http://example.org/Relationship"},
@@ -1155,13 +1164,14 @@ def test_inherited_intermediate_relation_condition(
11551164
"shouldBeDisplayed": True,
11561165
}
11571166

1158-
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None):
1167+
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None, subject_class=None):
11591168
if prop_uri == "http://example.org/knows":
11601169
display_name = "Knows (with inherited relationship)"
11611170
if display_name not in grouped_triples:
11621171
grouped_triples[display_name] = {
11631172
"property": prop_uri,
11641173
"triples": [{"triple": ("http://example.org/person1", prop_uri, "mock_value")}],
1174+
"subjectClass": subject_class,
11651175
"subjectShape": subject_shape,
11661176
"objectShape": "http://example.org/PersonShape",
11671177
"intermediateRelation": {"class": "http://example.org/Relationship"},
@@ -1265,13 +1275,14 @@ def test_simple_display_name_with_intermediate_relation(
12651275

12661276
extended_predicates_info = mock_valid_predicates_info + ["http://example.org/simple"]
12671277

1268-
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None):
1278+
def mock_process_default_property(prop_uri, triples, grouped_triples, subject_shape=None, subject_class=None):
12691279
if prop_uri == "http://example.org/simple":
12701280
display_name = "Simple Property"
12711281
if display_name not in grouped_triples:
12721282
grouped_triples[display_name] = {
12731283
"property": prop_uri,
12741284
"triples": [{"triple": ("http://example.org/person1", prop_uri, "mock_value")}],
1285+
"subjectClass": subject_class,
12751286
"subjectShape": subject_shape,
12761287
"objectShape": "http://example.org/SimpleShape",
12771288
"intermediateRelation": {"class": "http://example.org/SimpleRelationship"},

0 commit comments

Comments
 (0)