選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

reports.py 3.2KB

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