forms.py 1.6 KB

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