Merge pull request #178 from sartography/fix/delete_workflow_endpoint
Delete workflow endpoint fix
This commit is contained in:
commit
b83ab60a04
|
@ -91,7 +91,7 @@ def delete_workflow_specification(spec_id):
|
|||
|
||||
# Delete all events and workflow models related to this specification
|
||||
for workflow in session.query(WorkflowModel).filter_by(workflow_spec_id=spec_id):
|
||||
StudyService.delete_workflow(workflow)
|
||||
StudyService.delete_workflow(workflow.id)
|
||||
session.query(WorkflowSpecModel).filter_by(id=spec_id).delete()
|
||||
session.commit()
|
||||
|
||||
|
|
|
@ -9,14 +9,15 @@ from ldap3.core.exceptions import LDAPSocketOpenError
|
|||
|
||||
from crc import db, session, app
|
||||
from crc.api.common import ApiError
|
||||
from crc.models.file import FileModel, FileModelSchema, File
|
||||
from crc.models.approval import ApprovalFile, ApprovalModel
|
||||
from crc.models.file import FileDataModel, FileModel, FileModelSchema, File, LookupFileModel, LookupDataModel
|
||||
from crc.models.ldap import LdapSchema
|
||||
from crc.models.protocol_builder import ProtocolBuilderStudy, ProtocolBuilderStatus
|
||||
from crc.models.study import StudyModel, Study, StudyStatus, Category, WorkflowMetadata, StudyEventType, StudyEvent, \
|
||||
IrbStatus
|
||||
from crc.models.task_event import TaskEventModel, TaskEvent
|
||||
from crc.models.workflow import WorkflowSpecCategoryModel, WorkflowModel, WorkflowSpecModel, WorkflowState, \
|
||||
WorkflowStatus
|
||||
WorkflowStatus, WorkflowSpecDependencyFile
|
||||
from crc.services.approval_service import ApprovalService
|
||||
from crc.services.file_service import FileService
|
||||
from crc.services.ldap_service import LdapService
|
||||
|
@ -80,19 +81,26 @@ class StudyService(object):
|
|||
def delete_study(study_id):
|
||||
session.query(TaskEventModel).filter_by(study_id=study_id).delete()
|
||||
for workflow in session.query(WorkflowModel).filter_by(study_id=study_id):
|
||||
StudyService.delete_workflow(workflow)
|
||||
StudyService.delete_workflow(workflow.id)
|
||||
study = session.query(StudyModel).filter_by(id=study_id).first()
|
||||
session.delete(study)
|
||||
session.commit()
|
||||
|
||||
@staticmethod
|
||||
def delete_workflow(workflow):
|
||||
for file in session.query(FileModel).filter_by(workflow_id=workflow.id).all():
|
||||
FileService.delete_file(file.id)
|
||||
for dep in workflow.dependencies:
|
||||
session.delete(dep)
|
||||
def delete_workflow(workflow_id):
|
||||
workflow = session.query(WorkflowModel).get(workflow_id)
|
||||
if not workflow:
|
||||
return
|
||||
|
||||
session.query(TaskEventModel).filter_by(workflow_id=workflow.id).delete()
|
||||
session.query(WorkflowModel).filter_by(id=workflow.id).delete()
|
||||
session.query(WorkflowSpecDependencyFile).filter_by(workflow_id=workflow_id).delete(synchronize_session='fetch')
|
||||
session.query(FileModel).filter_by(workflow_id=workflow_id).update({'archived': True, 'workflow_id': None})
|
||||
|
||||
# Todo: Remove approvals completely.
|
||||
session.query(ApprovalFile).filter(ApprovalModel.workflow_id == workflow_id).delete(synchronize_session='fetch')
|
||||
session.query(ApprovalModel).filter_by(workflow_id=workflow.id).delete()
|
||||
|
||||
session.delete(workflow)
|
||||
session.commit()
|
||||
|
||||
@staticmethod
|
||||
|
|
|
@ -10,6 +10,7 @@ from crc import session, app
|
|||
from crc.models.protocol_builder import ProtocolBuilderStatus, \
|
||||
ProtocolBuilderStudySchema
|
||||
from crc.models.approval import ApprovalStatus
|
||||
from crc.models.file import FileModel
|
||||
from crc.models.task_event import TaskEventModel
|
||||
from crc.models.study import StudyEvent, StudyModel, StudySchema, StudyStatus, StudyEventType
|
||||
from crc.models.workflow import WorkflowSpecModel, WorkflowModel
|
||||
|
@ -260,13 +261,36 @@ class TestStudyApi(BaseTest):
|
|||
self.assertEqual(study.sponsor, json_data['sponsor'])
|
||||
self.assertEqual(study.ind_number, json_data['ind_number'])
|
||||
|
||||
|
||||
def test_delete_study(self):
|
||||
self.load_example_data()
|
||||
study = session.query(StudyModel).first()
|
||||
rv = self.app.delete('/v1.0/study/%i' % study.id, headers=self.logged_in_headers())
|
||||
self.assert_success(rv)
|
||||
|
||||
def test_delete_workflow(self):
|
||||
self.load_example_data()
|
||||
workflow = session.query(WorkflowModel).first()
|
||||
FileService.add_workflow_file(workflow_id=workflow.id,
|
||||
name="anything.png", content_type="text",
|
||||
binary_data=b'5678', irb_doc_code="UVACompl_PRCAppr" )
|
||||
|
||||
workflow_files = session.query(FileModel).filter_by(workflow_id=workflow.id)
|
||||
self.assertEqual(workflow_files.count(), 1)
|
||||
workflow_files_ids = [file.id for file in workflow_files]
|
||||
|
||||
rv = self.app.delete(f'/v1.0/workflow/{workflow.id}', headers=self.logged_in_headers())
|
||||
self.assert_success(rv)
|
||||
|
||||
# No files should have the deleted workflow id anymore
|
||||
workflow_files = session.query(FileModel).filter_by(workflow_id=workflow.id)
|
||||
self.assertEqual(workflow_files.count(), 0)
|
||||
|
||||
# Finally, let's confirm the file was archived
|
||||
workflow_files = session.query(FileModel).filter(FileModel.id.in_(workflow_files_ids))
|
||||
for file in workflow_files:
|
||||
self.assertTrue(file.archived)
|
||||
self.assertIsNone(file.workflow_id)
|
||||
|
||||
def test_delete_study_with_workflow_and_status(self):
|
||||
self.load_example_data()
|
||||
workflow = session.query(WorkflowModel).first()
|
||||
|
|
Loading…
Reference in New Issue