Ejemplo n.º 1
0
def send_test(service_id, template_id):
    session['recipient'] = None
    session['placeholders'] = {}
    session['send_test_letter_page_count'] = None

    db_template = current_service.get_template_with_user_permission_or_403(
        template_id, current_user)
    if db_template['template_type'] == 'letter':
        session['sender_id'] = None

    if email_or_sms_not_enabled(db_template['template_type'],
                                current_service.permissions):
        return redirect(
            url_for('.action_blocked',
                    service_id=service_id,
                    notification_type=db_template['template_type'],
                    return_to='view_template',
                    template_id=template_id))

    return redirect(
        url_for(
            {
                'main.send_test': '.send_test_step',
                'main.send_one_off': '.send_one_off_step',
            }[request.endpoint],
            service_id=service_id,
            template_id=template_id,
            step_index=0,
            help=get_help_argument(),
        ))
Ejemplo n.º 2
0
def send_test(service_id, template_id):
    session["recipient"] = None
    session["placeholders"] = {}
    session["send_test_letter_page_count"] = None

    db_template = current_service.get_template_with_user_permission_or_403(
        template_id, current_user)
    if db_template["template_type"] == "letter":
        session["sender_id"] = None

    if email_or_sms_not_enabled(db_template["template_type"],
                                current_service.permissions):
        return redirect(
            url_for(
                ".action_blocked",
                service_id=service_id,
                notification_type=db_template["template_type"],
                return_to="view_template",
                template_id=template_id,
            ))

    return redirect(
        url_for(
            {
                "main.send_test": ".send_test_step",
                "main.send_one_off": ".send_one_off_step",
            }[request.endpoint],
            service_id=service_id,
            template_id=template_id,
            step_index=0,
            help=get_help_argument(),
        ))
Ejemplo n.º 3
0
def _add_template_by_type(template_type, template_folder_id):

    if template_type == 'copy-existing':
        return redirect(
            url_for(
                '.choose_template_to_copy',
                service_id=current_service.id,
            ))

    if template_type == 'letter':
        blank_letter = service_api_client.create_service_template(
            'New letter template', 'letter', 'Body', current_service.id,
            'Main heading', 'normal', template_folder_id)
        return redirect(
            url_for(
                '.view_template',
                service_id=current_service.id,
                template_id=blank_letter['data']['id'],
            ))

    if email_or_sms_not_enabled(template_type, current_service.permissions):
        return redirect(
            url_for('.action_blocked',
                    service_id=current_service.id,
                    notification_type=template_type,
                    return_to='add_new_template',
                    template_id='0'))
    else:
        return redirect(
            url_for(
                '.add_service_template',
                service_id=current_service.id,
                template_type=template_type,
                template_folder_id=template_folder_id,
            ))
Ejemplo n.º 4
0
def send_messages(service_id, template_id):
    session['sender_id'] = None
    db_template = service_api_client.get_service_template(service_id, template_id)['data']

    if email_or_sms_not_enabled(db_template['template_type'], current_service['permissions']):
        return redirect(url_for(
            '.action_blocked',
            service_id=service_id,
            notification_type=db_template['template_type'],
            return_to='view_template',
            template_id=template_id
        ))

    template = get_template(
        db_template,
        current_service,
        show_recipient=True,
        expand_emails=True,
        letter_preview_url=url_for(
            '.view_letter_template_preview',
            service_id=service_id,
            template_id=template_id,
            filetype='png',
            page_count=get_page_count_for_letter(db_template),
        ),
    )

    form = CsvUploadForm()
    if form.validate_on_submit():
        try:
            upload_id = s3upload(
                service_id,
                Spreadsheet.from_file(form.file.data, filename=form.file.data.filename).as_dict,
                current_app.config['AWS_REGION']
            )
            session['upload_data'] = {
                "template_id": template_id,
                "original_file_name": form.file.data.filename
            }
            return redirect(url_for('.check_messages',
                                    service_id=service_id,
                                    upload_id=upload_id,
                                    template_type=template.template_type))
        except (UnicodeDecodeError, BadZipFile, XLRDError):
            flash('Couldn’t read {}. Try using a different file format.'.format(
                form.file.data.filename
            ))

    column_headings = first_column_headings[template.template_type] + list(template.placeholders)

    return render_template(
        'views/send.html',
        template=template,
        column_headings=list(ascii_uppercase[:len(column_headings)]),
        example=[column_headings, get_example_csv_rows(template)],
        form=form
    )
Ejemplo n.º 5
0
def add_template_by_type(service_id):

    form = ChooseTemplateType(
        include_letters=current_service.has_permission('letter'),
        include_copy=any((
            service_api_client.count_service_templates(service_id) > 0,
            len(user_api_client.get_service_ids_for_user(current_user)) > 1,
        )),
    )

    if form.validate_on_submit():

        if form.template_type.data == 'copy-existing':
            return redirect(
                url_for(
                    '.choose_template_to_copy',
                    service_id=service_id,
                ))

        if form.template_type.data == 'letter':
            blank_letter = service_api_client.create_service_template(
                'Untitled',
                'letter',
                'Body',
                service_id,
                'Main heading',
                'normal',
            )
            return redirect(
                url_for(
                    '.view_template',
                    service_id=service_id,
                    template_id=blank_letter['data']['id'],
                ))

        if email_or_sms_not_enabled(form.template_type.data,
                                    current_service.permissions):
            return redirect(
                url_for('.action_blocked',
                        service_id=service_id,
                        notification_type=form.template_type.data,
                        return_to='add_new_template',
                        template_id='0'))
        else:
            return redirect(
                url_for(
                    '.add_service_template',
                    service_id=service_id,
                    template_type=form.template_type.data,
                ))

    return render_template('views/templates/add.html', form=form)
Ejemplo n.º 6
0
def add_service_template(service_id, template_type, template_folder_id=None):

    if not current_service.has_permission('letter') and template_type == 'letter':
        abort(403)

    form = form_objects[template_type]()
    if form.validate_on_submit():
        if form.process_type.data == 'priority':
            abort_403_if_not_admin_user()
        try:
            new_template = service_api_client.create_service_template(
                form.name.data,
                template_type,
                form.template_content.data,
                service_id,
                form.subject.data if hasattr(form, 'subject') else None,
                form.process_type.data,
                template_folder_id
            )
        except HTTPError as e:
            if (
                e.status_code == 400
                and 'content' in e.message
                and any(['character count greater than' in x for x in e.message['content']])
            ):
                form.template_content.errors.extend(e.message['content'])
            else:
                raise e
        else:
            return redirect(
                url_for('.view_template', service_id=service_id, template_id=new_template['data']['id'])
            )

    if email_or_sms_not_enabled(template_type, current_service.permissions):
        return redirect(url_for(
            '.action_blocked',
            service_id=service_id,
            notification_type=template_type,
            template_folder_id=template_folder_id,
            return_to='templates',
        ))
    else:
        return render_template(
            'views/edit-{}-template.html'.format(template_type),
            form=form,
            template_type=template_type,
            template_folder_id=template_folder_id,
            heading_action='New',
        )
Ejemplo n.º 7
0
def _add_template_by_type(template_type, template_folder_id):

    if template_type == "copy-existing":
        return redirect(
            url_for(
                ".choose_template_to_copy",
                service_id=current_service.id,
            ))

    if template_type == "letter":
        blank_letter = service_api_client.create_service_template(
            "New letter template",
            "letter",
            "Body",
            current_service.id,
            "Main heading",
            "normal",
            template_folder_id,
        )
        return redirect(
            url_for(
                ".view_template",
                service_id=current_service.id,
                template_id=blank_letter["data"]["id"],
            ))

    if email_or_sms_not_enabled(template_type, current_service.permissions):
        return redirect(
            url_for(
                ".action_blocked",
                service_id=current_service.id,
                notification_type=template_type,
                return_to="add_new_template",
                template_id="0",
            ))
    else:
        return redirect(
            url_for(
                ".add_service_template",
                service_id=current_service.id,
                template_type=template_type,
                template_folder_id=template_folder_id,
            ))
Ejemplo n.º 8
0
def add_template_by_type(service_id):

    form = ChooseTemplateType(
        include_letters='letter' in current_service['permissions'])

    if form.validate_on_submit():

        if form.template_type.data == 'letter':
            blank_letter = service_api_client.create_service_template(
                'Untitled',
                'letter',
                'Body',
                service_id,
                'Main heading',
                'normal',
            )
            return redirect(
                url_for(
                    '.view_template',
                    service_id=service_id,
                    template_id=blank_letter['data']['id'],
                ))

        if email_or_sms_not_enabled(form.template_type.data,
                                    current_service['permissions']):
            return redirect(
                url_for('.action_blocked',
                        service_id=service_id,
                        notification_type=form.template_type.data,
                        return_to='add_new_template',
                        template_id='0'))
        else:
            return redirect(
                url_for(
                    '.add_service_template',
                    service_id=service_id,
                    template_type=form.template_type.data,
                ))

    return render_template('views/templates/add.html', form=form)
Ejemplo n.º 9
0
def send_messages(service_id, template_id):
    # if there's lots of data in the session, lets log it for debugging purposes
    # TODO: Remove this once we're confident we have session size under control
    if len(session.get('file_uploads', {}).keys()) > 2:
        current_app.logger.info(
            'session contains large file_uploads - json_len {}, keys: {}'.
            format(len(json.dumps(session['file_uploads'])),
                   session['file_uploads'].keys()))

    db_template = current_service.get_template_with_user_permission_or_403(
        template_id, current_user)

    email_reply_to = None
    sms_sender = None

    if db_template['template_type'] == 'email':
        email_reply_to = get_email_reply_to_address_from_session()
    elif db_template['template_type'] == 'sms':
        sms_sender = get_sms_sender_from_session()

    if email_or_sms_not_enabled(db_template['template_type'],
                                current_service.permissions):
        return redirect(
            url_for('.action_blocked',
                    service_id=service_id,
                    notification_type=db_template['template_type'],
                    return_to='view_template',
                    template_id=template_id))

    template = get_template(
        db_template,
        current_service,
        show_recipient=True,
        letter_preview_url=url_for(
            '.view_letter_template_preview',
            service_id=service_id,
            template_id=template_id,
            filetype='png',
            page_count=get_page_count_for_letter(db_template),
        ),
        email_reply_to=email_reply_to,
        sms_sender=sms_sender,
    )

    form = CsvUploadForm()
    if form.validate_on_submit():
        try:
            upload_id = s3upload(
                service_id,
                Spreadsheet.from_file(
                    form.file.data, filename=form.file.data.filename).as_dict,
                current_app.config['AWS_REGION'])
            return redirect(
                url_for(
                    '.check_messages',
                    service_id=service_id,
                    upload_id=upload_id,
                    template_id=template.id,
                    original_file_name=form.file.data.filename,
                ))
        except (UnicodeDecodeError, BadZipFile, XLRDError):
            flash(
                'Couldn’t read {}. Try using a different file format.'.format(
                    form.file.data.filename))
        except (XLDateError):
            flash((
                '{} contains numbers or dates that Notification can’t understand. '
                'Try formatting all columns as ‘text’ or export your file as CSV.'
            ).format(form.file.data.filename))

    column_headings = get_spreadsheet_column_headings_from_template(template)

    return render_template(
        'views/send.html',
        template=template,
        column_headings=list(ascii_uppercase[:len(column_headings)]),
        example=[column_headings,
                 get_example_csv_rows(template)],
        form=form)
Ejemplo n.º 10
0
def edit_service_template(service_id, template_id):
    template = service_api_client.get_service_template(service_id,
                                                       template_id)['data']
    template['template_content'] = template['content']
    form = form_objects[template['template_type']](**template)

    if form.validate_on_submit():
        if form.process_type.data != template['process_type']:
            abort_403_if_not_admin_user()

        subject = form.subject.data if hasattr(form, 'subject') else None
        new_template = get_template(
            {
                'name': form.name.data,
                'content': form.template_content.data,
                'subject': subject,
                'template_type': template['template_type'],
                'id': template['id'],
                'process_type': form.process_type.data,
                'reply_to_text': template['reply_to_text']
            }, current_service)
        template_change = get_template(
            template, current_service).compare_to(new_template)
        if template_change.placeholders_added and not request.form.get(
                'confirm'):
            example_column_headings = (
                first_column_headings[new_template.template_type] +
                list(new_template.placeholders))
            return render_template(
                'views/templates/breaking-change.html',
                template_change=template_change,
                new_template=new_template,
                column_headings=list(
                    ascii_uppercase[:len(example_column_headings)]),
                example_rows=[
                    example_column_headings,
                    get_example_csv_rows(new_template),
                    get_example_csv_rows(new_template)
                ],
                form=form)
        try:
            service_api_client.update_service_template(
                template_id, form.name.data, template['template_type'],
                form.template_content.data, service_id, subject,
                form.process_type.data)
        except HTTPError as e:
            if e.status_code == 400:
                if 'content' in e.message and any([
                        'character count greater than' in x
                        for x in e.message['content']
                ]):
                    form.template_content.errors.extend(e.message['content'])
                else:
                    raise e
            else:
                raise e
        else:
            return redirect(
                url_for('.view_template',
                        service_id=service_id,
                        template_id=template_id))

    db_template = service_api_client.get_service_template(
        service_id, template_id)['data']

    if email_or_sms_not_enabled(db_template['template_type'],
                                current_service['permissions']):
        return redirect(
            url_for('.action_blocked',
                    service_id=service_id,
                    notification_type=db_template['template_type'],
                    return_to='view_template',
                    template_id=template_id))
    else:
        return render_template('views/edit-{}-template.html'.format(
            template['template_type']),
                               form=form,
                               template_id=template_id,
                               template_type=template['template_type'],
                               heading_action='Edit')
Ejemplo n.º 11
0
def edit_service_template(service_id, template_id):
    template = current_service.get_template_with_user_permission_or_403(
        template_id, current_user)
    template["template_content"] = template["content"]
    form = form_objects[template["template_type"]](**template)
    if form.validate_on_submit():
        if form.process_type.data != template["process_type"]:
            abort_403_if_not_admin_user()

        subject = form.subject.data if hasattr(form, "subject") else None

        new_template_data = {
            "name": form.name.data,
            "content": form.template_content.data,
            "subject": subject,
            "template_type": template["template_type"],
            "id": template["id"],
            "process_type": form.process_type.data,
            "reply_to_text": template["reply_to_text"],
        }

        new_template = get_template(new_template_data, current_service)
        template_change = get_template(
            template, current_service).compare_to(new_template)
        if template_change.placeholders_added and not request.form.get(
                "confirm"):
            example_column_headings = first_column_headings[
                new_template.template_type] + list(new_template.placeholders)
            return render_template(
                "views/templates/breaking-change.html",
                template_change=template_change,
                new_template=new_template,
                column_headings=list(
                    ascii_uppercase[:len(example_column_headings)]),
                example_rows=[
                    example_column_headings,
                    get_example_csv_rows(new_template),
                    get_example_csv_rows(new_template),
                ],
                form=form,
            )
        try:
            service_api_client.update_service_template(
                template_id,
                form.name.data,
                template["template_type"],
                form.template_content.data,
                service_id,
                subject,
                form.process_type.data,
            )
        except HTTPError as e:
            if e.status_code == 400:
                if "content" in e.message and any([
                        "character count greater than" in x
                        for x in e.message["content"]
                ]):
                    form.template_content.errors.extend(e.message["content"])
                else:
                    raise e
            else:
                raise e
        else:
            flash(
                _("'{}' template saved").format(form.name.data),
                "default_with_tick")

            return redirect(
                url_for(".view_template",
                        service_id=service_id,
                        template_id=template_id))

    if email_or_sms_not_enabled(template["template_type"],
                                current_service.permissions):
        return redirect(
            url_for(
                ".action_blocked",
                service_id=service_id,
                notification_type=template["template_type"],
                return_to="view_template",
                template_id=template_id,
            ))
    else:
        return render_template(
            f"views/edit-{template['template_type']}-template.html",
            form=form,
            template=template,
            heading=_l("Edit email template") if template["template_type"]
            == "email" else _l("Edit text message template"),
        )
Ejemplo n.º 12
0
def add_service_template(service_id, template_type, template_folder_id=None):

    if template_type not in ["sms", "email", "letter"]:
        abort(404)
    if not current_service.has_permission(
            "letter") and template_type == "letter":
        abort(403)

    form = form_objects[template_type]()
    if form.validate_on_submit():
        if form.process_type.data != "normal":
            abort_403_if_not_admin_user()
        try:
            new_template = service_api_client.create_service_template(
                form.name.data,
                template_type,
                form.template_content.data,
                service_id,
                form.subject.data if hasattr(form, "subject") else None,
                form.process_type.data,
                template_folder_id,
            )
        except HTTPError as e:
            if (e.status_code == 400 and "content" in e.message and any([
                    "character count greater than" in x
                    for x in e.message["content"]
            ])):
                form.template_content.errors.extend(e.message["content"])
            else:
                raise e
        else:
            flash(
                _("'{}' template saved").format(form.name.data),
                "default_with_tick")

            return redirect(
                url_for(
                    ".view_template",
                    service_id=service_id,
                    template_id=new_template["data"]["id"],
                ))

    if email_or_sms_not_enabled(template_type, current_service.permissions):
        return redirect(
            url_for(
                ".action_blocked",
                service_id=service_id,
                notification_type=template_type,
                template_folder_id=template_folder_id,
                return_to="templates",
                template_id="0",
            ))
    else:
        return render_template(
            f"views/edit-{template_type}-template.html",
            form=form,
            template_type=template_type,
            template_folder_id=template_folder_id,
            service_id=service_id,
            heading=_l("New email template")
            if template_type == "email" else _l("New text message template"),
        )
Ejemplo n.º 13
0
def edit_service_template(service_id, template_id):
    template = current_service.get_template_with_user_permission_or_403(
        template_id, current_user)
    template['template_content'] = template['content']
    form = form_objects[template['template_type']](**template)
    if form.validate_on_submit():
        if form.process_type.data != template['process_type']:
            abort_403_if_not_admin_user()

        subject = form.subject.data if hasattr(form, 'subject') else None

        new_template_data = {
            'name': form.name.data,
            'content': form.template_content.data,
            'subject': subject,
            'template_type': template['template_type'],
            'id': template['id'],
            'process_type': form.process_type.data,
            'reply_to_text': template['reply_to_text'],
        }

        new_template = get_template(new_template_data, current_service)
        template_change = get_template(
            template, current_service).compare_to(new_template)

        if (template_change.placeholders_added
                and not request.form.get('confirm')
                and current_service.api_keys):
            return render_template(
                'views/templates/breaking-change.html',
                template_change=template_change,
                new_template=new_template,
                form=form,
            )
        try:
            service_api_client.update_service_template(
                template_id,
                form.name.data,
                template['template_type'],
                form.template_content.data,
                service_id,
                subject,
                form.process_type.data,
            )
        except HTTPError as e:
            if e.status_code == 400:
                if 'content' in e.message and any([
                        'character count greater than' in x
                        for x in e.message['content']
                ]):
                    form.template_content.errors.extend(e.message['content'])
                else:
                    raise e
            else:
                raise e
        else:
            return redirect(
                url_for('.view_template',
                        service_id=service_id,
                        template_id=template_id))

    if email_or_sms_not_enabled(template['template_type'],
                                current_service.permissions):
        return redirect(
            url_for('.action_blocked',
                    service_id=service_id,
                    notification_type=template['template_type'],
                    return_to='view_template',
                    template_id=template_id))
    else:
        return render_template(
            'views/edit-{}-template.html'.format(template['template_type']),
            form=form,
            template=template,
            heading_action='Edit',
        )
Ejemplo n.º 14
0
def s3_send(service_id, template_id):
    # if there's lots of data in the session, lets log it for debugging purposes
    # TODO: Remove this once we're confident we have session size under control
    if len(session.get("file_uploads", {}).keys()) > 2:
        current_app.logger.info(
            "session contains large file_uploads - json_len {}, keys: {}".
            format(len(json.dumps(session["file_uploads"])),
                   session["file_uploads"].keys()))

    db_template = current_service.get_template_with_user_permission_or_403(
        template_id, current_user)

    email_reply_to = None
    sms_sender = None

    if db_template["template_type"] == "email":
        email_reply_to = get_email_reply_to_address_from_session()
    elif db_template["template_type"] == "sms":
        sms_sender = get_sms_sender_from_session()

    is_email_or_sms_not_enabled = email_or_sms_not_enabled(
        db_template["template_type"], current_service.permissions)
    if is_email_or_sms_not_enabled or not service_can_bulk_send(service_id):
        return redirect(
            url_for(
                ".action_blocked",
                service_id=service_id,
                notification_type=db_template["template_type"],
                return_to="view_template",
                template_id=template_id,
            ))

    template = get_template(
        db_template,
        current_service,
        show_recipient=True,
        letter_preview_url=url_for(
            ".view_letter_template_preview",
            service_id=service_id,
            template_id=template_id,
            filetype="png",
            page_count=get_page_count_for_letter(db_template),
        ),
        email_reply_to=email_reply_to,
        sms_sender=sms_sender,
    )

    s3_objects = list_bulk_send_uploads()
    form = SelectCsvFromS3Form(
        choices=[(x.key, x.key) for x in s3_objects],  # (value, label)
        label="Select a file from Amazon S3",
    )

    if form.validate_on_submit():
        try:
            upload_id = copy_bulk_send_file_to_uploads(
                service_id,
                form.s3_files.data,
            )
            return redirect(
                url_for(
                    ".check_messages",
                    service_id=service_id,
                    upload_id=upload_id,
                    template_id=template.id,
                    original_file_name=form.s3_files.data,
                ))
        except (UnicodeDecodeError, BadZipFile, XLRDError):
            flash(
                _("Could not read {}. Try using a different file format.").
                format(form.s3_files.data))
        except (XLDateError):
            flash(
                _("{} contains numbers or dates that GC Notify can’t understand. "
                  "Try formatting all columns as ‘text’ or export your file as CSV."
                  ).format(form.s3_files.data))

    column_headings = get_spreadsheet_column_headings_from_template(template)

    return render_template(
        "views/s3-send.html",
        template=template,
        column_headings=list(ascii_uppercase[:len(column_headings)]),
        example=[column_headings,
                 get_example_csv_rows(template)],
        form=form,
    )