mirror of https://github.com/OCA/web.git
108 lines
3.2 KiB
Python
108 lines
3.2 KiB
Python
# © 2018 Iván Todorovich <ivan.todorovich@gmail.com>
|
|
# © 2019-Today GRAP
|
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class TileCategory(models.Model):
|
|
_name = "tile.category"
|
|
_description = "Dashboard Tile Category"
|
|
_order = "sequence asc"
|
|
|
|
name = fields.Char(required=True)
|
|
|
|
sequence = fields.Integer(required=True, default=10)
|
|
|
|
active = fields.Boolean(default=True)
|
|
|
|
action_id = fields.Many2one(
|
|
string="Odoo Action", comodel_name="ir.actions.act_window", readonly=True
|
|
)
|
|
|
|
menu_id = fields.Many2one(
|
|
string="Odoo Menu", comodel_name="ir.ui.menu", readonly=True
|
|
)
|
|
|
|
tile_ids = fields.One2many(
|
|
string="Tiles", comodel_name="tile.tile", inverse_name="category_id"
|
|
)
|
|
|
|
tile_qty = fields.Integer(
|
|
string="Tiles Quantity",
|
|
compute="_compute_tile_qty",
|
|
store=True,
|
|
)
|
|
|
|
@api.depends("tile_ids")
|
|
def _compute_tile_qty(self):
|
|
for category in self:
|
|
category.tile_qty = len(category.tile_ids)
|
|
|
|
def _prepare_action(self):
|
|
self.ensure_one()
|
|
return {
|
|
"name": self.name,
|
|
"res_model": "tile.tile",
|
|
"type": "ir.actions.act_window",
|
|
"view_mode": "kanban",
|
|
"domain": """[
|
|
('hidden', '=', False),
|
|
'|', ('user_id', '=', False), ('user_id', '=', uid),
|
|
('category_id', '=', {self.id})
|
|
]""".format(
|
|
self=self
|
|
),
|
|
}
|
|
|
|
def _prepare_menu(self):
|
|
self.ensure_one()
|
|
return {
|
|
"name": self.name,
|
|
"parent_id": self.env.ref("web_dashboard_tile.menu_dashboard_tile").id,
|
|
"action": "ir.actions.act_window,%d" % self.action_id.id,
|
|
"sequence": self.sequence,
|
|
}
|
|
|
|
def _create_ui(self):
|
|
IrUiMenu = self.env["ir.ui.menu"]
|
|
IrActionsActWindows = self.env["ir.actions.act_window"]
|
|
for category in self:
|
|
if not category.action_id:
|
|
category.action_id = IrActionsActWindows.create(
|
|
category._prepare_action()
|
|
)
|
|
if not category.menu_id:
|
|
category.menu_id = IrUiMenu.create(category._prepare_menu())
|
|
|
|
def _delete_ui(self):
|
|
for category in self:
|
|
if category.menu_id:
|
|
category.menu_id.unlink()
|
|
if category.action_id:
|
|
category.action_id.unlink()
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
categories = super().create(vals_list)
|
|
categories.filtered(lambda x: x.active)._create_ui()
|
|
return categories
|
|
|
|
def write(self, vals):
|
|
res = super().write(vals)
|
|
if "active" in vals.keys():
|
|
if vals.get("active"):
|
|
self._create_ui()
|
|
else:
|
|
self._delete_ui()
|
|
if "sequence" in vals.keys():
|
|
self.mapped("menu_id").write({"sequence": vals["sequence"]})
|
|
if "name" in vals.keys():
|
|
self.mapped("menu_id").write({"name": vals["name"]})
|
|
self.mapped("action_id").write({"name": vals["name"]})
|
|
return res
|
|
|
|
def unlink(self):
|
|
self._delete_ui()
|
|
return super().unlink()
|