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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import datetime
  2. from django.http import HttpResponse
  3. from django.utils.translation import ugettext_lazy as _
  4. from oscar.apps.dashboard.reports.csv_utils import CsvUnicodeWriter
  5. from oscar.core import utils
  6. class ReportGenerator(object):
  7. """
  8. Top-level class that needs to be subclassed to provide a
  9. report generator.
  10. """
  11. filename_template = 'report-%s-to-%s.csv'
  12. content_type = 'text/csv'
  13. code = ''
  14. description = '<insert report description>'
  15. date_range_field_name = None
  16. def __init__(self, **kwargs):
  17. self.start_date = kwargs.get('start_date')
  18. self.end_date = kwargs.get('end_date')
  19. formatter_name = '%s_formatter' % kwargs['formatter']
  20. self.formatter = self.formatters[formatter_name]()
  21. def report_description(self):
  22. return _('%(report_filter)s between %(start_date)s and %(end_date)s') \
  23. % {'report_filter': self.description,
  24. 'start_date': self.start_date,
  25. 'end_date': self.end_date,
  26. }
  27. def generate(self, response):
  28. pass
  29. def filename(self):
  30. """
  31. Returns the filename for this report
  32. """
  33. return self.formatter.filename()
  34. def is_available_to(self, user):
  35. """
  36. Checks whether this report is available to this user
  37. """
  38. return user.is_staff
  39. def filter_with_date_range(self, queryset):
  40. """
  41. Filter results based that are within a (possibly open ended) daterange
  42. """
  43. # Nothing to do if we don't have a date field
  44. if not self.date_range_field_name:
  45. return queryset
  46. # After the start date
  47. if self.start_date:
  48. filter_kwargs = {
  49. "%s__gt" % self.date_range_field_name: self.start_date,
  50. }
  51. queryset = queryset.filter(**filter_kwargs)
  52. # Before the end of the end date
  53. if self.end_date:
  54. end_of_end_date = datetime.datetime.combine(
  55. self.end_date,
  56. datetime.time(hour=23, minute=59, second=59)
  57. )
  58. filter_kwargs = {
  59. "%s__lt" % self.date_range_field_name: end_of_end_date,
  60. }
  61. queryset = queryset.filter(**filter_kwargs)
  62. return queryset
  63. class ReportFormatter(object):
  64. def format_datetime(self, dt):
  65. if not dt:
  66. return ''
  67. return utils.format_datetime(dt, 'DATETIME_FORMAT')
  68. def format_date(self, d):
  69. if not d:
  70. return ''
  71. return utils.format_datetime(d, 'DATE_FORMAT')
  72. def filename(self):
  73. return self.filename_template
  74. class ReportCSVFormatter(ReportFormatter):
  75. def get_csv_writer(self, file_handle, **kwargs):
  76. return CsvUnicodeWriter(file_handle, **kwargs)
  77. def generate_response(self, objects, **kwargs):
  78. response = HttpResponse(content_type='text/csv')
  79. response['Content-Disposition'] = 'attachment; filename=%s' \
  80. % self.filename(**kwargs)
  81. self.generate_csv(response, objects)
  82. return response
  83. class ReportHTMLFormatter(ReportFormatter):
  84. def generate_response(self, objects, **kwargs):
  85. return objects