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.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from oscar.core.loading 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. Basket = get_model('basket', 'Basket')
  10. class OpenBasketReportCSVFormatter(ReportCSVFormatter):
  11. filename_template = 'open-baskets-%s-%s.csv'
  12. def generate_csv(self, response, baskets):
  13. writer = self.get_csv_writer(response)
  14. header_row = [_('User ID'),
  15. _('Name'),
  16. _('Email'),
  17. _('Basket status'),
  18. _('Num lines'),
  19. _('Num items'),
  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(),
  27. basket.owner.email,
  28. basket.status, basket.num_lines,
  29. self.format_datetime(basket.date_created),
  30. basket.time_since_creation]
  31. else:
  32. row = [basket.owner_id, None, None, basket.status,
  33. basket.num_lines, basket.num_items,
  34. self.format_datetime(basket.date_created),
  35. basket.time_since_creation]
  36. writer.writerow(row)
  37. def filename(self, **kwargs):
  38. return self.filename_template % (kwargs['start_date'],
  39. kwargs['end_date'])
  40. class OpenBasketReportHTMLFormatter(ReportHTMLFormatter):
  41. filename_template = 'dashboard/reports/partials/open_basket_report.html'
  42. class OpenBasketReportGenerator(ReportGenerator):
  43. """
  44. Report of baskets which haven't been submitted yet
  45. """
  46. code = 'open_baskets'
  47. description = _('Open baskets')
  48. date_range_field_name = 'date_created'
  49. formatters = {
  50. 'CSV_formatter': OpenBasketReportCSVFormatter,
  51. 'HTML_formatter': OpenBasketReportHTMLFormatter}
  52. def generate(self):
  53. additional_data = {
  54. 'start_date': self.start_date,
  55. 'end_date': self.end_date}
  56. baskets = Basket._default_manager.filter(status=Basket.OPEN)
  57. return self.formatter.generate_response(baskets, **additional_data)
  58. class SubmittedBasketReportCSVFormatter(ReportCSVFormatter):
  59. filename_template = 'submitted_baskets-%s-%s.csv'
  60. def generate_csv(self, response, baskets):
  61. writer = self.get_csv_writer(response)
  62. header_row = [_('User ID'),
  63. _('User'),
  64. _('Basket status'),
  65. _('Num lines'),
  66. _('Num items'),
  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. self.format_datetime(basket.date_created),
  78. basket.time_before_submit]
  79. writer.writerow(row)
  80. def filename(self, **kwargs):
  81. return self.filename_template % (kwargs['start_date'],
  82. kwargs['end_date'])
  83. class SubmittedBasketReportHTMLFormatter(ReportHTMLFormatter):
  84. filename_template = 'dashboard/reports/partials/' \
  85. 'submitted_basket_report.html'
  86. class SubmittedBasketReportGenerator(ReportGenerator):
  87. """
  88. Report of baskets that have been submitted
  89. """
  90. code = 'submitted_baskets'
  91. description = _('Submitted baskets')
  92. date_range_field_name = 'date_submitted'
  93. formatters = {
  94. 'CSV_formatter': SubmittedBasketReportCSVFormatter,
  95. 'HTML_formatter': SubmittedBasketReportHTMLFormatter}
  96. def generate(self):
  97. additional_data = {
  98. 'start_date': self.start_date,
  99. 'end_date': self.end_date}
  100. baskets = Basket._default_manager.filter(status=Basket.SUBMITTED)
  101. return self.formatter.generate_response(baskets, **additional_data)