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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import datetime
  2. from django import forms
  3. from oscar.core.loading import get_model
  4. from django.http import QueryDict
  5. from django.utils.translation import ugettext_lazy as _
  6. from django.utils.translation import pgettext_lazy
  7. from oscar.apps.address.forms import AbstractAddressForm
  8. from oscar.views.generic import PhoneNumberMixin
  9. Order = get_model('order', 'Order')
  10. OrderNote = get_model('order', 'OrderNote')
  11. ShippingAddress = get_model('order', 'ShippingAddress')
  12. SourceType = get_model('payment', 'SourceType')
  13. class OrderStatsForm(forms.Form):
  14. date_from = forms.DateField(
  15. required=False, label=pgettext_lazy(u"start date", u"From"))
  16. date_to = forms.DateField(
  17. required=False, label=pgettext_lazy(u"end date", u"To"))
  18. _filters = _description = None
  19. def _determine_filter_metadata(self):
  20. self._filters = {}
  21. self._description = _('All orders')
  22. if self.errors:
  23. return
  24. date_from = self.cleaned_data['date_from']
  25. date_to = self.cleaned_data['date_to']
  26. if date_from and date_to:
  27. # We want to include end date so we adjust the date we use with the
  28. # 'range' function.
  29. self._filters = {'date_placed__range':
  30. [date_from, date_to + datetime.timedelta(days=1)]}
  31. self._description = _('Orders placed between %(date_from)s and'
  32. ' %(date_to)s') % {
  33. 'date_from': date_from,
  34. 'date_to': date_to}
  35. elif date_from and not date_to:
  36. self._filters = {'date_placed__gte': date_from}
  37. self._description = _('Orders placed since %s') % (date_from,)
  38. elif not date_from and date_to:
  39. self._filters = {'date_placed__lte': date_to}
  40. self._description = _('Orders placed until %s') % (date_to,)
  41. else:
  42. self._filters = {}
  43. self._description = _('All orders')
  44. def get_filters(self):
  45. if self._filters is None:
  46. self._determine_filter_metadata()
  47. return self._filters
  48. def get_filter_description(self):
  49. if self._description is None:
  50. self._determine_filter_metadata()
  51. return self._description
  52. class OrderSearchForm(forms.Form):
  53. order_number = forms.CharField(required=False, label=_("Order number"))
  54. name = forms.CharField(required=False, label=_("Customer name"))
  55. product_title = forms.CharField(required=False, label=_("Product name"))
  56. upc = forms.CharField(required=False, label=_("UPC"))
  57. partner_sku = forms.CharField(required=False, label=_("Partner SKU"))
  58. status_choices = (('', '---------'),) + tuple([(v, v)
  59. for v
  60. in Order.all_statuses()])
  61. status = forms.ChoiceField(choices=status_choices, label=_("Status"),
  62. required=False)
  63. date_from = forms.DateField(required=False, label=_("Date from"))
  64. date_to = forms.DateField(required=False, label=_("Date to"))
  65. voucher = forms.CharField(required=False, label=_("Voucher code"))
  66. payment_method = forms.ChoiceField(
  67. label=_("Payment method"), required=False,
  68. choices=())
  69. format_choices = (('html', _('HTML')),
  70. ('csv', _('CSV')),)
  71. response_format = forms.ChoiceField(widget=forms.RadioSelect,
  72. required=False, choices=format_choices,
  73. initial='html',
  74. label=_("Get results as"))
  75. def __init__(self, *args, **kwargs):
  76. # Ensure that 'response_format' is always set
  77. if 'data' in kwargs:
  78. data = kwargs['data']
  79. del(kwargs['data'])
  80. elif len(args) > 0:
  81. data = args[0]
  82. args = args[1:]
  83. else:
  84. data = None
  85. if data:
  86. if data.get('response_format', None) not in self.format_choices:
  87. # Handle POST/GET dictionaries, which are unmutable.
  88. if isinstance(data, QueryDict):
  89. data = data.dict()
  90. data['response_format'] = 'html'
  91. super(OrderSearchForm, self).__init__(data, *args, **kwargs)
  92. self.fields['payment_method'].choices = self.payment_method_choices()
  93. def payment_method_choices(self):
  94. return (('', '---------'),) + tuple(
  95. [(src.code, src.name) for src in SourceType.objects.all()])
  96. class OrderNoteForm(forms.ModelForm):
  97. class Meta:
  98. model = OrderNote
  99. exclude = ('order', 'user', 'note_type')
  100. def __init__(self, order, user, *args, **kwargs):
  101. super(OrderNoteForm, self).__init__(*args, **kwargs)
  102. self.instance.order = order
  103. self.instance.user = user
  104. class ShippingAddressForm(PhoneNumberMixin, AbstractAddressForm):
  105. class Meta:
  106. model = ShippingAddress
  107. exclude = ('search_text',)
  108. class OrderStatusForm(forms.Form):
  109. new_status = forms.ChoiceField(label=_("New order status"), choices=())
  110. def __init__(self, order, *args, **kwargs):
  111. super(OrderStatusForm, self).__init__(*args, **kwargs)
  112. # Set the choices
  113. choices = [(x, x) for x in order.available_statuses()]
  114. self.fields['new_status'].choices = choices
  115. @property
  116. def has_choices(self):
  117. return len(self.fields['new_status'].choices) > 0