mirror of https://github.com/OCA/web.git
69 lines
2.6 KiB
Python
69 lines
2.6 KiB
Python
# Copyright 2024 Tecnativa - David Vidal
|
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
|
from collections import defaultdict
|
|
|
|
from odoo import api, fields, models, tools
|
|
|
|
|
|
class QuicktStartScreen(models.Model):
|
|
_name = "quick.start.screen"
|
|
_description = "Quick action selection screen"
|
|
|
|
name = fields.Char(translate=True)
|
|
action_ids = fields.Many2many(comodel_name="quick.start.screen.action")
|
|
|
|
@api.model
|
|
@tools.ormcache("frozenset(self.env.user.groups_id.ids)")
|
|
def _visible_action_ids(self):
|
|
"""Inspired on how menus visibility work in core"""
|
|
screen_actions = self.action_ids.search([]).sudo()
|
|
visible = self.action_ids.browse()
|
|
access = self.env["ir.model.access"]
|
|
MODEL_BY_TYPE = {
|
|
"ir.actions.act_window": "res_model",
|
|
"ir.actions.report": "model",
|
|
"ir.actions.server": "model_name",
|
|
}
|
|
# performance trick: determine the ids to prefetch by type
|
|
prefetch_ids = defaultdict(list)
|
|
for action in screen_actions.mapped("action_ref_id"):
|
|
prefetch_ids[action._name].append(action.id)
|
|
for screen_action in screen_actions:
|
|
action = screen_action.action_ref_id
|
|
action = action.with_prefetch(prefetch_ids[action._name])
|
|
model_name = (
|
|
action._name in MODEL_BY_TYPE and action[MODEL_BY_TYPE[action._name]]
|
|
)
|
|
if not model_name or access.check(model_name, "read", False):
|
|
visible += screen_action
|
|
return set(visible.ids)
|
|
|
|
def _prepare_screen_action(self):
|
|
return {
|
|
"display_name": self.name or self.env._("Start"),
|
|
"name": self.name or self.env._("Start"),
|
|
"res_model": "quick.start.screen.action",
|
|
"target": "current",
|
|
"type": "ir.actions.act_window",
|
|
"view_mode": "kanban",
|
|
"views": [
|
|
[
|
|
self.env.ref(
|
|
"web_quick_start_screen.quick_start_screen_action_kanban"
|
|
).id,
|
|
"kanban",
|
|
]
|
|
],
|
|
}
|
|
|
|
def action_screen_actions(self):
|
|
"""Normally called from a server action"""
|
|
if not self:
|
|
self = self.env.user.quick_start_screen_id
|
|
if not self:
|
|
self = self.browse(self.env.context.get("default_quick_start_screen_id"))
|
|
action = self._prepare_screen_action()
|
|
visible_actions = set(self.action_ids.ids) & self._visible_action_ids()
|
|
action["domain"] = [("id", "in", list(visible_actions))]
|
|
return action
|