OCA reporting engine fork for dev and update.
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.

54 lines
1.8 KiB

  1. # Copyright 2019 Creu Blanca
  2. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
  3. from io import StringIO
  4. from odoo import models
  5. import logging
  6. _logger = logging.getLogger(__name__)
  7. try:
  8. import csv
  9. except ImportError:
  10. _logger.debug('Can not import csvwriter`.')
  11. class ReportCSVAbstract(models.AbstractModel):
  12. _name = 'report.report_csv.abstract'
  13. def _get_objs_for_report(self, docids, data):
  14. """
  15. Returns objects for csv report. From WebUI these
  16. are either as docids taken from context.active_ids or
  17. in the case of wizard are in data. Manual calls may rely
  18. on regular context, setting docids, or setting data.
  19. :param docids: list of integers, typically provided by
  20. qwebactionmanager for regular Models.
  21. :param data: dictionary of data, if present typically provided
  22. by qwebactionmanager for TransientModels.
  23. :param ids: list of integers, provided by overrides.
  24. :return: recordset of active model for ids.
  25. """
  26. if docids:
  27. ids = docids
  28. elif data and 'context' in data:
  29. ids = data["context"].get('active_ids', [])
  30. else:
  31. ids = self.env.context.get('active_ids', [])
  32. return self.env[self.env.context.get('active_model')].browse(ids)
  33. def create_csv_report(self, docids, data):
  34. objs = self._get_objs_for_report(docids, data)
  35. file_data = StringIO()
  36. file = csv.DictWriter(file_data, **self.csv_report_options())
  37. self.generate_csv_report(file, data, objs)
  38. file_data.seek(0)
  39. return file_data.read(), 'csv'
  40. def csv_report_options(self):
  41. return {'fieldnames': []}
  42. def generate_csv_report(self, file, data, objs):
  43. raise NotImplementedError()