Skip to content

Commit 436f6b4

Browse files
committed
[UPD] auditlog_security groupfield version
1 parent bb6f666 commit 436f6b4

7 files changed

Lines changed: 78 additions & 119 deletions

File tree

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
# Copyright 2021-2024 Therp B.V.
1+
# Copyright 2021-2025 Therp B.V.
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
33

44
from . import auditlog_rule
55
from . import auditlog_line_access_rule
6-
from . import ir_rule
6+
from . import auditlog_log
77
from . import auditlog_log_line
Lines changed: 1 addition & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Copyright 2021-2024 Therp B.V.
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
33

4-
from odoo import api, fields, models
4+
from odoo import fields, models
55

66

77
class AuditlogLineAccessRule(models.Model):
@@ -23,96 +23,3 @@ class AuditlogLineAccessRule(models.Model):
2323
"auditlog.rule", "auditlog_access_rule_ids", readonly=True, ondelete="cascade"
2424
)
2525
state = fields.Selection(related="auditlog_rule_id.state", readonly=True)
26-
27-
def needs_rule(self):
28-
self.ensure_one()
29-
return bool(self.group_ids)
30-
31-
def get_linked_rules(self):
32-
return self.env["ir.rule"].search(
33-
[("auditlog_line_access_rule_id", "in", self.ids)]
34-
)
35-
36-
def unlink(self):
37-
to_delete = self.get_linked_rules()
38-
res = super(AuditlogLineAccessRule, self).unlink()
39-
if res:
40-
res = res and to_delete.unlink()
41-
return res
42-
43-
def add_default_group_if_needed(self):
44-
self.ensure_one()
45-
res = False
46-
if not self.group_ids and self.field_ids:
47-
res = self.with_context(no_iter=True).write(
48-
{"group_ids": [(6, 0, [self.env.ref("base.group_user").id])]}
49-
)
50-
return res
51-
52-
@api.model_create_multi
53-
def create(self, vals):
54-
res = super(AuditlogLineAccessRule, self).create(vals)
55-
res.add_default_group_if_needed()
56-
res.regenerate_rules()
57-
return res
58-
59-
def write(self, vals):
60-
res = super(AuditlogLineAccessRule, self).write(vals)
61-
for this in self:
62-
added = this.add_default_group_if_needed()
63-
if (
64-
any(
65-
[
66-
x in vals
67-
for x in ("group_ids", "field_ids", "model_id", "all_fields")
68-
]
69-
)
70-
or added
71-
):
72-
this.regenerate_rules()
73-
74-
return res
75-
76-
def remove_rules(self):
77-
for this in self:
78-
this.get_linked_rules().unlink()
79-
80-
def regenerate_rules(self):
81-
for this in self:
82-
this.remove_rules()
83-
dict_values = this._prepare_rule_values()
84-
for values in dict_values:
85-
self.env["ir.rule"].create(values)
86-
87-
def _prepare_rule_values(self):
88-
self.ensure_one()
89-
if not self.needs_rule():
90-
return []
91-
domain_force = "[" + " ('log_id.model_id' , '=', %s)," % (self.model_id.id)
92-
if self.field_ids:
93-
domain_force = "[('field_id', 'in', %s)]" % (self.field_ids.ids)
94-
model = self.env.ref("auditlog.model_auditlog_log_line")
95-
else:
96-
domain_force = "[('model_id', '=', %s)]" % (self.model_id.id)
97-
model = self.env.ref("auditlog.model_auditlog_log")
98-
auditlog_security_group = self.env.ref(
99-
"auditlog_security.group_can_view_audit_logs"
100-
)
101-
return [
102-
{
103-
"name": "auditlog_extended_%s" % self.id,
104-
"model_id": model.id,
105-
"groups": [(6, 0, self.group_ids.ids)],
106-
"perm_read": True,
107-
"domain_force": domain_force,
108-
"auditlog_line_access_rule_id": self.id,
109-
},
110-
{
111-
"name": "auditlog_extended_%s" % self.id,
112-
"model_id": model.id,
113-
"groups": [(6, 0, [auditlog_security_group.id])],
114-
"perm_read": True,
115-
"domain_force": [(1, "=", 1)],
116-
"auditlog_line_access_rule_id": self.id,
117-
},
118-
]
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Copyright 2025 Therp B.V.
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
from odoo import api, fields, models
5+
6+
7+
class AuditlogLog(models.Model):
8+
_inherit = "auditlog.log"
9+
10+
rule_id = fields.Many2one("auditlog.rule", compute="_compute_rule_id", store=True)
11+
allowed_group_ids = fields.Many2many(
12+
"res.groups", compute="_compute_allowed_group_ids", store=True
13+
)
14+
15+
@api.depends("model_id")
16+
def _compute_rule_id(self):
17+
for log in self:
18+
log.rule_id = self.env["auditlog.rule"].search(
19+
[("model_id", "=", log.model_id.id)]
20+
)
21+
22+
@api.depends("rule_id")
23+
def _compute_allowed_group_ids(self):
24+
for log in self:
25+
log.allowed_group_ids = (
26+
self.env["auditlog.line.access.rule"]
27+
.search([("auditlog_rule_id", "=", log.rule_id.id)])
28+
.mapped("group_ids")
29+
)

auditlog_security/models/auditlog_log_line.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ class AuditlogLogLine(models.Model):
2020
"ir.model", compute="_compute_model_id", store=True, index=True
2121
)
2222
res_id = fields.Integer(compute="_compute_res_id", store=True, index=True)
23+
allowed_group_ids = fields.Many2many(
24+
"res.groups", compute="_compute_allowed_group_ids", store=True
25+
)
2326

2427
@api.depends("log_id.method")
2528
def _compute_method(self):
@@ -40,3 +43,26 @@ def _compute_model_id(self):
4043
def _compute_res_id(self):
4144
for this in self:
4245
this.res_id = this.log_id.res_id
46+
47+
@api.depends(
48+
"log_id.rule_id",
49+
"field_id",
50+
"log_id.rule_id.auditlog_line_access_rule_ids",
51+
"log_id.rule_id.auditlog_line_access_rule_ids.group_ids",
52+
"log_id.rule_id.auditlog_line_access_rule_ids.field_ids",
53+
)
54+
def _compute_allowed_group_ids(self):
55+
for line in self:
56+
# Do not give a value to sql model
57+
if line._name == "auditlog.log.line.view":
58+
continue
59+
line.allowed_group_ids = (
60+
self.env["auditlog.line.access.rule"]
61+
.search(
62+
[
63+
("auditlog_rule_id", "=", line.log_id.rule_id.id),
64+
("field_ids", "in", line.field_id.ids),
65+
]
66+
)
67+
.group_ids
68+
)

auditlog_security/models/auditlog_rule.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,19 +118,14 @@ def subscribe(self):
118118
for rule in self:
119119
server_action = rule._create_server_action()
120120
server_action.create_action()
121-
res = super(AuditlogRule, self).subscribe()
122-
for rule in self:
123-
rule.auditlog_line_access_rule_ids.regenerate_rules()
124-
# rule now will have "View Log" Action, make that visible only for admin
121+
res = super().subscribe()
125122
if res:
126123
self.action_id.write(
127124
{"groups_id": [(6, 0, [self.env.ref("base.group_system").id])]}
128125
)
129126
return res
130127

131128
def unsubscribe(self):
132-
for rule in self:
133-
rule.auditlog_line_access_rule_ids.remove_rules()
134129
for rule in self:
135130
rule.server_action_id.unlink()
136-
return super(AuditlogRule, self).unsubscribe()
131+
return super().unsubscribe()

auditlog_security/models/ir_rule.py

Lines changed: 0 additions & 16 deletions
This file was deleted.

auditlog_security/security/ir_rule.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,22 @@
1515
<field name="perm_unlink" eval="False" />
1616
</record>
1717

18+
<record id="auditlog_log_rule" model="ir.rule">
19+
<field name="name">Access to auditlog.log</field>
20+
<field name="model_id" ref="auditlog.model_auditlog_log" />
21+
<field
22+
name="domain_force"
23+
>[('allowed_group_ids', 'in', user.groups_id.ids)]</field>
24+
<field name="perm_read" eval="False" />
25+
</record>
26+
27+
<record id="auditlog_log_line_rule" model="ir.rule">
28+
<field name="name">Access to auditlog.log.line</field>
29+
<field name="model_id" ref="auditlog.model_auditlog_log_line" />
30+
<field
31+
name="domain_force"
32+
>[('allowed_group_ids', 'in', user.groups_id.ids)]</field>
33+
<field name="perm_read" eval="False" />
34+
</record>
35+
1836
</odoo>

0 commit comments

Comments
 (0)