From eba8bfa25c03d55bc2453ffc1873f3e3ba261bf3 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Thu, 20 Mar 2025 12:37:06 +0100 Subject: [PATCH 01/14] [ADD] support --- support/__init__.py | 1 + support/__manifest__.py | 20 ++++++++ support/data/cross_connect_server.xml | 16 ++++++ support/data/ir_actions_server.xml | 18 +++++++ support/models/__init__.py | 2 + support/models/cross_connect_server.py | 66 +++++++++++++++++++++++++ support/models/ir_actions.py | 20 ++++++++ support/pyproject.toml | 3 ++ support/security/res_groups.xml | 21 ++++++++ support/static/img/icon.png | Bin 0 -> 33727 bytes 10 files changed, 167 insertions(+) create mode 100644 support/__init__.py create mode 100644 support/__manifest__.py create mode 100644 support/data/cross_connect_server.xml create mode 100644 support/data/ir_actions_server.xml create mode 100644 support/models/__init__.py create mode 100644 support/models/cross_connect_server.py create mode 100644 support/models/ir_actions.py create mode 100644 support/pyproject.toml create mode 100644 support/security/res_groups.xml create mode 100644 support/static/img/icon.png diff --git a/support/__init__.py b/support/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/support/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/support/__manifest__.py b/support/__manifest__.py new file mode 100644 index 00000000..19150a3e --- /dev/null +++ b/support/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2025 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Support", + "summary": "Provide Akretion cross connect support integration", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "Akretion", + "website": "https://github.com/akretion/support", + "depends": [ + "cross_connect_client", + ], + "data": [ + "data/cross_connect_server.xml", + "data/ir_actions_server.xml", + "security/res_groups.xml", + ], +} diff --git a/support/data/cross_connect_server.xml b/support/data/cross_connect_server.xml new file mode 100644 index 00000000..93d47548 --- /dev/null +++ b/support/data/cross_connect_server.xml @@ -0,0 +1,16 @@ + + + + + + Support + https://erp-fr.akretion.com/api-support + Paste remote api key here + + + + diff --git a/support/data/ir_actions_server.xml b/support/data/ir_actions_server.xml new file mode 100644 index 00000000..92131be0 --- /dev/null +++ b/support/data/ir_actions_server.xml @@ -0,0 +1,18 @@ + + + + + + Créer un ticket support + + code + action = model.redirect_to_support() + + + diff --git a/support/models/__init__.py b/support/models/__init__.py new file mode 100644 index 00000000..8fa8191b --- /dev/null +++ b/support/models/__init__.py @@ -0,0 +1,2 @@ +from . import ir_actions +from . import cross_connect_server diff --git a/support/models/cross_connect_server.py b/support/models/cross_connect_server.py new file mode 100644 index 00000000..c35df3e7 --- /dev/null +++ b/support/models/cross_connect_server.py @@ -0,0 +1,66 @@ +# Copyright 2025 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import api, models +from urllib.parse import urlencode + + +class CrossConnectServer(models.Model): + _inherit = "cross.connect.server" + + @api.model + def redirect_to_support(self): + """Redirect to the support page""" + server = self.env.ref("support.akretion_erp") + url = f"/cross_connect_server/{server.id}" + params = { + "origin_db": self.env.cr.dbname, + } + res_model = self.env.context.get("active_model") + res_id = self.env.context.get("active_id") + params["origin_url"] = ( + self.env["ir.config_parameter"].sudo().get_param("web.base.url") or "" + ) + if res_model and res_id: + record = self.env[res_model].browse(res_id) + params["origin_name"] = record.name_get()[0][1] + + url_params = { + "view_type": "form", + "model": res_model, + "id": res_id, + "active_id": res_id, + "cids": ",".join(str(x) for x in self.env.companies.ids), + } + + action = self.env.context.get("params", {}).get("action") + if not action: + action = self.env["ir.actions.act_window"].search( + [("res_model", "=", res_model), ("view_mode", "ilike", "form")], + limit=1, + ) + if action: + action = action.id + if action: + url_params["action"] = action + + params["origin_url"] += f"/web#{urlencode(url_params)}" + + redirect_params = { + "action": "project_customer_access.action_view_all_task", + "view_type": "form", + **{ + f"project.task_default_{field}": value + for field, value in params.items() + }, + } + + final_params = {"redirect_url": f"/web#{urlencode(redirect_params)}"} + url += "?" + urlencode(final_params) + return { + "type": "ir.actions.act_url", + "url": url, + "target": "self", + } diff --git a/support/models/ir_actions.py b/support/models/ir_actions.py new file mode 100644 index 00000000..a60e1469 --- /dev/null +++ b/support/models/ir_actions.py @@ -0,0 +1,20 @@ +# Copyright 2025 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class IrActions(models.Model): + _inherit = "ir.actions.actions" + + @api.model + def get_bindings(self, model_name): + """Add support action to every model""" + res = super().get_bindings(model_name) + if self.env.user.has_group("support.akretion_erp_group_customer"): + action_id = "support.cross_connect_support" + if action_id not in [act.get("xml_id") for act in res["action"]]: + res["action"].append(self._for_xml_id(action_id)) + + return res diff --git a/support/pyproject.toml b/support/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/support/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/support/security/res_groups.xml b/support/security/res_groups.xml new file mode 100644 index 00000000..13ab91a0 --- /dev/null +++ b/support/security/res_groups.xml @@ -0,0 +1,21 @@ + + + + + + Support: Support User + + + + + Support: Support Manager + + + + + + diff --git a/support/static/img/icon.png b/support/static/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b2fb4aea3348b5bc68aa3d0d1271f6fa509bb248 GIT binary patch literal 33727 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 literal 0 HcmV?d00001 From f12bd44e844d00e03da9dc339e6a8ee053b2b311 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Tue, 1 Apr 2025 12:14:07 +0200 Subject: [PATCH 02/14] [IMP] support: Custom redirection for akretion members --- support/models/cross_connect_server.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/support/models/cross_connect_server.py b/support/models/cross_connect_server.py index c35df3e7..79486b83 100644 --- a/support/models/cross_connect_server.py +++ b/support/models/cross_connect_server.py @@ -1,10 +1,12 @@ # Copyright 2025 Akretion (http://www.akretion.com). # @author Florian Mounier # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - +import re from odoo import api, models -from urllib.parse import urlencode +from urllib.parse import urlencode, urlparse + +AKRETION_EMAILS_RE = re.compile(r"^(.*@akretion\.com(\.br)?)$") class CrossConnectServer(models.Model): @@ -59,8 +61,20 @@ def redirect_to_support(self): final_params = {"redirect_url": f"/web#{urlencode(redirect_params)}"} url += "?" + urlencode(final_params) + + # Akretion users specific case + if self.env.user.email and AKRETION_EMAILS_RE.match(self.env.user.email): + redirect_params["action"] = ( + "custom_akretion_project.action_view_all_task_real" + ) + server_url = urlparse(server.server_url) + server_url = server_url._replace( + path="/web", + fragment=urlencode(redirect_params), + ) + url = server_url.geturl() return { "type": "ir.actions.act_url", "url": url, - "target": "self", + "target": "new", } From 366e9fc8dee7395fa82c82fc15afef1f464494e8 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Wed, 2 Apr 2025 09:44:32 +0200 Subject: [PATCH 03/14] [IMP] support: Add remote budget group --- support/security/res_groups.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/support/security/res_groups.xml b/support/security/res_groups.xml index 13ab91a0..36486e21 100644 --- a/support/security/res_groups.xml +++ b/support/security/res_groups.xml @@ -17,5 +17,11 @@ + + Support: Support Budget Access + + + + From c8fe190054c1acaab4e0fea0446161acf912d181 Mon Sep 17 00:00:00 2001 From: Bonnerue Date: Tue, 1 Apr 2025 07:59:13 +0200 Subject: [PATCH 04/14] [FIX] ir_actions, in get_binding : res do not have always 'action' --- support/models/ir_actions.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/support/models/ir_actions.py b/support/models/ir_actions.py index a60e1469..07af48b0 100644 --- a/support/models/ir_actions.py +++ b/support/models/ir_actions.py @@ -14,7 +14,10 @@ def get_bindings(self, model_name): res = super().get_bindings(model_name) if self.env.user.has_group("support.akretion_erp_group_customer"): action_id = "support.cross_connect_support" - if action_id not in [act.get("xml_id") for act in res["action"]]: - res["action"].append(self._for_xml_id(action_id)) + if "action" in res: + if action_id not in [act.get("xml_id") for act in res["action"]]: + res["action"].append(self._for_xml_id(action_id)) + else: + res["action"] = [self._for_xml_id(action_id)] return res From 96e2fceba4b4e3c3393258deeab340d35d79b49c Mon Sep 17 00:00:00 2001 From: Florian da Costa Date: Thu, 3 Apr 2025 19:59:47 +0200 Subject: [PATCH 05/14] [IMP] Display create support task menu for users having any support cross connect server group --- support/models/ir_actions.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/support/models/ir_actions.py b/support/models/ir_actions.py index 07af48b0..28748d5e 100644 --- a/support/models/ir_actions.py +++ b/support/models/ir_actions.py @@ -12,7 +12,9 @@ class IrActions(models.Model): def get_bindings(self, model_name): """Add support action to every model""" res = super().get_bindings(model_name) - if self.env.user.has_group("support.akretion_erp_group_customer"): + support_server = self.env.ref("support.akretion_erp", raise_if_not_found=False) or self.env["cross.connect.server"] + support_groups = self.env.user.groups_id & support_server.group_ids + if support_groups: action_id = "support.cross_connect_support" if "action" in res: if action_id not in [act.get("xml_id") for act in res["action"]]: From 98f2501e9f33712190b2a6d23b95bdcc57cb1ba3 Mon Sep 17 00:00:00 2001 From: Florian da Costa Date: Thu, 3 Apr 2025 12:03:30 +0200 Subject: [PATCH 06/14] [IMP] Extract support_akretion from support module to make it generic --- support/__manifest__.py | 3 +-- support/data/cross_connect_server.xml | 4 ++-- support/models/cross_connect_server.py | 2 +- support/models/ir_actions.py | 2 +- support/security/res_groups.xml | 27 -------------------------- 5 files changed, 5 insertions(+), 33 deletions(-) delete mode 100644 support/security/res_groups.xml diff --git a/support/__manifest__.py b/support/__manifest__.py index 19150a3e..188b867d 100644 --- a/support/__manifest__.py +++ b/support/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Support", - "summary": "Provide Akretion cross connect support integration", + "summary": "Provide cross connect support integration", "version": "16.0.1.0.0", "license": "AGPL-3", "author": "Akretion", @@ -15,6 +15,5 @@ "data": [ "data/cross_connect_server.xml", "data/ir_actions_server.xml", - "security/res_groups.xml", ], } diff --git a/support/data/cross_connect_server.xml b/support/data/cross_connect_server.xml index 93d47548..fec9a26b 100644 --- a/support/data/cross_connect_server.xml +++ b/support/data/cross_connect_server.xml @@ -6,9 +6,9 @@ --> - + Support - https://erp-fr.akretion.com/api-support + your-server-url/api-support Paste remote api key here diff --git a/support/models/cross_connect_server.py b/support/models/cross_connect_server.py index 79486b83..9207686c 100644 --- a/support/models/cross_connect_server.py +++ b/support/models/cross_connect_server.py @@ -15,7 +15,7 @@ class CrossConnectServer(models.Model): @api.model def redirect_to_support(self): """Redirect to the support page""" - server = self.env.ref("support.akretion_erp") + server = self.env.ref("support.support_server") url = f"/cross_connect_server/{server.id}" params = { "origin_db": self.env.cr.dbname, diff --git a/support/models/ir_actions.py b/support/models/ir_actions.py index 28748d5e..6d26baf7 100644 --- a/support/models/ir_actions.py +++ b/support/models/ir_actions.py @@ -12,7 +12,7 @@ class IrActions(models.Model): def get_bindings(self, model_name): """Add support action to every model""" res = super().get_bindings(model_name) - support_server = self.env.ref("support.akretion_erp", raise_if_not_found=False) or self.env["cross.connect.server"] + support_server = self.env.ref("support.support_server", raise_if_not_found=False) or self.env["cross.connect.server"] support_groups = self.env.user.groups_id & support_server.group_ids if support_groups: action_id = "support.cross_connect_support" diff --git a/support/security/res_groups.xml b/support/security/res_groups.xml deleted file mode 100644 index 36486e21..00000000 --- a/support/security/res_groups.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - Support: Support User - - - - - Support: Support Manager - - - - - - Support: Support Budget Access - - - - - - From 08effe5778cb01e96ce135813de55025e86140c5 Mon Sep 17 00:00:00 2001 From: Florian da Costa Date: Thu, 3 Apr 2025 23:59:42 +0200 Subject: [PATCH 07/14] [FIX] rights when creating external task + remove custom task akretion action --- support/data/cross_connect_server.xml | 2 +- support/data/ir_actions_server.xml | 1 + support/models/cross_connect_server.py | 5 ++++- support/models/ir_actions.py | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/support/data/cross_connect_server.xml b/support/data/cross_connect_server.xml index fec9a26b..c7c22a63 100644 --- a/support/data/cross_connect_server.xml +++ b/support/data/cross_connect_server.xml @@ -4,7 +4,7 @@ @author Florian Mounier License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> - + Support diff --git a/support/data/ir_actions_server.xml b/support/data/ir_actions_server.xml index 92131be0..fd124efb 100644 --- a/support/data/ir_actions_server.xml +++ b/support/data/ir_actions_server.xml @@ -9,6 +9,7 @@ Créer un ticket support + code Date: Fri, 23 May 2025 17:20:03 +0200 Subject: [PATCH 08/14] Apply pre-commit stuff --- support/data/cross_connect_server.xml | 16 +++++++--------- support/data/ir_actions_server.xml | 20 ++++++++------------ support/models/cross_connect_server.py | 6 ++---- support/models/ir_actions.py | 5 ++++- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/support/data/cross_connect_server.xml b/support/data/cross_connect_server.xml index c7c22a63..e6779243 100644 --- a/support/data/cross_connect_server.xml +++ b/support/data/cross_connect_server.xml @@ -1,16 +1,14 @@ - + - - - Support - your-server-url/api-support - Paste remote api key here - - - + + Support + your-server-url/api-support + Paste remote api key here + + diff --git a/support/data/ir_actions_server.xml b/support/data/ir_actions_server.xml index fd124efb..a75863a3 100644 --- a/support/data/ir_actions_server.xml +++ b/support/data/ir_actions_server.xml @@ -1,19 +1,15 @@ - + - - - Créer un ticket support - - - code - action = model.redirect_to_support() - - + + Créer un ticket support + + + code + action = model.redirect_to_support() + diff --git a/support/models/cross_connect_server.py b/support/models/cross_connect_server.py index 9f21bc7c..b88b82d7 100644 --- a/support/models/cross_connect_server.py +++ b/support/models/cross_connect_server.py @@ -2,9 +2,9 @@ # @author Florian Mounier # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import re +from urllib.parse import urlencode, urlparse from odoo import api, models -from urllib.parse import urlencode, urlparse AKRETION_EMAILS_RE = re.compile(r"^(.*@akretion\.com(\.br)?)$") @@ -67,9 +67,7 @@ def redirect_to_support(self): # Akretion users specific case if self.env.user.email and AKRETION_EMAILS_RE.match(self.env.user.email): - redirect_params["action"] = ( - "project.action_view_task" - ) + redirect_params["action"] = "project.action_view_task" server_url = urlparse(server.server_url) server_url = server_url._replace( path="/web", diff --git a/support/models/ir_actions.py b/support/models/ir_actions.py index e1947411..d394b0b4 100644 --- a/support/models/ir_actions.py +++ b/support/models/ir_actions.py @@ -12,7 +12,10 @@ class IrActions(models.Model): def get_bindings(self, model_name): """Add support action to every model""" res = super().get_bindings(model_name) - support_server = self.sudo().env.ref("support.support_server", raise_if_not_found=False) or self.env["cross.connect.server"].sudo() + support_server = ( + self.sudo().env.ref("support.support_server", raise_if_not_found=False) + or self.env["cross.connect.server"].sudo() + ) support_groups = self.env.user.groups_id & support_server.group_ids if support_groups: action_id = "support.cross_connect_support" From b766073a8e069642c06d8284de41673e3872e632 Mon Sep 17 00:00:00 2001 From: Florian da Costa Date: Fri, 23 May 2025 17:23:01 +0200 Subject: [PATCH 09/14] [MIG] migrate support to v18 --- support/README.rst | 55 ++++ support/__manifest__.py | 2 +- support/readme/DESCRIPTION.md | 1 + support/static/description/index.html | 409 ++++++++++++++++++++++++++ 4 files changed, 466 insertions(+), 1 deletion(-) create mode 100644 support/README.rst create mode 100644 support/readme/DESCRIPTION.md create mode 100644 support/static/description/index.html diff --git a/support/README.rst b/support/README.rst new file mode 100644 index 00000000..5d8ebc6e --- /dev/null +++ b/support/README.rst @@ -0,0 +1,55 @@ +======= +Support +======= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:855fe761de693eead0e3c0b2089a90e99dc1deda377363bb8cc8daddb76f2668 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-Akretion%2Fsupport-lightgray.png?logo=github + :target: https://github.com/Akretion/support/tree/18.0/support + :alt: Akretion/support + +|badge1| |badge2| |badge3| + +Create Task from client Odoo from any menu + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Akretion + +Maintainers +----------- + +This module is part of the `Akretion/support `_ project on GitHub. + +You are welcome to contribute. diff --git a/support/__manifest__.py b/support/__manifest__.py index 188b867d..e4942e3a 100644 --- a/support/__manifest__.py +++ b/support/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Support", "summary": "Provide cross connect support integration", - "version": "16.0.1.0.0", + "version": "18.0.1.0.0", "license": "AGPL-3", "author": "Akretion", "website": "https://github.com/akretion/support", diff --git a/support/readme/DESCRIPTION.md b/support/readme/DESCRIPTION.md new file mode 100644 index 00000000..0e7e5222 --- /dev/null +++ b/support/readme/DESCRIPTION.md @@ -0,0 +1 @@ +Create Task from client Odoo from any menu diff --git a/support/static/description/index.html b/support/static/description/index.html new file mode 100644 index 00000000..262e40cc --- /dev/null +++ b/support/static/description/index.html @@ -0,0 +1,409 @@ + + + + + +Support + + + +

+ + From 5f431420a6d72575b339f532f11378207cc3c822 Mon Sep 17 00:00:00 2001 From: David Beal Date: Tue, 14 Oct 2025 16:53:09 +0200 Subject: [PATCH 10/14] support: switch name_get to display_name --- support/models/cross_connect_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/models/cross_connect_server.py b/support/models/cross_connect_server.py index b88b82d7..cae7838a 100644 --- a/support/models/cross_connect_server.py +++ b/support/models/cross_connect_server.py @@ -30,7 +30,7 @@ def redirect_to_support(self): ) if res_model and res_id: record = self.env[res_model].browse(res_id) - params["origin_name"] = record.name_get()[0][1] + params["origin_name"] = record.display_name url_params = { "view_type": "form", From b18f431e408a4e1880002896d698a6d00889b59d Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Tue, 9 Dec 2025 12:09:49 +0100 Subject: [PATCH 11/14] [IMP] support: Work with params and not server redirect_url --- support/models/cross_connect_server.py | 27 +++----------------------- 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/support/models/cross_connect_server.py b/support/models/cross_connect_server.py index cae7838a..62b4ce6e 100644 --- a/support/models/cross_connect_server.py +++ b/support/models/cross_connect_server.py @@ -1,12 +1,10 @@ # Copyright 2025 Akretion (http://www.akretion.com). # @author Florian Mounier # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import re -from urllib.parse import urlencode, urlparse -from odoo import api, models +from urllib.parse import urlencode -AKRETION_EMAILS_RE = re.compile(r"^(.*@akretion\.com(\.br)?)$") +from odoo import api, models class CrossConnectServer(models.Model): @@ -53,27 +51,8 @@ def redirect_to_support(self): params["origin_url"] += f"/web#{urlencode(url_params)}" - redirect_params = { - "action": "project_customer_access.action_view_all_task", - "view_type": "form", - **{ - f"project.task_default_{field}": value - for field, value in params.items() - }, - } - - final_params = {"redirect_url": f"/web#{urlencode(redirect_params)}"} - url += "?" + urlencode(final_params) + url += "?" + urlencode(params) - # Akretion users specific case - if self.env.user.email and AKRETION_EMAILS_RE.match(self.env.user.email): - redirect_params["action"] = "project.action_view_task" - server_url = urlparse(server.server_url) - server_url = server_url._replace( - path="/web", - fragment=urlencode(redirect_params), - ) - url = server_url.geturl() return { "type": "ir.actions.act_url", "url": url, From 7726e4662cb19787275bb3f5040e07a0a9204f08 Mon Sep 17 00:00:00 2001 From: Florian da Costa Date: Fri, 16 Jan 2026 12:23:08 +0100 Subject: [PATCH 12/14] [IMP] Add explicit new intent in client support ticket creation --- support/models/cross_connect_server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/support/models/cross_connect_server.py b/support/models/cross_connect_server.py index 62b4ce6e..79894b45 100644 --- a/support/models/cross_connect_server.py +++ b/support/models/cross_connect_server.py @@ -28,6 +28,7 @@ def redirect_to_support(self): ) if res_model and res_id: record = self.env[res_model].browse(res_id) + params["intent"] = "new" params["origin_name"] = record.display_name url_params = { From 900d5290190ac7d7d6637981d268020645e04446 Mon Sep 17 00:00:00 2001 From: Akretion Git Bot Date: Fri, 6 Mar 2026 13:29:59 +0000 Subject: [PATCH 13/14] [ADD] icon.png --- support/static/description/icon.png | Bin 0 -> 10254 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 support/static/description/icon.png diff --git a/support/static/description/icon.png b/support/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcc49c24f364e9adf0afbc6fc0bac6dbecdeb11 GIT binary patch literal 10254 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 Date: Mon, 29 Jun 2026 10:28:42 +0200 Subject: [PATCH 14/14] [MIG] Migrate support to 19 --- support/README.rst | 12 ++++++++---- support/__manifest__.py | 2 +- support/data/ir_actions_server.xml | 2 +- support/models/ir_actions.py | 2 +- support/static/description/index.html | 26 ++++++++++++++++---------- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/support/README.rst b/support/README.rst index 5d8ebc6e..bf0ce36a 100644 --- a/support/README.rst +++ b/support/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ======= Support ======= @@ -13,11 +17,11 @@ Support .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-Akretion%2Fsupport-lightgray.png?logo=github - :target: https://github.com/Akretion/support/tree/18.0/support + :target: https://github.com/Akretion/support/tree/19.0/support :alt: Akretion/support |badge1| |badge2| |badge3| @@ -35,7 +39,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -50,6 +54,6 @@ Authors Maintainers ----------- -This module is part of the `Akretion/support `_ project on GitHub. +This module is part of the `Akretion/support `_ project on GitHub. You are welcome to contribute. diff --git a/support/__manifest__.py b/support/__manifest__.py index e4942e3a..7b640287 100644 --- a/support/__manifest__.py +++ b/support/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Support", "summary": "Provide cross connect support integration", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "license": "AGPL-3", "author": "Akretion", "website": "https://github.com/akretion/support", diff --git a/support/data/ir_actions_server.xml b/support/data/ir_actions_server.xml index a75863a3..7c66e875 100644 --- a/support/data/ir_actions_server.xml +++ b/support/data/ir_actions_server.xml @@ -8,7 +8,7 @@ Créer un ticket support - + code action = model.redirect_to_support() diff --git a/support/models/ir_actions.py b/support/models/ir_actions.py index d394b0b4..c65e39fb 100644 --- a/support/models/ir_actions.py +++ b/support/models/ir_actions.py @@ -16,7 +16,7 @@ def get_bindings(self, model_name): self.sudo().env.ref("support.support_server", raise_if_not_found=False) or self.env["cross.connect.server"].sudo() ) - support_groups = self.env.user.groups_id & support_server.group_ids + support_groups = self.env.user.group_ids & support_server.group_ids if support_groups: action_id = "support.cross_connect_support" if "action" in res: diff --git a/support/static/description/index.html b/support/static/description/index.html index 262e40cc..f783909f 100644 --- a/support/static/description/index.html +++ b/support/static/description/index.html @@ -3,7 +3,7 @@ -Support +README.rst -
-

Support

+
+ + +Odoo Community Association + +
+

Support

-

Beta License: AGPL-3 Akretion/support

+

Beta License: AGPL-3 Akretion/support

Create Task from client Odoo from any menu

Table of contents

@@ -383,27 +388,28 @@

Support

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Akretion
-

Maintainers

-

This module is part of the Akretion/support project on GitHub.

+

Maintainers

+

This module is part of the Akretion/support project on GitHub.

You are welcome to contribute.

+
+

Support

+ + +

Beta License: AGPL-3 Akretion/support

+

Create Task from client Odoo from any menu

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
+
+
+

Maintainers

+

This module is part of the Akretion/support project on GitHub.

+

You are welcome to contribute.

+
+
+