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

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