From 6c646409785e986343966c347c4ef0c9ad1a287c Mon Sep 17 00:00:00 2001 From: Werner Pieterson Date: Tue, 29 Nov 2016 11:07:43 +0200 Subject: [PATCH] Add min_choices validation --- multiselectfield/db/fields.py | 4 +++- multiselectfield/forms/fields.py | 5 ++++- multiselectfield/validators.py | 4 ++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/multiselectfield/db/fields.py b/multiselectfield/db/fields.py index 04f05e7..f849740 100644 --- a/multiselectfield/db/fields.py +++ b/multiselectfield/db/fields.py @@ -22,7 +22,7 @@ from django.db import models from django.utils.text import capfirst from django.core import exceptions -from ..forms.fields import MultiSelectFormField, MaxChoicesValidator +from ..forms.fields import MultiSelectFormField, MinChoicesValidator, MaxChoicesValidator from ..utils import get_max_length from ..validators import MaxValueMultiFieldValidator @@ -54,6 +54,8 @@ class MultiSelectField(models.CharField): super(MultiSelectField, self).__init__(*args, **kwargs) self.max_length = get_max_length(self.choices, self.max_length) self.validators[0] = MaxValueMultiFieldValidator(self.max_length) + if self.min_choices is not None: + self.validators.append(MinChoicesValidator(self.min_choices)) if self.max_choices is not None: self.validators.append(MaxChoicesValidator(self.max_choices)) diff --git a/multiselectfield/forms/fields.py b/multiselectfield/forms/fields.py index 6c5fc85..12d4133 100644 --- a/multiselectfield/forms/fields.py +++ b/multiselectfield/forms/fields.py @@ -17,13 +17,14 @@ from django import forms from ..utils import get_max_length -from ..validators import MaxValueMultiFieldValidator, MaxChoicesValidator +from ..validators import MaxValueMultiFieldValidator, MinChoicesValidator, MaxChoicesValidator class MultiSelectFormField(forms.MultipleChoiceField): widget = forms.CheckboxSelectMultiple def __init__(self, *args, **kwargs): + self.min_choices = kwargs.pop('min_choices', None) self.max_choices = kwargs.pop('max_choices', None) self.max_length = kwargs.pop('max_length', None) super(MultiSelectFormField, self).__init__(*args, **kwargs) @@ -31,3 +32,5 @@ class MultiSelectFormField(forms.MultipleChoiceField): self.validators.append(MaxValueMultiFieldValidator(self.max_length)) if self.max_choices is not None: self.validators.append(MaxChoicesValidator(self.max_choices)) + if self.min_choices is not None: + self.validators.append(MinChoicesValidator(self.min_choices)) diff --git a/multiselectfield/validators.py b/multiselectfield/validators.py index bd45332..50c8328 100644 --- a/multiselectfield/validators.py +++ b/multiselectfield/validators.py @@ -24,6 +24,10 @@ class MaxValueMultiFieldValidator(validators.MaxLengthValidator): code = 'max_multifield_value' +class MinChoicesValidator(validators.MinLengthValidator): + message = _(u'You must select a minimum of %(limit_value)d choices.') + code = 'min_choices' + class MaxChoicesValidator(validators.MaxLengthValidator): message = _(u'You must select a maximum of %(limit_value)d choices.') code = 'max_choices'