Added joins to template, job and user for returned letter query.

Added unit tests
Comleted endpoint to get returned letter details
This commit is contained in:
Rebecca Law
2019-12-16 17:25:57 +00:00
parent 606b2b6c84
commit aabaa4a971
5 changed files with 164 additions and 28 deletions

View File

@@ -5,7 +5,7 @@ from sqlalchemy.dialects.postgresql import insert
from app import db
from app.dao.dao_utils import transactional
from app.models import Notification, NotificationHistory, ReturnedLetter
from app.models import Notification, NotificationHistory, ReturnedLetter, Job, User, Template
def _get_notification_ids_for_references(references):
@@ -56,14 +56,35 @@ def get_returned_letter_summary(service_id):
).all()
def fetch_returned_letters(service_id, report_date):
return db.session.query(
ReturnedLetter.notification_id,
ReturnedLetter.reported_at
).filter(
ReturnedLetter.service_id == service_id,
func.date(ReturnedLetter.reported_at) == report_date
).order_by(
desc(ReturnedLetter.reported_at)
).all()
results = []
for table in [Notification, NotificationHistory]:
query = db.session.query(
ReturnedLetter.notification_id,
ReturnedLetter.reported_at,
table.client_reference,
table.created_at,
Template.name.label('template_name'),
table.template_id,
table.template_version,
table.created_by_id,
User.name.label('user_name'),
Job.original_file_name,
table.job_row_number
).outerjoin(
User, table.created_by_id == User.id
).outerjoin(
Job, table.job_id == Job.id
).filter(
ReturnedLetter.service_id == service_id,
ReturnedLetter.reported_at == report_date,
ReturnedLetter.notification_id == table.id,
table.template_id == Template.id
).order_by(
desc(ReturnedLetter.reported_at), desc(table.created_at)
)
results = results + query.all()
results = sorted(results[:4], reverse=True)
return results

View File

@@ -12,7 +12,7 @@ from notifications_utils.timezones import convert_utc_to_bst
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm.exc import NoResultFound
from app import DATE_FORMAT
from app import DATE_FORMAT, DATETIME_FORMAT
from app.config import QueueNames
from app.dao import fact_notification_status_dao, notifications_dao
from app.dao.dao_utils import dao_rollback
@@ -30,7 +30,7 @@ from app.dao.fact_notification_status_dao import (
)
from app.dao.inbound_numbers_dao import dao_allocate_number_for_service
from app.dao.organisation_dao import dao_get_organisation_by_service_id
from app.dao.returned_letters_dao import get_returned_letter_summary
from app.dao.returned_letters_dao import get_returned_letter_summary, fetch_returned_letters
from app.dao.service_data_retention_dao import (
fetch_service_data_retention,
fetch_service_data_retention_by_id,
@@ -956,8 +956,19 @@ def returned_letter_summary(service_id):
@service_blueprint.route('/<uuid:service_id>/returned-letters', methods=['GET'])
def get_returned_letters(service_id):
results = get_returned_letter_summary(service_id)
results = fetch_returned_letters(service_id=service_id, report_date=request.args.get('reported_at'))
json_results = [{'returned_letter_count': x.returned_letter_count, 'reported_at': x.reported_at} for x in results]
json_results = [
{'notification_id': x.notification_id,
'client_reference': x.client_reference,
'reported_at': x.reported_at.strftime(DATE_FORMAT),
'created_at': x.created_at.strftime(DATETIME_FORMAT),
'template_name': x.template_name,
'template_id': x.template_id,
'template_version': x.template_version,
'user_name': x.user_name,
'original_file_name': x.original_file_name,
'job_row_number': x.job_row_number
} for x in results]
return jsonify(json_results)
return jsonify(sorted(json_results, key=lambda i: i['created_at'], reverse=True))