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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import datetime
  2. from oscar.core.loading import get_model
  3. from django.utils.translation import ugettext_lazy as _
  4. from oscar.core.loading import get_class
  5. ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
  6. ReportCSVFormatter = get_class('dashboard.reports.reports',
  7. 'ReportCSVFormatter')
  8. ReportHTMLFormatter = get_class('dashboard.reports.reports',
  9. 'ReportHTMLFormatter')
  10. Order = get_model('order', 'Order')
  11. class OrderReportCSVFormatter(ReportCSVFormatter):
  12. filename_template = 'orders-%s-to-%s.csv'
  13. def generate_csv(self, response, orders):
  14. writer = self.get_csv_writer(response)
  15. header_row = [_('Order number'),
  16. _('Name'),
  17. _('Email'),
  18. _('Total incl. tax'),
  19. _('Date placed')]
  20. writer.writerow(header_row)
  21. for order in orders:
  22. row = [
  23. order.number,
  24. '-' if order.is_anonymous else order.user.get_full_name(),
  25. order.email,
  26. order.total_incl_tax,
  27. self.format_datetime(order.date_placed)]
  28. writer.writerow(row)
  29. def filename(self, **kwargs):
  30. return self.filename_template % (
  31. kwargs['start_date'], kwargs['end_date'])
  32. class OrderReportHTMLFormatter(ReportHTMLFormatter):
  33. filename_template = 'dashboard/reports/partials/order_report.html'
  34. class OrderReportGenerator(ReportGenerator):
  35. code = 'order_report'
  36. description = _("Orders placed")
  37. date_range_field_name = 'date_placed'
  38. formatters = {
  39. 'CSV_formatter': OrderReportCSVFormatter,
  40. 'HTML_formatter': OrderReportHTMLFormatter,
  41. }
  42. def generate(self):
  43. orders = Order._default_manager.filter(
  44. date_placed__gte=self.start_date,
  45. date_placed__lt=self.end_date + datetime.timedelta(days=1)
  46. )
  47. additional_data = {
  48. 'start_date': self.start_date,
  49. 'end_date': self.end_date
  50. }
  51. return self.formatter.generate_response(orders, **additional_data)
  52. def is_available_to(self, user):
  53. return user.is_staff