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.

views.py 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import operator
  2. from urllib import urlencode
  3. from django.http import HttpResponseRedirect
  4. from django.template import Context, loader, RequestContext
  5. from django.template.response import TemplateResponse
  6. from django.shortcuts import get_object_or_404
  7. from django.core.urlresolvers import reverse
  8. from django.core.paginator import Paginator, InvalidPage, EmptyPage
  9. from django.views.generic import ListView, DetailView
  10. from django.template.response import TemplateResponse
  11. from django.contrib import messages
  12. from django.db import transaction
  13. from django.db.models import Q
  14. from django.contrib.comments.views.moderation import delete
  15. from oscar.core.loading import import_module
  16. from oscar.views.generic import PostActionMixin
  17. import_module('order.models', ['Order', 'Line', 'ShippingEvent', 'ShippingEventQuantity',
  18. 'ShippingEventType', 'PaymentEvent', 'PaymentEventType', 'OrderNote'], locals())
  19. import_module('order_management.forms', ['SimpleSearch'], locals())
  20. class OrderListView(ListView):
  21. u"""A list of orders"""
  22. context_object_name = "orders"
  23. template_name = 'order_management/browse.html'
  24. paginate_by = 20
  25. def get_queryset(self):
  26. if 'search_query' in self.request.GET and self.request.GET['search_query'].strip():
  27. q = self.request.GET['search_query'].strip()
  28. q_list = [Q(number__icontains=q)]
  29. search_by = self.request.GET.getlist('search_by')
  30. if search_by:
  31. if 'billing_address' in search_by:
  32. q_list.append(Q(billing_address__search_text__icontains=q))
  33. if 'shipping_address' in search_by:
  34. q_list.append(Q(shipping_address__search_text__icontains=q))
  35. if 'customer' in search_by:
  36. q_list.append(Q(number__icontains=q))
  37. q_list.append(Q(user__first_name__icontains=q))
  38. q_list.append(Q(user__last_name__icontains=q))
  39. q_list.append(Q(user__email__icontains=q))
  40. return Order._default_manager.filter(reduce(operator.or_, q_list))
  41. return Order._default_manager.all()
  42. def get_context_data(self, **kwargs):
  43. context = super(OrderListView, self).get_context_data(**kwargs)
  44. search_params = self.request.GET.copy()
  45. if 'page' in search_params:
  46. del(search_params['page'])
  47. context['search_params'] = '&' + search_params.urlencode()
  48. context['order_simple_search_form'] = SimpleSearch(self.request.GET)
  49. return context
  50. def get(self, request, *args, **kwargs):
  51. response = super(OrderListView, self).get(request, *args, **kwargs)
  52. return response
  53. class OrderDetailView(DetailView, PostActionMixin):
  54. u"""A detail view of an order"""
  55. template_name = "order_management/order.html"
  56. context_object_name = 'order'
  57. def get_object(self):
  58. u"""Return an order object or a 404"""
  59. return get_object_or_404(Order, number=self.kwargs['order_number'])
  60. def get_context_data(self, **kwargs):
  61. context = super(OrderDetailView, self).get_context_data(**kwargs)
  62. context['shipping_options'] = ShippingEventType._default_manager.all()
  63. context['payment_options'] = PaymentEventType._default_manager.all()
  64. return context
  65. def post(self, request, *args, **kwargs):
  66. order = self.get_object()
  67. self.response = HttpResponseRedirect(reverse('oscar-order-management-order', kwargs={'order_number': order.number}))
  68. return super(OrderDetailView, self).post(request, *args, **kwargs)
  69. def do_create_order_event(self, order):
  70. self.create_shipping_event(order, order.lines.all())
  71. def do_create_line_event(self, order):
  72. u"""Create an event for an order"""
  73. line_ids = self.request.POST.getlist('order_line')
  74. lines = order.lines.in_bulk(line_ids)
  75. if not len(lines):
  76. messages.info(self.request, "Please select some lines")
  77. return
  78. try:
  79. if self.request.POST['shipping_event']:
  80. self.create_shipping_event(order, lines.values())
  81. except (AttributeError, ValueError), e:
  82. messages.error(self.request, str(e))
  83. def create_shipping_event(self, order, lines):
  84. u"""Create a shipping event for an order"""
  85. with transaction.commit_on_success():
  86. event_type = ShippingEventType._default_manager.get(code=self.request.POST['shipping_event'])
  87. event = ShippingEvent._default_manager.create(order=order, event_type=event_type)
  88. for line in lines:
  89. try:
  90. event_quantity = int(self.request.POST['order_line_quantity_%d' % line.id])
  91. except KeyError:
  92. event_quantity = line.quantity
  93. ShippingEventQuantity._default_manager.create(event=event, line=line,
  94. quantity=event_quantity)
  95. def create_payment_event(self, order, lines, type_code):
  96. u"""Create a payment event for an order"""
  97. event_type = PaymentEventType._default_manager.get(code=type_code)
  98. for line in lines.values():
  99. order_models.PaymentEvent._default_manager.create(order=order, line=line,
  100. quantity=line.quantity, event_type=event_type)
  101. def do_add_note(self, order):
  102. u"""Save a note against an order."""
  103. if self.request.user.is_authenticated():
  104. message = self.request.POST['message'].strip()
  105. if message:
  106. messages.info(self.request, "Message added")
  107. OrderNote._default_manager.create(order=order, message=self.request.POST['message'],
  108. user=self.request.user)
  109. else:
  110. messages.info(self.request, "Please enter a message")