This commit is contained in:
Dan 2023-05-02 14:00:15 -04:00
parent ac149c9dcb
commit 6aaae539a0
9 changed files with 48 additions and 40 deletions

View File

@ -18,13 +18,13 @@ def setup_database_uri(app: Flask) -> None:
if app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_URI") is None: if app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_URI") is None:
database_name = f"spiffworkflow_backend_{app.config['ENV_IDENTIFIER']}" database_name = f"spiffworkflow_backend_{app.config['ENV_IDENTIFIER']}"
if app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_TYPE") == "sqlite": if app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_TYPE") == "sqlite":
app.config["SQLALCHEMY_DATABASE_URI"] = ( app.config[
f"sqlite:///{app.instance_path}/db_{app.config['ENV_IDENTIFIER']}.sqlite3" "SQLALCHEMY_DATABASE_URI"
) ] = f"sqlite:///{app.instance_path}/db_{app.config['ENV_IDENTIFIER']}.sqlite3"
elif app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_TYPE") == "postgres": elif app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_TYPE") == "postgres":
app.config["SQLALCHEMY_DATABASE_URI"] = ( app.config[
f"postgresql://spiffworkflow_backend:spiffworkflow_backend@localhost:5432/{database_name}" "SQLALCHEMY_DATABASE_URI"
) ] = f"postgresql://spiffworkflow_backend:spiffworkflow_backend@localhost:5432/{database_name}"
else: else:
# use pswd to trick flake8 with hardcoded passwords # use pswd to trick flake8 with hardcoded passwords
db_pswd = app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_PASSWORD") db_pswd = app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_PASSWORD")

View File

@ -129,9 +129,9 @@ class ProcessInstanceModel(SpiffworkflowBaseDBModel):
def serialized_with_metadata(self) -> dict[str, Any]: def serialized_with_metadata(self) -> dict[str, Any]:
process_instance_attributes = self.serialized process_instance_attributes = self.serialized
process_instance_attributes["process_metadata"] = self.process_metadata process_instance_attributes["process_metadata"] = self.process_metadata
process_instance_attributes["process_model_with_diagram_identifier"] = ( process_instance_attributes[
self.process_model_with_diagram_identifier "process_model_with_diagram_identifier"
) ] = self.process_model_with_diagram_identifier
return process_instance_attributes return process_instance_attributes
@property @property

View File

@ -2,6 +2,7 @@
import enum import enum
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any from typing import Any
from typing import List
from typing import Optional from typing import Optional
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import Union from typing import Union
@ -85,7 +86,7 @@ class TaskModel(SpiffworkflowBaseDBModel):
can_complete: Optional[bool] = None can_complete: Optional[bool] = None
extensions: Optional[dict] = None extensions: Optional[dict] = None
name_for_display: Optional[str] = None name_for_display: Optional[str] = None
signal_buttons: Optional[dict] = None signal_buttons: Optional[List[dict]] = None
def get_data(self) -> dict: def get_data(self) -> dict:
return {**self.python_env_data(), **self.json_data()} return {**self.python_env_data(), **self.json_data()}

View File

@ -18,7 +18,6 @@ from spiffworkflow_backend.exceptions.process_entity_not_found_error import (
) )
from spiffworkflow_backend.models.principal import PrincipalModel from spiffworkflow_backend.models.principal import PrincipalModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceModelSchema
from spiffworkflow_backend.models.process_instance_file_data import ( from spiffworkflow_backend.models.process_instance_file_data import (
ProcessInstanceFileDataModel, ProcessInstanceFileDataModel,
) )

View File

@ -423,9 +423,9 @@ class ProcessInstanceProcessor:
tld.process_instance_id = process_instance_model.id tld.process_instance_id = process_instance_model.id
# we want this to be the fully qualified path to the process model including all group subcomponents # we want this to be the fully qualified path to the process model including all group subcomponents
current_app.config["THREAD_LOCAL_DATA"].process_model_identifier = ( current_app.config[
f"{process_instance_model.process_model_identifier}" "THREAD_LOCAL_DATA"
) ].process_model_identifier = f"{process_instance_model.process_model_identifier}"
self.process_instance_model = process_instance_model self.process_instance_model = process_instance_model
self.process_model_service = ProcessModelService() self.process_model_service = ProcessModelService()
@ -585,9 +585,9 @@ class ProcessInstanceProcessor:
bpmn_subprocess_definition.bpmn_identifier bpmn_subprocess_definition.bpmn_identifier
] = bpmn_process_definition_dict ] = bpmn_process_definition_dict
spiff_bpmn_process_dict["subprocess_specs"][bpmn_subprocess_definition.bpmn_identifier]["task_specs"] = {} spiff_bpmn_process_dict["subprocess_specs"][bpmn_subprocess_definition.bpmn_identifier]["task_specs"] = {}
bpmn_subprocess_definition_bpmn_identifiers[bpmn_subprocess_definition.id] = ( bpmn_subprocess_definition_bpmn_identifiers[
bpmn_subprocess_definition.bpmn_identifier bpmn_subprocess_definition.id
) ] = bpmn_subprocess_definition.bpmn_identifier
task_definitions = TaskDefinitionModel.query.filter( task_definitions = TaskDefinitionModel.query.filter(
TaskDefinitionModel.bpmn_process_definition_id.in_( # type: ignore TaskDefinitionModel.bpmn_process_definition_id.in_( # type: ignore

View File

@ -2,7 +2,8 @@ import copy
import json import json
import time import time
from hashlib import sha256 from hashlib import sha256
from typing import Optional, List from typing import List
from typing import Optional
from typing import Tuple from typing import Tuple
from typing import TypedDict from typing import TypedDict
from typing import Union from typing import Union
@ -642,17 +643,19 @@ class TaskService:
for task_model in waiting_tasks: for task_model in waiting_tasks:
task_definition = task_model.task_definition task_definition = task_model.task_definition
extensions: dict = ( extensions: dict = (
task_definition.properties_json["extensions"] if "extensions" in task_definition.properties_json else {} task_definition.properties_json["extensions"]
if "extensions" in task_definition.properties_json
else {}
) )
event_definition: dict = ( event_definition: dict = (
task_definition.properties_json["event_definition"] if "event_definition" in task_definition.properties_json else {} task_definition.properties_json["event_definition"]
if "event_definition" in task_definition.properties_json
else {}
) )
if 'signalButtonLabel' in extensions and 'name' in event_definition: if "signalButtonLabel" in extensions and "name" in event_definition:
result.append({'event': event_definition, 'label': extensions['signalButtonLabel']}) result.append({"event": event_definition, "label": extensions["signalButtonLabel"]})
return result return result
@classmethod @classmethod
def get_spec_reference_from_bpmn_process(cls, bpmn_process: BpmnProcessModel) -> SpecReferenceCache: def get_spec_reference_from_bpmn_process(cls, bpmn_process: BpmnProcessModel) -> SpecReferenceCache:
"""Get the bpmn file for a given task model. """Get the bpmn file for a given task model.

View File

@ -157,7 +157,6 @@ class TestTaskService(BaseTest):
bpmn_process = TaskService.bpmn_process_for_called_activity_or_top_level_process(task_model_level_3) bpmn_process = TaskService.bpmn_process_for_called_activity_or_top_level_process(task_model_level_3)
assert bpmn_process.bpmn_process_definition.bpmn_identifier == "Level3" assert bpmn_process.bpmn_process_definition.bpmn_identifier == "Level3"
def test_get_button_labels_for_waiting_signal_event_tasks( def test_get_button_labels_for_waiting_signal_event_tasks(
self, self,
app: Flask, app: Flask,
@ -169,18 +168,18 @@ class TestTaskService(BaseTest):
bpmn_file_name="signal_event_extensions", bpmn_file_name="signal_event_extensions",
) )
load_test_spec( load_test_spec(
f"test_group/SpiffCatchEventExtensions", "test_group/SpiffCatchEventExtensions",
process_model_source_directory="call_activity_nested", process_model_source_directory="call_activity_nested",
bpmn_file_name="SpiffCatchEventExtensions" bpmn_file_name="SpiffCatchEventExtensions",
) )
process_instance = self.create_process_instance_from_process_model(process_model) process_instance = self.create_process_instance_from_process_model(process_model)
processor = ProcessInstanceProcessor(process_instance) processor = ProcessInstanceProcessor(process_instance)
processor.do_engine_steps(save=True, execution_strategy_name="greedy") processor.do_engine_steps(save=True, execution_strategy_name="greedy")
events = TaskService.get_ready_signals_with_button_labels(process_instance.id) events = TaskService.get_ready_signals_with_button_labels(process_instance.id)
assert(len(events) == 1) assert len(events) == 1
signal_event = events[0] signal_event = events[0]
assert(signal_event['event']['name'] == 'eat_spam') assert signal_event["event"]["name"] == "eat_spam"
assert(signal_event['event']['typename'] == 'SignalEventDefinition') assert signal_event["event"]["typename"] == "SignalEventDefinition"
assert(signal_event['label'] == 'Eat Spam') assert signal_event["label"] == "Eat Spam"
print(events) print(events)

View File

@ -196,7 +196,7 @@ export default function TaskShow() {
}; };
const handleSignalSubmit = (event: EventDefinition) => { const handleSignalSubmit = (event: EventDefinition) => {
console.log("Signal Event ", event) console.log('Signal Event ', event);
if (disabled || !task) { if (disabled || !task) {
return; return;
} }
@ -211,7 +211,7 @@ export default function TaskShow() {
httpMethod: 'POST', httpMethod: 'POST',
postBody: event, postBody: event,
}); });
} };
const buildTaskNavigation = () => { const buildTaskNavigation = () => {
let userTasksElement; let userTasksElement;
@ -367,19 +367,25 @@ export default function TaskShow() {
</Button> </Button>
); );
} }
reactFragmentToHideSubmitButton = <ButtonSet> reactFragmentToHideSubmitButton = (
<ButtonSet>
<Button type="submit" id="submit-button" disabled={disabled}> <Button type="submit" id="submit-button" disabled={disabled}>
{submitButtonText} {submitButtonText}
</Button> </Button>
{saveAsDraftButton} {saveAsDraftButton}
<> <>
{task.signal_buttons.map((signal, i) => {task.signal_buttons.map((signal) => (
<Button name={`signal.signal`} disabled={disabled} onClick={() => handleSignalSubmit(signal.event)}> <Button
name="signal.signal"
disabled={disabled}
onClick={() => handleSignalSubmit(signal.event)}
>
{signal.label} {signal.label}
</Button> </Button>
)} ))}
</> </>
</ButtonSet>; </ButtonSet>
);
} }
const customValidate = (formData: any, errors: any) => { const customValidate = (formData: any, errors: any) => {