예제 #1
0
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
        ),
    }
예제 #2
0
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'],
        }
예제 #3
0
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)
예제 #4
0
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")
예제 #5
0
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)
예제 #6
0
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),
    }
예제 #7
0
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
        ),
    }
예제 #8
0
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'])
            )
        }
    )
예제 #9
0
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'])
            )
        }
    )
예제 #10
0
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")
예제 #11
0
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
        )
    )
예제 #12
0
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
        )
    )
예제 #13
0
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),
    }
예제 #14
0
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),
    }
예제 #15
0
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"])
            ),
        },
    )
예제 #16
0
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,
    }
예제 #17
0
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,
        ),
    }
예제 #18
0
파일: jobs.py 프로젝트: qld-gov-au/notify
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'))),
    }
예제 #19
0
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")
예제 #20
0
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"),
            ),
        ),
    }
예제 #21
0
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,
        ),
    }
예제 #22
0
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,
    }
예제 #23
0
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']
        )
    )