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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from django.http import HttpResponseRedirect
  2. from django.template import Context, loader, RequestContext
  3. from django.shortcuts import render, get_object_or_404
  4. from django.core.urlresolvers import reverse
  5. from django.core.paginator import Paginator, InvalidPage, EmptyPage
  6. from django.views.generic import ListView, DetailView
  7. from django.contrib import messages
  8. from django.db import transaction
  9. from oscar.view.generic import ModelView
  10. from oscar.core.loading import import_module
  11. order_models = import_module('order.models', ['Order', 'Line', 'ShippingEvent', 'ShippingEventQuantity',
  12. 'ShippingEventType', 'PaymentEvent', 'PaymentEventType', 'OrderNote'])
  13. class OrderListView(ListView):
  14. u"""A list of orders"""
  15. context_object_name = "orders"
  16. template_name = 'order_management/browse.html'
  17. paginate_by = 20
  18. def get_queryset(self):
  19. return order_models.Order._default_manager.all()
  20. class OrderView(ModelView):
  21. u"""A detail view of an order"""
  22. template_file = "order_management/order.html"
  23. def get_model(self):
  24. u"""Return an order object or a 404"""
  25. return get_object_or_404(order_models.Order, number=self.kwargs['order_number'])
  26. def handle_GET(self, order):
  27. shipping_options = order_models.ShippingEventType._default_manager.all()
  28. payment_options = order_models.PaymentEventType._default_manager.all()
  29. self.response = render(self.request, self.template_file, locals())
  30. def handle_POST(self, order):
  31. self.response = HttpResponseRedirect(reverse('oscar-order-management-order', kwargs={'order_number': order.number}))
  32. super(OrderView, self).handle_POST(order)
  33. def do_create_order_event(self, order):
  34. self.create_shipping_event(order, order.lines.all())
  35. def do_create_line_event(self, order):
  36. u"""Create an event for an order"""
  37. line_ids = self.request.POST.getlist('order_line')
  38. lines = order.lines.in_bulk(line_ids)
  39. if not len(lines):
  40. messages.info(self.request, "Please select some lines")
  41. return
  42. try:
  43. if self.request.POST['shipping_event']:
  44. self.create_shipping_event(order, lines.values())
  45. except (AttributeError, ValueError), e:
  46. messages.error(self.request, str(e))
  47. def create_shipping_event(self, order, lines):
  48. u"""Create a shipping event for an order"""
  49. with transaction.commit_on_success():
  50. event_type = order_models.ShippingEventType._default_manager.get(code=self.request.POST['shipping_event'])
  51. event = order_models.ShippingEvent._default_manager.create(order=order, event_type=event_type)
  52. for line in lines:
  53. try:
  54. event_quantity = int(self.request.POST['order_line_quantity_%d' % line.id])
  55. except KeyError:
  56. event_quantity = line.quantity
  57. order_models.ShippingEventQuantity._default_manager.create(event=event, line=line,
  58. quantity=event_quantity)
  59. def create_payment_event(self, order, lines, type_code):
  60. u"""Create a payment event for an order"""
  61. event_type = order_models.PaymentEventType._default_manager.get(code=type_code)
  62. for line in lines.values():
  63. order_models.PaymentEvent._default_manager.create(order=order, line=line,
  64. quantity=line.quantity, event_type=event_type)
  65. def do_add_note(self, order):
  66. u"""Save a note against an order."""
  67. if self.request.user.is_authenticated():
  68. message = self.request.POST['message'].strip()
  69. if message:
  70. messages.info(self.request, "Message added")
  71. order_models.OrderNote._default_manager.create(order=order, message=self.request.POST['message'],
  72. user=self.request.user)
  73. else:
  74. messages.info(self.request, "Please enter a message")