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.

108 lines
3.3 KiB

  1. # Copyright 2009-2020 Noviat.
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. from odoo import models
  4. from odoo.addons.report_xlsx_helper.report.report_xlsx_format import (
  5. FORMATS,
  6. XLS_HEADERS,
  7. )
  8. class PartnerExportXlsx(models.AbstractModel):
  9. _name = "report.report_xlsx_helper_demo.partner_export_xlsx"
  10. _description = "Report xlsx helpers"
  11. _inherit = "report.report_xlsx.abstract"
  12. def _get_ws_params(self, wb, data, partners):
  13. partner_template = {
  14. "name": {
  15. "header": {
  16. "value": "Name",
  17. },
  18. "data": {
  19. "value": self._render("partner.name"),
  20. },
  21. "width": 20,
  22. },
  23. "number_of_contacts": {
  24. "header": {
  25. "value": "# Contacts",
  26. },
  27. "data": {
  28. "value": self._render("len(partner.child_ids)"),
  29. },
  30. "width": 10,
  31. },
  32. "is_company": {
  33. "header": {
  34. "value": "Company",
  35. },
  36. "data": {
  37. "value": self._render("partner.is_company"),
  38. },
  39. "width": 10,
  40. },
  41. "is_company_formula": {
  42. "header": {
  43. "value": "Company Y/N ?",
  44. },
  45. "data": {
  46. "type": "formula",
  47. "value": self._render("company_formula"),
  48. },
  49. "width": 14,
  50. },
  51. }
  52. wanted_list = ["name", "number_of_contacts", "is_company", "is_company_formula"]
  53. ws_params = {
  54. "ws_name": "Partners",
  55. "generate_ws_method": "_partner_report",
  56. "title": "Partners",
  57. "wanted_list": wanted_list,
  58. "col_specs": partner_template,
  59. }
  60. return [ws_params]
  61. def _partner_report(self, workbook, ws, ws_params, data, partners):
  62. ws.set_portrait()
  63. ws.fit_to_pages(1, 0)
  64. ws.set_header(XLS_HEADERS["xls_headers"]["standard"])
  65. ws.set_footer(XLS_HEADERS["xls_footers"]["standard"])
  66. self._set_column_width(ws, ws_params)
  67. row_pos = 0
  68. if len(partners) == 1:
  69. ws_params["title"] = partners.name
  70. row_pos = self._write_ws_title(ws, row_pos, ws_params)
  71. row_pos = self._write_line(
  72. ws,
  73. row_pos,
  74. ws_params,
  75. col_specs_section="header",
  76. default_format=FORMATS["format_theader_yellow_left"],
  77. )
  78. ws.freeze_panes(row_pos, 0)
  79. wl = ws_params["wanted_list"]
  80. for partner in partners:
  81. is_company_pos = "is_company" in wl and wl.index("is_company")
  82. is_company_cell = self._rowcol_to_cell(row_pos, is_company_pos)
  83. company_formula = 'IF({},"Y", "N")'.format(is_company_cell)
  84. row_pos = self._write_line(
  85. ws,
  86. row_pos,
  87. ws_params,
  88. col_specs_section="data",
  89. render_space={
  90. "partner": partner,
  91. "company_formula": company_formula,
  92. },
  93. default_format=FORMATS["format_tcell_left"],
  94. )