From a58843536882e89375f87f4611b1b2dd6b87ac39 Mon Sep 17 00:00:00 2001 From: auslin-aot <99173163+auslin-aot@users.noreply.github.com> Date: Thu, 10 Oct 2024 14:35:34 +0530 Subject: [PATCH] FWF-3679: [Feature] process list api changes --- .../src/formsflow_api_utils/utils/__init__.py | 1 + .../src/formsflow_api_utils/utils/enums.py | 1 + .../src/formsflow_api_utils/utils/util.py | 17 ++++++++++ forms-flow-api/requirements.txt | 2 +- forms-flow-api/requirements/prod.txt | 2 +- .../models/form_process_mapper.py | 32 ++++++++----------- .../src/formsflow_api/models/process.py | 12 +++---- .../src/formsflow_api/services/process.py | 6 ++-- 8 files changed, 42 insertions(+), 31 deletions(-) diff --git a/forms-flow-api-utils/src/formsflow_api_utils/utils/__init__.py b/forms-flow-api-utils/src/formsflow_api_utils/utils/__init__.py index 314f14c146..0d2e38dd51 100644 --- a/forms-flow-api-utils/src/formsflow_api_utils/utils/__init__.py +++ b/forms-flow-api-utils/src/formsflow_api_utils/utils/__init__.py @@ -51,6 +51,7 @@ get_role_ids_from_user_groups, translate, validate_sort_order_and_order_by, + add_sort_filter, ) from .caching import Cache from .sentry import init_sentry diff --git a/forms-flow-api-utils/src/formsflow_api_utils/utils/enums.py b/forms-flow-api-utils/src/formsflow_api_utils/utils/enums.py index 469bd72304..c7d8c06a2b 100644 --- a/forms-flow-api-utils/src/formsflow_api_utils/utils/enums.py +++ b/forms-flow-api-utils/src/formsflow_api_utils/utils/enums.py @@ -79,3 +79,4 @@ class ProcessSortingParameters: # pylint: disable=too-few-public-methods Name = "name" Created = "created" Modified= "modified" + ProcessKey = "processKey" diff --git a/forms-flow-api-utils/src/formsflow_api_utils/utils/util.py b/forms-flow-api-utils/src/formsflow_api_utils/utils/util.py index 04e711a36e..3aa05da428 100644 --- a/forms-flow-api-utils/src/formsflow_api_utils/utils/util.py +++ b/forms-flow-api-utils/src/formsflow_api_utils/utils/util.py @@ -28,6 +28,7 @@ CREATE_SUBMISSIONS, VIEW_SUBMISSIONS, ) +from sqlalchemy.sql.expression import text def cors_preflight(methods: str = "GET"): """Render an option method on the class.""" @@ -70,6 +71,7 @@ def validate_sort_order_and_order_by(order_by: str, sort_order: str) -> bool: ProcessSortingParameters.Name, ProcessSortingParameters.Created, ProcessSortingParameters.Modified, + ProcessSortingParameters.ProcessKey, ]: order_by = None else: @@ -135,3 +137,18 @@ def get_form_and_submission_id_from_form_url(form_url: str) -> Tuple: form_id = form_url[form_url.find("/form/") + 6 : form_url.find("/submission/")] submission_id = form_url[form_url.find("/submission/") + 12 : len(form_url)] return (form_id, submission_id) + + +def add_sort_filter(query, sort_by, sort_order, model_name): + """Adding sortBy and sortOrder.""" + order = [] + if sort_by and sort_order: + for sort_by_att, sort_order_attr in zip(sort_by, sort_order): + name, value = validate_sort_order_and_order_by( + sort_order=sort_order_attr, order_by=sort_by_att + ) + if name and value: + order.append(text(f"{model_name}.{name} {value}")) + + query = query.order_by(*order) + return query diff --git a/forms-flow-api/requirements.txt b/forms-flow-api/requirements.txt index 97b59d9df3..8804b599ed 100644 --- a/forms-flow-api/requirements.txt +++ b/forms-flow-api/requirements.txt @@ -27,7 +27,7 @@ ecdsa==0.18.0 flask-jwt-oidc==0.3.0 flask-marshmallow==1.2.1 flask-restx==1.3.0 -formsflow_api_utils @ git+https://github.com/AOT-Technologies/forms-flow-ai.git@develop#subdirectory=forms-flow-api-utils +formsflow_api_utils @ git+https://github.com/shuhaib-aot/forms-flow-ai.git@feature/FWF-3679-subflow-creation-updation#subdirectory=forms-flow-api-utils gunicorn==21.2.0 h11==0.14.0 h2==4.1.0 diff --git a/forms-flow-api/requirements/prod.txt b/forms-flow-api/requirements/prod.txt index 46703f3c3d..b0cd1cfba6 100644 --- a/forms-flow-api/requirements/prod.txt +++ b/forms-flow-api/requirements/prod.txt @@ -17,4 +17,4 @@ markupsafe PyJWT redis lxml -git+https://github.com/AOT-Technologies/forms-flow-ai.git@develop#subdirectory=forms-flow-api-utils \ No newline at end of file +git+https://github.com/shuhaib-aot/forms-flow-ai.git@feature/FWF-3679-subflow-creation-updation#subdirectory=forms-flow-api-utils \ No newline at end of file diff --git a/forms-flow-api/src/formsflow_api/models/form_process_mapper.py b/forms-flow-api/src/formsflow_api/models/form_process_mapper.py index 3fd5e91178..6dbe5984b5 100644 --- a/forms-flow-api/src/formsflow_api/models/form_process_mapper.py +++ b/forms-flow-api/src/formsflow_api/models/form_process_mapper.py @@ -10,13 +10,12 @@ DEFAULT_PROCESS_KEY, DEFAULT_PROCESS_NAME, FILTER_MAPS, - validate_sort_order_and_order_by, + add_sort_filter, ) from formsflow_api_utils.utils.enums import FormProcessMapperStatus from formsflow_api_utils.utils.user_context import UserContext, user_context from sqlalchemy import UniqueConstraint, and_, desc, func, or_ from sqlalchemy.dialects.postgresql import JSON -from sqlalchemy.sql.expression import text from .audit_mixin import AuditDateTimeMixin, AuditUserMixin from .base_model import BaseModel @@ -184,21 +183,6 @@ def get_latest_form_mapper_ids(cls): .all() ) - @classmethod - def add_sort_filter(cls, query, sort_by, sort_order): - """Adding sortBy and sortOrder.""" - order = [] - if sort_by and sort_order: - for sort_by_att, sort_order_attr in zip(sort_by, sort_order): - name, value = validate_sort_order_and_order_by( - sort_order=sort_order_attr, order_by=sort_by_att - ) - if name and value: - order.append(text(f"form_process_mapper.{name} {value}")) - - query = query.order_by(*order) - return query - @classmethod def add_search_filter(cls, query, search): """Adding search filter in query.""" @@ -241,7 +225,12 @@ def find_all_forms( query = cls.add_search_filter(query=query, search=search) - query = cls.add_sort_filter(query=query, sort_by=sort_by, sort_order=sort_order) + query = add_sort_filter( + query=query, + sort_by=sort_by, + sort_order=sort_order, + model_name="form_process_mapper", + ) # form type is list of type to filter the form if form_type: @@ -293,7 +282,12 @@ def find_all_active_by_formid( ) query = cls.add_search_filter(query=query, search=search) query = cls.access_filter(query=query) - query = cls.add_sort_filter(sort_by=sort_by, sort_order=sort_order, query=query) + query = cls.add_sort_filter( + sort_by=sort_by, + sort_order=sort_order, + query=query, + model_name="form_process_mapper", + ) total_count = query.count() query = query.with_entities( diff --git a/forms-flow-api/src/formsflow_api/models/process.py b/forms-flow-api/src/formsflow_api/models/process.py index 030724fe0d..b83ce8009b 100644 --- a/forms-flow-api/src/formsflow_api/models/process.py +++ b/forms-flow-api/src/formsflow_api/models/process.py @@ -6,14 +6,10 @@ from typing import List from flask_sqlalchemy.query import Query -from formsflow_api_utils.utils import ( - FILTER_MAPS, - validate_sort_order_and_order_by, -) +from formsflow_api_utils.utils import FILTER_MAPS, add_sort_filter from formsflow_api_utils.utils.user_context import UserContext, user_context from sqlalchemy import LargeBinary, and_, desc, or_ from sqlalchemy.dialects.postgresql import ENUM -from sqlalchemy.sql.expression import text from .audit_mixin import AuditDateTimeMixin, AuditUserMixin from .base_model import BaseModel @@ -152,9 +148,9 @@ def find_all_process( # pylint: disable=too-many-arguments, too-many-positional if is_subflow: query = query.filter(cls.is_subflow.is_(True)) query = cls.auth_query(query=query) - sort_by, sort_order = validate_sort_order_and_order_by(sort_by, sort_order) - if sort_by and sort_order: - query = query.order_by(text(f"process.{sort_by} {sort_order}")) + query = add_sort_filter( + query=query, sort_by=sort_by, sort_order=sort_order, model_name="process" + ) total_count = query.count() limit = total_count if limit is None else limit query = query.paginate(page=page_no, per_page=limit, error_out=False) diff --git a/forms-flow-api/src/formsflow_api/services/process.py b/forms-flow-api/src/formsflow_api/services/process.py index d779e1adb0..257ac9f4de 100644 --- a/forms-flow-api/src/formsflow_api/services/process.py +++ b/forms-flow-api/src/formsflow_api/services/process.py @@ -35,7 +35,7 @@ def get_all_process(cls, request_args): # pylint:disable=too-many-locals dict_data = ProcessListRequestSchema().load(request_args) or {} page_no = dict_data.get("page_no") limit = dict_data.get("limit") - sort_by = dict_data.get("sort_by", "id") + sort_by = dict_data.get("sort_by", "") process_id = dict_data.get("process_id") process_name = dict_data.get("name") status = dict_data.get("status").upper() if dict_data.get("status") else None @@ -49,7 +49,9 @@ def get_all_process(cls, request_args): # pylint:disable=too-many-locals created_to_date = dict_data.get("created_to_date") modified_from_date = dict_data.get("modified_from_date") modified_to_date = dict_data.get("modified_to_date") - sort_order = dict_data.get("sort_order", "desc") + sort_order = dict_data.get("sort_order", "") + sort_by = sort_by.split(",") + sort_order = sort_order.split(",") process, count = Process.find_all_process( created_from=created_from_date, created_to=created_to_date,