From 8d9fc7db46f27e9a14d4340621a7d8fa1ea6e2ee Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Thu, 4 Jul 2024 17:20:42 -0400 Subject: [PATCH] impersonate_user: add unimpersonate systray button --- impersonate_user/__init__.py | 1 + impersonate_user/__manifest__.py | 9 +++++-- impersonate_user/controllers/__init__.py | 1 + impersonate_user/controllers/main.py | 9 +++++++ impersonate_user/models/__init__.py | 1 + impersonate_user/models/ir_http.py | 11 ++++++++ impersonate_user/models/res_users.py | 4 +-- .../src/systray_unimpersonate_button.esm.js | 27 +++++++++++++++++++ .../src/systray_unimpersonate_button.xml | 15 +++++++++++ 9 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 impersonate_user/controllers/__init__.py create mode 100644 impersonate_user/controllers/main.py create mode 100644 impersonate_user/models/ir_http.py create mode 100644 impersonate_user/static/src/systray_unimpersonate_button.esm.js create mode 100644 impersonate_user/static/src/systray_unimpersonate_button.xml diff --git a/impersonate_user/__init__.py b/impersonate_user/__init__.py index 0650744..f7209b1 100644 --- a/impersonate_user/__init__.py +++ b/impersonate_user/__init__.py @@ -1 +1,2 @@ from . import models +from . import controllers diff --git a/impersonate_user/__manifest__.py b/impersonate_user/__manifest__.py index 6bdda91..9e68c59 100644 --- a/impersonate_user/__manifest__.py +++ b/impersonate_user/__manifest__.py @@ -25,11 +25,16 @@ "author": "Bemade Inc.", "website": "http://www.bemade.org", "license": "LGPL-3", - "depends": ["base"], + "depends": ["web"], "data": [ "views/impersonation_views.xml", ], - "assets": {}, + "assets": { + "web.assets_backend": [ + "impersonate_user/static/src/**/*.js", + "impersonate_user/static/src/**/*.xml", + ] + }, "installable": True, "auto_install": False, } diff --git a/impersonate_user/controllers/__init__.py b/impersonate_user/controllers/__init__.py new file mode 100644 index 0000000..12a7e52 --- /dev/null +++ b/impersonate_user/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/impersonate_user/controllers/main.py b/impersonate_user/controllers/main.py new file mode 100644 index 0000000..f2e8d80 --- /dev/null +++ b/impersonate_user/controllers/main.py @@ -0,0 +1,9 @@ +from odoo import http +from odoo.http import request + + +class UserImpersonationController(http.Controller): + + @http.route("/unimpersonate", type="json", auth="user") + def unimpersonate(self): + return request.env["res.users"].sudo().unimpersonate() diff --git a/impersonate_user/models/__init__.py b/impersonate_user/models/__init__.py index 8835165..943b46c 100644 --- a/impersonate_user/models/__init__.py +++ b/impersonate_user/models/__init__.py @@ -1 +1,2 @@ from . import res_users +from . import ir_http diff --git a/impersonate_user/models/ir_http.py b/impersonate_user/models/ir_http.py new file mode 100644 index 0000000..85fcf10 --- /dev/null +++ b/impersonate_user/models/ir_http.py @@ -0,0 +1,11 @@ +from odoo import models +from odoo.http import request + + +class IrHttp(models.AbstractModel): + _inherit = "ir.http" + + def session_info(self): + result = super().session_info() + result["user_impersonated"] = bool(request.session.get("original_uid", False)) + return result diff --git a/impersonate_user/models/res_users.py b/impersonate_user/models/res_users.py index 4e85214..3bc5cc8 100644 --- a/impersonate_user/models/res_users.py +++ b/impersonate_user/models/res_users.py @@ -1,4 +1,4 @@ -from odoo import models, fields +from odoo import models, fields, _, api from odoo.exceptions import AccessError from odoo.http import request @@ -22,8 +22,8 @@ class ResUsers(models.Model): "target": "self", } + @api.model def unimpersonate(self): - self.ensure_one() original_uid = request.session.pop("original_uid", False) if original_uid: request.session.uid = original_uid diff --git a/impersonate_user/static/src/systray_unimpersonate_button.esm.js b/impersonate_user/static/src/systray_unimpersonate_button.esm.js new file mode 100644 index 0000000..ef974ea --- /dev/null +++ b/impersonate_user/static/src/systray_unimpersonate_button.esm.js @@ -0,0 +1,27 @@ +/** @odoo-module **/ + +import {Component} from "@odoo/owl"; +import {useService} from "@web/core/utils/hooks"; +import {session} from "@web/session"; +import {registry} from "@web/core/registry"; + +export class SystrayUnimpersonateButton extends Component { + setup() { + this.rpc = useService("rpc"); + this.action = useService("action"); + } + + async unimpersonate() { + this.rpc("/unimpersonate", {}).then((result) => this.action.doAction(result)); + } + + get isVisible() { + return session.user_impersonated; + } +} + +SystrayUnimpersonateButton.props = {}; +SystrayUnimpersonateButton.template = "impersonate_user.SystrayUnimpersonateButton"; +registry.category("systray").add("unimpersonate_button", { + Component: SystrayUnimpersonateButton, +}); diff --git a/impersonate_user/static/src/systray_unimpersonate_button.xml b/impersonate_user/static/src/systray_unimpersonate_button.xml new file mode 100644 index 0000000..be79cf9 --- /dev/null +++ b/impersonate_user/static/src/systray_unimpersonate_button.xml @@ -0,0 +1,15 @@ + + + + + +