You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

forms.py 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from django import forms
  2. from django.conf import settings
  3. from django.forms.models import inlineformset_factory
  4. from django.utils.translation import ugettext_lazy as _
  5. from oscar.apps.promotions.conf import PROMOTION_CLASSES
  6. from oscar.forms.fields import ExtendedURLField
  7. from oscar.core.loading import get_classes
  8. RawHTML, SingleProduct, PagePromotion, HandPickedProductList, OrderedProduct = get_classes('promotions.models',
  9. ['RawHTML', 'SingleProduct', 'PagePromotion', 'HandPickedProductList',
  10. 'OrderedProduct'])
  11. class PromotionTypeSelectForm(forms.Form):
  12. choices = []
  13. for klass in PROMOTION_CLASSES:
  14. choices.append((klass.classname(), klass._meta.verbose_name))
  15. promotion_type = forms.ChoiceField(choices=tuple(choices),
  16. label=_("Promotion type"))
  17. class RawHTMLForm(forms.ModelForm):
  18. class Meta:
  19. model = RawHTML
  20. exclude = ('display_type',)
  21. class HandPickedProductListForm(forms.ModelForm):
  22. class Meta:
  23. model = HandPickedProductList
  24. exclude = ('products',)
  25. OrderedProductFormSet = inlineformset_factory(HandPickedProductList,
  26. OrderedProduct, extra=2)
  27. class PagePromotionForm(forms.ModelForm):
  28. page_url = ExtendedURLField(label=_("URL"), verify_exists=True)
  29. position = forms.CharField(
  30. widget=forms.Select(choices=settings.OSCAR_PROMOTION_POSITIONS),
  31. label=_("Position"),
  32. help_text=_("Where in the page this content block will appear"))
  33. class Meta:
  34. model = PagePromotion
  35. exclude = ('display_order', 'clicks', 'content_type', 'object_id')
  36. def clean_page_url(self):
  37. page_url = self.cleaned_data.get('page_url')
  38. if not page_url:
  39. return page_url
  40. if page_url.startswith('http'):
  41. raise forms.ValidationError(
  42. _("Content blocks can only be linked to internal URLs"))
  43. if page_url.startswith('/') and not page_url.endswith('/'):
  44. page_url += '/'
  45. return page_url