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.

109 lines
3.7 KiB

  1. from base64 import b64decode
  2. import json
  3. from tempfile import NamedTemporaryFile
  4. from openerp.report.report_sxw import *
  5. from openerp import pooler
  6. from py3o.template import Template
  7. from py3o.template.helpers import Py3oConvertor
  8. import requests
  9. class py3o_report(report_sxw):
  10. # def __init__(self, name, table):
  11. # super(py3o_report, self).__init__(name, table)
  12. def get_values(self, cr, uid, ids, data, context):
  13. """ Override this function to customize the dictionary given to the
  14. py3o.template renderer. """
  15. return {
  16. 'lang': self.get_lang(cr, uid, context),
  17. 'objects': self.getObjects(cr, uid, ids, context),
  18. }
  19. @staticmethod
  20. def get_lang(cr, uid, context):
  21. pool = pooler.get_pool(cr.dbname)
  22. lang_obj = pool.get('res.lang')
  23. user_obj = pool.get('res.users')
  24. lang_code = user_obj.browse(cr, uid, uid, context=context).lang
  25. lang = lang_obj.search(cr, uid,
  26. [('code', '=', lang_code)],
  27. context=context)[0]
  28. return lang_obj.browse(cr, uid, lang, context=context)
  29. @staticmethod
  30. def format_date(date, values):
  31. """ Return a date formatted according to the language extracted from
  32. the "values" argument (which should be the result of get_values). """
  33. return date.strftime(values['lang'].date_format)
  34. def create(self, cr, uid, ids, data, context=None):
  35. # Find the report definition to get its settings.
  36. pool = pooler.get_pool(cr.dbname)
  37. report_xml_obj = pool.get('ir.actions.report.xml')
  38. report_xml_ids = report_xml_obj.search(
  39. cr, uid, [('report_name', '=', self.name[7:])], # Ignore "report."
  40. context=context
  41. )
  42. if not report_xml_ids:
  43. return super(py3o_report, self).create(
  44. cr, uid, ids, data, context=context
  45. )
  46. report_xml = report_xml_obj.browse(
  47. cr, uid, report_xml_ids[0], context=context
  48. )
  49. template = report_xml.py3o_template_id
  50. filetype = report_xml.py3o_fusion_filetype
  51. # py3o.template operates on filenames so create temporary files.
  52. with NamedTemporaryFile(
  53. suffix='.odt',
  54. prefix='py3o-template-',
  55. ) as in_temp:
  56. in_temp.write(b64decode(template.py3o_template_data))
  57. in_temp.flush()
  58. in_temp.seek(0)
  59. template = Template(in_temp.name, None)
  60. expressions = template.get_all_user_python_expression()
  61. py_expr = template.convert_py3o_to_python_ast(expressions)
  62. p = Py3oConvertor()
  63. res = p(py_expr)
  64. values = json.dumps(res.jsonify(
  65. self.get_values(cr, uid, ids, data, context)
  66. ))
  67. fusion_server_obj = pool['py3o.server']
  68. fusion_server_id = fusion_server_obj.search(
  69. cr, uid, [], context=context
  70. )[0]
  71. fusion_server = fusion_server_obj.browse(
  72. cr, uid, fusion_server_id, context=context
  73. )
  74. files = {
  75. 'tmpl_file': in_temp,
  76. }
  77. fields = {
  78. "targetformat": filetype.fusion_ext,
  79. "datadict": values,
  80. "image_mapping": "{}",
  81. }
  82. r = requests.post(fusion_server.url, data=fields, files=files)
  83. chunk_size = 1024
  84. with NamedTemporaryFile(
  85. suffix=filetype.human_ext,
  86. prefix='py3o-template-'
  87. ) as fd:
  88. for chunk in r.iter_content(chunk_size):
  89. fd.write(chunk)
  90. fd.seek(0)
  91. return fd.read(), filetype.human_ext