Helper function to support reaping process instances (#91)
This commit is contained in:
parent
4d5e729a73
commit
06d9913ceb
|
@ -0,0 +1,63 @@
|
||||||
|
"""Delete_process_instances_with_criteria."""
|
||||||
|
from time import time
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from flask_bpmn.models.db import db
|
||||||
|
from sqlalchemy import or_
|
||||||
|
|
||||||
|
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
||||||
|
from spiffworkflow_backend.models.script_attributes_context import (
|
||||||
|
ScriptAttributesContext,
|
||||||
|
)
|
||||||
|
from spiffworkflow_backend.models.spiff_step_details import SpiffStepDetailsModel
|
||||||
|
from spiffworkflow_backend.scripts.script import Script
|
||||||
|
|
||||||
|
|
||||||
|
class DeleteProcessInstancesWithCriteria(Script):
|
||||||
|
"""DeleteProcessInstancesWithCriteria."""
|
||||||
|
|
||||||
|
def get_description(self) -> str:
|
||||||
|
"""Get_description."""
|
||||||
|
return "Delete process instances that match the provided criteria,"
|
||||||
|
|
||||||
|
def run(
|
||||||
|
self,
|
||||||
|
script_attributes_context: ScriptAttributesContext,
|
||||||
|
*args: Any,
|
||||||
|
**kwargs: Any,
|
||||||
|
) -> Any:
|
||||||
|
"""Run."""
|
||||||
|
criteria_list = args[0]
|
||||||
|
|
||||||
|
delete_criteria = []
|
||||||
|
delete_time = time()
|
||||||
|
|
||||||
|
for criteria in criteria_list:
|
||||||
|
delete_criteria.append(
|
||||||
|
(ProcessInstanceModel.process_model_identifier == criteria["name"])
|
||||||
|
& ProcessInstanceModel.status.in_(criteria["status"]) # type: ignore
|
||||||
|
& (
|
||||||
|
ProcessInstanceModel.updated_at_in_seconds
|
||||||
|
< (delete_time - criteria["last_updated_delta"])
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
results = (
|
||||||
|
ProcessInstanceModel.query.filter(or_(*delete_criteria)).limit(100).all()
|
||||||
|
)
|
||||||
|
rows_affected = len(results)
|
||||||
|
|
||||||
|
if rows_affected > 0:
|
||||||
|
ids_to_delete = list(map(lambda r: r.id, results)) # type: ignore
|
||||||
|
|
||||||
|
step_details = SpiffStepDetailsModel.query.filter(
|
||||||
|
SpiffStepDetailsModel.process_instance_id.in_(ids_to_delete) # type: ignore
|
||||||
|
).all()
|
||||||
|
|
||||||
|
for deletion in step_details:
|
||||||
|
db.session.delete(deletion)
|
||||||
|
for deletion in results:
|
||||||
|
db.session.delete(deletion)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
return rows_affected
|
|
@ -157,6 +157,7 @@ class CustomBpmnScriptEngine(PythonScriptEngine): # type: ignore
|
||||||
"_strptime": _strptime,
|
"_strptime": _strptime,
|
||||||
"enumerate": enumerate,
|
"enumerate": enumerate,
|
||||||
"list": list,
|
"list": list,
|
||||||
|
"map": map,
|
||||||
}
|
}
|
||||||
|
|
||||||
# This will overwrite the standard builtins
|
# This will overwrite the standard builtins
|
||||||
|
|
Loading…
Reference in New Issue