diff --git a/openassessment/xblock/apis/ora_data_accessor.py b/openassessment/xblock/apis/ora_data_accessor.py index a722d11d37..abada4432b 100644 --- a/openassessment/xblock/apis/ora_data_accessor.py +++ b/openassessment/xblock/apis/ora_data_accessor.py @@ -27,7 +27,7 @@ def submission_data(self): @property def workflow_data(self): - return WorkflowAPI(self._block) + return self._block.workflow_data @property def grades_data(self): diff --git a/openassessment/xblock/apis/workflow_api.py b/openassessment/xblock/apis/workflow_api.py index 10de36e37f..9546b62cd4 100644 --- a/openassessment/xblock/apis/workflow_api.py +++ b/openassessment/xblock/apis/workflow_api.py @@ -10,13 +10,28 @@ class WorkflowAPI: def __init__(self, block): self._block = block self.grades = self._block.grades_data + self._workflow = self._block.get_workflow_info() def get_workflow_info(self, submission_uuid=None): - return self._block.get_workflow_info(submission_uuid) + """ + Update workflow info and return workflow for the submission. + + NOTE - calls workflow update + """ + self._workflow = self._block.get_workflow_info(submission_uuid) + return self._workflow @property def workflow(self): - return self.get_workflow_info() + """ + Getter for workflow, used to keep us from updating workflow every time + we ask for info. + + NOTE - when there isn't a workflow, this will try to refresh workflow. + """ + if not self._workflow: + return self.get_workflow_info() + return self._workflow @property def has_workflow(self): @@ -34,6 +49,11 @@ def has_status(self): def status_details(self): return self.workflow.get("status_details", {}) + @property + def status(self): + if self.workflow: + return self.workflow.get("status") + def has_reached_given_step(self, requested_step, current_workflow_step=None): """ Helper to determine if are far enough through a workflow to request data for a step. @@ -102,10 +122,6 @@ def submission_uuid(self): def workflow_requirements(self): return self._block.workflow_requirements() - @property - def status(self): - return self.workflow.get("status") - @property def has_received_grade(self): return bool(self.workflow.get('score')) @@ -120,6 +136,9 @@ def get_course_workflow_settings(self): return self._block.get_course_workflow_settings() def update_workflow_status(self, submission_uuid=None): + """ + NOTE - calls workflow update. + """ self._block.update_workflow_status(submission_uuid) def create_workflow(self, submission_uuid): diff --git a/openassessment/xblock/openassessmentblock.py b/openassessment/xblock/openassessmentblock.py index 861b9cd68d..c216524772 100644 --- a/openassessment/xblock/openassessmentblock.py +++ b/openassessment/xblock/openassessmentblock.py @@ -293,9 +293,14 @@ class OpenAssessmentBlock( def config_data(self): return ORAConfigAPI(self) + _workflow_data = None + @property def workflow_data(self): - return WorkflowAPI(self) + # Initialize Workflow API only once + if not self._workflow_data: + self._workflow_data = WorkflowAPI(self) + return self._workflow_data @property def submission_data(self):