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.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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 'range'
  25. # function.
  26. self._filters = {'date_placed__range': [date_from,
  27. date_to +
  28. datetime.timedelta(days=1)]}
  29. self._description = _('Orders placed between %(date_from)s and %(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) for v in Order.all_statuses()])
  56. status = forms.ChoiceField(choices=status_choices, label=_("Status"), required=False)
  57. date_from = forms.DateField(required=False, label=_("Date from"))
  58. date_to = forms.DateField(required=False, label=_("Date to"))
  59. voucher = forms.CharField(required=False, label=_("Voucher code"))
  60. payment_method = forms.ChoiceField(
  61. label=_("Payment method"), required=False,
  62. choices=())
  63. format_choices = (('html', _('HTML')),
  64. ('csv', _('CSV')),)
  65. response_format = forms.ChoiceField(widget=forms.RadioSelect, required=False,
  66. choices=format_choices, initial='html', label=_("Get results as"))
  67. def __init__(self, *args, **kwargs):
  68. # ensure that 'response_format' is always set
  69. if 'data' in kwargs:
  70. data = kwargs['data']
  71. del(kwargs['data'])
  72. elif len(args) > 0:
  73. data = args[0]
  74. args = args[1:]
  75. else:
  76. data = None
  77. if data and data.get('response_format', None) not in self.format_choices:
  78. # handle POST/GET dictionaries, whose are unmutable
  79. if isinstance(data, QueryDict):
  80. data = data.dict()
  81. data['response_format'] = 'html'
  82. super(OrderSearchForm, self).__init__(data, *args, **kwargs)
  83. self.fields['payment_method'].choices = self.payment_method_choices()
  84. def payment_method_choices(self):
  85. return (('', '---------'),) + tuple(
  86. [(src.code, src.name) for src in SourceType.objects.all()])
  87. class OrderNoteForm(forms.ModelForm):
  88. class Meta:
  89. model = OrderNote
  90. exclude = ('order', 'user', 'note_type')
  91. class ShippingAddressForm(PhoneNumberMixin, AbstractAddressForm):
  92. class Meta:
  93. model = ShippingAddress
  94. exclude = ('search_text',)