attempting to filter process instances with json instead of report filters w/ burnettk
This commit is contained in:
parent
9aa9fe913b
commit
0adea8c25c
|
@ -697,7 +697,7 @@ paths:
|
||||||
description: Base64 encoded json of report filter by.
|
description: Base64 encoded json of report filter by.
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
get:
|
post:
|
||||||
operationId: spiffworkflow_backend.routes.process_instances_controller.process_instance_list_for_me
|
operationId: spiffworkflow_backend.routes.process_instances_controller.process_instance_list_for_me
|
||||||
summary: Returns a list of process instances that are associated with me.
|
summary: Returns a list of process instances that are associated with me.
|
||||||
tags:
|
tags:
|
||||||
|
@ -828,7 +828,7 @@ paths:
|
||||||
description: Base64 encoded json of report filter by.
|
description: Base64 encoded json of report filter by.
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
get:
|
post:
|
||||||
operationId: spiffworkflow_backend.routes.process_instances_controller.process_instance_list
|
operationId: spiffworkflow_backend.routes.process_instances_controller.process_instance_list
|
||||||
summary: Returns a list of process instances.
|
summary: Returns a list of process instances.
|
||||||
tags:
|
tags:
|
||||||
|
|
|
@ -22,7 +22,21 @@ from spiffworkflow_backend.services.process_instance_processor import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
ReportMetadata = dict[str, Any]
|
class FilterValue(TypedDict):
|
||||||
|
field_name: str
|
||||||
|
field_value: str
|
||||||
|
operator: str
|
||||||
|
|
||||||
|
|
||||||
|
class ReportMetadataColumn(TypedDict):
|
||||||
|
Header: str
|
||||||
|
accessor: str
|
||||||
|
|
||||||
|
|
||||||
|
class ReportMetadata(TypedDict):
|
||||||
|
columns: list[ReportMetadataColumn]
|
||||||
|
filter_by: list[FilterValue]
|
||||||
|
order_by: list[str]
|
||||||
|
|
||||||
|
|
||||||
class ProcessInstanceReportAlreadyExistsError(Exception):
|
class ProcessInstanceReportAlreadyExistsError(Exception):
|
||||||
|
|
|
@ -226,103 +226,107 @@ def process_instance_resume(
|
||||||
|
|
||||||
|
|
||||||
def process_instance_list_for_me(
|
def process_instance_list_for_me(
|
||||||
|
body: Dict[str, Any],
|
||||||
process_model_identifier: Optional[str] = None,
|
process_model_identifier: Optional[str] = None,
|
||||||
page: int = 1,
|
page: int = 1,
|
||||||
per_page: int = 100,
|
per_page: int = 100,
|
||||||
start_from: Optional[int] = None,
|
# start_from: Optional[int] = None,
|
||||||
start_to: Optional[int] = None,
|
# start_to: Optional[int] = None,
|
||||||
end_from: Optional[int] = None,
|
# end_from: Optional[int] = None,
|
||||||
end_to: Optional[int] = None,
|
# end_to: Optional[int] = None,
|
||||||
process_status: Optional[str] = None,
|
# process_status: Optional[str] = None,
|
||||||
user_filter: Optional[bool] = False,
|
# user_filter: Optional[bool] = False,
|
||||||
report_identifier: Optional[str] = None,
|
# report_identifier: Optional[str] = None,
|
||||||
report_id: Optional[int] = None,
|
# report_id: Optional[int] = None,
|
||||||
user_group_identifier: Optional[str] = None,
|
# user_group_identifier: Optional[str] = None,
|
||||||
process_initiator_username: Optional[str] = None,
|
# process_initiator_username: Optional[str] = None,
|
||||||
report_columns: Optional[str] = None,
|
# report_columns: Optional[str] = None,
|
||||||
report_filter_by: Optional[str] = None,
|
# report_filter_by: Optional[str] = None,
|
||||||
) -> flask.wrappers.Response:
|
) -> flask.wrappers.Response:
|
||||||
"""Process_instance_list_for_me."""
|
"""Process_instance_list_for_me."""
|
||||||
return process_instance_list(
|
return process_instance_list(
|
||||||
process_model_identifier=process_model_identifier,
|
process_model_identifier=process_model_identifier,
|
||||||
page=page,
|
page=page,
|
||||||
per_page=per_page,
|
per_page=per_page,
|
||||||
start_from=start_from,
|
# start_from=start_from,
|
||||||
start_to=start_to,
|
# start_to=start_to,
|
||||||
end_from=end_from,
|
# end_from=end_from,
|
||||||
end_to=end_to,
|
# end_to=end_to,
|
||||||
process_status=process_status,
|
# process_status=process_status,
|
||||||
user_filter=user_filter,
|
# user_filter=user_filter,
|
||||||
report_identifier=report_identifier,
|
# report_identifier=report_identifier,
|
||||||
report_id=report_id,
|
# report_id=report_id,
|
||||||
user_group_identifier=user_group_identifier,
|
# user_group_identifier=user_group_identifier,
|
||||||
with_relation_to_me=True,
|
# with_relation_to_me=True,
|
||||||
report_columns=report_columns,
|
# report_columns=report_columns,
|
||||||
report_filter_by=report_filter_by,
|
# report_filter_by=report_filter_by,
|
||||||
process_initiator_username=process_initiator_username,
|
# process_initiator_username=process_initiator_username,
|
||||||
|
body=body
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def process_instance_list(
|
def process_instance_list(
|
||||||
|
body: Dict[str, Any],
|
||||||
process_model_identifier: Optional[str] = None,
|
process_model_identifier: Optional[str] = None,
|
||||||
page: int = 1,
|
page: int = 1,
|
||||||
per_page: int = 100,
|
per_page: int = 100,
|
||||||
start_from: Optional[int] = None,
|
# start_from: Optional[int] = None,
|
||||||
start_to: Optional[int] = None,
|
# start_to: Optional[int] = None,
|
||||||
end_from: Optional[int] = None,
|
# end_from: Optional[int] = None,
|
||||||
end_to: Optional[int] = None,
|
# end_to: Optional[int] = None,
|
||||||
process_status: Optional[str] = None,
|
# process_status: Optional[str] = None,
|
||||||
with_relation_to_me: Optional[bool] = None,
|
# with_relation_to_me: Optional[bool] = None,
|
||||||
user_filter: Optional[bool] = False,
|
# user_filter: Optional[bool] = False,
|
||||||
report_identifier: Optional[str] = None,
|
# report_identifier: Optional[str] = None,
|
||||||
report_id: Optional[int] = None,
|
# report_id: Optional[int] = None,
|
||||||
user_group_identifier: Optional[str] = None,
|
# user_group_identifier: Optional[str] = None,
|
||||||
process_initiator_username: Optional[str] = None,
|
# process_initiator_username: Optional[str] = None,
|
||||||
report_columns: Optional[str] = None,
|
# report_columns: Optional[str] = None,
|
||||||
report_filter_by: Optional[str] = None,
|
# report_filter_by: Optional[str] = None,
|
||||||
) -> flask.wrappers.Response:
|
) -> flask.wrappers.Response:
|
||||||
"""Process_instance_list."""
|
# process_instance_report = ProcessInstanceReportService.report_with_identifier(g.user, body['report_id'], body['report_identifier'])
|
||||||
process_instance_report = ProcessInstanceReportService.report_with_identifier(g.user, report_id, report_identifier)
|
process_instance_report = ProcessInstanceReportService.report_with_identifier(g.user)
|
||||||
|
|
||||||
report_column_list = None
|
# report_column_list = None
|
||||||
if report_columns:
|
# if report_columns:
|
||||||
report_column_list = json.loads(base64.b64decode(report_columns))
|
# report_column_list = json.loads(base64.b64decode(report_columns))
|
||||||
report_filter_by_list = None
|
# report_filter_by_list = None
|
||||||
if report_filter_by:
|
# if report_filter_by:
|
||||||
report_filter_by_list = json.loads(base64.b64decode(report_filter_by))
|
# report_filter_by_list = json.loads(base64.b64decode(report_filter_by))
|
||||||
|
|
||||||
if user_filter:
|
# if user_filter:
|
||||||
report_filter = ProcessInstanceReportFilter(
|
# report_filter = ProcessInstanceReportFilter(
|
||||||
process_model_identifier=process_model_identifier,
|
# process_model_identifier=process_model_identifier,
|
||||||
user_group_identifier=user_group_identifier,
|
# # user_group_identifier=user_group_identifier,
|
||||||
start_from=start_from,
|
# # start_from=start_from,
|
||||||
start_to=start_to,
|
# # start_to=start_to,
|
||||||
end_from=end_from,
|
# # end_from=end_from,
|
||||||
end_to=end_to,
|
# # end_to=end_to,
|
||||||
with_relation_to_me=with_relation_to_me,
|
# # with_relation_to_me=with_relation_to_me,
|
||||||
process_status=process_status.split(",") if process_status else None,
|
# # process_status=process_status.split(",") if process_status else None,
|
||||||
process_initiator_username=process_initiator_username,
|
# # process_initiator_username=process_initiator_username,
|
||||||
report_column_list=report_column_list,
|
# # report_column_list=report_column_list,
|
||||||
report_filter_by_list=report_filter_by_list,
|
# # report_filter_by_list=report_filter_by_list,
|
||||||
)
|
# )
|
||||||
else:
|
# else:
|
||||||
report_filter = ProcessInstanceReportService.filter_from_metadata_with_overrides(
|
# report_filter = ProcessInstanceReportService.filter_from_metadata_with_overrides(
|
||||||
process_instance_report=process_instance_report,
|
# process_instance_report=process_instance_report,
|
||||||
process_model_identifier=process_model_identifier,
|
# process_model_identifier=process_model_identifier,
|
||||||
user_group_identifier=user_group_identifier,
|
# # user_group_identifier=user_group_identifier,
|
||||||
start_from=start_from,
|
# # start_from=start_from,
|
||||||
start_to=start_to,
|
# # start_to=start_to,
|
||||||
end_from=end_from,
|
# # end_from=end_from,
|
||||||
end_to=end_to,
|
# # end_to=end_to,
|
||||||
process_status=process_status,
|
# # process_status=process_status,
|
||||||
with_relation_to_me=with_relation_to_me,
|
# # with_relation_to_me=with_relation_to_me,
|
||||||
process_initiator_username=process_initiator_username,
|
# # process_initiator_username=process_initiator_username,
|
||||||
report_column_list=report_column_list,
|
# # report_column_list=report_column_list,
|
||||||
report_filter_by_list=report_filter_by_list,
|
# # report_filter_by_list=report_filter_by_list,
|
||||||
)
|
# )
|
||||||
|
|
||||||
response_json = ProcessInstanceReportService.run_process_instance_report(
|
response_json = ProcessInstanceReportService.run_process_instance_report(
|
||||||
report_filter=report_filter,
|
# report_filter=report_filter,
|
||||||
|
report_metadata=body['report_metadata'],
|
||||||
process_instance_report=process_instance_report,
|
process_instance_report=process_instance_report,
|
||||||
page=page,
|
page=page,
|
||||||
per_page=per_page,
|
per_page=per_page,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
"""Process_instance_report_service."""
|
"""Process_instance_report_service."""
|
||||||
import re
|
import re
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Any
|
from typing import Any, Generator, Iterable
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Type
|
from typing import Type
|
||||||
|
|
||||||
|
@ -24,7 +24,9 @@ from spiffworkflow_backend.models.process_instance_metadata import (
|
||||||
ProcessInstanceMetadataModel,
|
ProcessInstanceMetadataModel,
|
||||||
)
|
)
|
||||||
from spiffworkflow_backend.models.process_instance_report import (
|
from spiffworkflow_backend.models.process_instance_report import (
|
||||||
|
FilterValue,
|
||||||
ProcessInstanceReportModel,
|
ProcessInstanceReportModel,
|
||||||
|
ReportMetadata,
|
||||||
)
|
)
|
||||||
from spiffworkflow_backend.models.user import UserModel
|
from spiffworkflow_backend.models.user import UserModel
|
||||||
from spiffworkflow_backend.models.user_group_assignment import UserGroupAssignmentModel
|
from spiffworkflow_backend.models.user_group_assignment import UserGroupAssignmentModel
|
||||||
|
@ -236,7 +238,6 @@ class ProcessInstanceReportService:
|
||||||
report_id: Optional[int] = None,
|
report_id: Optional[int] = None,
|
||||||
report_identifier: Optional[str] = None,
|
report_identifier: Optional[str] = None,
|
||||||
) -> ProcessInstanceReportModel:
|
) -> ProcessInstanceReportModel:
|
||||||
"""Report_with_filter."""
|
|
||||||
if report_id is not None:
|
if report_id is not None:
|
||||||
process_instance_report = ProcessInstanceReportModel.query.filter_by(
|
process_instance_report = ProcessInstanceReportModel.query.filter_by(
|
||||||
id=report_id, created_by_id=user.id
|
id=report_id, created_by_id=user.id
|
||||||
|
@ -496,25 +497,31 @@ class ProcessInstanceReportService:
|
||||||
{"Header": "Status", "accessor": "status", "filterable": False},
|
{"Header": "Status", "accessor": "status", "filterable": False},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def blah(cls, filters: list[FilterValue], filter_key: str) -> Generator:
|
||||||
|
for filter in filters:
|
||||||
|
if filter['field_name'] == filter_key and filter['field_value'] is not None:
|
||||||
|
yield filter['field_value']
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def run_process_instance_report(
|
def run_process_instance_report(
|
||||||
cls,
|
cls,
|
||||||
report_filter: ProcessInstanceReportFilter,
|
# report_filter: ProcessInstanceReportFilter,
|
||||||
|
report_metadata: ReportMetadata,
|
||||||
process_instance_report: ProcessInstanceReportModel,
|
process_instance_report: ProcessInstanceReportModel,
|
||||||
user: UserModel,
|
user: UserModel,
|
||||||
page: int = 1,
|
page: int = 1,
|
||||||
per_page: int = 100,
|
per_page: int = 100,
|
||||||
) -> dict:
|
) -> dict:
|
||||||
"""Run_process_instance_report."""
|
|
||||||
process_instance_query = ProcessInstanceModel.query
|
process_instance_query = ProcessInstanceModel.query
|
||||||
# Always join that hot user table for good performance at serialization time.
|
# Always join that hot user table for good performance at serialization time.
|
||||||
process_instance_query = process_instance_query.options(selectinload(ProcessInstanceModel.process_initiator))
|
process_instance_query = process_instance_query.options(selectinload(ProcessInstanceModel.process_initiator))
|
||||||
|
filters = report_metadata['filter_by']
|
||||||
|
|
||||||
if report_filter.process_model_identifier is not None:
|
for value in cls.blah(filters, 'process_model_identifier'):
|
||||||
process_model = ProcessModelService.get_process_model(
|
process_model = ProcessModelService.get_process_model(
|
||||||
f"{report_filter.process_model_identifier}",
|
f"{value}",
|
||||||
)
|
)
|
||||||
|
|
||||||
process_instance_query = process_instance_query.filter_by(process_model_identifier=process_model.id)
|
process_instance_query = process_instance_query.filter_by(process_model_identifier=process_model.id)
|
||||||
|
|
||||||
# this can never happen. obviously the class has the columns it defines. this is just to appease mypy.
|
# this can never happen. obviously the class has the columns it defines. this is just to appease mypy.
|
||||||
|
@ -527,187 +534,188 @@ class ProcessInstanceReportService:
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if report_filter.start_from is not None:
|
# if report_filter.start_from is not None:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
ProcessInstanceModel.start_in_seconds >= report_filter.start_from
|
# ProcessInstanceModel.start_in_seconds >= report_filter.start_from
|
||||||
)
|
# )
|
||||||
if report_filter.start_to is not None:
|
# if report_filter.start_to is not None:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
ProcessInstanceModel.start_in_seconds <= report_filter.start_to
|
# ProcessInstanceModel.start_in_seconds <= report_filter.start_to
|
||||||
)
|
# )
|
||||||
if report_filter.end_from is not None:
|
# if report_filter.end_from is not None:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
ProcessInstanceModel.end_in_seconds >= report_filter.end_from
|
# ProcessInstanceModel.end_in_seconds >= report_filter.end_from
|
||||||
)
|
# )
|
||||||
if report_filter.end_to is not None:
|
# if report_filter.end_to is not None:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
ProcessInstanceModel.end_in_seconds <= report_filter.end_to
|
# ProcessInstanceModel.end_in_seconds <= report_filter.end_to
|
||||||
)
|
# )
|
||||||
if report_filter.process_status is not None:
|
# if report_filter.process_status is not None:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
ProcessInstanceModel.status.in_(report_filter.process_status) # type: ignore
|
# ProcessInstanceModel.status.in_(report_filter.process_status) # type: ignore
|
||||||
)
|
# )
|
||||||
|
#
|
||||||
if report_filter.initiated_by_me is True:
|
# if report_filter.initiated_by_me is True:
|
||||||
process_instance_query = process_instance_query.filter_by(process_initiator=user)
|
# process_instance_query = process_instance_query.filter_by(process_initiator=user)
|
||||||
|
#
|
||||||
if report_filter.has_terminal_status is True:
|
# if report_filter.has_terminal_status is True:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
ProcessInstanceModel.status.in_(ProcessInstanceModel.terminal_statuses()) # type: ignore
|
# ProcessInstanceModel.status.in_(ProcessInstanceModel.terminal_statuses()) # type: ignore
|
||||||
)
|
# )
|
||||||
elif report_filter.has_terminal_status is False:
|
# elif report_filter.has_terminal_status is False:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
ProcessInstanceModel.status.not_in(ProcessInstanceModel.terminal_statuses()) # type: ignore
|
# ProcessInstanceModel.status.not_in(ProcessInstanceModel.terminal_statuses()) # type: ignore
|
||||||
)
|
# )
|
||||||
if report_filter.has_active_status is True:
|
# if report_filter.has_active_status is True:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
ProcessInstanceModel.status.in_(ProcessInstanceModel.active_statuses()) # type: ignore
|
# ProcessInstanceModel.status.in_(ProcessInstanceModel.active_statuses()) # type: ignore
|
||||||
)
|
# )
|
||||||
|
#
|
||||||
if report_filter.process_initiator_username is not None:
|
# if report_filter.process_initiator_username is not None:
|
||||||
initiator = UserModel.query.filter_by(username=report_filter.process_initiator_username).first()
|
# initiator = UserModel.query.filter_by(username=report_filter.process_initiator_username).first()
|
||||||
process_initiator_id = -1
|
# process_initiator_id = -1
|
||||||
if initiator:
|
# if initiator:
|
||||||
process_initiator_id = initiator.id
|
# process_initiator_id = initiator.id
|
||||||
process_instance_query = process_instance_query.filter_by(process_initiator_id=process_initiator_id)
|
# process_instance_query = process_instance_query.filter_by(process_initiator_id=process_initiator_id)
|
||||||
|
#
|
||||||
if (
|
# if (
|
||||||
not report_filter.with_tasks_completed_by_me
|
# not report_filter.with_tasks_completed_by_me
|
||||||
and not report_filter.with_tasks_assigned_to_my_group
|
# and not report_filter.with_tasks_assigned_to_my_group
|
||||||
and not report_filter.with_tasks_i_can_complete
|
# and not report_filter.with_tasks_i_can_complete
|
||||||
and report_filter.with_relation_to_me is True
|
# and report_filter.with_relation_to_me is True
|
||||||
):
|
# ):
|
||||||
process_instance_query = process_instance_query.outerjoin(HumanTaskModel).outerjoin(
|
# process_instance_query = process_instance_query.outerjoin(HumanTaskModel).outerjoin(
|
||||||
HumanTaskUserModel,
|
# HumanTaskUserModel,
|
||||||
and_(
|
# and_(
|
||||||
HumanTaskModel.id == HumanTaskUserModel.human_task_id,
|
# HumanTaskModel.id == HumanTaskUserModel.human_task_id,
|
||||||
HumanTaskUserModel.user_id == user.id,
|
# HumanTaskUserModel.user_id == user.id,
|
||||||
),
|
# ),
|
||||||
)
|
# )
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
or_(
|
# or_(
|
||||||
HumanTaskUserModel.id.is_not(None),
|
# HumanTaskUserModel.id.is_not(None),
|
||||||
ProcessInstanceModel.process_initiator_id == user.id,
|
# ProcessInstanceModel.process_initiator_id == user.id,
|
||||||
)
|
# )
|
||||||
)
|
# )
|
||||||
|
#
|
||||||
if report_filter.with_tasks_completed_by_me is True:
|
# if report_filter.with_tasks_completed_by_me is True:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
ProcessInstanceModel.process_initiator_id != user.id
|
# ProcessInstanceModel.process_initiator_id != user.id
|
||||||
)
|
# )
|
||||||
process_instance_query = process_instance_query.join(
|
# process_instance_query = process_instance_query.join(
|
||||||
HumanTaskModel,
|
# HumanTaskModel,
|
||||||
and_(
|
# and_(
|
||||||
HumanTaskModel.process_instance_id == ProcessInstanceModel.id,
|
# HumanTaskModel.process_instance_id == ProcessInstanceModel.id,
|
||||||
HumanTaskModel.completed_by_user_id == user.id,
|
# HumanTaskModel.completed_by_user_id == user.id,
|
||||||
),
|
# ),
|
||||||
)
|
# )
|
||||||
|
#
|
||||||
if report_filter.with_tasks_i_can_complete is True:
|
# if report_filter.with_tasks_i_can_complete is True:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
ProcessInstanceModel.process_initiator_id != user.id
|
# ProcessInstanceModel.process_initiator_id != user.id
|
||||||
)
|
# )
|
||||||
process_instance_query = process_instance_query.join(
|
# process_instance_query = process_instance_query.join(
|
||||||
HumanTaskModel,
|
# HumanTaskModel,
|
||||||
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_(HumanTaskUserModel.human_task_id == HumanTaskModel.id, HumanTaskUserModel.user_id == user.id),
|
# and_(HumanTaskUserModel.human_task_id == HumanTaskModel.id, HumanTaskUserModel.user_id == user.id),
|
||||||
)
|
# )
|
||||||
if report_filter.has_active_status:
|
# if report_filter.has_active_status:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
HumanTaskModel.completed.is_(False) # type: ignore
|
# HumanTaskModel.completed.is_(False) # type: ignore
|
||||||
)
|
# )
|
||||||
|
#
|
||||||
if report_filter.with_tasks_assigned_to_my_group is True:
|
# if report_filter.with_tasks_assigned_to_my_group is True:
|
||||||
group_model_join_conditions = [GroupModel.id == HumanTaskModel.lane_assignment_id]
|
# group_model_join_conditions = [GroupModel.id == HumanTaskModel.lane_assignment_id]
|
||||||
if report_filter.user_group_identifier:
|
# if report_filter.user_group_identifier:
|
||||||
group_model_join_conditions.append(GroupModel.identifier == report_filter.user_group_identifier)
|
# group_model_join_conditions.append(GroupModel.identifier == report_filter.user_group_identifier)
|
||||||
|
#
|
||||||
process_instance_query = process_instance_query.join(HumanTaskModel)
|
# process_instance_query = process_instance_query.join(HumanTaskModel)
|
||||||
if report_filter.has_active_status:
|
# if report_filter.has_active_status:
|
||||||
process_instance_query = process_instance_query.filter(
|
# process_instance_query = process_instance_query.filter(
|
||||||
HumanTaskModel.completed.is_(False) # type: ignore
|
# HumanTaskModel.completed.is_(False) # type: ignore
|
||||||
)
|
# )
|
||||||
|
#
|
||||||
process_instance_query = process_instance_query.join(GroupModel, and_(*group_model_join_conditions))
|
# process_instance_query = process_instance_query.join(GroupModel, and_(*group_model_join_conditions))
|
||||||
process_instance_query = process_instance_query.join(
|
# process_instance_query = process_instance_query.join(
|
||||||
UserGroupAssignmentModel,
|
# UserGroupAssignmentModel,
|
||||||
UserGroupAssignmentModel.group_id == GroupModel.id,
|
# UserGroupAssignmentModel.group_id == GroupModel.id,
|
||||||
)
|
# )
|
||||||
process_instance_query = process_instance_query.filter(UserGroupAssignmentModel.user_id == user.id)
|
# process_instance_query = process_instance_query.filter(UserGroupAssignmentModel.user_id == user.id)
|
||||||
|
#
|
||||||
instance_metadata_aliases = {}
|
# instance_metadata_aliases = {}
|
||||||
stock_columns = cls.get_column_names_for_model(ProcessInstanceModel)
|
# stock_columns = cls.get_column_names_for_model(ProcessInstanceModel)
|
||||||
if isinstance(report_filter.report_column_list, list):
|
# if isinstance(report_filter.report_column_list, list):
|
||||||
process_instance_report.report_metadata["columns"] = report_filter.report_column_list
|
# process_instance_report.report_metadata["columns"] = report_filter.report_column_list
|
||||||
if isinstance(report_filter.report_filter_by_list, list):
|
# if isinstance(report_filter.report_filter_by_list, list):
|
||||||
process_instance_report.report_metadata["filter_by"] = report_filter.report_filter_by_list
|
# process_instance_report.report_metadata["filter_by"] = report_filter.report_filter_by_list
|
||||||
|
#
|
||||||
for column in process_instance_report.report_metadata["columns"]:
|
# for column in process_instance_report.report_metadata["columns"]:
|
||||||
if column["accessor"] in stock_columns:
|
# if column["accessor"] in stock_columns:
|
||||||
continue
|
# continue
|
||||||
instance_metadata_alias = aliased(ProcessInstanceMetadataModel)
|
# instance_metadata_alias = aliased(ProcessInstanceMetadataModel)
|
||||||
instance_metadata_aliases[column["accessor"]] = instance_metadata_alias
|
# instance_metadata_aliases[column["accessor"]] = instance_metadata_alias
|
||||||
|
#
|
||||||
filter_for_column = None
|
# filter_for_column = None
|
||||||
if "filter_by" in process_instance_report.report_metadata:
|
# if "filter_by" in process_instance_report.report_metadata:
|
||||||
filter_for_column = next(
|
# filter_for_column = next(
|
||||||
(
|
# (
|
||||||
f
|
# f
|
||||||
for f in process_instance_report.report_metadata["filter_by"]
|
# for f in process_instance_report.report_metadata["filter_by"]
|
||||||
if f["field_name"] == column["accessor"]
|
# if f["field_name"] == column["accessor"]
|
||||||
),
|
# ),
|
||||||
None,
|
# None,
|
||||||
)
|
# )
|
||||||
isouter = True
|
# isouter = True
|
||||||
conditions = [
|
# conditions = [
|
||||||
ProcessInstanceModel.id == instance_metadata_alias.process_instance_id,
|
# ProcessInstanceModel.id == instance_metadata_alias.process_instance_id,
|
||||||
instance_metadata_alias.key == column["accessor"],
|
# instance_metadata_alias.key == column["accessor"],
|
||||||
]
|
# ]
|
||||||
if filter_for_column:
|
# if filter_for_column:
|
||||||
isouter = False
|
# isouter = False
|
||||||
conditions.append(instance_metadata_alias.value == filter_for_column["field_value"])
|
# conditions.append(instance_metadata_alias.value == filter_for_column["field_value"])
|
||||||
process_instance_query = process_instance_query.join(
|
# process_instance_query = process_instance_query.join(
|
||||||
instance_metadata_alias, and_(*conditions), isouter=isouter
|
# instance_metadata_alias, and_(*conditions), isouter=isouter
|
||||||
).add_columns(func.max(instance_metadata_alias.value).label(column["accessor"]))
|
# ).add_columns(func.max(instance_metadata_alias.value).label(column["accessor"]))
|
||||||
|
#
|
||||||
order_by_query_array = []
|
# order_by_query_array = []
|
||||||
order_by_array = process_instance_report.report_metadata["order_by"]
|
# order_by_array = process_instance_report.report_metadata["order_by"]
|
||||||
if len(order_by_array) < 1:
|
# if len(order_by_array) < 1:
|
||||||
order_by_array = ProcessInstanceReportModel.default_order_by()
|
# order_by_array = ProcessInstanceReportModel.default_order_by()
|
||||||
for order_by_option in order_by_array:
|
# for order_by_option in order_by_array:
|
||||||
attribute = re.sub("^-", "", order_by_option)
|
# attribute = re.sub("^-", "", order_by_option)
|
||||||
if attribute in stock_columns:
|
# if attribute in stock_columns:
|
||||||
if order_by_option.startswith("-"):
|
# if order_by_option.startswith("-"):
|
||||||
order_by_query_array.append(getattr(ProcessInstanceModel, attribute).desc())
|
# order_by_query_array.append(getattr(ProcessInstanceModel, attribute).desc())
|
||||||
else:
|
# else:
|
||||||
order_by_query_array.append(getattr(ProcessInstanceModel, attribute).asc())
|
# order_by_query_array.append(getattr(ProcessInstanceModel, attribute).asc())
|
||||||
elif attribute in instance_metadata_aliases:
|
# elif attribute in instance_metadata_aliases:
|
||||||
if order_by_option.startswith("-"):
|
# if order_by_option.startswith("-"):
|
||||||
order_by_query_array.append(func.max(instance_metadata_aliases[attribute].value).desc())
|
# order_by_query_array.append(func.max(instance_metadata_aliases[attribute].value).desc())
|
||||||
else:
|
# else:
|
||||||
order_by_query_array.append(func.max(instance_metadata_aliases[attribute].value).asc())
|
# order_by_query_array.append(func.max(instance_metadata_aliases[attribute].value).asc())
|
||||||
|
|
||||||
process_instances = (
|
process_instances = (
|
||||||
process_instance_query.group_by(ProcessInstanceModel.id)
|
process_instance_query.group_by(ProcessInstanceModel.id)
|
||||||
.add_columns(ProcessInstanceModel.id)
|
.add_columns(ProcessInstanceModel.id)
|
||||||
.order_by(*order_by_query_array)
|
# .order_by(*order_by_query_array)
|
||||||
.paginate(page=page, per_page=per_page, error_out=False)
|
.paginate(page=page, per_page=per_page, error_out=False)
|
||||||
)
|
)
|
||||||
results = cls.add_metadata_columns_to_process_instance(
|
results = cls.add_metadata_columns_to_process_instance(
|
||||||
process_instances.items, process_instance_report.report_metadata["columns"]
|
process_instances.items, process_instance_report.report_metadata["columns"]
|
||||||
)
|
)
|
||||||
|
|
||||||
if report_filter.oldest_open_human_task_fields:
|
# if report_filter.oldest_open_human_task_fields:
|
||||||
results = cls.add_human_task_fields(results, report_filter.oldest_open_human_task_fields)
|
# results = cls.add_human_task_fields(results, report_filter.oldest_open_human_task_fields)
|
||||||
response_json = {
|
response_json = {
|
||||||
"report": process_instance_report,
|
"report": process_instance_report,
|
||||||
"results": results,
|
"results": results,
|
||||||
"filters": report_filter.to_dict(),
|
"filters": filters,
|
||||||
|
"hash": "HEY",
|
||||||
"pagination": {
|
"pagination": {
|
||||||
"count": len(results),
|
"count": len(results),
|
||||||
"total": process_instances.total,
|
"total": process_instances.total,
|
||||||
|
|
|
@ -114,12 +114,12 @@ export default function ProcessInstanceListTable({
|
||||||
canCompleteAllTasks = false,
|
canCompleteAllTasks = false,
|
||||||
showActionsColumn = false,
|
showActionsColumn = false,
|
||||||
}: OwnProps) {
|
}: OwnProps) {
|
||||||
let apiPath = '/process-instances/for-me';
|
let processInstanceApiSearchPath = '/process-instances/for-me';
|
||||||
if (variant === 'all') {
|
if (variant === 'all') {
|
||||||
apiPath = '/process-instances';
|
processInstanceApiSearchPath = '/process-instances';
|
||||||
}
|
}
|
||||||
const params = useParams();
|
const params = useParams();
|
||||||
const [searchParams] = useSearchParams();
|
const [searchParams, setSearchParams] = useSearchParams();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { addError, removeError } = useAPIError();
|
const { addError, removeError } = useAPIError();
|
||||||
|
|
||||||
|
@ -284,6 +284,8 @@ export default function ProcessInstanceListTable({
|
||||||
if (result.report.id) {
|
if (result.report.id) {
|
||||||
setProcessInstanceReportSelection(result.report);
|
setProcessInstanceReportSelection(result.report);
|
||||||
}
|
}
|
||||||
|
// searchParams.set('key', result.hash);
|
||||||
|
// setSearchParams(searchParams);
|
||||||
}
|
}
|
||||||
const stopRefreshing = () => {
|
const stopRefreshing = () => {
|
||||||
if (clearRefreshRef.current) {
|
if (clearRefreshRef.current) {
|
||||||
|
@ -372,9 +374,11 @@ export default function ProcessInstanceListTable({
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpService.makeCallToBackend({
|
HttpService.makeCallToBackend({
|
||||||
path: `${apiPath}?${queryParamString}`,
|
path: `${processInstanceApiSearchPath}?${queryParamString}`,
|
||||||
successCallback: setProcessInstancesFromResult,
|
successCallback: setProcessInstancesFromResult,
|
||||||
|
httpMethod: 'POST',
|
||||||
onUnauthorized: stopRefreshing,
|
onUnauthorized: stopRefreshing,
|
||||||
|
postBody: {'report_metadata': {'filter_by': [{'field_name': 'process_model_identifier', 'field_value': 'example/with-milestones' }]}},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function processResultForProcessModels(result: any) {
|
function processResultForProcessModels(result: any) {
|
||||||
|
@ -441,7 +445,7 @@ export default function ProcessInstanceListTable({
|
||||||
perPageOptions,
|
perPageOptions,
|
||||||
reportIdentifier,
|
reportIdentifier,
|
||||||
additionalParams,
|
additionalParams,
|
||||||
apiPath,
|
processInstanceApiSearchPath,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// This sets the filter data using the saved reports returned from the initial instance_list query.
|
// This sets the filter data using the saved reports returned from the initial instance_list query.
|
||||||
|
|
Loading…
Reference in New Issue