From a53c067223d387cfafb40be7c2a6b1ac5b969121 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Tue, 19 Nov 2024 10:19:25 -0800 Subject: [PATCH] uploads --- app/dao/notifications_dao.py | 16 ++++---- app/dao/uploads_dao.py | 62 ++++++++++++++++++------------ tests/app/user/test_rest_verify.py | 6 --- 3 files changed, 45 insertions(+), 39 deletions(-) diff --git a/app/dao/notifications_dao.py b/app/dao/notifications_dao.py index 7758a2c57..040af36f7 100644 --- a/app/dao/notifications_dao.py +++ b/app/dao/notifications_dao.py @@ -194,11 +194,11 @@ def get_notifications_for_job( if page_size is None: page_size = current_app.config["PAGE_SIZE"] - query = select(Notification).filter_by(service_id=service_id, job_id=job_id) - query = _filter_query(query, filter_dict) - query = query.order_by(asc(Notification.job_row_number)) + querie = select(Notification).filter_by(service_id=service_id, job_id=job_id) + querie = _filter_query(querie, filter_dict) + querie = querie.order_by(asc(Notification.job_row_number)) - results = db.session.execute(query).scalars().all() + results = db.session.execute(querie).scalars().all() page_size = current_app.config["PAGE_SIZE"] offset = (page - 1) * page_size @@ -298,12 +298,12 @@ def get_notifications_for_service( if client_reference is not None: filters.append(Notification.client_reference == client_reference) - query = Notification.query.filter(*filters) - query = _filter_query(query, filter_dict) + querie = Notification.query.filter(*filters) + querie = _filter_query(querie, filter_dict) if personalisation: - query = query.options(joinedload(Notification.template)) + querie = querie.options(joinedload(Notification.template)) - return query.order_by(desc(Notification.created_at)).paginate( + return querie.order_by(desc(Notification.created_at)).paginate( page=page, per_page=page_size, count=count_pages, diff --git a/app/dao/uploads_dao.py b/app/dao/uploads_dao.py index 4f0e65a1e..f29823b67 100644 --- a/app/dao/uploads_dao.py +++ b/app/dao/uploads_dao.py @@ -1,9 +1,10 @@ from os import getenv from flask import current_app -from sqlalchemy import String, and_, desc, func, literal, text +from sqlalchemy import String, and_, desc, func, literal, select, text, union from app import db +from app.dao.inbound_sms_dao import Pagination from app.enums import JobStatus, NotificationStatus, NotificationType from app.models import Job, Notification, ServiceDataRetention, Template from app.utils import midnight_n_days_ago, utc_now @@ -51,8 +52,8 @@ def dao_get_uploads_by_service_id(service_id, limit_days=None, page=1, page_size if limit_days is not None: jobs_query_filter.append(Job.created_at >= midnight_n_days_ago(limit_days)) - jobs_query = ( - db.session.query( + jobs_querie = ( + select( Job.id, Job.original_file_name, Job.notification_count, @@ -67,6 +68,7 @@ def dao_get_uploads_by_service_id(service_id, limit_days=None, page=1, page_size literal("job").label("upload_type"), literal(None).label("recipient"), ) + .select_from(Job) .join(Template, Job.template_id == Template.id) .outerjoin( ServiceDataRetention, @@ -76,7 +78,7 @@ def dao_get_uploads_by_service_id(service_id, limit_days=None, page=1, page_size == func.cast(ServiceDataRetention.notification_type, String), ), ) - .filter(*jobs_query_filter) + .where(*jobs_query_filter) ) letters_query_filter = [ @@ -94,12 +96,13 @@ def dao_get_uploads_by_service_id(service_id, limit_days=None, page=1, page_size ) letters_subquerie = ( - db.session.query( + select( func.count().label("notification_count"), _naive_gmt_to_utc(_get_printing_datetime(Notification.created_at)).label( "printing_at" ), ) + .select_from(Notification) .join(Template, Notification.template_id == Template.id) .outerjoin( ServiceDataRetention, @@ -109,30 +112,39 @@ def dao_get_uploads_by_service_id(service_id, limit_days=None, page=1, page_size == func.cast(ServiceDataRetention.notification_type, String), ), ) - .filter(*letters_query_filter) + .where(*letters_query_filter) .group_by("printing_at") .subquery() ) - letters_query = db.session.query( - literal(None).label("id"), - literal("Uploaded letters").label("original_file_name"), - letters_subquerie.c.notification_count.label("notification_count"), - literal("letter").label("template_type"), - literal(None).label("days_of_retention"), - letters_subquerie.c.printing_at.label("created_at"), - literal(None).label("scheduled_for"), - letters_subquerie.c.printing_at.label("processing_started"), - literal(None).label("status"), - literal("letter_day").label("upload_type"), - literal(None).label("recipient"), - ).group_by( - letters_subquerie.c.notification_count, - letters_subquerie.c.printing_at, + letters_querie = ( + select( + literal(None).label("id"), + literal("Uploaded letters").label("original_file_name"), + letters_subquerie.c.notification_count.label("notification_count"), + literal("letter").label("template_type"), + literal(None).label("days_of_retention"), + letters_subquerie.c.printing_at.label("created_at"), + literal(None).label("scheduled_for"), + letters_subquerie.c.printing_at.label("processing_started"), + literal(None).label("status"), + literal("letter_day").label("upload_type"), + literal(None).label("recipient"), + ) + .select_from(Notification) + .group_by( + letters_subquerie.c.notification_count, + letters_subquerie.c.printing_at, + ) ) - return ( - jobs_query.union_all(letters_query) - .order_by(desc("processing_started"), desc("created_at")) - .paginate(page=page, per_page=page_size) + stmt = union(jobs_querie, letters_querie).order_by( + desc("processing_started"), desc("created_at") ) + + results = db.session.execute(stmt).scalars().all() + page_size = current_app.config["PAGE_SIZE"] + offset = (page - 1) * page_size + paginated_results = results[offset : offset + page_size] + pagination = Pagination(paginated_results, page, page_size, len(results)) + return pagination diff --git a/tests/app/user/test_rest_verify.py b/tests/app/user/test_rest_verify.py index 17a6e633d..cab876d0e 100644 --- a/tests/app/user/test_rest_verify.py +++ b/tests/app/user/test_rest_verify.py @@ -516,12 +516,6 @@ def test_send_user_email_code_with_urlencoded_next_param( _data=data, _expected_status=204, ) - # TODO We are stripping out the personalisation from the db - # It should be recovered -- if needed -- from s3, but - # the purpose of this functionality is not clear. Is this - # 2fa codes for email users? Sms users receive 2fa codes via sms - # noti = Notification.query.one() - # assert noti.personalisation["url"].endswith("?next=%2Fservices") def test_send_email_code_returns_404_for_bad_input_data(admin_request):