Skip to content

Commit 2d19579

Browse files
committed
[FIX] dms: Delete the file if the attachment is deleted
When deleting an attachment, an attempt should be made to delete the linked file, causing an error if it is locked. Do not show the Delete/Archive/Unarchive option on files if it is locked and you cannot unlock it. Fixes OCA#381
1 parent 0aa7e6b commit 2d19579

File tree

4 files changed

+32
-4
lines changed

4 files changed

+32
-4
lines changed

dms/models/dms_file.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ def check_access_token(self, access_token=False):
202202
prefetch=False,
203203
invisible=True,
204204
ondelete="cascade",
205+
index=True,
205206
)
206207

207208
def get_human_size(self):

dms/models/ir_attachment.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2021 Tecnativa - Víctor Martínez
1+
# Copyright 2021-2025 Tecnativa - Víctor Martínez
22
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
33
from odoo import api, models
44
from odoo.tools import ormcache
@@ -57,6 +57,7 @@ def _dms_operations(self):
5757
)
5858
):
5959
continue
60+
6061
directories = attachment._get_dms_directories(
6162
attachment.res_model, attachment.res_id
6263
)
@@ -100,3 +101,8 @@ def write(self, vals):
100101
):
101102
self._dms_operations()
102103
return res
104+
105+
def unlink(self):
106+
if not self.env.context.get("dms_file"):
107+
self.env["dms.file"].search([("attachment_id", "in", self.ids)]).unlink()
108+
return super().unlink()

dms/tests/test_storage_attachment.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Copyright 2021 Tecnativa - João Marques
33
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
44

5+
from odoo.exceptions import AccessError
56
from odoo.tests.common import users
67
from odoo.tools import mute_logger
78

@@ -42,6 +43,26 @@ def test_storage_attachment_record_db_unlink(self):
4243
directories = self.env["dms.directory"].search([])
4344
self.assertNotIn(directory.id, directories.ids)
4445

46+
@mute_logger("odoo.models.unlink")
47+
def test_storage_attachment_unlink_lock_file(self):
48+
group_partner_manager = self.env.ref("base.group_partner_manager")
49+
self.dms_manager_user.write({"groups_id": [(4, group_partner_manager.id)]})
50+
self.dms_user.write({"groups_id": [(4, group_partner_manager.id)]})
51+
attachment = self._create_attachment("demo.txt")
52+
attachment = attachment.with_user(self.dms_manager_user)
53+
file = self.storage.storage_file_ids.filtered(lambda x: x.name == "demo.txt")
54+
file.with_user(self.dms_user).lock()
55+
self.assertTrue(file.is_locked)
56+
self.assertFalse(file.is_lock_editor)
57+
with self.assertRaises(AccessError):
58+
attachment.unlink()
59+
self.assertTrue(file.exists())
60+
file.with_user(self.dms_user).unlock()
61+
self.assertFalse(file.is_locked)
62+
file.invalidate_recordset()
63+
attachment.unlink()
64+
self.assertFalse(file.exists())
65+
4566
@users("dms-manager")
4667
def test_storage_attachment_misc(self):
4768
attachment = self._create_attachment("demo.txt")

dms/views/dms_file.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@
152152
Unlock
153153
</a>
154154
<a
155-
t-if="record.permission_write.raw_value and record.active.raw_value"
155+
t-if="record.permission_write.raw_value and record.active.raw_value and (!record.is_locked.raw_value or (record.is_locked.raw_value and record.is_lock_editor.raw_value))"
156156
role="menuitem"
157157
name="toggle_active"
158158
type="object"
@@ -162,7 +162,7 @@
162162
Archive
163163
</a>
164164
<a
165-
t-if="record.permission_write.raw_value and !record.active.raw_value"
165+
t-if="record.permission_write.raw_value and !record.active.raw_value and (!record.is_locked.raw_value or (record.is_locked.raw_value and record.is_lock_editor.raw_value))"
166166
role="menuitem"
167167
name="toggle_active"
168168
type="object"
@@ -204,7 +204,7 @@
204204
Edit
205205
</a>
206206
<a
207-
t-if="record.permission_unlink.raw_value"
207+
t-if="record.permission_unlink.raw_value and (!record.is_locked.raw_value or (record.is_locked.raw_value and record.is_lock_editor.raw_value))"
208208
role="menuitem"
209209
type="delete"
210210
class="dropdown-item"

0 commit comments

Comments
 (0)