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

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