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.

reports.py 1.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import csv
  2. from django.db.models import get_model
  3. from django.template.response import TemplateResponse
  4. from oscar.core.loading import get_class
  5. ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
  6. ReportCSVFormatter = get_class('dashboard.reports.reports', 'ReportCSVFormatter')
  7. ReportHTMLFormatter = get_class('dashboard.reports.reports', 'ReportHTMLFormatter')
  8. Order = get_model('order', 'Order')
  9. class OrderReportCSVFormatter(ReportCSVFormatter):
  10. filename_template = 'orders-%s-to-%s.csv'
  11. def generate_csv(self, response, orders):
  12. writer = csv.writer(response)
  13. header_row = ['Order number',
  14. 'User',
  15. 'Total incl. tax',
  16. 'Date placed',]
  17. writer.writerow(header_row)
  18. for order in orders:
  19. row = [order.number,
  20. order.user,
  21. order.total_incl_tax,
  22. self.format_datetime(order.date_placed)]
  23. writer.writerow(row)
  24. def filename(self, **kwargs):
  25. return self.filename_template % (kwargs['start_date'], kwargs['end_date'])
  26. class OrderReportHTMLFormatter(ReportHTMLFormatter):
  27. template = 'dashboard/reports/partials/order_report.html'
  28. class OrderReportGenerator(ReportGenerator):
  29. code = 'order_report'
  30. description = "Orders placed"
  31. formatters = {
  32. 'CSV_formatter': OrderReportCSVFormatter,
  33. 'HTML_formatter': OrderReportHTMLFormatter,
  34. }
  35. def generate(self):
  36. orders = Order._default_manager.filter(
  37. date_placed__gte=self.start_date
  38. ).filter(date_placed__lt=self.end_date)
  39. additional_data = {
  40. 'start_date': self.start_date,
  41. 'end_date': self.end_date
  42. }
  43. return self.formatter.generate_response(orders, **additional_data)
  44. def is_available_to(self, user):
  45. return user.is_staff and user.has_perm('order.can_view')