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 3.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import six
  2. from django import forms
  3. from oscar.core.loading import get_model
  4. from django.template import Template, TemplateSyntaxError
  5. from django.utils.translation import ugettext_lazy as _
  6. from oscar.apps.customer.utils import normalise_email
  7. from oscar.forms import widgets
  8. CommunicationEventType = get_model('customer', 'CommunicationEventType')
  9. Order = get_model('order', 'Order')
  10. class CommunicationEventTypeForm(forms.ModelForm):
  11. email_subject_template = forms.CharField(
  12. label=_("Email subject template"))
  13. email_body_template = forms.CharField(
  14. label=_("Email body text template"), required=True,
  15. widget=forms.widgets.Textarea(attrs={'class': 'plain'}))
  16. email_body_html_template = forms.CharField(
  17. label=_("Email body HTML template"), required=True,
  18. widget=widgets.WYSIWYGTextArea)
  19. preview_order_number = forms.CharField(
  20. label=_("Order number"), required=False)
  21. preview_email = forms.EmailField(label=_("Preview email"),
  22. required=False)
  23. def __init__(self, data=None, *args, **kwargs):
  24. self.show_preview = False
  25. self.send_preview = False
  26. if data:
  27. self.show_preview = 'show_preview' in data
  28. self.send_preview = 'send_preview' in data
  29. super(CommunicationEventTypeForm, self).__init__(data, *args, **kwargs)
  30. def validate_template(self, value):
  31. try:
  32. Template(value)
  33. except TemplateSyntaxError as e:
  34. raise forms.ValidationError(six.text_type(e))
  35. def clean_email_subject_template(self):
  36. subject = self.cleaned_data['email_subject_template']
  37. self.validate_template(subject)
  38. return subject
  39. def clean_email_body_template(self):
  40. body = self.cleaned_data['email_body_template']
  41. self.validate_template(body)
  42. return body
  43. def clean_email_body_html_template(self):
  44. body = self.cleaned_data['email_body_html_template']
  45. self.validate_template(body)
  46. return body
  47. def clean_preview_order_number(self):
  48. number = self.cleaned_data['preview_order_number'].strip()
  49. if not self.instance.is_order_related():
  50. return number
  51. if not self.show_preview and not self.send_preview:
  52. return number
  53. try:
  54. self.preview_order = Order.objects.get(number=number)
  55. except Order.DoesNotExist:
  56. raise forms.ValidationError(_(
  57. "No order found with this number"))
  58. return number
  59. def clean_preview_email(self):
  60. email = normalise_email(self.cleaned_data['preview_email'])
  61. if not self.send_preview:
  62. return email
  63. if not email:
  64. raise forms.ValidationError(_(
  65. "Please enter an email address"))
  66. return email
  67. def get_preview_context(self):
  68. ctx = {}
  69. if hasattr(self, 'preview_order'):
  70. ctx['order'] = self.preview_order
  71. return ctx
  72. class Meta:
  73. model = CommunicationEventType
  74. exclude = ('code', 'category', 'sms_template')