Skip to content

Commit

Permalink
Add referenced lists dict schema property
Browse files Browse the repository at this point in the history
  • Loading branch information
petechd committed Jun 7, 2024
1 parent 3e10922 commit f3d3159
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 51 deletions.
36 changes: 36 additions & 0 deletions app/validators/questionnaire_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ def __init__(self, schema):
for block in list_collector.get("repeating_blocks", [])
}
self._answers_with_context = {}
self._referenced_lists = {}

@lru_cache
def get_block_ids_for_block_type(self, block_type: str) -> list[str]:
Expand Down Expand Up @@ -209,6 +210,41 @@ def answers_with_context(self):
self._answers_with_context = answers_dict
return self._answers_with_context

@property
def referenced_lists(self):
if self._referenced_lists:
return self._referenced_lists

if supplementary_list := self.supplementary_lists:
for list_id in supplementary_list:
self._referenced_lists[list_id] = {"section_index": 0, "block_index": 0}

if blocks := self.get_blocks(type="ListCollector"):
for block in blocks:
list_id = block["for_list"]
if list_id not in self._referenced_lists:
section_id = self.get_section_id_for_block_id(block["id"])
section_index = self.get_section_index_for_section_id(section_id)
self._referenced_lists[list_id] = {
"section_index": section_index,
"block_index": self.block_ids.index(block["id"]),
}
if blocks := self.get_blocks(type="PrimaryPersonListCollector"):
for block in blocks:
list_id = block["for_list"]
if list_id not in self._referenced_lists or (
self.block_ids.index(block["id"])
< self._referenced_lists[list_id]["block_index"]
):
section_id = self.get_section_id_for_block_id(block["id"])
section_index = self.get_section_index_for_section_id(section_id)
self._referenced_lists[list_id] = {
"section_index": section_index,
"block_index": self.block_ids.index(block["id"]),
}

return self._referenced_lists

@staticmethod
def capture_answers(*, answers, answers_dict, context):
for answer in answers:
Expand Down
52 changes: 1 addition & 51 deletions app/validators/questionnaire_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ def validate_introduction_block(self):
self.add_error(error_messages.PREVIEW_WITHOUT_INTRODUCTION_BLOCK)

def validate_list_references(self):
referenced_lists = self.populate_referenced_lists()
referenced_lists = self.questionnaire_schema.referenced_lists

# We need to keep track of section index for: common_definitions.json#/section_enabled
for section_index, section in enumerate(self.questionnaire_schema.sections):
Expand Down Expand Up @@ -176,53 +176,3 @@ def validate_list_references(self):
),
section_name=section["id"],
)

def populate_referenced_lists(self):
referenced_lists = {}
if supplementary_list := self.questionnaire_schema.supplementary_lists:
for list_id in supplementary_list:
referenced_lists[list_id] = {"section_index": 0, "block_index": 0}

if blocks := self.questionnaire_schema.get_blocks(type="ListCollector"):
for block in blocks:
list_id = block["for_list"]
if list_id not in referenced_lists:
section_id = self.questionnaire_schema.get_section_id_for_block_id(
block["id"]
)
section_index = (
self.questionnaire_schema.get_section_index_for_section_id(
section_id
)
)
referenced_lists[list_id] = {
"section_index": section_index,
"block_index": self.questionnaire_schema.block_ids.index(
block["id"]
),
}
if blocks := self.questionnaire_schema.get_blocks(
type="PrimaryPersonListCollector"
):
for block in blocks:
list_id = block["for_list"]
if list_id not in referenced_lists or (
self.questionnaire_schema.block_ids.index(block["id"])
< referenced_lists[list_id]["block_index"]
):
section_id = self.questionnaire_schema.get_section_id_for_block_id(
block["id"]
)
section_index = (
self.questionnaire_schema.get_section_index_for_section_id(
section_id
)
)
referenced_lists[list_id] = {
"section_index": section_index,
"block_index": self.questionnaire_schema.block_ids.index(
block["id"]
),
}

return referenced_lists

0 comments on commit f3d3159

Please sign in to comment.