From ab14c214c25553aeb15bb8ffd67e4aa027888b81 Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 11:09:15 -0400 Subject: [PATCH 01/12] edit user form --- atst/forms/edit_user.py | 68 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 atst/forms/edit_user.py diff --git a/atst/forms/edit_user.py b/atst/forms/edit_user.py new file mode 100644 index 00000000..36dc206f --- /dev/null +++ b/atst/forms/edit_user.py @@ -0,0 +1,68 @@ +import pendulum +from wtforms.fields.html5 import DateField, EmailField, TelField +from wtforms.fields import RadioField, StringField +from wtforms.validators import Email, Required + +from .fields import SelectField +from .forms import ValidatedForm +from .data import ( + SERVICE_BRANCHES, +) + +from .validators import Alphabet, DateRange, PhoneNumber + + +class EditUserForm(ValidatedForm): + + fname = StringField("First Name", validators=[Required(), Alphabet()]) + + lname = StringField("Last Name", validators=[Required(), Alphabet()]) + + email = EmailField("E-mail Address", validators=[Required(), Email()]) + + phone_number = TelField( + "Phone Number", + description="Enter a 10-digit phone number", + validators=[Required(), PhoneNumber()], + ) + + service_branch = SelectField( + "Service Branch or Agency", + description="Which service or organization do you belong to within the DoD?", + choices=SERVICE_BRANCHES, + ) + + citizenship = RadioField( + description="What is your citizenship status?", + choices=[ + ("United States", "United States"), + ("Foreign National", "Foreign National"), + ("Other", "Other"), + ], + validators=[Required()], + ) + + designation = RadioField( + "Designation of Person", + description="What is your designation within the DoD?", + choices=[ + ("military", "Military"), + ("civilian", "Civilian"), + ("contractor", "Contractor"), + ], + validators=[Required()], + ) + + date_latest_training = DateField( + "Latest Information Assurance (IA) Training Completion Date", + description='To complete the training, you can find it in Information Assurance Cyber Awareness Challange website.', + validators=[ + Required(), + DateRange( + lower_bound=pendulum.duration(years=1), + upper_bound=pendulum.duration(days=0), + message="Must be a date within the last year.", + ), + ], + format="%m/%d/%Y", + ) From 27a806d7f8dbfc3604280f07b0c5391e32860b3b Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 11:09:22 -0400 Subject: [PATCH 02/12] user route --- atst/routes/__init__.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/atst/routes/__init__.py b/atst/routes/__init__.py index c2790196..616167b3 100644 --- a/atst/routes/__init__.py +++ b/atst/routes/__init__.py @@ -7,6 +7,7 @@ from atst.domain.users import Users from atst.domain.authnid import AuthenticationContext from atst.domain.audit_log import AuditLog from atst.domain.auth import logout as _logout +from atst.forms.edit_user import EditUserForm bp = Blueprint("atst", __name__) @@ -89,3 +90,10 @@ def logout(): def activity_history(): audit_events = AuditLog.get_all_events(g.current_user) return render_template("audit_log.html", audit_events=audit_events) + + +@bp.route("/user") +def user(): + form = EditUserForm(request.form) + user = g.current_user + return render_template("user/edit.html", form=form, user=user) From 6c9aa44b3706705bb5c52ce34f8d75b783ce6a80 Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 11:09:59 -0400 Subject: [PATCH 03/12] user link in topbar --- templates/navigation/topbar.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/navigation/topbar.html b/templates/navigation/topbar.html index b5bd8e78..6bcd0d0a 100644 --- a/templates/navigation/topbar.html +++ b/templates/navigation/topbar.html @@ -20,7 +20,7 @@ {% endif %} - + {{ g.current_user.first_name + " " + g.current_user.last_name }} {{ Icon('avatar', classes='topbar__link-icon') }} From 04ca96618cc99fa17b159f8414df58ac2cc593a3 Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 11:10:16 -0400 Subject: [PATCH 04/12] stub user edit screen --- templates/user/edit.html | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 templates/user/edit.html diff --git a/templates/user/edit.html b/templates/user/edit.html new file mode 100644 index 00000000..ff052b9b --- /dev/null +++ b/templates/user/edit.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block content %} +
+
+
+

+
{{ user.first_name }} {{ user.last_name }}
+
Edit user details
+

+
+
+
+{% endblock %} From d20247a47ee0a2d9dc7d499191997177f4c93e68 Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 14:10:41 -0400 Subject: [PATCH 05/12] edit user wtform --- atst/forms/edit_user.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/atst/forms/edit_user.py b/atst/forms/edit_user.py index 36dc206f..b3e9e64b 100644 --- a/atst/forms/edit_user.py +++ b/atst/forms/edit_user.py @@ -14,15 +14,19 @@ from .validators import Alphabet, DateRange, PhoneNumber class EditUserForm(ValidatedForm): - fname = StringField("First Name", validators=[Required(), Alphabet()]) + first_name = StringField("First Name", validators=[Required(), Alphabet()]) - lname = StringField("Last Name", validators=[Required(), Alphabet()]) + last_name = StringField("Last Name", validators=[Required(), Alphabet()]) - email = EmailField("E-mail Address", validators=[Required(), Email()]) + email = EmailField( + "E-mail Address", + description="Enter your preferred contact e-mail address", + validators=[Required(), Email()] + ) phone_number = TelField( "Phone Number", - description="Enter a 10-digit phone number", + description="Enter your 10-digit U.S. phone number", validators=[Required(), PhoneNumber()], ) From ca66139a2f57e15c07dceec12dc6a79889cbbcfd Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 14:10:52 -0400 Subject: [PATCH 06/12] dummy save_user route --- atst/routes/__init__.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/atst/routes/__init__.py b/atst/routes/__init__.py index 616167b3..6eae2333 100644 --- a/atst/routes/__init__.py +++ b/atst/routes/__init__.py @@ -97,3 +97,8 @@ def user(): form = EditUserForm(request.form) user = g.current_user return render_template("user/edit.html", form=form, user=user) + +@bp.route("/save_user") +def save_user(): + # no op + return redirect(url_for(".home")) From 0045f998ac130e22210de0d1abbf5fc7deb7d8f0 Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 14:11:11 -0400 Subject: [PATCH 07/12] Adjust max width for inputs in form cols --- styles/components/_forms.scss | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/styles/components/_forms.scss b/styles/components/_forms.scss index db7ee296..5ebf01f4 100644 --- a/styles/components/_forms.scss +++ b/styles/components/_forms.scss @@ -16,6 +16,12 @@ margin-top: 0; } } + + .usa-input { + input { + max-width: none; + } + } } @include media($medium-screen) { @@ -46,10 +52,6 @@ right: -$gap * 3; } } - - input { - max-width: none; - } } &:first-child { From 72d63f82c9e380fc493b8b992651148a8302f1e8 Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 14:11:20 -0400 Subject: [PATCH 08/12] edit user form template --- templates/fragments/edit_user_form.html | 38 +++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 templates/fragments/edit_user_form.html diff --git a/templates/fragments/edit_user_form.html b/templates/fragments/edit_user_form.html new file mode 100644 index 00000000..ed0ec406 --- /dev/null +++ b/templates/fragments/edit_user_form.html @@ -0,0 +1,38 @@ +{% from "components/text_input.html" import TextInput %} +{% from "components/options_input.html" import OptionsInput %} +{% from "components/date_input.html" import DateInput %} + +
+
+
+
+
+ {{ TextInput(form.first_name) }} +
+ +
+ {{ TextInput(form.last_name) }} +
+
+ +
+
+ {{ TextInput(form.email, validation='email') }} +
+ +
+ {{ TextInput(form.phone_number, validation='usPhone') }} +
+
+ + {{ OptionsInput(form.service_branch) }} + {{ OptionsInput(form.citizenship) }} + {{ OptionsInput(form.designation) }} + {{ DateInput(form.date_latest_training,tooltip="When was the last time you completed the IA training?
Information Assurance (IA) training is an important step in cyber awareness.",placeholder="MM / DD / YYYY", validation="date") }} +
+
+ +
+ +
+
From ca3be247e378d9d49708fb123f3f5a5036a01ec0 Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 14:11:30 -0400 Subject: [PATCH 09/12] edit user screen template --- templates/user/edit.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/templates/user/edit.html b/templates/user/edit.html index ff052b9b..709892cc 100644 --- a/templates/user/edit.html +++ b/templates/user/edit.html @@ -3,12 +3,16 @@ {% block content %}
-
+

{{ user.first_name }} {{ user.last_name }}
Edit user details

+ + {% set form_action = url_for('atst.save_user') %} + {% include "fragments/edit_user_form.html" %} +
{% endblock %} From 9415f14451cf90e3ffe0fcd446354f44af685cea Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 14:14:52 -0400 Subject: [PATCH 10/12] edit user url in public topbar --- templates/base_public.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/base_public.html b/templates/base_public.html index 2a5e9c32..9ceb400f 100644 --- a/templates/base_public.html +++ b/templates/base_public.html @@ -24,7 +24,7 @@ {% if g.current_user %} - + {{ g.current_user.first_name + " " + g.current_user.last_name }} {{ Icon('avatar', classes='topbar__link-icon') }} From 5572dfedba9baae7d94ddceb9d2dae53771b212a Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 14:18:32 -0400 Subject: [PATCH 11/12] formatting --- atst/forms/edit_user.py | 6 ++---- atst/routes/__init__.py | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/atst/forms/edit_user.py b/atst/forms/edit_user.py index b3e9e64b..0bf8f211 100644 --- a/atst/forms/edit_user.py +++ b/atst/forms/edit_user.py @@ -5,9 +5,7 @@ from wtforms.validators import Email, Required from .fields import SelectField from .forms import ValidatedForm -from .data import ( - SERVICE_BRANCHES, -) +from .data import SERVICE_BRANCHES from .validators import Alphabet, DateRange, PhoneNumber @@ -21,7 +19,7 @@ class EditUserForm(ValidatedForm): email = EmailField( "E-mail Address", description="Enter your preferred contact e-mail address", - validators=[Required(), Email()] + validators=[Required(), Email()], ) phone_number = TelField( diff --git a/atst/routes/__init__.py b/atst/routes/__init__.py index 6eae2333..4edbdb57 100644 --- a/atst/routes/__init__.py +++ b/atst/routes/__init__.py @@ -98,6 +98,7 @@ def user(): user = g.current_user return render_template("user/edit.html", form=form, user=user) + @bp.route("/save_user") def save_user(): # no op From 60445b9593bf1a9a809d2493be0426e13393c4fa Mon Sep 17 00:00:00 2001 From: Andrew Croce Date: Tue, 25 Sep 2018 14:22:07 -0400 Subject: [PATCH 12/12] add temporary alert --- templates/user/edit.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/templates/user/edit.html b/templates/user/edit.html index 709892cc..44cbc71f 100644 --- a/templates/user/edit.html +++ b/templates/user/edit.html @@ -1,7 +1,13 @@ {% extends "base.html" %} +{% from "components/alert.html" import Alert %} {% block content %}
+ {{ Alert('This form does not yet function', + message="

Functionality of this form is pending more engineering work. Engineers, please remove this alert when done.

", + level='warning' + ) }} +