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.

60 lines
2.1 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. """
  42. :return: dictionary of parameters. At least return 'fieldnames', but
  43. you can optionally return parameters that define the export format.
  44. Valid parameters include 'delimiter', 'quotechar', 'escapechar',
  45. 'doublequote', 'skipinitialspace', 'lineterminator', 'quoting'.
  46. """
  47. return {'fieldnames': []}
  48. def generate_csv_report(self, file, data, objs):
  49. raise NotImplementedError()