old_contents: from decimal import Decimal as D
  import datetime
  
  from django.db.models import get_model
  from django.utils.translation import ugettext_lazy as _
  
  from oscar.core.loading import get_class
  ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
  ReportCSVFormatter = get_class('dashboard.reports.reports', 'ReportCSVFormatter')
  ReportHTMLFormatter = get_class('dashboard.reports.reports', 'ReportHTMLFormatter')
  ConditionalOffer = get_model('offer', 'ConditionalOffer')
  OrderDiscount = get_model('order', 'OrderDiscount')
  
  
  class OfferReportCSVFormatter(ReportCSVFormatter):
      filename_template = 'conditional-offer-performance.csv'
  
      def generate_csv(self, response, offers):
          writer = self.get_csv_writer(response)
          header_row = [_('Offer'),
                        _('Total discount')
                       ]
          writer.writerow(header_row)
  
          for offer in offers:
              row = [offer, offer.total_discount]
              writer.writerow(row)
  
  
  class OfferReportHTMLFormatter(ReportHTMLFormatter):
      filename_template = 'dashboard/reports/partials/offer_report.html'
  
  
  class OfferReportGenerator(ReportGenerator):
      code = 'conditional-offers'
      description = _('Offer performance')
  
      formatters = {
          'CSV_formatter': OfferReportCSVFormatter,
          'HTML_formatter': OfferReportHTMLFormatter,
      }
  
      def generate(self):
          discounts = OrderDiscount._default_manager.filter(
              order__date_placed__gte=self.start_date,
              order__date_placed__lt=self.end_date + datetime.timedelta(days=1)
          )
          offer_discounts = {}
          for discount in discounts:
              if discount.offer_id not in offer_discounts:
                  try:
                      offer = ConditionalOffer._default_manager.get(id=discount.offer_id)
                  except ConditionalOffer.DoesNotExist:
                      continue
                  offer_discounts[discount.offer_id] = {
                      'offer': offer,
                      'total_discount': D('0.00')
                  }
              offer_discounts[discount.offer_id]['total_discount'] += discount.amount
  
          return self.formatter.generate_response(offer_discounts.values())
  
new_contents: from decimal import Decimal as D
  import datetime
  
  from django.db.models import get_model
  from django.utils.translation import ugettext_lazy as _
  
  from oscar.core.loading import get_class
  ReportGenerator = get_class('dashboard.reports.reports', 'ReportGenerator')
  ReportCSVFormatter = get_class('dashboard.reports.reports', 'ReportCSVFormatter')
  ReportHTMLFormatter = get_class('dashboard.reports.reports', 'ReportHTMLFormatter')
  ConditionalOffer = get_model('offer', 'ConditionalOffer')
  OrderDiscount = get_model('order', 'OrderDiscount')
  
  
  class OfferReportCSVFormatter(ReportCSVFormatter):
      filename_template = 'conditional-offer-performance.csv'
  
      def generate_csv(self, response, offers):
          writer = self.get_csv_writer(response)
          header_row = [_('Offer'),
                        _('Total discount')
                       ]
          writer.writerow(header_row)
  
          for offer in offers:
              row = [offer, offer['total_discount']]
              writer.writerow(row)
  
  
  class OfferReportHTMLFormatter(ReportHTMLFormatter):
      filename_template = 'dashboard/reports/partials/offer_report.html'
  
  
  class OfferReportGenerator(ReportGenerator):
      code = 'conditional-offers'
      description = _('Offer performance')
  
      formatters = {
          'CSV_formatter': OfferReportCSVFormatter,
          'HTML_formatter': OfferReportHTMLFormatter,
      }
  
      def generate(self):
          discounts = OrderDiscount._default_manager.filter(
              order__date_placed__gte=self.start_date,
              order__date_placed__lt=self.end_date + datetime.timedelta(days=1)
          )
          offer_discounts = {}
          for discount in discounts:
              if discount.offer_id not in offer_discounts:
                  try:
                      offer = ConditionalOffer._default_manager.get(id=discount.offer_id)
                  except ConditionalOffer.DoesNotExist:
                      continue
                  offer_discounts[discount.offer_id] = {
                      'offer': offer,
                      'total_discount': D('0.00')
                  }
              offer_discounts[discount.offer_id]['total_discount'] += discount.amount
  
          return self.formatter.generate_response(offer_discounts.values())
  
subject: Fix broken offer report generation