forms.py 1.5 KB

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