Skip to content

Commit 2e66233

Browse files
Copilotsaurabhrb
andauthored
fix: auto-lowercase table names in _build_lookup_field_models, remove .lower() from example
Agent-Logs-Url: https://github.com/microsoft/PowerPlatform-DataverseClient-Python/sessions/508cd2e9-7649-42ec-b5c4-2768fea34725 Co-authored-by: saurabhrb <32964911+saurabhrb@users.noreply.github.com>
1 parent f4afbef commit 2e66233

3 files changed

Lines changed: 44 additions & 6 deletions

File tree

examples/advanced/sql_examples.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,9 @@ def _run_examples(client):
175175
try:
176176
backoff(
177177
lambda: client.tables.create_lookup_field(
178-
referencing_table=child_table.lower(),
178+
referencing_table=child_table,
179179
lookup_field_name="new_TeamId",
180-
referenced_table=parent_table.lower(),
180+
referenced_table=parent_table,
181181
display_name="Team",
182182
)
183183
)

src/PowerPlatform/Dataverse/data/_odata.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2358,7 +2358,17 @@ def _build_lookup_field_models(
23582358
Returns ``(LookupAttributeMetadata, OneToManyRelationshipMetadata)``.
23592359
Used by both the batch resolver and ``TableOperations.create_lookup_field``
23602360
to avoid duplicating the metadata assembly logic.
2361+
2362+
Note: ``referencing_table`` and ``referenced_table`` are lowercased
2363+
automatically because Dataverse stores entity logical names in
2364+
lowercase. ``lookup_field_name`` is kept as-is (it is a SchemaName).
23612365
"""
2366+
# Dataverse logical names are always lowercase. Callers may pass
2367+
# SchemaName-cased values (e.g. "new_SQLTeam"); normalise here so
2368+
# the relationship metadata uses valid logical names.
2369+
referencing_lower = referencing_table.lower()
2370+
referenced_lower = referenced_table.lower()
2371+
23622372
lookup = LookupAttributeMetadata(
23632373
schema_name=lookup_field_name,
23642374
display_name=Label(
@@ -2375,12 +2385,12 @@ def _build_lookup_field_models(
23752385
lookup.description = Label(
23762386
localized_labels=[LocalizedLabel(label=description, language_code=language_code)]
23772387
)
2378-
rel_name = f"{referenced_table}_{referencing_table}_{lookup_field_name}"
2388+
rel_name = f"{referenced_lower}_{referencing_lower}_{lookup_field_name}"
23792389
relationship = OneToManyRelationshipMetadata(
23802390
schema_name=rel_name,
2381-
referenced_entity=referenced_table,
2382-
referencing_entity=referencing_table,
2383-
referenced_attribute=f"{referenced_table}id",
2391+
referenced_entity=referenced_lower,
2392+
referencing_entity=referencing_lower,
2393+
referenced_attribute=f"{referenced_lower}id",
23842394
cascade_configuration=CascadeConfiguration(delete=cascade_delete),
23852395
)
23862396
return lookup, relationship

tests/unit/test_client.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,34 @@ def test_referenced_attribute_auto_generated(self):
333333

334334
self.assertEqual(relationship.referenced_attribute, "accountid")
335335

336+
def test_mixed_case_table_names_lowered(self):
337+
"""Test that mixed-case table names are auto-lowered to logical names.
338+
339+
Only table names (entity logical names) are lowered.
340+
lookup_field_name is a SchemaName and keeps its original casing.
341+
"""
342+
self.client.tables.create_lookup_field(
343+
referencing_table="new_SQLTask",
344+
lookup_field_name="new_TeamId",
345+
referenced_table="new_SQLTeam",
346+
)
347+
348+
call_args = self.client.tables.create_one_to_many_relationship.call_args
349+
lookup = call_args[0][0]
350+
relationship = call_args[0][1]
351+
352+
# Entity names must be lowercased (Dataverse logical names)
353+
self.assertEqual(relationship.referenced_entity, "new_sqlteam")
354+
self.assertEqual(relationship.referencing_entity, "new_sqltask")
355+
self.assertEqual(relationship.referenced_attribute, "new_sqlteamid")
356+
357+
# Schema_name: table names lowered, lookup_field_name keeps casing
358+
self.assertEqual(relationship.schema_name, "new_sqlteam_new_sqltask_new_TeamId")
359+
360+
# Display name defaults to original (un-lowered) referenced_table
361+
label_dict = lookup.display_name.to_dict()
362+
self.assertEqual(label_dict["LocalizedLabels"][0]["Label"], "new_SQLTeam")
363+
336364
def test_returns_result(self):
337365
"""Test that the method returns the result from create_one_to_many_relationship."""
338366
expected_result = {

0 commit comments

Comments
 (0)