updated Spiffworkflow and updated terminated test to ensure tasks are deleted from the db w/ burnettk
This commit is contained in:
parent
b1d27cec75
commit
f0ddee0256
File diff suppressed because it is too large
Load Diff
|
@ -32,21 +32,6 @@ typing-extensions = ">=4"
|
|||
[package.extras]
|
||||
tz = ["python-dateutil"]
|
||||
|
||||
[[package]]
|
||||
name = "amqp"
|
||||
version = "5.1.1"
|
||||
description = "Low-level AMQP client for Python (fork of amqplib)."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "amqp-5.1.1-py3-none-any.whl", hash = "sha256:6f0956d2c23d8fa6e7691934d8c3930eadb44972cbbd1a7ae3a520f735d43359"},
|
||||
{file = "amqp-5.1.1.tar.gz", hash = "sha256:2c1b13fecc0893e946c65cbd5f36427861cffa4ea2201d8f6fca22e2a373b5e2"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
vine = ">=5.0.0"
|
||||
|
||||
[[package]]
|
||||
name = "aniso8601"
|
||||
version = "9.0.1"
|
||||
|
@ -220,18 +205,6 @@ soupsieve = ">1.2"
|
|||
html5lib = ["html5lib"]
|
||||
lxml = ["lxml"]
|
||||
|
||||
[[package]]
|
||||
name = "billiard"
|
||||
version = "3.6.4.0"
|
||||
description = "Python multiprocessing fork with improvements and bugfixes"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "billiard-3.6.4.0-py3-none-any.whl", hash = "sha256:87103ea78fa6ab4d5c751c4909bcff74617d985de7fa8b672cf8618afd5a875b"},
|
||||
{file = "billiard-3.6.4.0.tar.gz", hash = "sha256:299de5a8da28a783d51b197d496bef4f1595dd023a93a4f59dde1886ae905547"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "black"
|
||||
version = "22.12.0"
|
||||
|
@ -283,61 +256,6 @@ files = [
|
|||
[package.dependencies]
|
||||
typing-extensions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "celery"
|
||||
version = "5.2.7"
|
||||
description = "Distributed Task Queue."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "celery-5.2.7-py3-none-any.whl", hash = "sha256:138420c020cd58d6707e6257b6beda91fd39af7afde5d36c6334d175302c0e14"},
|
||||
{file = "celery-5.2.7.tar.gz", hash = "sha256:fafbd82934d30f8a004f81e8f7a062e31413a23d444be8ee3326553915958c6d"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
billiard = ">=3.6.4.0,<4.0"
|
||||
click = ">=8.0.3,<9.0"
|
||||
click-didyoumean = ">=0.0.3"
|
||||
click-plugins = ">=1.1.1"
|
||||
click-repl = ">=0.2.0"
|
||||
kombu = ">=5.2.3,<6.0"
|
||||
pytz = ">=2021.3"
|
||||
vine = ">=5.0.0,<6.0"
|
||||
|
||||
[package.extras]
|
||||
arangodb = ["pyArango (>=1.3.2)"]
|
||||
auth = ["cryptography"]
|
||||
azureblockblob = ["azure-storage-blob (==12.9.0)"]
|
||||
brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"]
|
||||
cassandra = ["cassandra-driver (<3.21.0)"]
|
||||
consul = ["python-consul2"]
|
||||
cosmosdbsql = ["pydocumentdb (==2.3.2)"]
|
||||
couchbase = ["couchbase (>=3.0.0)"]
|
||||
couchdb = ["pycouchdb"]
|
||||
django = ["Django (>=1.11)"]
|
||||
dynamodb = ["boto3 (>=1.9.178)"]
|
||||
elasticsearch = ["elasticsearch"]
|
||||
eventlet = ["eventlet (>=0.32.0)"]
|
||||
gevent = ["gevent (>=1.5.0)"]
|
||||
librabbitmq = ["librabbitmq (>=1.5.0)"]
|
||||
memcache = ["pylibmc"]
|
||||
mongodb = ["pymongo[srv] (>=3.11.1)"]
|
||||
msgpack = ["msgpack"]
|
||||
pymemcache = ["python-memcached"]
|
||||
pyro = ["pyro4"]
|
||||
pytest = ["pytest-celery"]
|
||||
redis = ["redis (>=3.4.1,!=4.0.0,!=4.0.1)"]
|
||||
s3 = ["boto3 (>=1.9.125)"]
|
||||
slmq = ["softlayer-messaging (>=1.0.3)"]
|
||||
solar = ["ephem"]
|
||||
sqlalchemy = ["sqlalchemy"]
|
||||
sqs = ["kombu[sqs]"]
|
||||
tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"]
|
||||
yaml = ["PyYAML (>=3.10)"]
|
||||
zookeeper = ["kazoo (>=1.3.1)"]
|
||||
zstd = ["zstandard"]
|
||||
|
||||
[[package]]
|
||||
name = "certifi"
|
||||
version = "2022.12.7"
|
||||
|
@ -551,56 +469,6 @@ files = [
|
|||
[package.dependencies]
|
||||
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||
|
||||
[[package]]
|
||||
name = "click-didyoumean"
|
||||
version = "0.3.0"
|
||||
description = "Enables git-like *did-you-mean* feature in click"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6.2,<4.0.0"
|
||||
files = [
|
||||
{file = "click-didyoumean-0.3.0.tar.gz", hash = "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035"},
|
||||
{file = "click_didyoumean-0.3.0-py3-none-any.whl", hash = "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
click = ">=7"
|
||||
|
||||
[[package]]
|
||||
name = "click-plugins"
|
||||
version = "1.1.1"
|
||||
description = "An extension module for click to enable registering CLI commands via setuptools entry-points."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"},
|
||||
{file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
click = ">=4.0"
|
||||
|
||||
[package.extras]
|
||||
dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"]
|
||||
|
||||
[[package]]
|
||||
name = "click-repl"
|
||||
version = "0.2.0"
|
||||
description = "REPL plugin for Click"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "click-repl-0.2.0.tar.gz", hash = "sha256:cd12f68d745bf6151210790540b4cb064c7b13e571bc64b6957d98d120dacfd8"},
|
||||
{file = "click_repl-0.2.0-py3-none-any.whl", hash = "sha256:94b3fbbc9406a236f176e0506524b2937e4b23b6f4c0c0b2a0a83f8a64e9194b"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
click = "*"
|
||||
prompt-toolkit = "*"
|
||||
six = "*"
|
||||
|
||||
[[package]]
|
||||
name = "clickclick"
|
||||
version = "20.10.2"
|
||||
|
@ -1543,38 +1411,6 @@ pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2"
|
|||
format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"]
|
||||
format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"]
|
||||
|
||||
[[package]]
|
||||
name = "kombu"
|
||||
version = "5.2.4"
|
||||
description = "Messaging library for Python."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "kombu-5.2.4-py3-none-any.whl", hash = "sha256:8b213b24293d3417bcf0d2f5537b7f756079e3ea232a8386dcc89a59fd2361a4"},
|
||||
{file = "kombu-5.2.4.tar.gz", hash = "sha256:37cee3ee725f94ea8bb173eaab7c1760203ea53bbebae226328600f9d2799610"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
amqp = ">=5.0.9,<6.0.0"
|
||||
vine = "*"
|
||||
|
||||
[package.extras]
|
||||
azureservicebus = ["azure-servicebus (>=7.0.0)"]
|
||||
azurestoragequeues = ["azure-storage-queue"]
|
||||
consul = ["python-consul (>=0.6.0)"]
|
||||
librabbitmq = ["librabbitmq (>=2.0.0)"]
|
||||
mongodb = ["pymongo (>=3.3.0,<3.12.1)"]
|
||||
msgpack = ["msgpack"]
|
||||
pyro = ["pyro4"]
|
||||
qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"]
|
||||
redis = ["redis (>=3.4.1,!=4.0.0,!=4.0.1)"]
|
||||
slmq = ["softlayer-messaging (>=1.0.3)"]
|
||||
sqlalchemy = ["sqlalchemy"]
|
||||
sqs = ["boto3 (>=1.9.12)", "pycurl (>=7.44.1,<7.45.0)", "urllib3 (>=1.26.7)"]
|
||||
yaml = ["PyYAML (>=3.10)"]
|
||||
zookeeper = ["kazoo (>=1.3.1)"]
|
||||
|
||||
[[package]]
|
||||
name = "lazy-object-proxy"
|
||||
version = "1.9.0"
|
||||
|
@ -2150,21 +1986,6 @@ files = [
|
|||
flask = "*"
|
||||
prometheus-client = "*"
|
||||
|
||||
[[package]]
|
||||
name = "prompt-toolkit"
|
||||
version = "3.0.38"
|
||||
description = "Library for building powerful interactive command lines in Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7.0"
|
||||
files = [
|
||||
{file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"},
|
||||
{file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
wcwidth = "*"
|
||||
|
||||
[[package]]
|
||||
name = "protobuf"
|
||||
version = "3.20.3"
|
||||
|
@ -3293,7 +3114,6 @@ files = []
|
|||
develop = false
|
||||
|
||||
[package.dependencies]
|
||||
celery = "*"
|
||||
configparser = "*"
|
||||
lxml = "*"
|
||||
|
||||
|
@ -3301,7 +3121,7 @@ lxml = "*"
|
|||
type = "git"
|
||||
url = "https://github.com/sartography/SpiffWorkflow"
|
||||
reference = "main"
|
||||
resolved_reference = "6ae98b585b25dce78a8be814f5d773a6947d6320"
|
||||
resolved_reference = "0a455cdd221137ec52d39801dd5ad6dabad4ed4f"
|
||||
|
||||
[[package]]
|
||||
name = "sqlalchemy"
|
||||
|
@ -3723,18 +3543,6 @@ brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
|
|||
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
|
||||
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "vine"
|
||||
version = "5.0.0"
|
||||
description = "Promises, promises, promises."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30"},
|
||||
{file = "vine-5.0.0.tar.gz", hash = "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "virtualenv"
|
||||
version = "20.21.0"
|
||||
|
@ -3756,18 +3564,6 @@ platformdirs = ">=2.4,<4"
|
|||
docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"]
|
||||
test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"]
|
||||
|
||||
[[package]]
|
||||
name = "wcwidth"
|
||||
version = "0.2.6"
|
||||
description = "Measures the displayed width of unicode strings in a terminal"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"},
|
||||
{file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "werkzeug"
|
||||
version = "2.2.3"
|
||||
|
|
|
@ -1902,6 +1902,18 @@ class ProcessInstanceProcessor:
|
|||
)
|
||||
task_service.update_all_tasks_from_spiff_tasks(spiff_tasks, deleted_tasks, start_time)
|
||||
|
||||
# we may want to move this to task_service.update_all_tasks_from_spiff_tasks but not sure it's always good to it.
|
||||
# for cancelled tasks, spiff only returns tasks that were cancelled, not the ones that were deleted so we have to find them
|
||||
spiff_task_guids = [str(st.id) for st in spiff_tasks]
|
||||
tasks_no_longer_in_spiff = TaskModel.query.filter(
|
||||
and_(
|
||||
TaskModel.process_instance_id == self.process_instance_model.id,
|
||||
TaskModel.guid.not_in(spiff_task_guids), # type: ignore
|
||||
)
|
||||
).all()
|
||||
for task in tasks_no_longer_in_spiff:
|
||||
db.session.delete(task)
|
||||
|
||||
self.save()
|
||||
self.process_instance_model.status = "terminated"
|
||||
db.session.add(self.process_instance_model)
|
||||
|
|
|
@ -462,7 +462,10 @@ class TaskService:
|
|||
human_tasks_to_clear = HumanTaskModel.query.filter(
|
||||
HumanTaskModel.task_id.in_(deleted_task_ids) # type: ignore
|
||||
).all()
|
||||
for task in tasks_to_clear + human_tasks_to_clear:
|
||||
|
||||
# delete human tasks first to avoid potential conflicts when deleting tasks.
|
||||
# otherwise sqlalchemy returns several warnings.
|
||||
for task in human_tasks_to_clear + tasks_to_clear:
|
||||
db.session.delete(task)
|
||||
|
||||
# Note: Can't restrict this to definite, because some things are updated and are now CANCELLED
|
||||
|
@ -473,6 +476,7 @@ class TaskService:
|
|||
spiff_tasks_updated[str(spiff_task.id)] = spiff_task
|
||||
for _id, spiff_task in spiff_tasks_updated.items():
|
||||
self.update_task_model_with_spiff_task(spiff_task)
|
||||
|
||||
self.save_objects_to_database()
|
||||
|
||||
@classmethod
|
||||
|
|
|
@ -1611,6 +1611,10 @@ class TestProcessApi(BaseTest):
|
|||
assert len(ready_tasks) == 1
|
||||
ready_task = ready_tasks[0]
|
||||
|
||||
# check all_tasks here to ensure we actually deleted items when cancelling the instance
|
||||
all_tasks = TaskModel.query.filter_by(process_instance_id=process_instance_id).all()
|
||||
assert len(all_tasks) == 8
|
||||
|
||||
response = client.post(
|
||||
f"/v1.0/process-instance-terminate/{self.modify_process_identifier_for_path_param(process_model_identifier)}/{process_instance_id}",
|
||||
headers=self.logged_in_headers(with_super_admin_user),
|
||||
|
@ -1621,11 +1625,13 @@ class TestProcessApi(BaseTest):
|
|||
process_instance = ProcessInstanceModel.query.filter_by(id=process_instance_id).first()
|
||||
assert process_instance
|
||||
assert process_instance.status == "terminated"
|
||||
assert ready_task.state == "CANCELLED"
|
||||
|
||||
# TODO: uncomment this once spiff is returning deleted tasks on cancel
|
||||
# remaining_tasks = TaskModel.query.filter_by(process_instance_id=process_instance_id).all()
|
||||
# assert len(remaining_tasks) == 3
|
||||
ready_task_that_is_now_cancelled = TaskModel.query.filter_by(guid=ready_task.guid).first()
|
||||
assert ready_task_that_is_now_cancelled is not None
|
||||
assert ready_task_that_is_now_cancelled.state == "CANCELLED"
|
||||
|
||||
remaining_tasks = TaskModel.query.filter_by(process_instance_id=process_instance_id).all()
|
||||
assert len(remaining_tasks) == 3
|
||||
|
||||
def test_process_instance_delete(
|
||||
self,
|
||||
|
|
Loading…
Reference in New Issue