impersonate_user: add unimpersonate systray button

This commit is contained in:
Marc Durepos 2024-07-04 17:20:42 -04:00
parent aed5ad9aed
commit 8d9fc7db46
9 changed files with 74 additions and 4 deletions

View file

@ -1 +1,2 @@
from . import models
from . import controllers

View file

@ -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,
}

View file

@ -0,0 +1 @@
from . import main

View file

@ -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()

View file

@ -1 +1,2 @@
from . import res_users
from . import ir_http

View file

@ -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

View file

@ -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

View file

@ -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,
});

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t t-name="impersonate_user.SystrayUnimpersonateButton">
<div t-if="isVisible" class="o-dropdown dropdown o-dropdown--no-caret">
<button
type="button"
t-on-click="unimpersonate"
class="dropdown-toggle o-dropdown--narrow"
title="Unimpersonate"
>
<i class="oi oi-close" role="img" aria-label="Unimpersonate" />
</button>
</div>
</t>
</templates>