From aac3d5c16ee17497c75c5ccb6a882ae9b846ff14 Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 1 Mar 2021 14:54:04 -0500 Subject: [PATCH 1/4] Bug #255, this requires the front end to pass in the name of the task, when doing a lookup. This will prevent a bug where we have multiple user tasks, with enum fields that set the same variable, but use different lookup tables to populate the dropbown or search feature. --- crc/api.yml | 8 +- crc/api/workflow.py | 4 +- crc/models/file.py | 1 + crc/services/lookup_service.py | 21 +-- crc/services/workflow_processor.py | 4 +- migrations/versions/7ec759f994c8_.py | 33 ++++ .../enum_options_competing_files/animals.xlsx | Bin 0 -> 5402 bytes .../enum_options_competing_files.bpmn | 145 ++++++++++++++++++ .../enum_options_competing_files/fruits.xlsx | Bin 0 -> 5404 bytes .../enum_options_from_file.bpmn | 8 +- .../enum_options_with_search.bpmn | 8 +- tests/test_lookup_service.py | 71 ++++++--- tests/test_tasks_api.py | 20 +-- 13 files changed, 269 insertions(+), 54 deletions(-) create mode 100644 migrations/versions/7ec759f994c8_.py create mode 100644 tests/data/enum_options_competing_files/animals.xlsx create mode 100644 tests/data/enum_options_competing_files/enum_options_competing_files.bpmn create mode 100644 tests/data/enum_options_competing_files/fruits.xlsx diff --git a/crc/api.yml b/crc/api.yml index 949b7b77..9d6089a6 100644 --- a/crc/api.yml +++ b/crc/api.yml @@ -954,7 +954,7 @@ paths: application/json: schema: $ref: "#/components/schemas/Workflow" - /workflow/{workflow_id}/lookup/{field_id}: + /workflow/{workflow_id}/lookup/{task_spec_name}/{field_id}: parameters: - name: workflow_id in: path @@ -963,6 +963,12 @@ paths: schema: type: integer format: int32 + - name: task_spec_name + in: path + required: true + description: The name of the current task + schema: + type: string - name: field_id in: path required: true diff --git a/crc/api/workflow.py b/crc/api/workflow.py index 20fdd781..5925abb8 100644 --- a/crc/api/workflow.py +++ b/crc/api/workflow.py @@ -250,7 +250,7 @@ def delete_workflow_spec_category(cat_id): session.commit() -def lookup(workflow_id, field_id, query=None, value=None, limit=10): +def lookup(workflow_id, task_spec_name, field_id, query=None, value=None, limit=10): """ given a field in a task, attempts to find the lookup table or function associated with that field and runs a full-text query against it to locate the values and @@ -258,7 +258,7 @@ def lookup(workflow_id, field_id, query=None, value=None, limit=10): Tries to be fast, but first runs will be very slow. """ workflow = session.query(WorkflowModel).filter(WorkflowModel.id == workflow_id).first() - lookup_data = LookupService.lookup(workflow, field_id, query, value, limit) + lookup_data = LookupService.lookup(workflow, task_spec_name, field_id, query, value, limit) return LookupDataSchema(many=True).dump(lookup_data) diff --git a/crc/models/file.py b/crc/models/file.py index d01dc2a3..b1269f78 100644 --- a/crc/models/file.py +++ b/crc/models/file.py @@ -148,6 +148,7 @@ class LookupFileModel(db.Model): __tablename__ = 'lookup_file' id = db.Column(db.Integer, primary_key=True) workflow_spec_id = db.Column(db.String) + task_spec_id = db.Column(db.String) field_id = db.Column(db.String) is_ldap = db.Column(db.Boolean) # Allows us to run an ldap query instead of a db lookup. file_data_model_id = db.Column(db.Integer, db.ForeignKey('file_data.id')) diff --git a/crc/services/lookup_service.py b/crc/services/lookup_service.py index 6aba5410..c1960354 100644 --- a/crc/services/lookup_service.py +++ b/crc/services/lookup_service.py @@ -40,13 +40,14 @@ class LookupService(object): def get_lookup_model(spiff_task, field): workflow_id = spiff_task.workflow.data[WorkflowProcessor.WORKFLOW_ID_KEY] workflow = db.session.query(WorkflowModel).filter(WorkflowModel.id == workflow_id).first() - return LookupService.__get_lookup_model(workflow, field.id) + return LookupService.__get_lookup_model(workflow, spiff_task.task_spec.name, field.id) @staticmethod - def __get_lookup_model(workflow, field_id): + def __get_lookup_model(workflow, task_spec_id, field_id): lookup_model = db.session.query(LookupFileModel) \ .filter(LookupFileModel.workflow_spec_id == workflow.workflow_spec_id) \ .filter(LookupFileModel.field_id == field_id) \ + .filter(LookupFileModel.task_spec_id == task_spec_id) \ .order_by(desc(LookupFileModel.id)).first() # one more quick query, to see if the lookup file is still related to this workflow. @@ -59,14 +60,14 @@ class LookupService(object): if not is_current: # Very very very expensive, but we don't know need this till we do. - lookup_model = LookupService.create_lookup_model(workflow, field_id) + lookup_model = LookupService.create_lookup_model(workflow, task_spec_id, field_id) return lookup_model @staticmethod - def lookup(workflow, field_id, query, value=None, limit=10): + def lookup(workflow, task_spec_id, field_id, query, value=None, limit=10): - lookup_model = LookupService.__get_lookup_model(workflow, field_id) + lookup_model = LookupService.__get_lookup_model(workflow, task_spec_id, field_id) if lookup_model.is_ldap: return LookupService._run_ldap_query(query, limit) @@ -74,7 +75,7 @@ class LookupService(object): return LookupService._run_lookup_query(lookup_model, query, value, limit) @staticmethod - def create_lookup_model(workflow_model, field_id): + def create_lookup_model(workflow_model, task_spec_id, field_id): """ This is all really expensive, but should happen just once (per file change). @@ -84,11 +85,12 @@ class LookupService(object): Returns: an array of LookupData, suitable for returning to the API. """ processor = WorkflowProcessor(workflow_model) # VERY expensive, Ludicrous for lookup / type ahead - spec, field = processor.find_spec_and_field_by_field_id(field_id) + spec, field = processor.find_spec_and_field(task_spec_id, field_id) # Clear out all existing lookup models for this workflow and field. existing_models = db.session.query(LookupFileModel) \ .filter(LookupFileModel.workflow_spec_id == workflow_model.workflow_spec_id) \ + .filter(LookupFileModel.task_spec_id == task_spec_id) \ .filter(LookupFileModel.field_id == field_id).all() for model in existing_models: # Do it one at a time to cause the required cascade of deletes. db.session.delete(model) @@ -117,7 +119,7 @@ class LookupService(object): data_model = latest_files[0] lookup_model = LookupService.build_lookup_table(data_model, value_column, label_column, - workflow_model.workflow_spec_id, field_id) + workflow_model.workflow_spec_id, task_spec_id, field_id) # Use the results of an LDAP request to populate enum field options elif field.has_property(Task.FIELD_PROP_LDAP_LOOKUP): @@ -134,7 +136,7 @@ class LookupService(object): return lookup_model @staticmethod - def build_lookup_table(data_model: FileDataModel, value_column, label_column, workflow_spec_id, field_id): + def build_lookup_table(data_model: FileDataModel, value_column, label_column, workflow_spec_id, task_spec_id, field_id): """ In some cases the lookup table can be very large. This method will add all values to the database in a way that can be searched and returned via an api call - rather than sending the full set of options along with the form. It will only open the file and process the options if something has @@ -153,6 +155,7 @@ class LookupService(object): lookup_model = LookupFileModel(workflow_spec_id=workflow_spec_id, field_id=field_id, + task_spec_id=task_spec_id, file_data_model_id=data_model.id, is_ldap=False) diff --git a/crc/services/workflow_processor.py b/crc/services/workflow_processor.py index 4eb7b027..2c83edd4 100644 --- a/crc/services/workflow_processor.py +++ b/crc/services/workflow_processor.py @@ -473,11 +473,11 @@ class WorkflowProcessor(object): if nav_item['task_id'] == task.id: return nav_item - def find_spec_and_field_by_field_id(self, field_id): + def find_spec_and_field(self, spec_name, field_id): """Tracks down a form field by name in the workflow spec, only looks at ready tasks. Returns a tuple of the task, and form""" for spec in self.bpmn_workflow.spec.task_specs.values(): - if hasattr(spec, "form"): + if spec.name == spec_name and hasattr(spec, "form"): for field in spec.form.fields: if field.id == field_id: return spec, field diff --git a/migrations/versions/7ec759f994c8_.py b/migrations/versions/7ec759f994c8_.py new file mode 100644 index 00000000..3478d384 --- /dev/null +++ b/migrations/versions/7ec759f994c8_.py @@ -0,0 +1,33 @@ +"""empty message + +Revision ID: 7ec759f994c8 +Revises: cb892916166a +Create Date: 2021-03-01 12:51:53.681624 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +from sqlalchemy.dialects import postgresql + +revision = '7ec759f994c8' +down_revision = 'cb892916166a' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.execute('delete from lookup_data') + op.execute('delete from lookup_file') + op.add_column('lookup_file', sa.Column('task_spec_id', sa.String(), nullable=True)) + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('lookup_file', 'task_spec_id') + # ### end Alembic commands ### diff --git a/tests/data/enum_options_competing_files/animals.xlsx b/tests/data/enum_options_competing_files/animals.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..45ddfe3c9cadfb4659ae7416dcd51e4677c0ebef GIT binary patch literal 5402 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 GUi}|CI|CE| literal 0 HcmV?d00001 diff --git a/tests/data/enum_options_competing_files/enum_options_competing_files.bpmn b/tests/data/enum_options_competing_files/enum_options_competing_files.bpmn new file mode 100644 index 00000000..41670c4d --- /dev/null +++ b/tests/data/enum_options_competing_files/enum_options_competing_files.bpmn @@ -0,0 +1,145 @@ + + + + + Flow_07vc55t + + + + Flow_1m73p95 + Flow_0gb1k4g + Flow_08kr305 + + + type == 'fruit' + + + type=="fruit" + + + Flow_09ik0zr + Flow_1tzwe06 + Flow_1ym0gex + + + + + Flow_1ym0gex + + + + + + + + + + + + + + + Flow_0gb1k4g + Flow_09ik0zr + + + + + + + + + + + + + + Flow_08kr305 + Flow_1tzwe06 + + + + + + + + + + + + + + + Flow_07vc55t + Flow_1m73p95 + + + Sheet one and sheet two each reference different spread sheets, butĀ  they useĀ  the same form name. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/enum_options_competing_files/fruits.xlsx b/tests/data/enum_options_competing_files/fruits.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c38173a2b86857ecf9d261482140e30433deb26e GIT binary patch literal 5404 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 K;u=MTz4|{SSPMD; literal 0 HcmV?d00001 diff --git a/tests/data/enum_options_from_file/enum_options_from_file.bpmn b/tests/data/enum_options_from_file/enum_options_from_file.bpmn index 6497d1f7..ccb10f6c 100644 --- a/tests/data/enum_options_from_file/enum_options_from_file.bpmn +++ b/tests/data/enum_options_from_file/enum_options_from_file.bpmn @@ -4,12 +4,12 @@ SequenceFlow_0lvudp8 - + SequenceFlow_02vev7n - - + + @@ -41,7 +41,7 @@ - + diff --git a/tests/data/enum_options_with_search/enum_options_with_search.bpmn b/tests/data/enum_options_with_search/enum_options_with_search.bpmn index 584dd261..cd971e54 100644 --- a/tests/data/enum_options_with_search/enum_options_with_search.bpmn +++ b/tests/data/enum_options_with_search/enum_options_with_search.bpmn @@ -4,12 +4,12 @@ SequenceFlow_0lvudp8 - + SequenceFlow_02vev7n - - + +