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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import csv
  2. from django.db.models import get_model
  3. from oscar.core.loading import get_class, get_classes
  4. ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
  5. ReportCSVFormatter = get_class('dashboard.reports.reports', 'ReportCSVFormatter')
  6. ReportHTMLFormatter = get_class('dashboard.reports.reports', 'ReportHTMLFormatter')
  7. Basket = get_model('basket', 'Basket')
  8. OPEN, SUBMITTED = get_classes('basket.models', ['OPEN', 'SUBMITTED'])
  9. class OpenBasketReportCSVFormatter(ReportCSVFormatter):
  10. filename_template = 'open-baskets-%s-%s.csv'
  11. def generate_csv(self, response, baskets):
  12. writer = csv.writer(response)
  13. header_row = ['User ID',
  14. 'Name',
  15. 'Email',
  16. 'Basket status',
  17. 'Num lines',
  18. 'Num items',
  19. 'Value',
  20. 'Date of creation',
  21. 'Time since creation',
  22. ]
  23. writer.writerow(header_row)
  24. for basket in baskets:
  25. if basket.owner:
  26. row = [basket.owner_id, basket.owner.get_full_name(), basket.owner.email,
  27. basket.status, basket.num_lines,
  28. basket.num_items, basket.total_incl_tax,
  29. self.format_datetime(basket.date_created),
  30. basket.time_since_creation]
  31. else:
  32. row = [basket.owner_id, None, None, basket.status, basket.num_lines,
  33. basket.num_items, basket.total_incl_tax,
  34. self.format_datetime(basket.date_created), basket.time_since_creation]
  35. writer.writerow(row)
  36. def filename(self, **kwargs):
  37. return self.filename_template % (kwargs['start_date'], kwargs['end_date'])
  38. class OpenBasketReportHTMLFormatter(ReportHTMLFormatter):
  39. filename_template = 'dashboard/reports/partials/open_basket_report.html'
  40. class OpenBasketReportGenerator(ReportGenerator):
  41. """
  42. Report of baskets which haven't been submitted yet
  43. """
  44. code = 'open_baskets'
  45. description = 'Open baskets'
  46. formatters = {
  47. 'CSV_formatter': OpenBasketReportCSVFormatter,
  48. 'HTML_formatter': OpenBasketReportHTMLFormatter
  49. }
  50. def generate(self):
  51. additional_data = {
  52. 'start_date': self.start_date,
  53. 'end_date': self.end_date
  54. }
  55. baskets = Basket._default_manager.filter(status=OPEN)
  56. return self.formatter.generate_response(baskets, **additional_data)
  57. class SubmittedBasketReportCSVFormatter(ReportCSVFormatter):
  58. filename_template = 'submitted_baskets-%s-%s.csv'
  59. def generate_csv(self, response, baskets):
  60. writer = csv.writer(response)
  61. header_row = ['User ID',
  62. 'User',
  63. 'Basket status',
  64. 'Num lines',
  65. 'Num items',
  66. 'Value',
  67. 'Date created',
  68. 'Time between creation and submission',
  69. ]
  70. writer.writerow(header_row)
  71. for basket in baskets:
  72. row = [basket.owner_id,
  73. basket.owner,
  74. basket.status,
  75. basket.num_lines,
  76. basket.num_items,
  77. basket.total_incl_tax,
  78. self.format_datetime(basket.date_created),
  79. basket.time_before_submit]
  80. writer.writerow(row)
  81. def filename(self, **kwargs):
  82. return self.filename_template % (kwargs['start_date'], kwargs['end_date'])
  83. class SubmittedBasketReportHTMLFormatter(ReportHTMLFormatter):
  84. filename_template = 'dashboard/reports/partials/submitted_basket_report.html'
  85. class SubmittedBasketReportGenerator(ReportGenerator):
  86. """
  87. Report of baskets that have been submitted
  88. """
  89. code = 'submitted_baskets'
  90. description = 'Submitted baskets'
  91. formatters = {
  92. 'CSV_formatter': SubmittedBasketReportCSVFormatter,
  93. 'HTML_formatter': SubmittedBasketReportHTMLFormatter
  94. }
  95. def generate(self):
  96. additional_data = {
  97. 'start_date': self.start_date,
  98. 'end_date': self.end_date
  99. }
  100. baskets = Basket._default_manager.filter(status=SUBMITTED)
  101. return self.formatter.generate_response(baskets, **additional_data)