mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-23 15:57:23 -04:00
Merge pull request #3019 from alphagov/sign-online
Allow online acceptance of the contract/memorandum of understanding
This commit is contained in:
@@ -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',
|
||||
'I’m accepting the agreement',
|
||||
),
|
||||
(
|
||||
'someone-else',
|
||||
'I’m 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(
|
||||
'What’s 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('Can’t 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")
|
||||
|
||||
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user