Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

reports.py 2.3KB

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