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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from decimal import Decimal as D
  2. import datetime
  3. from django.db.models import get_model
  4. from django.utils.translation import ugettext_lazy as _
  5. from oscar.core.loading import get_class
  6. ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
  7. ReportCSVFormatter = get_class('dashboard.reports.reports', 'ReportCSVFormatter')
  8. ReportHTMLFormatter = get_class('dashboard.reports.reports', 'ReportHTMLFormatter')
  9. ConditionalOffer = get_model('offer', 'ConditionalOffer')
  10. OrderDiscount = get_model('order', 'OrderDiscount')
  11. class OfferReportCSVFormatter(ReportCSVFormatter):
  12. filename_template = 'conditional-offer-performance.csv'
  13. def generate_csv(self, response, offers):
  14. writer = self.get_csv_writer(response)
  15. header_row = [_('Offer'),
  16. _('Total discount')
  17. ]
  18. writer.writerow(header_row)
  19. for offer in offers:
  20. row = [offer, offer['total_discount']]
  21. writer.writerow(row)
  22. class OfferReportHTMLFormatter(ReportHTMLFormatter):
  23. filename_template = 'dashboard/reports/partials/offer_report.html'
  24. class OfferReportGenerator(ReportGenerator):
  25. code = 'conditional-offers'
  26. description = _('Offer performance')
  27. formatters = {
  28. 'CSV_formatter': OfferReportCSVFormatter,
  29. 'HTML_formatter': OfferReportHTMLFormatter,
  30. }
  31. def generate(self):
  32. discounts = OrderDiscount._default_manager.filter(
  33. order__date_placed__gte=self.start_date,
  34. order__date_placed__lt=self.end_date + datetime.timedelta(days=1)
  35. )
  36. offer_discounts = {}
  37. for discount in discounts:
  38. if discount.offer_id not in offer_discounts:
  39. try:
  40. offer = ConditionalOffer._default_manager.get(id=discount.offer_id)
  41. except ConditionalOffer.DoesNotExist:
  42. continue
  43. offer_discounts[discount.offer_id] = {
  44. 'offer': offer,
  45. 'total_discount': D('0.00')
  46. }
  47. offer_discounts[discount.offer_id]['total_discount'] += discount.amount
  48. return self.formatter.generate_response(offer_discounts.values())