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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. from django.db.models import get_model
  2. from django.utils.translation import ugettext_lazy as _
  3. from oscar.core.loading import get_class
  4. ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
  5. ReportCSVFormatter = get_class('dashboard.reports.reports',
  6. 'ReportCSVFormatter')
  7. ReportHTMLFormatter = get_class('dashboard.reports.reports',
  8. 'ReportHTMLFormatter')
  9. ProductRecord = get_model('analytics', 'ProductRecord')
  10. UserRecord = get_model('analytics', 'UserRecord')
  11. class ProductReportCSVFormatter(ReportCSVFormatter):
  12. filename_template = 'conditional-offer-performance.csv'
  13. def generate_csv(self, response, products):
  14. writer = self.get_csv_writer(response)
  15. header_row = [_('Product'),
  16. _('Views'),
  17. _('Basket additions'),
  18. _('Purchases')]
  19. writer.writerow(header_row)
  20. for record in products:
  21. row = [record.product,
  22. record.num_views,
  23. record.num_basket_additions,
  24. record.num_purchases]
  25. writer.writerow(row)
  26. class ProductReportHTMLFormatter(ReportHTMLFormatter):
  27. filename_template = 'dashboard/reports/partials/product_report.html'
  28. class ProductReportGenerator(ReportGenerator):
  29. code = 'product_analytics'
  30. description = _('Product analytics')
  31. formatters = {
  32. 'CSV_formatter': ProductReportCSVFormatter,
  33. 'HTML_formatter': ProductReportHTMLFormatter}
  34. def report_description(self):
  35. return self.description
  36. def generate(self):
  37. records = ProductRecord._default_manager.all()
  38. return self.formatter.generate_response(records)
  39. def is_available_to(self, user):
  40. return user.is_staff
  41. class UserReportCSVFormatter(ReportCSVFormatter):
  42. filename_template = 'user-analytics.csv'
  43. def generate_csv(self, response, users):
  44. writer = self.get_csv_writer(response)
  45. header_row = [_('Name'),
  46. _('Date registered'),
  47. _('Product views'),
  48. _('Basket additions'),
  49. _('Orders'),
  50. _('Order lines'),
  51. _('Order items'),
  52. _('Total spent'),
  53. _('Date of last order')]
  54. writer.writerow(header_row)
  55. for record in users:
  56. row = [record.user.get_full_name(),
  57. self.format_date(record.user.date_joined),
  58. record.num_product_views,
  59. record.num_basket_additions,
  60. record.num_orders,
  61. record.num_order_lines,
  62. record.num_order_items,
  63. record.total_spent,
  64. self.format_datetime(record.date_last_order)]
  65. writer.writerow(row)
  66. class UserReportHTMLFormatter(ReportHTMLFormatter):
  67. filename_template = 'dashboard/reports/partials/user_report.html'
  68. class UserReportGenerator(ReportGenerator):
  69. code = 'user_analytics'
  70. description = _('User analytics')
  71. formatters = {
  72. 'CSV_formatter': UserReportCSVFormatter,
  73. 'HTML_formatter': UserReportHTMLFormatter}
  74. def generate(self):
  75. users = UserRecord._default_manager.select_related().all()
  76. return self.formatter.generate_response(users)
  77. def is_available_to(self, user):
  78. return user.is_staff