pyl and turn back on autoreload for homepage w/ burnettk

This commit is contained in:
jasquat 2023-04-13 16:56:49 -04:00
parent fd25bb64d7
commit c9785b2c34
4 changed files with 38 additions and 25 deletions

View File

@ -44,3 +44,6 @@ per-file-ignores =
# S607 Starting a process with a partial executable path # S607 Starting a process with a partial executable path
# S605 Starting a process with a shell: Seems safe, but may be changed in the future, consider rewriting without shell # S605 Starting a process with a shell: Seems safe, but may be changed in the future, consider rewriting without shell
spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py:S607,S101,S605,D102,D103,D101 spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py:S607,S101,S605,D102,D103,D101
# TODO: refactor this service so complexity should be reduced throughout
spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_report_service.py:C901,D100,D101,D102,D103,D107

View File

@ -41,3 +41,6 @@ per-file-ignores =
src/spiffworkflow_backend/services/logging_service.py:N802,B950 src/spiffworkflow_backend/services/logging_service.py:N802,B950
tests/spiffworkflow_backend/integration/test_process_api.py:S607,S101,S605,D102,D103,D101 tests/spiffworkflow_backend/integration/test_process_api.py:S607,S101,S605,D102,D103,D101
# TODO: refactor this service so complexity should be reduced throughout
src/spiffworkflow_backend/services/process_instance_report_service.py:C901,D100,D101,D102,D103,D107

View File

@ -1,25 +1,25 @@
"""Process_instance_report_service.""" """Process_instance_report_service."""
import re import re
from flask import current_app
from sqlalchemy.orm.util import AliasedClass
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any from typing import Any
from typing import Optional from typing import Optional
from typing import Type from typing import Type
import sqlalchemy import sqlalchemy
from flask import current_app
from sqlalchemy import and_ from sqlalchemy import and_
from sqlalchemy import func from sqlalchemy import func
from sqlalchemy import or_ from sqlalchemy import or_
from sqlalchemy.orm import aliased from sqlalchemy.orm import aliased
from sqlalchemy.orm import selectinload from sqlalchemy.orm import selectinload
from sqlalchemy.orm.util import AliasedClass
from spiffworkflow_backend.exceptions.api_error import ApiError from spiffworkflow_backend.exceptions.api_error import ApiError
from spiffworkflow_backend.models.db import SpiffworkflowBaseDBModel from spiffworkflow_backend.models.db import SpiffworkflowBaseDBModel
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.human_task import HumanTaskModel from spiffworkflow_backend.models.human_task import HumanTaskModel
from spiffworkflow_backend.models.human_task_user import HumanTaskUserModel from spiffworkflow_backend.models.human_task_user import HumanTaskUserModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel, ProcessInstanceStatus from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from spiffworkflow_backend.models.process_instance_metadata import ( from spiffworkflow_backend.models.process_instance_metadata import (
ProcessInstanceMetadataModel, ProcessInstanceMetadataModel,
) )
@ -167,7 +167,12 @@ class ProcessInstanceReportService:
"filter_by": [ "filter_by": [
{"field_name": "initiated_by_me", "field_value": "true"}, {"field_name": "initiated_by_me", "field_value": "true"},
{"field_name": "has_terminal_status", "field_value": "false"}, {"field_name": "has_terminal_status", "field_value": "false"},
{"field_name": "oldest_open_human_task_fields", "field_value": ['task_id', 'task_title', 'task_name', 'potential_owner_usernames', 'assigned_user_group_identifier']}, {
"field_name": "oldest_open_human_task_fields",
"field_value": (
"task_id,task_title,task_name,potential_owner_usernames,assigned_user_group_identifier"
),
},
], ],
"order_by": ["-start_in_seconds", "-id"], "order_by": ["-start_in_seconds", "-id"],
}, },
@ -186,7 +191,10 @@ class ProcessInstanceReportService:
"filter_by": [ "filter_by": [
{"field_name": "with_tasks_i_can_complete", "field_value": "true"}, {"field_name": "with_tasks_i_can_complete", "field_value": "true"},
{"field_name": "has_active_status", "field_value": "true"}, {"field_name": "has_active_status", "field_value": "true"},
{"field_name": "oldest_open_human_task_fields", "field_value": ['task_id', 'task_title', 'task_name']}, {
"field_name": "oldest_open_human_task_fields",
"field_value": "task_id,task_title,task_name",
},
], ],
"order_by": ["-start_in_seconds", "-id"], "order_by": ["-start_in_seconds", "-id"],
}, },
@ -208,7 +216,10 @@ class ProcessInstanceReportService:
"field_value": "true", "field_value": "true",
}, },
{"field_name": "has_active_status", "field_value": "true"}, {"field_name": "has_active_status", "field_value": "true"},
{"field_name": "oldest_open_human_task_fields", "field_value": ['task_id', 'task_title', 'task_name']}, {
"field_name": "oldest_open_human_task_fields",
"field_value": "task_id,task_title,task_name",
},
], ],
"order_by": ["-start_in_seconds", "-id"], "order_by": ["-start_in_seconds", "-id"],
}, },
@ -274,7 +285,7 @@ class ProcessInstanceReportService:
if key not in filters: if key not in filters:
return None return None
# bool returns True if not an empty string so check explicitly for false # bool returns True if not an empty string so check explicitly for false
if filters[key] in ['false', 'False']: if filters[key] in ["false", "False"]:
return False return False
return bool(filters[key]) return bool(filters[key])
@ -283,12 +294,7 @@ class ProcessInstanceReportService:
return int(filters[key]) if key in filters else None return int(filters[key]) if key in filters else None
def list_value(key: str) -> Optional[list[str]]: def list_value(key: str) -> Optional[list[str]]:
"""List_value.""" return filters[key].split(",") if key in filters else None
if key not in filters:
return None
if isinstance(filters[key], list):
return filters[key]
return filters[key].split(",")
process_model_identifier = filters.get("process_model_identifier") process_model_identifier = filters.get("process_model_identifier")
user_group_identifier = filters.get("user_group_identifier") user_group_identifier = filters.get("user_group_identifier")
@ -418,11 +424,13 @@ class ProcessInstanceReportService:
return results return results
@classmethod @classmethod
def add_human_task_fields(cls, process_instance_dicts: list[dict], oldest_open_human_task_fields: list) -> list[dict]: def add_human_task_fields(
cls, process_instance_dicts: list[dict], oldest_open_human_task_fields: list
) -> list[dict]:
for process_instance_dict in process_instance_dicts: for process_instance_dict in process_instance_dicts:
assigned_user = aliased(UserModel) assigned_user = aliased(UserModel)
human_task_query = ( human_task_query = (
HumanTaskModel.query.filter_by(process_instance_id=process_instance_dict['id'], completed=False) HumanTaskModel.query.filter_by(process_instance_id=process_instance_dict["id"], completed=False)
.group_by(HumanTaskModel.id) .group_by(HumanTaskModel.id)
.outerjoin( .outerjoin(
HumanTaskUserModel, HumanTaskUserModel,
@ -438,8 +446,10 @@ class ProcessInstanceReportService:
HumanTaskModel.task_name, HumanTaskModel.task_name,
HumanTaskModel.task_title, HumanTaskModel.task_title,
func.max(GroupModel.identifier).label("assigned_user_group_identifier"), func.max(GroupModel.identifier).label("assigned_user_group_identifier"),
potential_owner_usernames_from_group_concat_or_similar potential_owner_usernames_from_group_concat_or_similar,
).order_by(HumanTaskModel.id.asc()).first() # type: ignore )
.order_by(HumanTaskModel.id.asc()) # type: ignore
.first()
) )
if human_task is not None: if human_task is not None:
for field in oldest_open_human_task_fields: for field in oldest_open_human_task_fields:
@ -602,13 +612,10 @@ class ProcessInstanceReportService:
and_( and_(
HumanTaskModel.process_instance_id == ProcessInstanceModel.id, HumanTaskModel.process_instance_id == ProcessInstanceModel.id,
HumanTaskModel.lane_assignment_id.is_(None), # type: ignore HumanTaskModel.lane_assignment_id.is_(None), # type: ignore
) ),
).join( ).join(
HumanTaskUserModel, HumanTaskUserModel,
and_( and_(HumanTaskUserModel.human_task_id == HumanTaskModel.id, HumanTaskUserModel.user_id == user.id),
HumanTaskUserModel.human_task_id == HumanTaskModel.id,
HumanTaskUserModel.user_id == user.id
)
) )
if report_filter.with_tasks_assigned_to_my_group is True: if report_filter.with_tasks_assigned_to_my_group is True:

View File

@ -38,7 +38,7 @@ export default function InProgressInstances() {
additionalParams={`user_group_identifier=${userGroup}`} additionalParams={`user_group_identifier=${userGroup}`}
canCompleteAllTasks canCompleteAllTasks
showActionsColumn showActionsColumn
autoReload={false} autoReload
/> />
</> </>
); );
@ -66,7 +66,7 @@ export default function InProgressInstances() {
textToShowIfEmpty="There are no open instances you started at this time." textToShowIfEmpty="There are no open instances you started at this time."
paginationClassName="with-large-bottom-margin" paginationClassName="with-large-bottom-margin"
showActionsColumn showActionsColumn
autoReload={false} autoReload
/> />
<h2 <h2
title={waitingForMeTitleText} title={waitingForMeTitleText}
@ -84,7 +84,7 @@ export default function InProgressInstances() {
paginationClassName="with-large-bottom-margin" paginationClassName="with-large-bottom-margin"
canCompleteAllTasks canCompleteAllTasks
showActionsColumn showActionsColumn
autoReload={false} autoReload
/> />
{groupTableComponents()} {groupTableComponents()}
</> </>