odoo-addon-dms 16.0.1.8.0.3__py3-none-any.whl → 17.0.1.0.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- odoo/addons/dms/README.rst +132 -78
- odoo/addons/dms/__manifest__.py +34 -16
- odoo/addons/dms/actions/file.xml +1 -3
- odoo/addons/dms/controllers/main.py +0 -34
- odoo/addons/dms/controllers/portal.py +178 -92
- odoo/addons/dms/data/onboarding_data.xml +77 -0
- odoo/addons/dms/demo/access_group.xml +3 -9
- odoo/addons/dms/i18n/de.po +13 -117
- odoo/addons/dms/i18n/dms.pot +137 -174
- odoo/addons/dms/i18n/es.po +15 -58
- odoo/addons/dms/i18n/fr.po +296 -450
- odoo/addons/dms/i18n/he_IL.po +13 -117
- odoo/addons/dms/i18n/it.po +15 -131
- odoo/addons/dms/i18n/nl.po +13 -117
- odoo/addons/dms/i18n/pt.po +13 -121
- odoo/addons/dms/i18n/pt_BR.po +28 -147
- odoo/addons/dms/i18n/ru.po +13 -117
- odoo/addons/dms/models/__init__.py +7 -1
- odoo/addons/dms/models/abstract_dms_mixin.py +1 -1
- odoo/addons/dms/models/access_groups.py +18 -11
- odoo/addons/dms/models/base.py +10 -2
- odoo/addons/dms/models/directory.py +46 -75
- odoo/addons/dms/models/{category.py → dms_category.py} +10 -42
- odoo/addons/dms/models/dms_file.py +125 -147
- odoo/addons/dms/models/dms_security_mixin.py +26 -22
- odoo/addons/dms/models/ir_attachment.py +0 -1
- odoo/addons/dms/models/ir_binary.py +19 -0
- odoo/addons/dms/models/mail_thread.py +2 -4
- odoo/addons/dms/models/mixins_thumbnail.py +13 -8
- odoo/addons/dms/models/onboarding_onboarding.py +16 -0
- odoo/addons/dms/models/onboarding_onboarding_step.py +50 -0
- odoo/addons/dms/models/res_company.py +22 -47
- odoo/addons/dms/models/res_config_settings.py +0 -1
- odoo/addons/dms/models/storage.py +4 -24
- odoo/addons/dms/models/tag.py +1 -1
- odoo/addons/dms/readme/CONFIGURE.md +59 -0
- odoo/addons/dms/readme/CONTRIBUTORS.md +14 -0
- odoo/addons/dms/readme/CREDITS.md +6 -0
- odoo/addons/dms/readme/DESCRIPTION.md +9 -0
- odoo/addons/dms/readme/INSTALL.md +4 -0
- odoo/addons/dms/readme/ROADMAP.md +19 -0
- odoo/addons/dms/readme/USAGE.md +11 -0
- odoo/addons/dms/security/security.xml +1 -0
- odoo/addons/dms/static/description/icon.png +0 -0
- odoo/addons/dms/static/description/icon.svg +4 -1
- odoo/addons/dms/static/description/index.html +133 -88
- odoo/addons/dms/static/description/portal_icon.svg +12 -0
- odoo/addons/dms/static/src/js/fields/{path_owl.esm.js → path_json/path_owl.esm.js} +22 -4
- odoo/addons/dms/static/src/js/fields/{path_owl.xml → path_json/path_owl.xml} +7 -4
- odoo/addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js +47 -0
- odoo/addons/dms/static/src/js/{views/fields/binary → fields/preview_binary}/preview_record.xml +5 -4
- odoo/addons/dms/static/src/js/views/dms_file_upload.esm.js +155 -148
- odoo/addons/dms/static/src/js/views/file_kanban_controller.xml +0 -1
- odoo/addons/dms/static/src/js/views/file_kanban_record.esm.js +26 -27
- odoo/addons/dms/static/src/js/views/file_kanban_renderer.esm.js +1 -2
- odoo/addons/dms/static/src/js/views/file_kanban_renderer.xml +12 -16
- odoo/addons/dms/static/src/js/views/file_kanban_view.esm.js +11 -9
- odoo/addons/dms/static/src/js/views/file_list_controller.esm.js +1 -1
- odoo/addons/dms/static/src/js/views/file_list_renderer.xml +1 -7
- odoo/addons/dms/static/src/js/views/file_list_view.esm.js +11 -9
- odoo/addons/dms/static/src/js/views/search_panel.esm.js +9 -10
- odoo/addons/dms/static/src/models/attachment.esm.js +83 -82
- odoo/addons/dms/static/src/models/attachment_image.esm.js +30 -28
- odoo/addons/dms/static/src/models/attachment_viewer_viewable.esm.js +27 -25
- odoo/addons/dms/static/src/scss/directory_kanban.scss +28 -73
- odoo/addons/dms/static/src/scss/dms_common.scss +69 -0
- odoo/addons/dms/static/src/scss/file_kanban.scss +22 -34
- odoo/addons/dms/static/src/scss/portal.scss +12 -0
- odoo/addons/dms/static/tests/tours/dms_portal_tour.esm.js +46 -0
- odoo/addons/dms/{views/dms_portal_templates.xml → template/portal.xml} +13 -3
- odoo/addons/dms/tests/common.py +20 -4
- odoo/addons/dms/tests/data/mail01.eml +2 -2
- odoo/addons/dms/tests/data/mail02.eml +2 -2
- odoo/addons/dms/tests/test_benchmark.py +16 -21
- odoo/addons/dms/tests/test_directory.py +128 -40
- odoo/addons/dms/tests/test_file.py +112 -30
- odoo/addons/dms/tests/test_file_database.py +50 -24
- odoo/addons/dms/tests/test_portal.py +50 -37
- odoo/addons/dms/tests/test_storage_attachment.py +85 -63
- odoo/addons/dms/tests/test_storage_database.py +89 -35
- odoo/addons/dms/tools/file.py +63 -11
- odoo/addons/dms/views/dms_access_groups_views.xml +2 -17
- odoo/addons/dms/views/{category.xml → dms_category.xml} +4 -9
- odoo/addons/dms/views/{directory.xml → dms_directory.xml} +168 -176
- odoo/addons/dms/views/dms_file.xml +170 -191
- odoo/addons/dms/views/{tag.xml → dms_tag.xml} +50 -53
- odoo/addons/dms/views/menu.xml +52 -21
- odoo/addons/dms/views/res_config_settings.xml +31 -82
- odoo/addons/dms/views/storage.xml +7 -13
- odoo_addon_dms-17.0.1.0.0.2.dist-info/METADATA +257 -0
- {odoo_addon_dms-16.0.1.8.0.3.dist-info → odoo_addon_dms-17.0.1.0.0.2.dist-info}/RECORD +93 -93
- {odoo_addon_dms-16.0.1.8.0.3.dist-info → odoo_addon_dms-17.0.1.0.0.2.dist-info}/WHEEL +1 -1
- odoo_addon_dms-17.0.1.0.0.2.dist-info/top_level.txt +1 -0
- odoo/addons/dms/readme/CONFIGURE.rst +0 -40
- odoo/addons/dms/readme/CONTRIBUTORS.rst +0 -16
- odoo/addons/dms/readme/CREDITS.rst +0 -6
- odoo/addons/dms/readme/DESCRIPTION.rst +0 -6
- odoo/addons/dms/readme/INSTALL.rst +0 -9
- odoo/addons/dms/readme/ROADMAP.rst +0 -8
- odoo/addons/dms/readme/USAGE.rst +0 -8
- odoo/addons/dms/static/src/js/components/path/path.esm.js +0 -0
- odoo/addons/dms/static/src/js/dms_portal_tour.js +0 -57
- odoo/addons/dms/static/src/js/fields/path.js +0 -81
- odoo/addons/dms/static/src/js/views/fields/binary/preview_record.esm.js +0 -35
- odoo/addons/dms/static/src/js/views/many_drop_target.js +0 -98
- odoo/addons/dms/static/src/scss/variables.scss +0 -9
- odoo/addons/dms/static/src/xml/views.xml +0 -72
- odoo/addons/dms/template/assets.xml +0 -44
- odoo/addons/dms/template/onboarding.xml +0 -97
- odoo_addon_dms-16.0.1.8.0.3.dist-info/METADATA +0 -203
- odoo_addon_dms-16.0.1.8.0.3.dist-info/top_level.txt +0 -1
@@ -1,15 +1,15 @@
|
|
1
1
|
# Copyright 2017-2019 MuK IT GmbH.
|
2
2
|
# Copyright 2020 Creu Blanca
|
3
|
+
# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com).
|
3
4
|
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
|
4
5
|
|
5
6
|
import os
|
6
7
|
|
7
8
|
from odoo import api, fields, models
|
8
|
-
from odoo.
|
9
|
+
from odoo.tools.misc import file_path
|
9
10
|
|
10
11
|
|
11
12
|
class Thumbnail(models.AbstractModel):
|
12
|
-
|
13
13
|
_name = "dms.mixins.thumbnail"
|
14
14
|
_inherit = "image.mixin"
|
15
15
|
_description = "DMS thumbnail and icon mixin"
|
@@ -17,11 +17,16 @@ class Thumbnail(models.AbstractModel):
|
|
17
17
|
icon_url = fields.Char(string="Icon URL", compute="_compute_icon_url")
|
18
18
|
|
19
19
|
def _get_icon_disk_path(self):
|
20
|
-
"""
|
21
|
-
folders = ["static", "icons"]
|
20
|
+
"""Get the local disk path to record icon."""
|
22
21
|
name = self._get_icon_placeholder_name()
|
23
|
-
|
24
|
-
|
22
|
+
folders = ["dms", "static", "icons"]
|
23
|
+
|
24
|
+
try:
|
25
|
+
path = file_path(os.path.join(*folders, name))
|
26
|
+
except FileNotFoundError:
|
27
|
+
return file_path(os.path.join(*folders, "file_unknown.svg"))
|
28
|
+
|
29
|
+
return path or file_path(os.path.join(*folders, "file_unknown.svg"))
|
25
30
|
|
26
31
|
def _get_icon_placeholder_name(self):
|
27
32
|
return "folder.svg"
|
@@ -38,7 +43,7 @@ class Thumbnail(models.AbstractModel):
|
|
38
43
|
for one in self:
|
39
44
|
# Get URL to thumbnail or to the default icon by file extension
|
40
45
|
one.icon_url = (
|
41
|
-
"/web/image/{}/{}/image_128/128x128?crop=1"
|
46
|
+
f"/web/image/{one._name}/{one.id}/image_128/128x128?crop=1"
|
42
47
|
if one.image_128
|
43
|
-
else one._get_icon_url()
|
48
|
+
else f"{one._get_icon_url()}?crop=1"
|
44
49
|
)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com).
|
2
|
+
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
|
3
|
+
|
4
|
+
|
5
|
+
from odoo import api, models
|
6
|
+
|
7
|
+
|
8
|
+
class OnboardingOnboarding(models.Model):
|
9
|
+
_inherit = "onboarding.onboarding"
|
10
|
+
|
11
|
+
# ----------------------------------------------------------
|
12
|
+
# Actions
|
13
|
+
# ----------------------------------------------------------
|
14
|
+
@api.model
|
15
|
+
def action_close_panel_dms_file(self):
|
16
|
+
self.action_close_panel("dms.onboarding_onboarding_dms_file")
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com).
|
2
|
+
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
|
3
|
+
|
4
|
+
|
5
|
+
from odoo import api, models
|
6
|
+
|
7
|
+
|
8
|
+
class OnboardingOnboardingStep(models.Model):
|
9
|
+
_inherit = "onboarding.onboarding.step"
|
10
|
+
|
11
|
+
# ----------------------------------------------------------
|
12
|
+
# Actions
|
13
|
+
# ----------------------------------------------------------
|
14
|
+
@api.model
|
15
|
+
def action_open_documents_onboarding_storage(self):
|
16
|
+
"""
|
17
|
+
Open the form to create a new storage from the onboarding panel.
|
18
|
+
"""
|
19
|
+
return self.env.ref("dms.action_dms_storage_new").read()[0]
|
20
|
+
|
21
|
+
@api.model
|
22
|
+
def action_open_documents_onboarding_directory(self):
|
23
|
+
"""
|
24
|
+
Open the form to create a new directory from the onboarding panel.
|
25
|
+
"""
|
26
|
+
storage = self.env["dms.storage"].search([], order="create_date desc", limit=1)
|
27
|
+
action = self.env.ref("dms.action_dms_directory_new").read()[0]
|
28
|
+
action["context"] = {
|
29
|
+
**self.env.context,
|
30
|
+
**{
|
31
|
+
"default_is_root_directory": True,
|
32
|
+
"default_storage_id": storage and storage.id,
|
33
|
+
},
|
34
|
+
}
|
35
|
+
return action
|
36
|
+
|
37
|
+
@api.model
|
38
|
+
def action_open_documents_onboarding_file(self):
|
39
|
+
"""
|
40
|
+
Open the form to create a new file from the onboarding panel.
|
41
|
+
"""
|
42
|
+
directory = self.env["dms.directory"].search(
|
43
|
+
[], order="create_date desc", limit=1
|
44
|
+
)
|
45
|
+
action = self.env.ref("dms.action_dms_file_new").read()[0]
|
46
|
+
action["context"] = {
|
47
|
+
**self.env.context,
|
48
|
+
**{"default_directory_id": directory and directory.id},
|
49
|
+
}
|
50
|
+
return action
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# Copyright 2020 Creu Blanca
|
2
2
|
# Copyright 2017-2019 MuK IT GmbH
|
3
|
+
# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com).
|
3
4
|
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
|
4
5
|
|
5
6
|
import logging
|
@@ -10,13 +11,8 @@ _logger = logging.getLogger(__name__)
|
|
10
11
|
|
11
12
|
|
12
13
|
class ResCompany(models.Model):
|
13
|
-
|
14
14
|
_inherit = "res.company"
|
15
15
|
|
16
|
-
# ----------------------------------------------------------
|
17
|
-
# Database
|
18
|
-
# ----------------------------------------------------------
|
19
|
-
|
20
16
|
documents_onboarding_state = fields.Selection(
|
21
17
|
selection=[
|
22
18
|
("not_done", "Not done"),
|
@@ -26,7 +22,6 @@ class ResCompany(models.Model):
|
|
26
22
|
],
|
27
23
|
default="not_done",
|
28
24
|
)
|
29
|
-
|
30
25
|
documents_onboarding_storage_state = fields.Selection(
|
31
26
|
selection=[
|
32
27
|
("not_done", "Not done"),
|
@@ -36,7 +31,6 @@ class ResCompany(models.Model):
|
|
36
31
|
],
|
37
32
|
default="not_done",
|
38
33
|
)
|
39
|
-
|
40
34
|
documents_onboarding_directory_state = fields.Selection(
|
41
35
|
selection=[
|
42
36
|
("not_done", "Not done"),
|
@@ -46,7 +40,6 @@ class ResCompany(models.Model):
|
|
46
40
|
],
|
47
41
|
default="not_done",
|
48
42
|
)
|
49
|
-
|
50
43
|
documents_onboarding_file_state = fields.Selection(
|
51
44
|
selection=[
|
52
45
|
("not_done", "Not done"),
|
@@ -57,55 +50,37 @@ class ResCompany(models.Model):
|
|
57
50
|
default="not_done",
|
58
51
|
)
|
59
52
|
|
60
|
-
# ----------------------------------------------------------
|
61
53
|
# Functions
|
62
|
-
# ----------------------------------------------------------
|
63
|
-
|
64
54
|
def get_and_update_documents_onboarding_state(self):
|
65
|
-
|
66
|
-
"documents_onboarding_state", self.get_documents_steps_states_names()
|
67
|
-
)
|
68
|
-
|
69
|
-
def get_documents_steps_states_names(self):
|
70
|
-
return [
|
55
|
+
step_states = [
|
71
56
|
"documents_onboarding_storage_state",
|
72
57
|
"documents_onboarding_directory_state",
|
73
58
|
"documents_onboarding_file_state",
|
74
59
|
]
|
60
|
+
onboarding_state = "documents_onboarding_state"
|
61
|
+
old_values = {}
|
62
|
+
all_done = True
|
75
63
|
|
76
|
-
|
77
|
-
|
78
|
-
|
64
|
+
for step_state in step_states:
|
65
|
+
old_values[step_state] = self[step_state]
|
66
|
+
if self[step_state] == "just_done":
|
67
|
+
self[step_state] = "done"
|
68
|
+
all_done = all_done and self[step_state] == "done"
|
79
69
|
|
80
|
-
|
81
|
-
|
82
|
-
|
70
|
+
if all_done:
|
71
|
+
old_values[onboarding_state] = (
|
72
|
+
"just_done" if self[onboarding_state] == "not_done" else "done"
|
73
|
+
)
|
74
|
+
self[onboarding_state] = "done"
|
83
75
|
|
84
|
-
|
85
|
-
def action_open_documents_onboarding_directory(self):
|
86
|
-
storage = self.env["dms.storage"].search([], order="create_date desc", limit=1)
|
87
|
-
action = self.env.ref("dms.action_dms_directory_new").read()[0]
|
88
|
-
action["context"] = {
|
89
|
-
**self.env.context,
|
90
|
-
**{
|
91
|
-
"default_is_root_directory": True,
|
92
|
-
"default_storage_id": storage and storage.id,
|
93
|
-
},
|
94
|
-
}
|
95
|
-
return action
|
96
|
-
|
97
|
-
@api.model
|
98
|
-
def action_open_documents_onboarding_file(self):
|
99
|
-
directory = self.env["dms.directory"].search(
|
100
|
-
[], order="create_date desc", limit=1
|
101
|
-
)
|
102
|
-
action = self.env.ref("dms.action_dms_file_new").read()[0]
|
103
|
-
action["context"] = {
|
104
|
-
**self.env.context,
|
105
|
-
**{"default_directory_id": directory and directory.id},
|
106
|
-
}
|
107
|
-
return action
|
76
|
+
return old_values
|
108
77
|
|
78
|
+
# Actions
|
109
79
|
@api.model
|
110
80
|
def action_close_documents_onboarding(self):
|
111
81
|
self.env.user.company_id.documents_onboarding_state = "closed"
|
82
|
+
|
83
|
+
def set_onboarding_step_done(self, step):
|
84
|
+
self.ensure_one()
|
85
|
+
if self[step] == "not_done":
|
86
|
+
self[step] = "just_done"
|
@@ -12,16 +12,10 @@ _logger = logging.getLogger(__name__)
|
|
12
12
|
|
13
13
|
|
14
14
|
class Storage(models.Model):
|
15
|
-
|
16
15
|
_name = "dms.storage"
|
17
16
|
_description = "Storage"
|
18
17
|
|
19
|
-
# ----------------------------------------------------------
|
20
|
-
# Database
|
21
|
-
# ----------------------------------------------------------
|
22
|
-
|
23
18
|
name = fields.Char(required=True)
|
24
|
-
|
25
19
|
save_type = fields.Selection(
|
26
20
|
selection=[
|
27
21
|
("database", _("Database")),
|
@@ -30,11 +24,10 @@ class Storage(models.Model):
|
|
30
24
|
],
|
31
25
|
default="database",
|
32
26
|
required=True,
|
33
|
-
help="
|
34
|
-
|
35
|
-
|
27
|
+
help="The save type is used to determine how a file is saved by the system. "
|
28
|
+
"If you change this setting, you can migrate existing files manually by "
|
29
|
+
"triggering the action.",
|
36
30
|
)
|
37
|
-
|
38
31
|
company_id = fields.Many2one(
|
39
32
|
comodel_name="res.company",
|
40
33
|
string="Company",
|
@@ -42,13 +35,11 @@ class Storage(models.Model):
|
|
42
35
|
help="If set, directories and files will only be available for "
|
43
36
|
"the selected company.",
|
44
37
|
)
|
45
|
-
|
46
38
|
is_hidden = fields.Boolean(
|
47
39
|
string="Storage is Hidden",
|
48
40
|
default=False,
|
49
41
|
help="Indicates if directories and files are hidden by default.",
|
50
42
|
)
|
51
|
-
|
52
43
|
root_directory_ids = fields.One2many(
|
53
44
|
comodel_name="dms.directory",
|
54
45
|
inverse_name="storage_id",
|
@@ -57,7 +48,6 @@ class Storage(models.Model):
|
|
57
48
|
readonly=False,
|
58
49
|
copy=False,
|
59
50
|
)
|
60
|
-
|
61
51
|
storage_directory_ids = fields.One2many(
|
62
52
|
comodel_name="dms.directory",
|
63
53
|
inverse_name="storage_id",
|
@@ -66,7 +56,6 @@ class Storage(models.Model):
|
|
66
56
|
readonly=True,
|
67
57
|
copy=False,
|
68
58
|
)
|
69
|
-
|
70
59
|
storage_file_ids = fields.One2many(
|
71
60
|
comodel_name="dms.file",
|
72
61
|
inverse_name="storage_id",
|
@@ -75,22 +64,19 @@ class Storage(models.Model):
|
|
75
64
|
readonly=True,
|
76
65
|
copy=False,
|
77
66
|
)
|
78
|
-
|
79
67
|
count_storage_directories = fields.Integer(
|
80
68
|
compute="_compute_count_storage_directories", string="Count Directories"
|
81
69
|
)
|
82
|
-
|
83
70
|
count_storage_files = fields.Integer(
|
84
71
|
compute="_compute_count_storage_files", string="Count Files"
|
85
72
|
)
|
86
|
-
|
87
73
|
model_ids = fields.Many2many("ir.model", string="Linked Models")
|
88
74
|
inherit_access_from_parent_record = fields.Boolean(
|
89
75
|
string="Inherit permissions from related record",
|
90
76
|
default=False,
|
91
77
|
help="Indicate if directories and files access work only with "
|
92
78
|
"related model access (for example, if some directories are related "
|
93
|
-
"with any sale, only users with read access to these sale can
|
79
|
+
"with any sale, only users with read access to these sale can access)",
|
94
80
|
)
|
95
81
|
include_message_attachments = fields.Boolean(
|
96
82
|
string="Create files from message attachments",
|
@@ -110,10 +96,7 @@ class Storage(models.Model):
|
|
110
96
|
if record.save_type == "attachment":
|
111
97
|
record.inherit_access_from_parent_record = True
|
112
98
|
|
113
|
-
# ----------------------------------------------------------
|
114
99
|
# Actions
|
115
|
-
# ----------------------------------------------------------
|
116
|
-
|
117
100
|
def action_storage_migrate(self):
|
118
101
|
if self.save_type != "attachment":
|
119
102
|
if not self.env.user.has_group("dms.group_dms_manager"):
|
@@ -132,10 +115,7 @@ class Storage(models.Model):
|
|
132
115
|
"documents_onboarding_storage_state"
|
133
116
|
)
|
134
117
|
|
135
|
-
# ----------------------------------------------------------
|
136
118
|
# Read, View
|
137
|
-
# ----------------------------------------------------------
|
138
|
-
|
139
119
|
@api.depends("storage_directory_ids")
|
140
120
|
def _compute_count_storage_directories(self):
|
141
121
|
for record in self:
|
odoo/addons/dms/models/tag.py
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
# Configuration
|
2
|
+
|
3
|
+
To configure this module, you need to:
|
4
|
+
|
5
|
+
## 1. Create a storage
|
6
|
+
1. Go to *Documents -\> Configuration -\> Storages*.
|
7
|
+
|
8
|
+
2. Create a new document storage. You can choose between three options on `Save Type`:
|
9
|
+
- `Database`: Store the files on the database as a field
|
10
|
+
- `Attachment`: Store the files as attachments
|
11
|
+
- `File`: Store the files on the file system
|
12
|
+
|
13
|
+
## 2. Create an access group
|
14
|
+
1. Next, create an administrative access group. Go to *Configuration -\> Access Groups*.
|
15
|
+
- Create a new group, name it appropriately, and turn on all three
|
16
|
+
permissions (Create, Write and Unlink. Read is implied and always
|
17
|
+
enabled).
|
18
|
+
- Add any other top-level administrative users to the group if
|
19
|
+
needed (your user should already be there).
|
20
|
+
- You can create other groups in here later for fine-grained access
|
21
|
+
control.
|
22
|
+
|
23
|
+
## 3. Create a directory
|
24
|
+
1. Afterward, go to *Documents -\> Directories*.
|
25
|
+
|
26
|
+
2. Create a new directory, mark it as root and select the previously created setting.
|
27
|
+
- Select the *Groups* tab and add your administrative group created
|
28
|
+
above.
|
29
|
+
If your directory was already created before the group, you can also add it in the
|
30
|
+
access groups (*Configuration -\> Access Groups*).
|
31
|
+
|
32
|
+
3. In the directory settings, you can also add other access groups (created above) that will be able to:
|
33
|
+
- read
|
34
|
+
- create
|
35
|
+
- write
|
36
|
+
- delete
|
37
|
+
|
38
|
+
# Migration
|
39
|
+
|
40
|
+
If you need to modify the storage `Save Type` you might want to migrate
|
41
|
+
the file data. To achieve it, you need to:
|
42
|
+
|
43
|
+
1. Go to *Documents -\> Configuration -\> Storage* and select the
|
44
|
+
storage you want to modify
|
45
|
+
2. Modify the save type
|
46
|
+
3. Press the button Migrate files if you want to migrate all the files
|
47
|
+
at once
|
48
|
+
4. Press the button Manual File Migration to specify files one by one
|
49
|
+
|
50
|
+
You can check all the files that still need to be migrated from all
|
51
|
+
storages and migrate them manually on *Documents -\> Configuration -\>
|
52
|
+
Migration*
|
53
|
+
|
54
|
+
# File Wizard Selection
|
55
|
+
|
56
|
+
There is an action called `action_dms_file_wizard_selector` to open a
|
57
|
+
wizard to list files in kanban view. This can be used (example
|
58
|
+
dms_attachment_link module) to add a button in kanban view with the
|
59
|
+
action we need.
|
@@ -0,0 +1,14 @@
|
|
1
|
+
- Mathias Markl \<<mathias.markl@mukit.at>\>
|
2
|
+
- Enric Tobella \<<etobella@creublanca.es>\>
|
3
|
+
- Antoni Romera
|
4
|
+
- Gelu Boros \<<gelu.boros@rgbconsulting.com>\>
|
5
|
+
- [Tecnativa](https://www.tecnativa.com):
|
6
|
+
- Víctor Martínez
|
7
|
+
- Pedro M. Baeza
|
8
|
+
- Jairo Llopis
|
9
|
+
- [Elego](https://www.elegosoft.com):
|
10
|
+
- Yu Weng \<<yweng@elegosoft.com>\>
|
11
|
+
- Philip Witte \<<phillip.witte@elegosoft.com>\>
|
12
|
+
- Khanh Bui \<<khanh.bui@mail.elegosoft.com>\>
|
13
|
+
- [Subteno](https://www.subteno.com):
|
14
|
+
- Timothée Vannier <<tva@subteno.com>>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
Some pictures are based on or inspired by:
|
2
|
+
|
3
|
+
- [Roundicons](https://www.flaticon.com/authors/roundicons)
|
4
|
+
- [Smashicons](https://www.flaticon.com/authors/smashicons)
|
5
|
+
- [EmojiOne](https://github.com/EmojiTwo/emojitwo) : Portal DMS icon
|
6
|
+
- [GitHub Octicons](https://github.com/primer/octicons/) : The main DMS icon
|
@@ -0,0 +1,9 @@
|
|
1
|
+
DMS is a module for creating, managing and viewing document files
|
2
|
+
directly within Odoo. This module is only the basis for an entire
|
3
|
+
ecosystem of apps that extend and seamlessly integrate with the document
|
4
|
+
management system.
|
5
|
+
|
6
|
+
This module adds portal functionality for directories and files for
|
7
|
+
allowed users, both portal or internal users. You can get as well a
|
8
|
+
tokenized link from a directory or a file for sharing it with any
|
9
|
+
anonymous user.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
- Files preview in portal
|
2
|
+
- Allow to download folder in portal and create zip file with all
|
3
|
+
content
|
4
|
+
- Save in cache own_root directories and update in every
|
5
|
+
create/write/unlink function
|
6
|
+
- Add a migration procedure for converting an storage to attachment one
|
7
|
+
for populating existing records with attachments as folders
|
8
|
+
- Add a link from attachment view in chatter to linked documents
|
9
|
+
- If Inherit permissions from related record (the
|
10
|
+
inherit_access_from_parent_record field from storage) is changed when
|
11
|
+
directories already exist, inconsistencies may occur because groups
|
12
|
+
defined in the directories and subdirectories will still exist, all
|
13
|
+
groups in these directories should be removed before changing.
|
14
|
+
- Since portal users can read `dms.storage` records, if your module
|
15
|
+
extends this model to another storage backend that needs using
|
16
|
+
secrets, remember to forbid access to the secrets fields by other
|
17
|
+
means. It would be nice to be able to remove that rule at some point.
|
18
|
+
- Searchpanel in files: Highlight items (shading) without records when
|
19
|
+
filtering something (by name for example).
|
@@ -0,0 +1,11 @@
|
|
1
|
+
The best way to manage the documents is to switch to the Documents view.
|
2
|
+
Existing documents can be managed there and new documents can be
|
3
|
+
created.
|
4
|
+
|
5
|
+
## Portal functionality
|
6
|
+
|
7
|
+
You can add any portal user to DMS access groups, and then allow that
|
8
|
+
group in directories, so they will see in the portal such directories
|
9
|
+
and their files. Another possibility is to click on "Share" button
|
10
|
+
inside a directory or a file for obtaining a tokenized link for single
|
11
|
+
access to that resource, no matter if logged or not.
|
Binary file
|
@@ -1 +1,4 @@
|
|
1
|
-
|
1
|
+
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
|
2
|
+
<path d="M10.6594 14.0094C12.443 12.2246 14.8624 11.2213 17.3856 11.22H36.4169C39.4075 11.22 42.235 12.6338 44.0294 15.0263L48.9231 21.5513C49.0498 21.7201 49.2139 21.8571 49.4027 21.9515C49.5915 22.0459 49.7996 22.095 50.0106 22.095H78.5575C79.9996 22.095 81.3827 22.6679 82.4024 23.6876C83.4221 24.7073 83.995 26.0904 83.995 27.5325V30.2513H22.8231C21.7415 30.2513 20.7043 30.6809 19.9395 31.4457C19.1747 32.2105 18.745 33.2478 18.745 34.3294C18.745 35.411 19.1747 36.4483 19.9395 37.213C20.7043 37.9778 21.7415 38.4075 22.8231 38.4075H87.9535C88.7217 38.4068 89.4812 38.5689 90.1822 38.8831C90.8832 39.1973 91.5096 39.6564 92.0203 40.2303C92.5309 40.8041 92.9142 41.4796 93.1448 42.2123C93.3755 42.945 93.4482 43.7183 93.3584 44.4812L89.4325 77.8294C89.4325 80.3531 88.43 82.7734 86.6454 84.5579C84.8609 86.3425 82.4406 87.345 79.9169 87.345H17.3856C14.8619 87.345 12.4416 86.3425 10.6571 84.5579C8.87254 82.7734 7.87 80.3531 7.87 77.8294V20.7356C7.87 18.2126 8.8705 15.7875 10.6594 14.0094Z" fill="#C83737"/>
|
3
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M42.5039 38.4075H22.8231C21.7415 38.4075 20.7043 37.9778 19.9395 37.213C19.1747 36.4482 18.745 35.411 18.745 34.3294C18.745 33.2478 19.1747 32.2105 19.9395 31.4457C20.7043 30.6809 21.7415 30.2513 22.8231 30.2513H83.995V27.5325C83.995 26.0904 83.4221 24.7073 82.4024 23.6876C81.3827 22.6679 79.9996 22.095 78.5575 22.095H50.0106C49.7996 22.095 49.5914 22.0459 49.4027 21.9515C49.2139 21.8571 49.0498 21.7201 48.9231 21.5513L44.0294 15.0263C42.235 12.6338 39.4075 11.22 36.4169 11.22H17.3856C14.8624 11.2213 12.443 12.2246 10.6594 14.0094C8.8705 15.7875 7.87 18.2126 7.87 20.7356V47.9602C16.6861 44.4618 28.757 40.875 42.5039 38.4075Z" fill="#EC8A8A"/>
|
4
|
+
</svg>
|