check if process initiator exists before running a process instance report w/ burnettk

This commit is contained in:
jasquat 2023-03-20 10:53:23 -04:00
parent 7696ae8efe
commit 7a891c786d
5 changed files with 74 additions and 10 deletions

View File

@ -1538,6 +1538,25 @@ paths:
items: items:
$ref: "#/components/schemas/User" $ref: "#/components/schemas/User"
/users/exists/by-username:
post:
tags:
- Users
operationId: spiffworkflow_backend.routes.users_controller.user_exists_by_username
summary: Returns a true if user exists by username.
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/User"
responses:
"200":
description: true if user exists
content:
application/json:
schema:
$ref: "#/components/schemas/OkTrue"
/user-groups/for-current-user: /user-groups/for-current-user:
get: get:
tags: tags:

View File

@ -1,13 +1,29 @@
"""Users_controller.""" """Users_controller."""
from typing import Any
from typing import Dict
import flask import flask
from flask import current_app from flask import current_app
from flask import g from flask import g
from flask import jsonify from flask import jsonify
from flask import make_response from flask import make_response
from spiffworkflow_backend.exceptions.api_error import ApiError
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
def user_exists_by_username(body: Dict[str, Any]) -> flask.wrappers.Response:
if "username" not in body:
raise ApiError(
error_code="username_not_given",
message="Username could not be found in post body.",
status_code=400,
)
username = body["username"]
found_user = UserModel.query.filter_by(username=username).first()
return make_response(jsonify({"user_found": found_user is not None}), 200)
def user_search(username_prefix: str) -> flask.wrappers.Response: def user_search(username_prefix: str) -> flask.wrappers.Response:
"""User_search.""" """User_search."""
found_users = UserModel.query.filter(UserModel.username.like(f"{username_prefix}%")).all() # type: ignore found_users = UserModel.query.filter(UserModel.username.like(f"{username_prefix}%")).all() # type: ignore

View File

@ -565,6 +565,7 @@ class AuthorizationService:
permissions_to_assign.append(PermissionToAssign(permission="read", target_uri="/processes")) permissions_to_assign.append(PermissionToAssign(permission="read", target_uri="/processes"))
permissions_to_assign.append(PermissionToAssign(permission="read", target_uri="/service-tasks")) permissions_to_assign.append(PermissionToAssign(permission="read", target_uri="/service-tasks"))
permissions_to_assign.append(PermissionToAssign(permission="read", target_uri="/user-groups/for-current-user")) permissions_to_assign.append(PermissionToAssign(permission="read", target_uri="/user-groups/for-current-user"))
permissions_to_assign.append(PermissionToAssign(permission="create", target_uri="/users/exists/by-username"))
permissions_to_assign.append( permissions_to_assign.append(
PermissionToAssign(permission="read", target_uri="/process-instances/find-by-id/*") PermissionToAssign(permission="read", target_uri="/process-instances/find-by-id/*")
) )

View File

@ -182,6 +182,10 @@ export default function ProcessInstanceListTable({
const [processInitiatorText, setProcessInitiatorText] = useState< const [processInitiatorText, setProcessInitiatorText] = useState<
string | null string | null
>(null); >(null);
const [
processInitiatorNotFoundErrorText,
setProcessInitiatorNotFoundErrorText,
] = useState<string>('');
const lastRequestedInitatorSearchTerm = useRef<string>(); const lastRequestedInitatorSearchTerm = useRef<string>();
@ -560,8 +564,17 @@ export default function ProcessInstanceListTable({
return (reportMetadata as any).filter_by; return (reportMetadata as any).filter_by;
}; };
const navigateToNewReport = (queryParamString: string) => {
removeError();
setProcessInstanceReportJustSaved(null);
setProcessInstanceFilters({});
navigate(`${processInstanceListPathPrefix}?${queryParamString}`);
};
const applyFilter = (event: any) => { const applyFilter = (event: any) => {
event.preventDefault(); event.preventDefault();
setProcessInitiatorNotFoundErrorText('');
const { page, perPage } = getPageInfoFromSearchParams( const { page, perPage } = getPageInfoFromSearchParams(
searchParams, searchParams,
undefined, undefined,
@ -605,21 +618,33 @@ export default function ProcessInstanceListTable({
queryParamString += `&report_id=${processInstanceReportSelection.id}`; queryParamString += `&report_id=${processInstanceReportSelection.id}`;
} }
if (processInitiatorSelection) {
queryParamString += `&process_initiator_username=${processInitiatorSelection.username}`;
} else if (processInitiatorText) {
queryParamString += `&process_initiator_username=${processInitiatorText}`;
}
const reportColumnsBase64 = encodeBase64(JSON.stringify(reportColumns())); const reportColumnsBase64 = encodeBase64(JSON.stringify(reportColumns()));
queryParamString += `&report_columns=${reportColumnsBase64}`; queryParamString += `&report_columns=${reportColumnsBase64}`;
const reportFilterByBase64 = encodeBase64(JSON.stringify(reportFilterBy())); const reportFilterByBase64 = encodeBase64(JSON.stringify(reportFilterBy()));
queryParamString += `&report_filter_by=${reportFilterByBase64}`; queryParamString += `&report_filter_by=${reportFilterByBase64}`;
removeError(); if (processInitiatorSelection) {
setProcessInstanceReportJustSaved(null); queryParamString += `&process_initiator_username=${processInitiatorSelection.username}`;
setProcessInstanceFilters({}); navigateToNewReport(queryParamString);
navigate(`${processInstanceListPathPrefix}?${queryParamString}`); } else if (processInitiatorText) {
HttpService.makeCallToBackend({
path: targetUris.userExists,
httpMethod: 'POST',
postBody: { username: processInitiatorText },
successCallback: (result: any) => {
if (result.user_found) {
queryParamString += `&process_initiator_username=${processInitiatorText}`;
navigateToNewReport(queryParamString);
} else {
setProcessInitiatorNotFoundErrorText(
`The provided username is invalid. Please type the exact username.`
);
}
},
});
} else {
navigateToNewReport(queryParamString);
}
}; };
const dateComponent = ( const dateComponent = (
@ -1143,6 +1168,8 @@ export default function ProcessInstanceListTable({
id="process-instance-initiator-search" id="process-instance-initiator-search"
placeholder="Enter username" placeholder="Enter username"
labelText="Process Initiator" labelText="Process Initiator"
invalid={processInitiatorNotFoundErrorText !== ''}
invalidText={processInitiatorNotFoundErrorText}
onChange={(event: any) => { onChange={(event: any) => {
setProcessInitiatorText(event.target.value); setProcessInitiatorText(event.target.value);
setRequiresRefilter(true); setRequiresRefilter(true);

View File

@ -30,6 +30,7 @@ export const useUriListForPermissions = () => {
processModelShowPath: `/v1.0/process-models/${params.process_model_id}`, processModelShowPath: `/v1.0/process-models/${params.process_model_id}`,
secretListPath: `/v1.0/secrets`, secretListPath: `/v1.0/secrets`,
userSearch: `/v1.0/users/search`, userSearch: `/v1.0/users/search`,
userExists: `/v1.0/users/exists/by-username`,
}; };
}, [params]); }, [params]);