File: base_module_install_request.py

package info (click to toggle)
odoo 18.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 878,716 kB
  • sloc: javascript: 927,937; python: 685,670; xml: 388,524; sh: 1,033; sql: 415; makefile: 26
file content (87 lines) | stat: -rw-r--r-- 3,353 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from odoo import api, fields, models, _
from odoo.exceptions import UserError


class BaseModuleInstallRequest(models.TransientModel):
    _name = "base.module.install.request"
    _description = "Module Activation Request"
    _rec_name = "module_id"

    module_id = fields.Many2one(
        'ir.module.module', string="Module", required=True,
        domain=[('state', '=', "uninstalled")],
        ondelete='cascade', readonly=True,
    )
    user_id = fields.Many2one('res.users', default=lambda self: self.env.user, required=True)
    user_ids = fields.Many2many('res.users', string="Send to:", compute='_compute_user_ids')
    body_html = fields.Html('Body')

    @api.depends('module_id')
    def _compute_user_ids(self):
        users = self.env.ref('base.group_system').users
        self.user_ids = [(6, 0, users.ids)]

    def action_send_request(self):
        mail_template = self.env.ref('base_install_request.mail_template_base_install_request')
        menu_id = self.env.ref('base.menu_apps').id
        for user in self.user_ids:
            render_ctx = dict(self.env.context, partner=user.partner_id, menu_id=menu_id)
            mail_template.with_context(render_ctx).send_mail(
                self.id,
                force_send=True,
                email_layout_xmlid='mail.mail_notification_light')
        return {
            'type': 'ir.actions.client',
            'tag': 'display_notification',
            'params': {
                'type': 'success',
                'message': _('Your request has been successfully sent'),
                'next': {'type': 'ir.actions.act_window_close'},
            }
        }


class BaseModuleInstallReview(models.TransientModel):
    _name = "base.module.install.review"
    _description = "Module Activation Review"
    _rec_name = "module_id"

    module_id = fields.Many2one(
        'ir.module.module', string="Module", required=True,
        domain=[('state', '=', "uninstalled")],
        ondelete='cascade', readonly=True,
    )
    module_ids = fields.Many2many(
        'ir.module.module', string="Depending Apps", compute='_compute_modules_description')
    modules_description = fields.Html(compute='_compute_modules_description')

    @api.depends('module_id')
    def _compute_modules_description(self):
        for wizard in self:
            apps = wizard._get_depending_apps(wizard.module_id)
            wizard.module_ids = [(6, 0, apps.ids)]
            wizard.modules_description = self.env["ir.qweb"]._render(
                "base_install_request.base_module_install_review_description", {'apps': apps})

    @api.model
    def _get_depending_apps(self, module):
        if not module:
            raise UserError(_('No module selected.'))
        if module.state == "installed":
            raise UserError(_('The module is already installed.'))
        deps = module.upstream_dependencies()
        apps = module | deps.filtered(lambda d: d.application)
        for dep in deps:
            apps |= dep.upstream_dependencies()
        return apps

    def action_install_module(self):
        self.ensure_one()
        self.module_id.button_immediate_install()
        return {
            'type': 'ir.actions.client',
            'tag': 'home',
        }