diff --git a/projects/admin.py b/projects/admin.py index f3967fd..7cd0c8a 100644 --- a/projects/admin.py +++ b/projects/admin.py @@ -1,11 +1,15 @@ from django import forms from django.contrib import admin +from django.db import models from django.contrib.auth.models import User +from django.forms import CharField +from django.forms import Textarea from projects.models import IAA, Project, AgileBPA, ContractingOffice, \ ContractingSpecialist, ContractingOfficer, \ ContractingOfficerRepresentative, Agency, \ AgencyOffice, Micropurchase from projects.widgets import DurationMultiWidget +from django.contrib.postgres.forms import SimpleArrayField # Register your models here. @@ -44,6 +48,7 @@ class AgileBPAForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(AgileBPAForm, self).__init__(*args, **kwargs) + self.fields['requirements'].widget = Textarea(attrs=None) # Limit the queryset for the technical evaluation panel to team members # for this project # TODO: Could this be made more user-friendly with javascript? @@ -62,6 +67,12 @@ def __init__(self, *args, **kwargs): self.fields['acquisition_lead'].queryset = User.objects.none() self.fields['technical_lead'].queryset = User.objects.none() + requirements = SimpleArrayField( + CharField(), + delimiter='\n', + help_text='Multiple requirements are allowed. Enter each one on its own line.' + ) + class Meta: model = AgileBPA exclude = ('nda_signed',) @@ -75,6 +86,9 @@ class Meta: class AgileBPAAdmin(admin.ModelAdmin): form = AgileBPAForm filter_horizontal = ('technical_evaluation_panel',) + # formfield_overrides = { + # ArrayField: {'widget': SplitArrayWidget} + # } def get_readonly_fields(self, request, obj=None): if obj: diff --git a/projects/migrations/0007_auto_20161220_2311.py b/projects/migrations/0007_auto_20161220_2311.py new file mode 100644 index 0000000..99e97df --- /dev/null +++ b/projects/migrations/0007_auto_20161220_2311.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.4 on 2016-12-20 23:11 +from __future__ import unicode_literals + +import django.contrib.postgres.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0006_auto_20161209_0416'), + ] + + operations = [ + migrations.AddField( + model_name='agilebpa', + name='requirements', + field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=200), default=list, size=None), + ), + migrations.AddField( + model_name='micropurchase', + name='requirements', + field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=200), default=list, size=None), + ), + migrations.AddField( + model_name='openmarket', + name='requirements', + field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=200), default=list, size=None), + ), + migrations.AddField( + model_name='software', + name='requirements', + field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=200), default=list, size=None), + ), + ] diff --git a/projects/models.py b/projects/models.py index e18acb0..9497bb8 100644 --- a/projects/models.py +++ b/projects/models.py @@ -2,6 +2,7 @@ from datetime import date, timedelta from django.db import models +from django.contrib.postgres.fields import ArrayField from django.shortcuts import reverse from django.core.exceptions import ValidationError from django.contrib.auth.models import User, Group @@ -335,6 +336,11 @@ class Buy(models.Model): blank=False, null=True, ) + requirements = ArrayField( + # https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#arrayfield + models.CharField(max_length=200, blank=True), + default=list, + ) product_owner = models.ForeignKey( User, blank=True, diff --git a/projects/widgets.py b/projects/widgets.py index af4a478..41ac8ab 100644 --- a/projects/widgets.py +++ b/projects/widgets.py @@ -1,5 +1,14 @@ +import copy from datetime import timedelta from django.forms import widgets +from django import forms +from django.contrib.postgres.validators import ( + ArrayMaxLengthValidator, ArrayMinLengthValidator, +) +from django.core.exceptions import ValidationError +from django.utils import six +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext_lazy as _ class DurationMultiWidget(widgets.MultiWidget):