diff --git a/atst/forms/officers.py b/atst/forms/officers.py new file mode 100644 index 00000000..84e2283a --- /dev/null +++ b/atst/forms/officers.py @@ -0,0 +1,60 @@ +from flask_wtf import FlaskForm +from wtforms.fields import FormField, StringField +from wtforms.fields.html5 import TelField +from wtforms.validators import Length, Optional + +from atst.forms.validators import IsNumber, PhoneNumber + +from .forms import CacheableForm + + +class OfficerForm(FlaskForm): + first_name = StringField("First Name") + last_name = StringField("Last Name") + email = StringField("Email") + phone_number = TelField("Phone Number", validators=[PhoneNumber()]) + dod_id = StringField("DoD ID", validators=[Optional(), Length(min=10), IsNumber()]) + + +class EditTaskOrderOfficersForm(CacheableForm): + + contracting_officer = FormField(OfficerForm) + contracting_officer_representative = FormField(OfficerForm) + security_officer = FormField(OfficerForm) + + OFFICER_PREFIXES = { + "contracting_officer": "ko", + "contracting_officer_representative": "cor", + "security_officer": "so", + } + OFFICER_INFO_FIELD_NAMES = [ + "first_name", + "last_name", + "email", + "phone_number", + "dod_id", + ] + + def process(self, formdata=None, obj=None, data=None, **kwargs): + if obj: + for name, field in self._fields.items(): + if name in self.OFFICER_PREFIXES: + prefix = self.OFFICER_PREFIXES[name] + officer_data = { + field_name: getattr(obj, prefix + "_" + field_name) + for field_name in self.OFFICER_INFO_FIELD_NAMES + } + field.process(formdata=formdata, data=officer_data) + else: + field.process(formdata) + else: + super(EditTaskOrderOfficersForm, self).process( + formdata=formdata, obj=obj, data=data, **kwargs + ) + + def populate_obj(self, obj): + for name, field in self._fields.items(): + if name in self.OFFICER_PREFIXES: + prefix = self.OFFICER_PREFIXES[name] + for field_name in self.OFFICER_INFO_FIELD_NAMES: + setattr(obj, prefix + "_" + field_name, field[field_name].data) diff --git a/tests/forms/test_officers.py b/tests/forms/test_officers.py new file mode 100644 index 00000000..ce6ca1eb --- /dev/null +++ b/tests/forms/test_officers.py @@ -0,0 +1,56 @@ +from werkzeug.datastructures import ImmutableMultiDict + +from atst.forms.officers import EditTaskOrderOfficersForm +from tests.factories import TaskOrderFactory, UserFactory + + +class TestEditTaskOrderOfficersForm: + def _assert_officer_info_matches(self, form, task_order, officer): + prefix = form.OFFICER_PREFIXES[officer] + + for field in form.OFFICER_INFO_FIELD_NAMES: + assert form[officer][field].data == getattr( + task_order, "{}_{}".format(prefix, field) + ) + + def test_processing_with_existing_task_order(self): + task_order = TaskOrderFactory.create() + form = EditTaskOrderOfficersForm(obj=task_order) + for officer in form.OFFICER_PREFIXES.keys(): + self._assert_officer_info_matches(form, task_order, officer) + + def test_processing_form_with_formdata(self): + data = { + "contracting_officer-first_name": "Han", + "contracting_officer-last_name": "Solo", + } + formdata = ImmutableMultiDict(data) + task_order = TaskOrderFactory.create() + form = EditTaskOrderOfficersForm(formdata=formdata, obj=task_order) + + for officer in ["contracting_officer_representative", "security_officer"]: + self._assert_officer_info_matches(form, task_order, officer) + + prefix = "ko" + officer = "contracting_officer" + for field in form.OFFICER_INFO_FIELD_NAMES: + data_field = "{}-{}".format(officer, field) + if data_field in formdata: + assert form[officer][field].data == formdata[data_field] + else: + assert form[officer][field].data == getattr( + task_order, "{}_{}".format(prefix, field) + ) + + def test_populate_obj(self): + data = { + "security_officer-first_name": "Luke", + "security_officer-last_name": "Skywalker", + } + formdata = ImmutableMultiDict(data) + task_order = TaskOrderFactory.create() + form = EditTaskOrderOfficersForm(formdata=formdata, obj=task_order) + + form.populate_obj(task_order) + assert task_order.so_first_name == data["security_officer-first_name"] + assert task_order.so_last_name == data["security_officer-last_name"]