From 1c7603e9085e468bdaab4cf83fb77b28d3e44c98 Mon Sep 17 00:00:00 2001 From: Taib Simon Hayat Date: Wed, 13 Nov 2019 14:19:10 +0100 Subject: [PATCH] store and show interest in study typed --- castellum/recruitment/forms.py | 25 +++++++++++++------ ...003_attributeset_study_type_disinterest.py | 19 ++++++++++++++ castellum/recruitment/models/attributesets.py | 7 ++++++ .../recruitment/attributeset_form.html | 2 ++ 4 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 castellum/recruitment/migrations/0003_attributeset_study_type_disinterest.py diff --git a/castellum/recruitment/forms.py b/castellum/recruitment/forms.py index 351b1ba5f..4ec54eb33 100644 --- a/castellum/recruitment/forms.py +++ b/castellum/recruitment/forms.py @@ -28,6 +28,7 @@ from castellum.utils.forms import DisabledChoiceField from castellum.utils.forms import DisabledModelChoiceField from .models import AttributeDescription +from .models import AttributeSet from .models import ParticipationRequest from .models import SubjectFilter from .models.attributesets import ANSWER_DECLINED @@ -126,26 +127,36 @@ class SubjectFilterFormSet(forms.BaseModelFormSet): ), code='invalid') -class AttributeSetForm(forms.Form): +class AttributeSetForm(forms.ModelForm): + + class Meta: + model = AttributeSet + exclude = ('data',) + widgets = { + 'study_type_disinterest': forms.CheckboxSelectMultiple(), + } + def __init__(self, instance=None, **kwargs): - self.instance = instance if not kwargs.get('initial'): kwargs['initial'] = {} for key, value in instance.get_data().items(): kwargs['initial'][key] = None if value == ANSWER_DECLINED else value - super().__init__(**kwargs) + super().__init__(instance=instance, **kwargs) def clean(self): cleaned_data = super().clean() for key in cleaned_data: if key + '_answer_declined' in self.data: cleaned_data[key] = ANSWER_DECLINED - return cleaned_data + study_type_disinterest = cleaned_data.pop('study_type_disinterest') + return { + 'study_type_disinterest': study_type_disinterest, + 'data': cleaned_data, + } def save(self): - self.instance.data.update(self.cleaned_data) - self.instance.save() - return self.instance + self.instance.data.update(self.cleaned_data['data']) + return super().save() @classmethod def factory(cls, user, obj=None): diff --git a/castellum/recruitment/migrations/0003_attributeset_study_type_disinterest.py b/castellum/recruitment/migrations/0003_attributeset_study_type_disinterest.py new file mode 100644 index 000000000..e0cff3c81 --- /dev/null +++ b/castellum/recruitment/migrations/0003_attributeset_study_type_disinterest.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.7 on 2019-11-20 13:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('studies', '0001_initial'), + ('recruitment', '0002_auto_20191116_1743'), + ] + + operations = [ + migrations.AddField( + model_name='attributeset', + name='study_type_disinterest', + field=models.ManyToManyField(blank=True, related_name='_attributeset_study_type_disinterest_+', to='studies.StudyType', verbose_name='Does not want to participate in the following study types:'), + ), + ] diff --git a/castellum/recruitment/models/attributesets.py b/castellum/recruitment/models/attributesets.py index bc70017e5..f4ac0b897 100644 --- a/castellum/recruitment/models/attributesets.py +++ b/castellum/recruitment/models/attributesets.py @@ -37,6 +37,7 @@ from parler.models import TranslatableModel from parler.models import TranslatedFields from parler.utils.context import switch_language +from castellum.studies.models import StudyType from castellum.subjects.models import Subject from castellum.utils.models import TimeStampedModel @@ -84,6 +85,12 @@ class ImportMixin: class AttributeSet(TimeStampedModel): subject = models.OneToOneField(Subject, on_delete=models.CASCADE, editable=False) data = JSONField(encoder=DjangoJSONEncoder) + study_type_disinterest = models.ManyToManyField( + StudyType, + verbose_name=_('Does not want to participate in the following study types:'), + blank=True, + related_name='+' + ) class Meta: verbose_name = _('Attribute set') diff --git a/castellum/recruitment/templates/recruitment/attributeset_form.html b/castellum/recruitment/templates/recruitment/attributeset_form.html index e3dc8dca2..97c4c5175 100644 --- a/castellum/recruitment/templates/recruitment/attributeset_form.html +++ b/castellum/recruitment/templates/recruitment/attributeset_form.html @@ -36,6 +36,8 @@ {% endfor %} + {% bootstrap_field form.study_type_disinterest %} +
{% if view.get_back_url %} {% trans "Back" %} -- GitLab