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.0 KiB

  1. # Copyright 2015 ACSONE SA/NV (<http://acsone.eu>)
  2. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
  3. from io import BytesIO
  4. from odoo import models
  5. import logging
  6. _logger = logging.getLogger(__name__)
  7. try:
  8. import xlsxwriter
  9. except ImportError:
  10. _logger.debug('Can not import xlsxwriter`.')
  11. class ReportXlsxAbstract(models.AbstractModel):
  12. _name = 'report.report_xlsx.abstract'
  13. _description = 'Abstract XLSX Report'
  14. def _get_objs_for_report(self, docids, data):
  15. """
  16. Returns objects for xlx report. From WebUI these
  17. are either as docids taken from context.active_ids or
  18. in the case of wizard are in data. Manual calls may rely
  19. on regular context, setting docids, or setting data.
  20. :param docids: list of integers, typically provided by
  21. qwebactionmanager for regular Models.
  22. :param data: dictionary of data, if present typically provided
  23. by qwebactionmanager for TransientModels.
  24. :param ids: list of integers, provided by overrides.
  25. :return: recordset of active model for ids.
  26. """
  27. if docids:
  28. ids = docids
  29. elif data and 'context' in data:
  30. ids = data["context"].get('active_ids', [])
  31. else:
  32. ids = self.env.context.get('active_ids', [])
  33. return self.env[self.env.context.get('active_model')].browse(ids)
  34. def create_xlsx_report(self, docids, data):
  35. objs = self._get_objs_for_report(docids, data)
  36. file_data = BytesIO()
  37. workbook = xlsxwriter.Workbook(file_data, self.get_workbook_options())
  38. self.generate_xlsx_report(workbook, data, objs)
  39. workbook.close()
  40. file_data.seek(0)
  41. return file_data.read(), 'xlsx'
  42. def get_workbook_options(self):
  43. """
  44. See https://xlsxwriter.readthedocs.io/workbook.html constructor options
  45. :return: A dictionary of options
  46. """
  47. return {}
  48. def generate_xlsx_report(self, workbook, data, objs):
  49. raise NotImplementedError()