Add forms to edit TO officer information
This commit is contained in:
parent
526ab59024
commit
d43c1febea
60
atst/forms/officers.py
Normal file
60
atst/forms/officers.py
Normal file
@ -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)
|
56
tests/forms/test_officers.py
Normal file
56
tests/forms/test_officers.py
Normal file
@ -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"]
|
Loading…
x
Reference in New Issue
Block a user