Merge pull request #3019 from alphagov/sign-online

Allow online acceptance of the contract/memorandum of understanding
This commit is contained in:
Chris Hill-Scott
2019-06-27 15:26:41 +01:00
committed by GitHub
13 changed files with 553 additions and 49 deletions

View File

@@ -1462,3 +1462,68 @@ class GoLiveNotesForm(StripWhitespaceForm):
'Go live notes',
filters=[lambda x: x or None],
)
class AcceptAgreementForm(StripWhitespaceForm):
@classmethod
def from_organisation(cls, org):
if org.agreement_signed_on_behalf_of_name and org.agreement_signed_on_behalf_of_email_address:
who = 'someone-else'
elif org.agreement_signed_version: # only set if user has submitted form previously
who = 'me'
else:
who = None
return cls(
version=org.agreement_signed_version,
who=who,
on_behalf_of_name=org.agreement_signed_on_behalf_of_name,
on_behalf_of_email=org.agreement_signed_on_behalf_of_email_address,
)
version = StringField(
'Which version of the agreement are you accepting?'
)
who = RadioField(
'Who is accepting the agreement?',
choices=(
(
'me',
'Im accepting the agreement',
),
(
'someone-else',
'Im accepting the agreement on behalf of someone else',
),
),
validators=[DataRequired()],
)
on_behalf_of_name = StringField(
'Who are you accepting the agreement on behalf of?'
)
on_behalf_of_email = email_address(
'Whats their email address?',
required=False,
gov_user=False,
)
def __validate_if_nominating(self, field):
if self.who.data == 'someone-else':
if not field.data:
raise ValidationError('Cant be empty')
else:
field.data = ''
validate_on_behalf_of_name = __validate_if_nominating
validate_on_behalf_of_email = __validate_if_nominating
def validate_version(self, field):
try:
float(field.data)
except (TypeError, ValueError):
raise ValidationError("Must be a number")

View File

@@ -1,8 +1,11 @@
from flask import abort, render_template, request, send_file, url_for
from datetime import datetime
from flask import abort, redirect, render_template, request, send_file, url_for
from flask_login import current_user, login_required
from app import current_service
from app.main import main
from app.main.forms import AcceptAgreementForm
from app.main.views.sub_navigation_dictionaries import features_nav
from app.s3_client.s3_mou_client import get_mou
@@ -26,6 +29,50 @@ def service_agreement(service_id):
)
@main.route('/services/<uuid:service_id>/agreement/accept', methods=['GET', 'POST'])
@login_required
def service_accept_agreement(service_id):
if not current_service.organisation:
abort(404)
form = AcceptAgreementForm.from_organisation(current_service.organisation)
if form.validate_on_submit():
current_service.organisation.update(
agreement_signed_version=float(form.version.data),
agreement_signed_on_behalf_of_name=form.on_behalf_of_name.data,
agreement_signed_on_behalf_of_email_address=form.on_behalf_of_email.data,
)
return redirect(url_for('main.service_confirm_agreement', service_id=current_service.id))
return render_template(
'views/agreement/agreement-accept.html',
form=form,
)
@main.route('/services/<uuid:service_id>/agreement/confirm', methods=['GET', 'POST'])
@login_required
def service_confirm_agreement(service_id):
if (
not current_service.organisation
or current_service.organisation.agreement_signed_version is None
):
abort(403)
if request.method == 'POST':
current_service.organisation.update(
agreement_signed=True,
agreement_signed_at=str(datetime.utcnow()),
agreement_signed_by_id=current_user.id,
)
return redirect(url_for('main.request_to_go_live', service_id=current_service.id))
return render_template('views/agreement/agreement-confirm.html')
@main.route('/agreement.pdf')
@login_required
def download_agreement():