forms.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.forms import ModelForm, ValidationError
  4. from django.db.models import Q
  5. from coin.offers.models import OfferSubscription
  6. from coin.configuration.models import Configuration
  7. class ConfigurationForm(ModelForm):
  8. class Meta:
  9. model = Configuration
  10. fields = '__all__'
  11. def __init__(self, *args, **kwargs):
  12. """
  13. This filter the offersubscription select field in configurations forms
  14. to only display subscription that are the sames type of actual configuration
  15. and that haven't already a configuration associated with
  16. """
  17. super(ConfigurationForm, self).__init__(*args, **kwargs)
  18. if self.instance:
  19. queryset = OfferSubscription.objects.filter(
  20. Q(offer__configuration_type=self.instance.model_name) & (
  21. Q(configuration=None) | Q(configuration=self.instance.pk)))
  22. self.fields['offersubscription'].queryset = queryset
  23. def clean_offersubscription(self):
  24. """
  25. This check if the selected administrative subscription is linked to an
  26. offer which use the same configuration type than the edited configuration.
  27. """
  28. offersubscription = self.cleaned_data['offersubscription']
  29. if offersubscription.offer.configuration_type != self.instance.model_name():
  30. raise ValidationError('Administrative subscription must refer an offer having a "{}" configuration type.'.format(self.instance.model_name()))
  31. return offersubscription