Skip to content

Commit a35a7af

Browse files
committed
fix: [ERP-3351] Handle consent section and question codes with underscores
* Build field name codification into get_schema_field_name for consistent use
1 parent 273b06f commit a35a7af

File tree

2 files changed

+34
-23
lines changed

2 files changed

+34
-23
lines changed

rdrf/report/report_builder.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@
2020
)
2121
from report.clinical_data_csv_util import ClinicalDataCsvUtil
2222
from report.models import ReportCdeHeadingFormat
23-
from report.schema import codify, create_dynamic_schema, get_schema_field_name
23+
from report.schema import (
24+
create_dynamic_schema,
25+
get_schema_field_name,
26+
to_camel_case,
27+
)
2428
from report.utils import (
2529
get_flattened_json_path,
2630
get_graphql_result_value,
@@ -89,7 +93,10 @@ def _build_query_from_variants(self, variants, fields):
8993
# e.g. variants=["itemCode1", "itemCode2"]
9094
if any(isinstance(item, str) for item in variants):
9195
return [
92-
GqlQuery().fields(fields).query(codify(header)).generate()
96+
GqlQuery()
97+
.fields(fields)
98+
.query(get_schema_field_name(header))
99+
.generate()
93100
for header in variants
94101
]
95102

@@ -102,14 +109,16 @@ def _build_query_from_variants(self, variants, fields):
102109
sorted_variants, lambda x: x[0]
103110
):
104111
group_items = list(items)
105-
group_name_field = get_schema_field_name(group_name)
112+
group_name_field = get_schema_field_name(
113+
to_camel_case(group_name)
114+
)
106115
next_group_items = [item[1:] for item in group_items]
107116
if len(next_group_items[0]) == 1:
108117
# We've reached the end of the list so build the lowest level query
109118
query_fields = [
110119
GqlQuery()
111120
.fields(fields)
112-
.query(get_schema_field_name(item))
121+
.query(get_schema_field_name(to_camel_case(item)))
113122
.generate()
114123
for nested_item in next_group_items
115124
for item in nested_item
@@ -255,7 +264,7 @@ def _get_form_data(form):
255264
field_section = (
256265
GqlQuery()
257266
.fields(
258-
map(get_schema_field_name, section["cdes"]),
267+
list(map(get_schema_field_name, section["cdes"])),
259268
name=get_schema_field_name(section_code),
260269
)
261270
.generate()
@@ -400,7 +409,7 @@ def add_fields(subvariant_index=None):
400409
)
401410
item_pointer = "_".join(
402411
[
403-
get_schema_field_name(codify(field))
412+
get_schema_field_name(field)
404413
for field in items
405414
]
406415
)

rdrf/report/schema.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,6 @@ def to_camel_case(name):
8686
return lower_dot_case_name
8787

8888

89-
def codify(str):
90-
return re.sub(r"[^a-zA-Z0-9]+", "", str)
91-
92-
9389
def validate_fields(fields, valid_fields, label):
9490
invalid_fields = list(set(fields).difference(valid_fields))
9591
if len(invalid_fields) > 0:
@@ -186,7 +182,7 @@ def resolve_values(parent, _info):
186182
"resolve_values": resolve_values,
187183
}
188184
for wg_type in registry.working_group_types.all():
189-
field_name = get_schema_field_name(codify(wg_type.name))
185+
field_name = get_schema_field_name(wg_type.name)
190186
wg_type_fields.update(
191187
{
192188
field_name: graphene.Field(DataSummaryItemSummaryType),
@@ -422,14 +418,20 @@ def resolve_last_updated(parent, _info):
422418
return datetime.fromisoformat(form_timestamp)
423419

424420

425-
def get_schema_field_name(s):
426-
if not _graphql_field_pattern.match(s):
427-
new_str = f"field{s}"
428-
assert _graphql_field_pattern.match(new_str), (
429-
f"Cannot use field '{s}' in graphql schema"
430-
)
431-
return new_str
432-
return s
421+
def get_schema_field_name(raw):
422+
def _codify(name):
423+
return re.sub(r"[^a-zA-Z0-9]+", "", name)
424+
425+
def _safe_field_name(name):
426+
if not _graphql_field_pattern.match(name):
427+
new_str = f"field{name}"
428+
assert _graphql_field_pattern.match(
429+
new_str
430+
), f"Cannot use field '{name}' in graphql schema"
431+
return new_str
432+
return name
433+
434+
return _safe_field_name(_codify(to_camel_case(raw)))
433435

434436

435437
def get_section_fields(_section_key, section_cdes):
@@ -496,9 +498,9 @@ def get_cfg_forms(cfg_key, cfg_model):
496498

497499
def form_resolver(parent, _info, form_model):
498500
_patient, _contexts, clinical_data = parent
499-
assert len(clinical_data) <= 1, (
500-
"Too many clinical data records to resolve form"
501-
)
501+
assert (
502+
len(clinical_data) <= 1
503+
), "Too many clinical data records to resolve form"
502504

503505
if len(clinical_data) == 0:
504506
return None
@@ -744,7 +746,7 @@ def working_groups_resolver(parent, _info, working_group_type):
744746

745747
fields = {}
746748
for working_group_type in registry.working_group_types.all():
747-
field_name = get_schema_field_name(codify(working_group_type.name))
749+
field_name = get_schema_field_name(working_group_type.name)
748750
fields[field_name] = graphene.List(WorkingGroupSchemaType)
749751
fields[f"resolve_{field_name}"] = partial(
750752
working_groups_resolver, working_group_type=working_group_type

0 commit comments

Comments
 (0)