def get_job_partials(job): filter_args = _parse_filter_args(request.args) filter_args['status'] = _set_status_filters(filter_args) notifications = notification_api_client.get_notifications_for_service( job['service'], job['id'], status=filter_args['status'] ) return { 'counts': render_template( 'partials/jobs/count.html', counts=_get_job_counts(job, request.args.get('help', 0)), status=filter_args['status'] ), 'notifications': render_template( 'partials/jobs/notifications.html', notifications=notifications['notifications'], more_than_one_page=bool(notifications.get('links', {}).get('next')), percentage_complete=(job['notifications_requested'] / job['notification_count'] * 100), download_link=url_for( '.view_job_csv', service_id=current_service['id'], job_id=job['id'], status=request.args.get('status') ), help=get_help_argument(), time_left=get_time_left(job['created_at']), job=job ), 'status': render_template( 'partials/jobs/status.html', job=job ), }
def get_sms_thread(service_id, user_number): for notification in sorted(( notification_api_client.get_notifications_for_service(service_id, to=user_number, template_type='sms')['notifications'] + service_api_client.get_inbound_sms(service_id, user_number=user_number)['data'] ), key=lambda notification: notification['created_at']): is_inbound = ('notify_number' in notification) redact_personalisation = not is_inbound and notification['template']['redact_personalisation'] if redact_personalisation: notification['personalisation'] = {} yield { 'inbound': is_inbound, 'content': SMSPreviewTemplate( { 'content': ( notification['content'] if is_inbound else notification['template']['content'] ) }, notification.get('personalisation'), downgrade_non_sms_characters=(not is_inbound), redact_missing_personalisation=redact_personalisation, ), 'created_at': notification['created_at'], 'status': notification.get('status'), 'id': notification['id'], }
def cancel_letter_job(service_id, job_id): if request.method == 'POST': job = job_api_client.get_job(service_id, job_id)['data'] notifications = notification_api_client.get_notifications_for_service( job['service'], job['id'])['notifications'] if job['job_status'] != 'finished' or len( notifications) < job['notification_count']: flash( "We are still processing these letters, please try again in a minute.", 'try again') return view_job(service_id, job_id) try: number_of_letters = job_api_client.cancel_letter_job( current_service.id, job_id) except HTTPError as e: flash(e.message, 'dangerous') return redirect( url_for('main.view_job', service_id=service_id, job_id=job_id)) flash( "Cancelled {} letters from {}".format( format_thousands(number_of_letters), job['original_file_name']), 'default_with_tick') return redirect( url_for('main.service_dashboard', service_id=service_id)) flash("Are you sure you want to cancel sending these letters?", 'cancel') return view_job(service_id, job_id)
def generate_notifications_csv(**kwargs): from app import notification_api_client if 'page' not in kwargs: kwargs['page'] = 1 fieldnames = [ 'Row number', 'Recipient', 'Template', 'Type', 'Job', 'Status', 'Time' ] yield ','.join(fieldnames) + '\n' while kwargs['page']: notifications_resp = notification_api_client.get_notifications_for_service( **kwargs) notifications = notifications_resp['notifications'] for notification in notifications: values = [ notification['row_number'], notification['recipient'], notification['template_name'], notification['template_type'], notification['job_name'], notification['status'], notification['created_at'] ] line = ','.join(str(i) for i in values) + '\n' yield line if notifications_resp['links'].get('next'): kwargs['page'] += 1 else: return raise Exception("Should never reach here")
def cancel_letter_job(service_id, job_id): if request.method == "POST": job = job_api_client.get_job(service_id, job_id)["data"] notifications = notification_api_client.get_notifications_for_service( job["service"], job["id"])["notifications"] if job["job_status"] != "finished" or len( notifications) < job["notification_count"]: flash( "We are still processing these letters, please try again in a minute.", "try again", ) return view_job(service_id, job_id) try: number_of_letters = job_api_client.cancel_letter_job( current_service.id, job_id) except HTTPError as e: flash(e.message, "dangerous") return redirect( url_for("main.view_job", service_id=service_id, job_id=job_id)) flash( "Cancelled {} letters from {}".format( format_thousands(number_of_letters), job["original_file_name"]), "default_with_tick", ) return redirect( url_for("main.service_dashboard", service_id=service_id)) flash("Are you sure you want to cancel sending these letters?", "cancel") return view_job(service_id, job_id)
def get_job_partials(job): filter_args = _parse_filter_args(request.args) filter_args["status"] = _set_status_filters(filter_args) notifications = notification_api_client.get_notifications_for_service( job["service"], job["id"], status=filter_args["status"] ) return { "counts": render_template( "partials/jobs/count.html", counts=_get_job_counts(job, request.args.get("help", 0)), status=filter_args["status"], ), "notifications": render_template( "partials/jobs/notifications.html", notifications=notifications["notifications"], more_than_one_page=bool(notifications.get("links", {}).get("next")), percentage_complete=(job["notifications_requested"] / job["notification_count"] * 100), download_link=url_for( ".view_job_csv", service_id=current_service["id"], job_id=job["id"], status=request.args.get("status") ), help=get_help_argument(), time_left=get_time_left(job["created_at"]), job=job, ), "status": render_template("partials/jobs/status.html", job=job), }
def get_job_partials(job): filter_args = _parse_filter_args(request.args) filter_args['status'] = _set_status_filters(filter_args) notifications = notification_api_client.get_notifications_for_service( job['service'], job['id'], status=filter_args['status'] ) return { 'counts': render_template( 'partials/jobs/count.html', job=job, counts=_get_job_counts(job, request.args.get('help', 0)), status=filter_args['status'] ), 'notifications': render_template( 'partials/jobs/notifications.html', notifications=notifications['notifications'], more_than_one_page=bool(notifications.get('links', {}).get('next')), percentage_complete=(job['notifications_sent'] / job['notification_count'] * 100), download_link=url_for( '.view_job_csv', service_id=current_service['id'], job_id=job['id'], status=request.args.get('status') ), help=get_help_argument(), time_left=get_time_left(job['created_at']) ), 'status': render_template( 'partials/jobs/status.html', job=job ), }
def view_job_csv(service_id, job_id): job = job_api_client.get_job(service_id, job_id)['data'] template = service_api_client.get_service_template( service_id=service_id, template_id=job['template'], version=job['template_version'] )['data'] filter_args = _parse_filter_args(request.args) filter_args['status'] = _set_status_filters(filter_args) return ( generate_notifications_csv( notification_api_client.get_notifications_for_service( service_id, job_id, status=filter_args.get('status'), page_size=job['notification_count'] )['notifications'] ), 200, { 'Content-Type': 'text/csv; charset=utf-8', 'Content-Disposition': 'inline; filename="{} - {}.csv"'.format( template['name'], format_datetime_short(job['created_at']) ) } )
def generate_notifications_csv(**kwargs): from app import notification_api_client from app.s3_client.s3_csv_client import s3download if 'page' not in kwargs: kwargs['page'] = 1 if kwargs.get('job_id'): original_file_contents = s3download(kwargs['service_id'], kwargs['job_id']) original_upload = RecipientCSV( original_file_contents, template_type=kwargs['template_type'], ) original_column_headers = original_upload.column_headers fieldnames = ['Row number'] + original_column_headers + [ 'Template', 'Type', 'Job', 'Status', 'Time' ] else: fieldnames = [ 'Recipient', 'Template', 'Type', 'Sent by', 'Sent by email', 'Job', 'Status', 'Time' ] yield ','.join(fieldnames) + '\n' while kwargs['page']: notifications_resp = notification_api_client.get_notifications_for_service( **kwargs) for notification in notifications_resp['notifications']: if kwargs.get('job_id'): values = [ notification['row_number'], ] + [ original_upload[notification['row_number'] - 1].get(header).data for header in original_column_headers ] + [ notification['template_name'], notification['template_type'], notification['job_name'], notification['status'], notification['created_at'], ] else: values = [ notification['recipient'], notification['template_name'], notification['template_type'], notification['created_by_name'] or '', notification['created_by_email_address'] or '', notification['job_name'] or '', notification['status'], notification['created_at'] ] yield Spreadsheet.from_rows([map(str, values)]).as_csv_data if notifications_resp['links'].get('next'): kwargs['page'] += 1 else: return raise Exception("Should never reach here")
def api_integration(service_id): return render_template( 'views/api/index.html', api_notifications=notification_api_client.get_notifications_for_service( service_id=service_id, include_jobs=False, include_from_test_key=True ) )
def get_job_partials(job, template): filter_args = parse_filter_args(request.args) filter_args['status'] = set_status_filters(filter_args) notifications = notification_api_client.get_notifications_for_service( job['service'], job['id'], status=filter_args['status']) if template['template_type'] == 'letter': # there might be no notifications if the job has only just been created and the tasks haven't run yet if notifications['notifications']: postage = notifications['notifications'][0]['postage'] else: postage = template['postage'] counts = render_template( 'partials/jobs/count-letters.html', total=job.get('notification_count', 0), delivery_estimate=get_letter_timings( job['created_at'], postage=postage).earliest_delivery, ) else: counts = render_template('partials/count.html', counts=_get_job_counts(job), status=filter_args['status']) service_data_retention_days = current_service.get_days_of_retention( template['template_type']) return { 'counts': counts, 'notifications': render_template( 'partials/jobs/notifications.html', notifications=list( add_preview_of_content_to_notifications( notifications['notifications'])), more_than_one_page=bool( notifications.get('links', {}).get('next')), percentage_complete=(job['notifications_requested'] / job['notification_count'] * 100), download_link=url_for('.view_job_csv', service_id=current_service.id, job_id=job['id'], status=request.args.get('status')), time_left=get_time_left( job['created_at'], service_data_retention_days=service_data_retention_days), job=job, template=template, template_version=job['template_version'], ), 'status': render_template('partials/jobs/status.html', job=job), }
def get_job_partials(job, template): filter_args = _parse_filter_args(request.args) filter_args['status'] = _set_status_filters(filter_args) notifications = notification_api_client.get_notifications_for_service( job['service'], job['id'], status=filter_args['status']) if template['template_type'] == 'letter': counts = render_template( 'partials/jobs/count-letters.html', total=job.get('notification_count', 0), delivery_estimate=get_letter_timings( job['created_at']).earliest_delivery, ) else: counts = render_template('partials/count.html', counts=_get_job_counts(job), status=filter_args['status']) return { 'counts': counts, 'notifications': render_template( 'partials/jobs/notifications.html', notifications=list( add_preview_of_content_to_notifications( notifications['notifications'])), more_than_one_page=bool( notifications.get('links', {}).get('next')), percentage_complete=(job['notifications_requested'] / job['notification_count'] * 100), download_link=url_for('.view_job_csv', service_id=current_service['id'], job_id=job['id'], status=request.args.get('status')), time_left=get_time_left(job['created_at']), job=job, template=template, template_version=job['template_version'], ), 'status': render_template('partials/jobs/status.html', job=job), }
def view_job_csv(service_id, job_id): job = job_api_client.get_job(service_id, job_id)["data"] template = service_api_client.get_service_template( service_id=service_id, template_id=job["template"], version=job["template_version"] )["data"] filter_args = _parse_filter_args(request.args) filter_args["status"] = _set_status_filters(filter_args) return ( generate_notifications_csv( notification_api_client.get_notifications_for_service( service_id, job_id, status=filter_args.get("status"), page_size=job["notification_count"] )["notifications"] ), 200, { "Content-Type": "text/csv; charset=utf-8", "Content-Disposition": 'inline; filename="{} - {}.csv"'.format( template["name"], format_datetime_short(job["created_at"]) ), }, )
def get_job_partials(job, template): filter_args = parse_filter_args(request.args) filter_args['status'] = set_status_filters(filter_args) notifications = notification_api_client.get_notifications_for_service( job['service'], job['id'], status=filter_args['status']) if template['template_type'] == 'letter': # there might be no notifications if the job has only just been created and the tasks haven't run yet if notifications['notifications']: postage = notifications['notifications'][0]['postage'] else: postage = template['postage'] counts = render_template( 'partials/jobs/count-letters.html', total=job.get('notification_count', 0), delivery_estimate=get_letter_timings( job['created_at'], postage=postage).earliest_delivery, ) else: counts = render_template('partials/count.html', counts=_get_job_counts(job), status=filter_args['status']) service_data_retention_days = current_service.get_days_of_retention( template['template_type']) can_letter_job_be_cancelled = False if template["template_type"] == "letter": not_cancellable = [ n for n in notifications["notifications"] if n["status"] not in CANCELLABLE_JOB_LETTER_STATUSES ] job_created = job["created_at"][:-6] if not letter_can_be_cancelled( "created", datetime.strptime( job_created, '%Y-%m-%dT%H:%M:%S.%f')) or len(not_cancellable) != 0: can_letter_job_be_cancelled = False else: can_letter_job_be_cancelled = True return { 'counts': counts, 'notifications': render_template( 'partials/jobs/notifications.html', notifications=list( add_preview_of_content_to_notifications( notifications['notifications'])), more_than_one_page=bool( notifications.get('links', {}).get('next')), percentage_complete=(job['notifications_requested'] / job['notification_count'] * 100), download_link=url_for('.view_job_csv', service_id=current_service.id, job_id=job['id'], status=request.args.get('status')), time_left=get_time_left( job['created_at'], service_data_retention_days=service_data_retention_days), job=job, template=template, template_version=job['template_version'], ), 'status': render_template('partials/jobs/status.html', job=job, template_type=template["template_type"], letter_print_day=get_letter_printing_statement( "created", job["created_at"])), 'can_letter_job_be_cancelled': can_letter_job_be_cancelled, }
def get_notifications(service_id, message_type, status_override=None): # TODO get the api to return count of pages as well. page = get_page_from_request() if page is None: abort(404, "Invalid page argument ({}).".format(request.args.get('page'))) filter_args = parse_filter_args(request.args) filter_args['status'] = set_status_filters(filter_args) service_data_retention_days = None if message_type is not None: service_data_retention_days = current_service.get_days_of_retention( message_type) if request.path.endswith('csv') and current_user.has_permissions( 'view_activity'): return Response(generate_notifications_csv( service_id=service_id, page=page, page_size=5000, template_type=[message_type], status=filter_args.get('status'), limit_days=service_data_retention_days), mimetype='text/csv', headers={ 'Content-Disposition': 'inline; filename="notifications.csv"' }) notifications = notification_api_client.get_notifications_for_service( service_id=service_id, page=page, template_type=[message_type] if message_type else [], status=filter_args.get('status'), limit_days=service_data_retention_days, to=request.form.get('to', ''), ) url_args = { 'message_type': message_type, 'status': request.args.get('status') } prev_page = None if 'links' in notifications and notifications['links'].get('prev', None): prev_page = generate_previous_dict('main.view_notifications', service_id, page, url_args=url_args) next_page = None if 'links' in notifications and notifications['links'].get('next', None): next_page = generate_next_dict('main.view_notifications', service_id, page, url_args) if message_type: download_link = url_for('.view_notifications_csv', service_id=current_service.id, message_type=message_type, status=request.args.get('status')) else: download_link = None return { 'service_data_retention_days': service_data_retention_days, 'counts': render_template('views/activity/counts.html', status=request.args.get('status'), status_filters=get_status_filters( current_service, message_type, service_api_client.get_service_statistics( service_id, today_only=False, limit_days=service_data_retention_days))), 'notifications': render_template( 'views/activity/notifications.html', notifications=list( add_preview_of_content_to_notifications( notifications['notifications'])), page=page, limit_days=service_data_retention_days, prev_page=prev_page, next_page=next_page, status=request.args.get('status'), message_type=message_type, download_link=download_link, ), }
def get_notifications(service_id, message_type, status_override=None): # TODO get the api to return count of pages as well. page = get_page_from_request() if page is None: abort( 404, "Invalid page argument ({}) reverting to page 1.".format( request.args['page'], None)) if message_type not in ['email', 'sms', 'letter']: abort(404) filter_args = parse_filter_args(request.args) filter_args['status'] = set_status_filters(filter_args) if request.path.endswith('csv'): return Response(generate_notifications_csv( service_id=service_id, page=page, page_size=5000, template_type=[message_type], status=filter_args.get('status'), limit_days=current_app.config['ACTIVITY_STATS_LIMIT_DAYS']), mimetype='text/csv', headers={ 'Content-Disposition': 'inline; filename="notifications.csv"' }) notifications = notification_api_client.get_notifications_for_service( service_id=service_id, page=page, template_type=[message_type], status=filter_args.get('status'), limit_days=current_app.config['ACTIVITY_STATS_LIMIT_DAYS'], to=request.form.get('to', ''), ) url_args = { 'message_type': message_type, 'status': request.args.get('status') } prev_page = None if 'links' in notifications and notifications['links'].get('prev', None): prev_page = generate_previous_dict('main.view_notifications', service_id, page, url_args=url_args) next_page = None if 'links' in notifications and notifications['links'].get('next', None): next_page = generate_next_dict('main.view_notifications', service_id, page, url_args) return { 'counts': render_template('views/activity/counts.html', status=request.args.get('status'), status_filters=get_status_filters( current_service, message_type, service_api_client.get_detailed_service(service_id) ['data']['statistics'])), 'notifications': render_template('views/activity/notifications.html', notifications=list( add_preview_of_content_to_notifications( notifications['notifications'])), page=page, prev_page=prev_page, next_page=next_page, status=request.args.get('status'), message_type=message_type, download_link=url_for( '.view_notifications_csv', service_id=current_service['id'], message_type=message_type, status=request.args.get('status'))), }
def generate_notifications_csv(**kwargs): from app import notification_api_client from app.s3_client.s3_csv_client import s3download if "page" not in kwargs: kwargs["page"] = 1 if kwargs.get("job_id"): original_file_contents = s3download(kwargs["service_id"], kwargs["job_id"]) original_upload = RecipientCSV( original_file_contents, template_type=kwargs["template_type"], ) original_column_headers = original_upload.column_headers fieldnames = ["Row number"] + original_column_headers + [ "Template", "Type", "Job", "Status", "Time" ] else: fieldnames = [ "Recipient", "Template", "Type", "Sent by", "Sent by email", "Job", "Status", "Time", ] yield ",".join(fieldnames) + "\n" while kwargs["page"]: notifications_resp = notification_api_client.get_notifications_for_service( **kwargs) for notification in notifications_resp["notifications"]: if kwargs.get("job_id"): values = ([ notification["row_number"], ] + [ original_upload[notification["row_number"] - 1].get(header).data for header in original_column_headers ] + [ notification["template_name"], notification["template_type"], notification["job_name"], notification["status"], notification["created_at"], ]) else: values = [ notification["recipient"], notification["template_name"], notification["template_type"], notification["created_by_name"] or "", notification["created_by_email_address"] or "", notification["job_name"] or "", notification["status"], notification["created_at"], ] yield Spreadsheet.from_rows([map(str, values)]).as_csv_data if notifications_resp["links"].get("next"): kwargs["page"] += 1 else: return raise Exception("Should never reach here")
def get_notifications(service_id, message_type, status_override=None): # TODO get the api to return count of pages as well. page = get_page_from_request() if page is None: abort(404, "Invalid page argument ({}) reverting to page 1.".format(request.args["page"], None)) if message_type not in ["email", "sms"]: abort(404) filter_args = _parse_filter_args(request.args) filter_args["status"] = _set_status_filters(filter_args) notifications = notification_api_client.get_notifications_for_service( service_id=service_id, page=page, template_type=[message_type], status=filter_args.get("status"), limit_days=current_app.config["ACTIVITY_STATS_LIMIT_DAYS"], ) url_args = {"message_type": message_type, "status": request.args.get("status")} prev_page = None if notifications["links"].get("prev", None): prev_page = generate_previous_dict("main.view_notifications", service_id, page, url_args=url_args) next_page = None if notifications["links"].get("next", None): next_page = generate_next_dict("main.view_notifications", service_id, page, url_args) if request.path.endswith("csv"): csv_content = generate_notifications_csv( notification_api_client.get_notifications_for_service( service_id=service_id, page=page, page_size=notifications["total"], template_type=[message_type], status=filter_args.get("status"), limit_days=current_app.config["ACTIVITY_STATS_LIMIT_DAYS"], )["notifications"] ) return ( csv_content, 200, {"Content-Type": "text/csv; charset=utf-8", "Content-Disposition": 'inline; filename="notifications.csv"'}, ) return { "counts": render_template( "views/activity/counts.html", status=request.args.get("status"), status_filters=get_status_filters( current_service, message_type, service_api_client.get_detailed_service(service_id)["data"]["statistics"] ), ), "notifications": render_template( "views/activity/notifications.html", notifications=notifications["notifications"], page=page, prev_page=prev_page, next_page=next_page, status=request.args.get("status"), message_type=message_type, download_link=url_for( ".view_notifications_csv", service_id=current_service["id"], message_type=message_type, status=request.args.get("status"), ), ), }
def get_notifications(service_id, message_type, status_override=None): # TODO get the api to return count of pages as well. page = get_page_from_request() if page is None: abort(404, "Invalid page argument ({}).".format(request.args.get("page"))) if message_type not in ["email", "sms", "letter", None]: abort(404) filter_args = parse_filter_args(request.args) filter_args["status"] = set_status_filters(filter_args) service_data_retention_days = current_app.config.get( "ACTIVITY_STATS_LIMIT_DAYS", None) if message_type is not None: service_data_retention_days = current_service.get_days_of_retention( message_type) if request.path.endswith("csv") and current_user.has_permissions( "view_activity"): return Response( generate_notifications_csv( service_id=service_id, page=page, page_size=5000, template_type=[message_type], status=filter_args.get("status"), limit_days=service_data_retention_days, ), mimetype="text/csv", headers={ "Content-Disposition": 'inline; filename="notifications.csv"' }, ) notifications = notification_api_client.get_notifications_for_service( service_id=service_id, page=page, template_type=[message_type] if message_type else [], status=filter_args.get("status"), limit_days=service_data_retention_days, to=request.form.get("to", ""), ) url_args = { "message_type": message_type, "status": request.args.get("status") } prev_page = None if "links" in notifications and notifications["links"].get("prev", None): prev_page = generate_previous_dict("main.view_notifications", service_id, page, url_args=url_args) next_page = None if "links" in notifications and notifications["links"].get("next", None): next_page = generate_next_dict("main.view_notifications", service_id, page, url_args) if message_type: download_link = url_for( ".view_notifications_csv", service_id=current_service.id, message_type=message_type, status=request.args.get("status"), ) else: download_link = None return { "service_data_retention_days": service_data_retention_days, "counts": render_template( "views/activity/counts.html", status=request.args.get("status"), status_filters=get_status_filters( current_service, message_type, service_api_client.get_service_statistics( service_id, today_only=False, limit_days=service_data_retention_days), ), ), "notifications": render_template( "views/activity/notifications.html", notifications=list( add_preview_of_content_to_notifications( notifications["notifications"])), page=page, limit_days=service_data_retention_days, prev_page=prev_page, next_page=next_page, status=request.args.get("status"), message_type=message_type, download_link=download_link, ), }
def get_job_partials(job, template): filter_args = parse_filter_args(request.args) filter_args["status"] = set_status_filters(filter_args) notifications = notification_api_client.get_notifications_for_service( job["service"], job["id"], status=filter_args["status"]) if template["template_type"] == "letter": # there might be no notifications if the job has only just been created and the tasks haven't run yet if notifications["notifications"]: postage = notifications["notifications"][0]["postage"] else: postage = template["postage"] counts = render_template( "partials/jobs/count-letters.html", total=job.get("notification_count", 0), delivery_estimate=get_letter_timings( job["created_at"], postage=postage).earliest_delivery, ) else: counts = render_template( "partials/count.html", counts=_get_job_counts(job), status=filter_args["status"], ) service_data_retention_days = current_service.get_days_of_retention( template["template_type"]) can_letter_job_be_cancelled = False if template["template_type"] == "letter": not_cancellable = [ n for n in notifications["notifications"] if n["status"] not in CANCELLABLE_JOB_LETTER_STATUSES ] job_created = job["created_at"][:-6] if (not letter_can_be_cancelled( "created", datetime.strptime(job_created, "%Y-%m-%dT%H:%M:%S.%f")) or len(not_cancellable) != 0): can_letter_job_be_cancelled = False else: can_letter_job_be_cancelled = True return { "counts": counts, "notifications": render_template( "partials/jobs/notifications.html", notifications=list( add_preview_of_content_to_notifications( notifications["notifications"])), more_than_one_page=bool( notifications.get("links", {}).get("next")), percentage_complete=(job["notifications_requested"] / job["notification_count"] * 100), download_link=url_for( ".view_job_csv", service_id=current_service.id, job_id=job["id"], status=request.args.get("status"), ), available_until_date=get_available_until_date( job["created_at"], service_data_retention_days=service_data_retention_days, ), job=job, template=template, template_version=job["template_version"], ), "status": render_template( "partials/jobs/status.html", job=job, template=template, template_type=template["template_type"], template_version=job["template_version"], letter_print_day=get_letter_printing_statement( "created", job["created_at"]), ), "can_letter_job_be_cancelled": can_letter_job_be_cancelled, }
def view_notifications(service_id, message_type): # TODO get the api to return count of pages as well. page = get_page_from_request() if page is None: abort(404, "Invalid page argument ({}) reverting to page 1.".format(request.args['page'], None)) if message_type not in ['email', 'sms']: abort(404) filter_args = _parse_filter_args(request.args) filter_args['status'] = _set_status_filters(filter_args) notifications = notification_api_client.get_notifications_for_service( service_id=service_id, page=page, template_type=[message_type], status=filter_args.get('status'), limit_days=current_app.config['ACTIVITY_STATS_LIMIT_DAYS']) view_dict = dict( message_type=message_type, status=request.args.get('status') ) prev_page = None if notifications['links'].get('prev', None): prev_page = generate_previous_next_dict( 'main.view_notifications', service_id, view_dict, page - 1, 'Previous page', 'page {}'.format(page - 1)) next_page = None if notifications['links'].get('next', None): next_page = generate_previous_next_dict( 'main.view_notifications', service_id, view_dict, page + 1, 'Next page', 'page {}'.format(page + 1)) if request.path.endswith('csv'): csv_content = generate_notifications_csv( notification_api_client.get_notifications_for_service( service_id=service_id, page=page, page_size=notifications['total'], template_type=[message_type], status=filter_args.get('status'), limit_days=current_app.config['ACTIVITY_STATS_LIMIT_DAYS'])['notifications']) return csv_content, 200, { 'Content-Type': 'text/csv; charset=utf-8', 'Content-Disposition': 'inline; filename="notifications.csv"' } return render_template( 'views/notifications.html', notifications=notifications['notifications'], page=page, prev_page=prev_page, next_page=next_page, status=request.args.get('status'), message_type=message_type, download_link=url_for( '.view_notifications_csv', service_id=current_service['id'], message_type=message_type, status=request.args.get('status') ), status_filters=get_status_filters( current_service, message_type, service_api_client.get_detailed_service(service_id)['data']['statistics'] ) )