diff --git a/__init__.py b/__init__.py index 5b2ef480c07b807b141e836f50066c048468afb0..44fb71a00bc9b32aafc05249aa6b34e856874549 100644 --- a/__init__.py +++ b/__init__.py @@ -1,5 +1,4 @@ # Copyright 2021 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from . import controllers -from . import models +from . import controllers, models diff --git a/__manifest__.py b/__manifest__.py index 93b08e06da8442a7ea7f7069febbe6a589fc6bb4..9b09b8e0558b690b91aa8188ff4c7a17b83cf0c3 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -23,7 +23,6 @@ "views/afac_project_partner.xml", "views/res_company.xml", "views/res_partner.xml", - ], "qweb": [ "static/src/xml/base.xml", diff --git a/controllers/main.py b/controllers/main.py index 8834915753fc3e0f7d03f943f36ce6fb7f64f72b..ed77bd77bc9d25be0844c0b2633c1fa689004327 100644 --- a/controllers/main.py +++ b/controllers/main.py @@ -5,14 +5,12 @@ import operator from odoo.http import content_disposition, request, route from odoo.addons.web.controllers.main import ( - ExportFormat, - GroupsTreeNode, - ExcelExport, CSVExport, + ExcelExport, + GroupsTreeNode, serialize_exception, ) - _logger = logging.getLogger(__name__) @@ -20,19 +18,25 @@ class ExcelExport(ExcelExport): @route("/web/export/xlsx", type="http", auth="user") @serialize_exception def index(self, data, token): - return afac_base(self, data, token) + params = json.loads(data) + if params.get("model") == "res.partner" and params.get("afac"): + return afac_base(self, data, token) + else: + return super(ExcelExport, self).index(data, token) class CSVExport(CSVExport): - @route("/web/export/csv", type="http", auth="user") @serialize_exception def index(self, data, token): - return afac_base(self, data, token) + params = json.loads(data) + if params.get("model") == "res.partner" and params.get("afac"): + return afac_base(self, data, token) + else: + return super(CSVExport, self).index(data, token) def afac_base(object, data, token): - params = json.loads(data) model, fields, ids, domain, import_compat = operator.itemgetter( "model", "fields", "ids", "domain", "import_compat" @@ -83,10 +87,7 @@ def afac_base(object, data, token): return request.make_response( response_data, headers=[ - ( - "Content-Disposition", - content_disposition(object.filename(model)), - ), + ("Content-Disposition", content_disposition(object.filename(model))), ("Content-Type", object.content_type), ], cookies={"fileToken": token}, diff --git a/models/afac_project.py b/models/afac_project.py index 2546c5ec992212ab6eca462c13b4f449b348bad8..3e70ce69f7ba30df9a2d02f6630a0bb00219e58d 100644 --- a/models/afac_project.py +++ b/models/afac_project.py @@ -69,4 +69,3 @@ class AfacProject(models.Model): "default_company_id": self.company_id.id, }, } - diff --git a/models/afac_project_category.py b/models/afac_project_category.py index 4a607d6f62f261cacc7a13ca608f411b45485e50..a6daf28b69520e92bec8a602190d377eebc9ea4b 100644 --- a/models/afac_project_category.py +++ b/models/afac_project_category.py @@ -10,10 +10,7 @@ class AfacProjectCategory(models.Model): name = fields.Char("Nom", required=True) project_id = fields.Many2one( - comodel_name="afac.project", - string="Projet", - ondelete="cascade", - required=True + comodel_name="afac.project", string="Projet", ondelete="cascade", required=True ) active = fields.Boolean(related="project_id.active") company_id = fields.Many2one( diff --git a/models/afac_project_partner.py b/models/afac_project_partner.py index 85b000dbe212b5b80d3849573ff0850e9c1c58ef..3107f6313cf5f47aef9b90c97d08cc23d3272cd2 100644 --- a/models/afac_project_partner.py +++ b/models/afac_project_partner.py @@ -22,10 +22,7 @@ class AfacProjectPartner(models.Model): comodel_name="res.partner", string="Contact", ondelete="cascade", required=True ) project_id = fields.Many2one( - comodel_name="afac.project", - string="Projet", - ondelete="cascade", - required=True + comodel_name="afac.project", string="Projet", ondelete="cascade", required=True ) active = fields.Boolean(related="project_id.active") project_cat_ids = fields.Many2many( diff --git a/models/res_partner.py b/models/res_partner.py index 5506cc3fd2b672d6d484267d6331bab736623ad0..6c5aa506cfc512e313fe2547ac33bc9068429ed9 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -122,52 +122,6 @@ class ResPartner(models.Model): # Default methods # ------------------------------------------------------ - def export_data(self, fields_to_export, afac=False): - - out = super().export_data(fields_to_export) - if afac: - column = [] - datas = out.get("datas", []) - all_projects = ( - self.env["afac.project.partner"] - .search([("partner_id", "in", self.ids)]) - .mapped("project_id") - ) - - if datas: - for afac_project in all_projects: - data_index = 0 - column.append(afac_project.name) - afac_project_category = self.env["afac.project.category"].search( - [("project_id", "=", afac_project.id)] - ) - for project_category in afac_project_category: - column.append(project_category.name) - - for partner in self: - project_partner = self.env["afac.project.partner"].search( - [ - "&", - ("partner_id", "=", partner.id), - ("project_id", "=", afac_project.id), - ] - ) - if project_partner: - datas[data_index].append(1) - else: - datas[data_index].append(0) - - for project_category in afac_project_category: - if project_category in project_partner.project_cat_ids: - datas[data_index].append(1) - else: - datas[data_index].append(0) - data_index += 1 - out["datas"] = datas - out["column"] = column - return out - return out - # ------------------------------------------------------ # Computed fields / Search Fields # ------------------------------------------------------ @@ -305,7 +259,7 @@ class ResPartner(models.Model): self.short_name = self.parent_id.short_name # ------------------------------------------------------ - # CRUD methods (ORM overrides) + # ORM overrides # ------------------------------------------------------ def write(self, vals): """ @@ -340,6 +294,54 @@ class ResPartner(models.Model): return res + def export_data(self, fields_to_export, afac=False): + """ + Hérite la fonction de Model pour ajouter les projets et sous projets dans + l'export si la case est cochée + """ + out = super().export_data(fields_to_export) + if afac: + column = [] + datas = out.get("datas", []) + all_projects = ( + self.env["afac.project.partner"] + .search([("partner_id", "in", self.ids)]) + .mapped("project_id") + ) + if datas: + for afac_project in all_projects: + data_index = 0 + column.append(afac_project.name) + afac_project_category = self.env["afac.project.category"].search( + [("project_id", "=", afac_project.id)] + ) + for project_category in afac_project_category: + column.append(f"{afac_project.name}/{project_category.name}") + + for partner in self: + project_partner = self.env["afac.project.partner"].search( + [ + "&", + ("partner_id", "=", partner.id), + ("project_id", "=", afac_project.id), + ] + ) + if project_partner: + datas[data_index].append(1) + else: + datas[data_index].append(0) + + for project_category in afac_project_category: + if project_category in project_partner.project_cat_ids: + datas[data_index].append(1) + else: + datas[data_index].append(0) + data_index += 1 + out["datas"] = datas + out["column"] = column + return out + return out + # ------------------------------------------------------ # Actions # ------------------------------------------------------ diff --git a/static/src/js/data_export.js b/static/src/js/data_export.js index 100248b60227c2151d436ab4bb098da2f50355f1..4e30fb593d599d75e54f143189fc008c2f26ff4e 100644 --- a/static/src/js/data_export.js +++ b/static/src/js/data_export.js @@ -1,4 +1,4 @@ -odoo.define("base_export_async.DataExport", function (require) { +odoo.define("afac_partner.DataExport", function (require) { "use strict"; var core = require("web.core"); @@ -16,37 +16,34 @@ odoo.define("base_export_async.DataExport", function (require) { _exportData(exportedFields, exportFormat, idsToExport) { const afac = this.$("#o-export-afac-project"); if (afac && afac.is(":checked")) { - console.log("CHECKED"); - console.log(exportedFields); - console.log(exportFormat); - console.log(idsToExport); if (_.isEmpty(exportedFields)) { - Dialog.alert(this, _t("Please select fields to export...")); - return; + Dialog.alert(this, _t("Please select fields to export...")); + return; } if (this.isCompatibleMode) { - exportedFields.unshift({ name: 'id', label: _t('External ID') }); + exportedFields.unshift({name: "id", label: _t("External ID")}); } - framework.blockUI(); - this.getSession().get_file({ - url: '/web/export/' + exportFormat, - data: { - data: JSON.stringify({ - model: this.record.model, - fields: exportedFields, - ids: idsToExport, - domain: this.domain, - groupby: this.groupby, - context: pyUtils.eval('contexts', [this.record.getContext()]), - import_compat: this.isCompatibleMode, - afac: true - }) - }, - complete: framework.unblockUI, - error: (error) => this.call('crash_manager', 'rpc_error', error), - }); - + framework.blockUI(); + this.getSession().get_file({ + url: "/web/export/" + exportFormat, + data: { + data: JSON.stringify({ + model: this.record.model, + fields: exportedFields, + ids: idsToExport, + domain: this.domain, + groupby: this.groupby, + context: pyUtils.eval("contexts", [ + this.record.getContext(), + ]), + import_compat: this.isCompatibleMode, + afac: true, + }), + }, + complete: framework.unblockUI, + error: (error) => this.call("crash_manager", "rpc_error", error), + }); } else { /* Call the standard method if afac is not checked diff --git a/static/src/xml/base.xml b/static/src/xml/base.xml index a440b4691f4b7b4751931fa6d2994470e6a20f1f..c250e8c8c5d47584cdf5a88fffb6ca9db3fc438a 100644 --- a/static/src/xml/base.xml +++ b/static/src/xml/base.xml @@ -1,19 +1,19 @@ -<?xml version="1.0" encoding="UTF-8"?> +<?xml version="1.0" encoding="UTF-8" ?> <templates id="template" xml:space="preserve"> - <t - t-name="ExportDialog" - t-inherit="web.ExportDialog" - t-inherit-mode="extension" -> + <t t-name="ExportDialog" t-inherit="web.ExportDialog" t-inherit-mode="extension"> <xpath expr="//div[hasclass('o_import_compat')]" position="after"> - <p t-if="widget.record.model == 'res.partner'"> - <div class="form-check"> - <input class="form-check-input" id="o-export-afac-project" type="checkbox"/> - <label class="form-check-label" for="o-export-afac-project"> - Export AFAC project + <div t-if="widget.record.model == 'res.partner'" class="mt16 mb16"> + <div class="o_boolean_toggle custom-control custom-checkbox"> + <input + class="custom-control-input" + id="o-export-afac-project" + type="checkbox" + /> + <label class="custom-control-label" for="o-export-afac-project"> + Exporter les projets AFAC </label> </div> - </p> + </div> </xpath> </t> </templates> diff --git a/views/afac_project.xml b/views/afac_project.xml index acc9bc791f2f10da266e8c9ecfae4dd342cd3e32..008f6da0c2c9cb47780562ad0b0919530a4d7a05 100644 --- a/views/afac_project.xml +++ b/views/afac_project.xml @@ -10,9 +10,17 @@ <field name="model">afac.project</field> <field name="arch" type="xml"> <search string="Projets"> - <field name="name" string="Nom du projet"/> - <filter name="active" string="Archivés" domain="[('active', '=', False)]"/> - <filter name="active" string="Tous" domain="[('active', 'in', (True, False))]"/> + <field name="name" string="Nom du projet" /> + <filter + name="active" + string="Archivés" + domain="[('active', '=', False)]" + /> + <filter + name="active" + string="Tous" + domain="[('active', 'in', (True, False))]" + /> </search> </field> </record> diff --git a/views/afac_project_partner.xml b/views/afac_project_partner.xml index a83e6da17d9fc4b884deecd14030e2c257fc49f7..cabda5330d4dbcc3ab536a33dcb8dfd6bbe9636c 100644 --- a/views/afac_project_partner.xml +++ b/views/afac_project_partner.xml @@ -9,7 +9,7 @@ <field name="model">afac.project.partner</field> <field name="arch" type="xml"> <search string="Projets du contact"> - <field name="partner_id"/> + <field name="partner_id" /> <field name="project_cat_ids" /> <field name="project_id" /> <searchpanel>