Document Management System

dms
REPOSITORY
REPOSITORYOCA/dms
GIT
GIThttps://github.com/OCA/dms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/dms/tree/18.0/dms
VERSION
VERSION 1.1.1
CATEGORY
CATEGORYDocument Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), MuK IT
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), MuK IT
COMMITTERS
COMMITTERSroot, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, CarlosRoca13, Matteo Mircoli
WEBSITE
WEBSITEhttps://github.com/OCA/dms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - http_routing
    - onboarding
    - portal
    - web_editor
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
DMS is a module for creating, managing and viewing document files
directly within Odoo. This module is only the basis for an entire
ecosystem of apps that extend and seamlessly integrate with the document
management system.

This module adds portal functionality for directories and files for
allowed users, both portal or internal users. You can get as well a
tokenized link from a directory or a file for sharing it with any
anonymous user.

Code Analysis

Views touched (34)
XML IDNameModelTypeStatus
portal_my_dms My DMS ir.ui.view qweb New
portal_my_dms_breadcrumbs My DMS: Breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_dms Portal My Home : dms entries ir.ui.view qweb Inherits portal.portal_my_home
res_config_settings_view_form res.config.settings.view.form.inherit.dms res.config.settings xpath Inherits base.res_config_settings_view_form
search_dms_directory dms_directory.search dms.directory search New
search_dms_file dms_file.search dms.file search New
search_dms_file_migration dms_file.search dms.file search New
view_dms_access_groups_form dms_access.group.form dms.access.group form New
view_dms_access_groups_tree dms_access_groups.list dms.access.group list New
view_dms_category_form dms_category.form dms.category form New
view_dms_category_search dms_category.search dms.category search New
view_dms_category_tree dms_category.list dms.category list New
view_dms_directory_form dms_directory.form dms.directory form New
view_dms_directory_kanban dms_directory.kanban dms.directory kanban New
view_dms_directory_new_form dms_directory.form dms.directory xpath Inherits view_dms_directory_form
view_dms_directory_tree dms_directory.list dms.directory list New
view_dms_file_form dms_file.form dms.file form New
view_dms_file_graph dms_file.graph dms.file graph New
view_dms_file_kanban dms_file.kanban dms.file kanban New
view_dms_file_kanban_wizard_selection dms_file.kanban.wizard.selection dms.file kanban Inherits dms.view_dms_file_kanban
view_dms_file_migration_tree dms_file.list dms.file list New
view_dms_file_new_form dms_file.form dms.file xpath Inherits view_dms_file_form
view_dms_file_pivot dms_file.pivot dms.file pivot New
view_dms_file_tree dms_file.list dms.file list New
view_dms_storage_form dms_storage.form dms.storage form New
view_dms_storage_new_form dms_storage.form dms.storage xpath Inherits view_dms_storage_form
view_dms_storage_search dms_storage.search dms.storage search New
view_dms_storage_tree dms_storage.list dms.storage list New
view_dms_tag_form dms_tag.form dms.tag form New
view_dms_tag_kanban dms_tag.kanban dms.tag kanban New
view_dms_tag_search dms_tag.search dms.tag search New
view_dms_tag_tree dms_tag.list dms.tag list New
wizard_dms_file_move_form_view wizard.dms.file.move.form wizard.dms.file.move form New
wizard_dms_share_form wizard.dms.share.form wizard.dms.share field Inherits portal.portal_share_wizard
Models touched (19)

New fields (7)
  • category_id Many2one → dms.category
    comodel_name='dms.category' context={'dms_category_show_path': True} string='Category'
  • color Integer
    default=0
  • company_id Many2one → res.company
    comodel_name='res.company' index='btree' readonly=True related='storage_id.company_id' store=True string='Company'
  • is_hidden Boolean
    readonly=True related='storage_id.is_hidden' store=True string='Storage is Hidden'
  • name Char
    index='btree' required=True
  • storage_id Many2one → dms.storage
    comodel_name='dms.storage' copy=True store=True string='Storage'
  • storage_id_save_type Selection
    related='storage_id.save_type' store=False
Public methods (1)
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
    Add context to display short folder name.

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)
    Cascade DMS related resources removal. Avoid executing in ir.* models (ir.mode, ir.model.fields, etc), in transient models and in the models we want to check.

New fields (17)
  • child_group_ids One2many → dms.access.group
    comodel_name='dms.access.group' inverse_name='parent_group_id' string='Child Groups'
  • complete_directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_complete_groups_rel' string='Complete directories'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_users Integer
    compute='_compute_users' store=True
  • directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_groups_rel' string='Directories'
  • explicit_user_ids Many2many → res.users
    column1='gid' column2='uid' comodel_name='res.users' relation='dms_access_group_explicit_users_rel' string='Explicit Users'
  • group_ids Many2many → res.groups
    column1='gid' column2='rid' comodel_name='res.groups' relation='dms_access_group_groups_rel' string='Groups'
  • name Char
    required=True string='Group Name' translate=True
  • parent_group_id Many2one → dms.access.group
    comodel_name='dms.access.group' index='btree' ondelete='cascade' string='Parent Group'
  • parent_path Char
    index='btree'
  • perm_create Boolean
    string='Create Access'
  • perm_inclusive_create Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Create Access'
  • perm_inclusive_unlink Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Unlink Access'
  • perm_inclusive_write Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Write Access'
  • perm_unlink Boolean
    string='Unlink Access'
  • perm_write Boolean
    string='Write Access'
  • users Many2many → res.users
    auto_join=True column1='gid' column2='uid' comodel_name='res.users' compute='_compute_users' recursive=True relation='dms_access_group_users_rel' store=True string='Group Users'
Public methods (2)
  • copy_data(self, default=None)
  • default_get(self, fields_list)
    @api.model

New fields (13)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • child_category_ids One2many → dms.category
    comodel_name='dms.category' inverse_name='parent_id' string='Child Categories'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • count_categories Integer
    compute='_compute_count_categories' string='Count Subcategories'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_files Integer
    compute='_compute_count_files'
  • count_tags Integer
    compute='_compute_count_tags'
  • directory_ids One2many → dms.directory
    comodel_name='dms.directory' inverse_name='category_id' readonly=True string='Directories'
  • file_ids One2many → dms.file
    comodel_name='dms.file' inverse_name='category_id' readonly=True string='Files'
  • name Char
    required=True translate=True
  • parent_id Many2one → dms.category
    comodel_name='dms.category' index='btree' ondelete='cascade' string='Parent Category'
  • parent_path Char
    index='btree'
  • tag_ids One2many → dms.tag
    comodel_name='dms.tag' inverse_name='category_id' string='Tags'
Public methods (0)

No public methods.

New fields (29)
  • alias_process Selection
    default='directory' help=' Define how incoming emails are processed:\n\n - Single Files: The email gets attached to the directory and\n all attachments are created as files.\n\n - Subdirectory: A new subdirectory is created for each email\n and the mail is attached to this subdirectory. The attachments\n are created as files of the subdirectory.\n ' required=True selection=[('files', 'Single Files'), ('directory', 'Subdirectory')] string='Unpack Emails as'
  • allowed_model_ids Many2many → ir.model
    comodel_name='ir.model' related='storage_id.model_ids'
  • child_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=True inverse_name='parent_id' string='Subdirectories'
  • complete_group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' compute='_compute_groups' compute_sudo=True readonly=True recursive=True relation='dms_directory_complete_groups_rel' store=True string='Complete Groups'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • count_directories Integer
    compute='_compute_count_directories' string='Count Subdirectories Title'
  • count_directories_title Char
    compute='_compute_count_directories' string='Count Subdirectories'
  • count_elements Integer
    compute='_compute_count_elements'
  • count_files Integer
    compute='_compute_count_files' string='Count Files Title'
  • count_files_title Char
    compute='_compute_count_files' string='Count Files'
  • count_total_directories Integer
    compute='_compute_count_total_directories' string='Total Subdirectories'
  • count_total_elements Integer
    compute='_compute_count_total_elements' string='Total Elements'
  • count_total_files Integer
    compute='_compute_count_total_files' string='Total Files'
  • file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=True inverse_name='directory_id' string='Files'
  • group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' relation='dms_directory_groups_rel' string='Groups'
  • human_size Char
    compute='_compute_human_size' string='Size (human readable)'
  • inherit_group_ids Boolean
    default=True string='Inherit Groups'
  • is_root_directory Boolean
    default=False help='Indicates if the directory is a root directory.\n A root directory has a settings object, while a directory with a set\n parent inherits the settings form its parent.'
  • model_id Many2one → ir.model
    comodel_name='ir.model' compute='_compute_model_id' domain="[('id', 'in', allowed_model_ids)]" inverse='_inverse_model_id' store=True string='Model'
  • parent_id Many2one → dms.directory
    comodel_name='dms.directory' compute='_compute_parent_id' copy=True default=<expr> domain="[('permission_create', '=', True)]" index='btree' ondelete='restrict' prefetch=False readonly=False store=True string='Parent Directory'
  • parent_path Char
    index='btree'
  • root_directory_id Many2one → dms.directory
    compute='_compute_root_id' store=True args: 'dms.directory', 'Root Directory'
  • size Float
    compute='_compute_size'
  • starred Boolean
    compute='_compute_starred' inverse='_inverse_starred' search='_search_starred'
  • storage_id Many2one → dms.storage
    auto_join=True comodel_name='dms.storage' compute='_compute_storage_id' compute_sudo=True ondelete='restrict' readonly=False store=True string='Storage'
  • storage_id_inherit_access_from_parent_record Boolean
    related='storage_id.inherit_access_from_parent_record' related_sudo=True store=True
  • storage_id_save_type Selection
    prefetch=False readonly=True related='storage_id.save_type' related_sudo=True store=False
  • tag_ids Many2many → dms.tag
    column1='did' column2='tid' comodel_name='dms.tag' compute='_compute_tags' domain="[\n '|', ['category_id', '=', False],\n ['category_id', 'child_of', category_id]]\n " readonly=False relation='dms_directory_tag_rel' store=True string='Tags'
  • user_star_ids Many2many → res.users
    column1='did' column2='uid' comodel_name='res.users' relation='dms_directory_star_rel' string='Stars'
Public methods (13)
  • action_dms_directories_all_directory(self)
  • action_dms_files_all_directory(self)
  • action_save_onboarding_directory_step(self)
  • check_access_token(self, access_token=False)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • message_new(self, msg_dict, custom_values=None)
    @api.model
  • message_update(self, msg_dict, update_vals=None)
  • search_panel_select_multi_range(self, field_name, **kwargs)
    @api.model
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
  • toggle_starred(self)
  • unlink(self)
    Custom cascade unlink. Cannot rely on DB backend's cascade because subfolder and subfile unlinks must check custom permissions implementation.
  • write(self, vals)

New fields (25)
  • active Boolean
    default=True help='If a file is set to archived, it is not displayed, but still exists.' string='Archived'
  • attachment_id Many2one → ir.attachment
    comodel_name='ir.attachment' index=True ondelete='cascade' prefetch=False string='Attachment File'
  • checksum Char
    index='btree' readonly=True string='Checksum/SHA1'
  • content Binary
    attachment=False compute='_compute_content' inverse='_inverse_content' prefetch=False required=True store=False
  • content_binary Binary
    attachment=False prefetch=False
  • content_file Binary
    attachment=True prefetch=False
  • directory_id Many2one → dms.directory
    auto_join=True comodel_name='dms.directory' context={'dms_directory_show_path': True} domain="[('permission_create', '=', True)]" index='btree' ondelete='restrict' required=True string='Directory' tracking=True
  • extension Char
    compute='_compute_extension' readonly=True store=True
  • human_size Char
    compute='_compute_human_size' readonly=True store=True string='Size (human readable)'
  • image_1920 Image
    compute='_compute_image_1920' readonly=False store=True
  • is_lock_editor Boolean
    compute='_compute_locked' string='Editor'
  • is_locked Boolean
    compute='_compute_locked' string='Locked'
  • locked_by Many2one → res.users
    comodel_name='res.users'
  • migration Char
    compute='_compute_migration' compute_sudo=True prefetch=False readonly=True store=True string='Migration Status'
  • mimetype Char
    compute='_compute_mimetype' readonly=True store=True string='Type'
  • path_json Text
    compute='_compute_path' compute_sudo=True readonly=True store=False
  • path_names Char
    compute='_compute_path' compute_sudo=True readonly=True store=False
  • require_migration Boolean
    compute='_compute_migration' compute_sudo=True store=True
  • res_id Integer
    related='directory_id.res_id' string='Linked attachments record ID'
  • res_model Char
    related='directory_id.res_model' string='Linked attachments model'
  • root_directory_id Many2one
    related='directory_id.root_directory_id'
  • save_type Char
    compute='_compute_save_type' prefetch=False string='Current Save Type'
  • size Float
    readonly=True
  • storage_id Many2one
    prefetch=False readonly=True related='directory_id.storage_id'
  • tag_ids Many2many → dms.tag
    column1='fid' column2='tid' comodel_name='dms.tag' domain="['|', ('category_id', '=', False),('category_id', '=?', category_id)]" relation='dms_file_tag_rel' string='Tags'
Public methods (13)
  • action_migrate(self, should_logging=True)
  • action_save_onboarding_file_step(self)
  • action_wizard_dms_file_move(self)
  • check_access(self, operation)
  • check_access_token(self, access_token=False)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_human_size(self)
  • lock(self)
  • search_panel_select_multi_range(self, field_name, **kwargs)
    @api.model
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
    This method is overwritten to make it 'similar' to v13. The goal is that the directory searchpanel shows all directories (even if some folders have no files).
  • unlink(self)
  • unlock(self)

New fields (1)
  • icon_url Char
    compute='_compute_icon_url' string='Icon URL'
Public methods (0)

No public methods.

New fields (7)
  • permission_create Boolean
    compute='_compute_permissions' search='_search_permission_create' string='Create Access'
  • permission_read Boolean
    compute='_compute_permissions' search='_search_permission_read' string='Read Access'
  • permission_unlink Boolean
    compute='_compute_permissions' search='_search_permission_unlink' string='Delete Access'
  • permission_write Boolean
    compute='_compute_permissions' search='_search_permission_write' string='Write Access'
  • record_ref Reference
    compute='_compute_record_ref' selection=<expr> string='Record Referenced'
  • res_id Integer
    index='btree' store=True string='Linked attachments record ID'
  • res_model Char
    index='btree' store=True string='Linked attachments model'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • filtered_domain(self, domain)
    This method is needed to inhibit the behavior when called from the _check_access() method with sudo() https://github.com/odoo/odoo/blob/fc737a147b9aefbd6ae5d111835ce3f4f7b4240a/odoo/models.py#L4465. It would cause the error that multiple records are not accessed to be displayed. The _filtered_access() method is also overwritten to prevent this sudo() specific behavior and to be able to access only the appropriate records.
  • unlink(self)
  • write(self, vals)

New fields (13)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='If set, directories and files will only be available for the selected company.' string='Company'
  • count_storage_directories Integer
    compute='_compute_count_storage_directories' string='Count Directories'
  • count_storage_files Integer
    compute='_compute_count_storage_files' string='Count Files'
  • include_message_attachments Boolean
    default=False help='Indicate if directories and files auto-create in mail composition process too' string='Create files from message attachments'
  • inherit_access_from_parent_record Boolean
    default=False help='Indicate if directories and files access work only with related model access (for example, if some directories are related with any sale, only users with read access to these sale can access)' string='Inherit permissions from related record'
  • is_hidden Boolean
    default=False help='Indicates if directories and files are hidden by default.' string='Storage is Hidden'
  • model Char
    search='_search_model' store=False
  • model_ids Many2many → ir.model
    string='Linked Models' args: 'ir.model'
  • name Char
    required=True
  • root_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=False string='Root Directories'
  • save_type Selection
    default='database' help='The save type is used to determine how a file is saved by the system. If you change this setting, you can migrate existing files manually by triggering the action.' required=True selection=[('database', 'Database'), ('file', 'Filestore'), ('attachment', 'Attachment')]
  • storage_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=True string='Directories'
  • storage_file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='storage_id' readonly=True string='Files'
Public methods (3)
  • action_save_onboarding_storage_step(self)
  • action_storage_migrate(self)
  • write(self, values)

New fields (8)
  • active Boolean
    default=True help='The active field allows you to hide the tag without removing it.'
  • category_id Many2one → dms.category
    comodel_name='dms.category' context={'dms_category_show_path': True} ondelete='set null' string='Category'
  • color Integer
    default=10 string='Color Index'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_files Integer
    compute='_compute_count_files'
  • directory_ids Many2many → dms.directory
    column1='tid' column2='did' comodel_name='dms.directory' readonly=True relation='dms_directory_tag_rel' string='Directories'
  • file_ids Many2many → dms.file
    column1='tid' column2='fid' comodel_name='dms.file' readonly=True relation='dms_file_tag_rel' string='Files'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_close_panel_dms_file(self)
    @api.model

New fields (0)

No new fields.

Public methods (3)
  • action_open_documents_onboarding_directory(self)
    @api.model
    Open the form to create a new directory from the onboarding panel.
  • action_open_documents_onboarding_file(self)
    @api.model
    Open the form to create a new file from the onboarding panel.
  • action_open_documents_onboarding_storage(self)
    @api.model
    Open the form to create a new storage from the onboarding panel.

New fields (4)
  • documents_onboarding_directory_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_file_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_storage_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
Public methods (3)
  • action_close_documents_onboarding(self)
    @api.model
  • get_and_update_documents_onboarding_state(self)
  • set_onboarding_step_done(self, step)

New fields (2)
  • documents_binary_max_size Integer
    config_parameter='dms.binary_max_size' help='Defines the maximum upload size in MB. Default (25MB)' string='Size'
  • documents_forbidden_extensions Char
    config_parameter='dms.forbidden_extensions' help="Defines a list of forbidden file extensions. (Example: 'exe,msi')" string='Extensions'
Public methods (0)

No public methods.

New fields (2)
  • count_files Integer
    readonly=True
  • directory_id Many2one → dms.directory
    comodel_name='dms.directory' required=True string='Directory'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/dms
GIT
GIThttps://github.com/OCA/dms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/dms/tree/17.0/dms
VERSION
VERSION 1.2.5
CATEGORY
CATEGORYDocument Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), MuK IT
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), MuK IT
COMMITTERS
COMMITTERSPedro M. Baeza, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, Gil Arasa Verge, kaynnan, Timothée VANNIER, Timothée Vannier
WEBSITE
WEBSITEhttps://github.com/OCA/dms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:03
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - http_routing
    - onboarding
    - portal
    - web_editor
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
DMS is a module for creating, managing and viewing document files
directly within Odoo. This module is only the basis for an entire
ecosystem of apps that extend and seamlessly integrate with the document
management system.

This module adds portal functionality for directories and files for
allowed users, both portal or internal users. You can get as well a
tokenized link from a directory or a file for sharing it with any
anonymous user.

Code Analysis

Views touched (34)
XML IDNameModelTypeStatus
portal_my_dms My DMS ir.ui.view qweb New
portal_my_dms_breadcrumbs My DMS: Breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_dms Portal My Home : dms entries ir.ui.view qweb Inherits portal.portal_my_home
res_config_settings_view_form res.config.settings.view.form.inherit.dms res.config.settings xpath Inherits base.res_config_settings_view_form
search_dms_directory dms_directory.search dms.directory search New
search_dms_file dms_file.search dms.file search New
search_dms_file_migration dms_file.search dms.file search New
view_dms_access_groups_form dms_access.group.form dms.access.group form New
view_dms_access_groups_tree dms_access_groups.tree dms.access.group tree New
view_dms_category_form dms_category.form dms.category form New
view_dms_category_search dms_category.search dms.category search New
view_dms_category_tree dms_category.tree dms.category tree New
view_dms_directory_form dms_directory.form dms.directory form New
view_dms_directory_kanban dms_directory.kanban dms.directory kanban New
view_dms_directory_new_form dms_directory.form dms.directory xpath Inherits view_dms_directory_form
view_dms_directory_tree dms_directory.tree dms.directory tree New
view_dms_file_form dms_file.form dms.file form New
view_dms_file_graph dms_file.graph dms.file graph New
view_dms_file_kanban dms_file.kanban dms.file kanban New
view_dms_file_kanban_wizard_selection dms_file.kanban.wizard.selection dms.file kanban Inherits dms.view_dms_file_kanban
view_dms_file_migration_tree dms_file.tree dms.file tree New
view_dms_file_new_form dms_file.form dms.file xpath Inherits view_dms_file_form
view_dms_file_pivot dms_file.pivot dms.file pivot New
view_dms_file_tree dms_file.tree dms.file tree New
view_dms_storage_form dms_storage.form dms.storage form New
view_dms_storage_new_form dms_storage.form dms.storage xpath Inherits view_dms_storage_form
view_dms_storage_search dms_storage.search dms.storage search New
view_dms_storage_tree dms_storage.tree dms.storage tree New
view_dms_tag_form dms_tag.form dms.tag form New
view_dms_tag_kanban dms_tag.kanban dms.tag kanban New
view_dms_tag_search dms_tag.search dms.tag search New
view_dms_tag_tree dms_tag.tree dms.tag tree New
wizard_dms_file_move_form_view wizard.dms.file.move.form wizard.dms.file.move form New
wizard_dms_share_form wizard.dms.share.form wizard.dms.share field Inherits portal.portal_share_wizard
Models touched (19)

New fields (7)
  • category_id Many2one → dms.category
    comodel_name='dms.category' context={'dms_category_show_path': True} string='Category'
  • color Integer
    default=0
  • company_id Many2one → res.company
    comodel_name='res.company' index='btree' readonly=True related='storage_id.company_id' store=True string='Company'
  • is_hidden Boolean
    readonly=True related='storage_id.is_hidden' store=True string='Storage is Hidden'
  • name Char
    index='btree' required=True
  • storage_id Many2one → dms.storage
    comodel_name='dms.storage' copy=True store=True string='Storage'
  • storage_id_save_type Selection
    related='storage_id.save_type' store=False
Public methods (1)
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
    Add context to display short folder name.

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)
    Cascade DMS related resources removal. Avoid executing in ir.* models (ir.mode, ir.model.fields, etc), in transient models and in the models we want to check.

New fields (17)
  • child_group_ids One2many → dms.access.group
    comodel_name='dms.access.group' inverse_name='parent_group_id' string='Child Groups'
  • complete_directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_complete_groups_rel' string='Complete directories'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_users Integer
    compute='_compute_users' store=True
  • directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_groups_rel' string='Directories'
  • explicit_user_ids Many2many → res.users
    column1='gid' column2='uid' comodel_name='res.users' relation='dms_access_group_explicit_users_rel' string='Explicit Users'
  • group_ids Many2many → res.groups
    column1='gid' column2='rid' comodel_name='res.groups' relation='dms_access_group_groups_rel' string='Groups'
  • name Char
    required=True string='Group Name' translate=True
  • parent_group_id Many2one → dms.access.group
    comodel_name='dms.access.group' index='btree' ondelete='cascade' string='Parent Group'
  • parent_path Char
    index='btree' unaccent=False
  • perm_create Boolean
    string='Create Access'
  • perm_inclusive_create Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Create Access'
  • perm_inclusive_unlink Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Unlink Access'
  • perm_inclusive_write Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Write Access'
  • perm_unlink Boolean
    string='Unlink Access'
  • perm_write Boolean
    string='Write Access'
  • users Many2many → res.users
    auto_join=True column1='gid' column2='uid' comodel_name='res.users' compute='_compute_users' recursive=True relation='dms_access_group_users_rel' store=True string='Group Users'
Public methods (2)
  • copy(self, default=None)
  • default_get(self, fields_list)
    @api.model

New fields (13)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • child_category_ids One2many → dms.category
    comodel_name='dms.category' inverse_name='parent_id' string='Child Categories'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • count_categories Integer
    compute='_compute_count_categories' string='Count Subcategories'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_files Integer
    compute='_compute_count_files'
  • count_tags Integer
    compute='_compute_count_tags'
  • directory_ids One2many → dms.directory
    comodel_name='dms.directory' inverse_name='category_id' readonly=True string='Directories'
  • file_ids One2many → dms.file
    comodel_name='dms.file' inverse_name='category_id' readonly=True string='Files'
  • name Char
    required=True translate=True
  • parent_id Many2one → dms.category
    comodel_name='dms.category' index='btree' ondelete='cascade' string='Parent Category'
  • parent_path Char
    index='btree' unaccent=False
  • tag_ids One2many → dms.tag
    comodel_name='dms.tag' inverse_name='category_id' string='Tags'
Public methods (0)

No public methods.

New fields (29)
  • alias_process Selection
    default='directory' help=' Define how incoming emails are processed:\n\n - Single Files: The email gets attached to the directory and\n all attachments are created as files.\n\n - Subdirectory: A new subdirectory is created for each email\n and the mail is attached to this subdirectory. The attachments\n are created as files of the subdirectory.\n ' required=True selection=[('files', 'Single Files'), ('directory', 'Subdirectory')] string='Unpack Emails as'
  • allowed_model_ids Many2many → ir.model
    comodel_name='ir.model' related='storage_id.model_ids'
  • child_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=True inverse_name='parent_id' string='Subdirectories'
  • complete_group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' compute='_compute_groups' compute_sudo=True readonly=True recursive=True relation='dms_directory_complete_groups_rel' store=True string='Complete Groups'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • count_directories Integer
    compute='_compute_count_directories' string='Count Subdirectories Title'
  • count_directories_title Char
    compute='_compute_count_directories' string='Count Subdirectories'
  • count_elements Integer
    compute='_compute_count_elements'
  • count_files Integer
    compute='_compute_count_files' string='Count Files Title'
  • count_files_title Char
    compute='_compute_count_files' string='Count Files'
  • count_total_directories Integer
    compute='_compute_count_total_directories' string='Total Subdirectories'
  • count_total_elements Integer
    compute='_compute_count_total_elements' string='Total Elements'
  • count_total_files Integer
    compute='_compute_count_total_files' string='Total Files'
  • file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=True inverse_name='directory_id' string='Files'
  • group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' relation='dms_directory_groups_rel' string='Groups'
  • human_size Char
    compute='_compute_human_size' string='Size (human readable)'
  • inherit_group_ids Boolean
    default=True string='Inherit Groups'
  • is_root_directory Boolean
    default=False help='Indicates if the directory is a root directory.\n A root directory has a settings object, while a directory with a set\n parent inherits the settings form its parent.'
  • model_id Many2one → ir.model
    comodel_name='ir.model' compute='_compute_model_id' domain="[('id', 'in', allowed_model_ids)]" inverse='_inverse_model_id' store=True string='Model'
  • parent_id Many2one → dms.directory
    comodel_name='dms.directory' compute='_compute_parent_id' copy=True default=<expr> domain="[('permission_create', '=', True)]" index='btree' ondelete='restrict' prefetch=False readonly=False store=True string='Parent Directory'
  • parent_path Char
    index='btree' unaccent=False
  • root_directory_id Many2one → dms.directory
    compute='_compute_root_id' store=True args: 'dms.directory', 'Root Directory'
  • size Float
    compute='_compute_size'
  • starred Boolean
    compute='_compute_starred' inverse='_inverse_starred' search='_search_starred'
  • storage_id Many2one → dms.storage
    auto_join=True comodel_name='dms.storage' compute='_compute_storage_id' compute_sudo=True ondelete='restrict' readonly=False store=True string='Storage'
  • storage_id_inherit_access_from_parent_record Boolean
    related='storage_id.inherit_access_from_parent_record' related_sudo=True store=True
  • storage_id_save_type Selection
    prefetch=False readonly=True related='storage_id.save_type' related_sudo=True store=False
  • tag_ids Many2many → dms.tag
    column1='did' column2='tid' comodel_name='dms.tag' compute='_compute_tags' domain="[\n '|', ['category_id', '=', False],\n ['category_id', 'child_of', category_id]]\n " readonly=False relation='dms_directory_tag_rel' store=True string='Tags'
  • user_star_ids Many2many → res.users
    column1='did' column2='uid' comodel_name='res.users' relation='dms_directory_star_rel' string='Stars'
Public methods (13)
  • action_dms_directories_all_directory(self)
  • action_dms_files_all_directory(self)
  • action_save_onboarding_directory_step(self)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • message_new(self, msg_dict, custom_values=None)
    @api.model
  • message_update(self, msg_dict, update_vals=None)
  • search_panel_select_multi_range(self, field_name, **kwargs)
    @api.model
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
  • toggle_starred(self)
  • unlink(self)
    Custom cascade unlink. Cannot rely on DB backend's cascade because subfolder and subfile unlinks must check custom permissions implementation.
  • write(self, vals)

New fields (25)
  • active Boolean
    default=True help='If a file is set to archived, it is not displayed, but still exists.' string='Archived'
  • attachment_id Many2one → ir.attachment
    comodel_name='ir.attachment' index=True ondelete='cascade' prefetch=False string='Attachment File'
  • checksum Char
    index='btree' readonly=True string='Checksum/SHA1'
  • content Binary
    attachment=False compute='_compute_content' inverse='_inverse_content' prefetch=False required=True store=False
  • content_binary Binary
    attachment=False prefetch=False
  • content_file Binary
    attachment=True prefetch=False
  • directory_id Many2one → dms.directory
    auto_join=True comodel_name='dms.directory' context={'dms_directory_show_path': True} domain="[('permission_create', '=', True)]" index='btree' ondelete='restrict' required=True string='Directory' tracking=True
  • extension Char
    compute='_compute_extension' readonly=True store=True
  • human_size Char
    compute='_compute_human_size' readonly=True store=True string='Size (human readable)'
  • image_1920 Image
    compute='_compute_image_1920' readonly=False store=True
  • is_lock_editor Boolean
    compute='_compute_locked' string='Editor'
  • is_locked Boolean
    compute='_compute_locked' string='Locked'
  • locked_by Many2one → res.users
    comodel_name='res.users'
  • migration Char
    compute='_compute_migration' compute_sudo=True prefetch=False readonly=True store=True string='Migration Status'
  • mimetype Char
    compute='_compute_mimetype' readonly=True store=True string='Type'
  • path_json Text
    compute='_compute_path' compute_sudo=True readonly=True store=False
  • path_names Char
    compute='_compute_path' compute_sudo=True readonly=True store=False
  • require_migration Boolean
    compute='_compute_migration' compute_sudo=True store=True
  • res_id Integer
    related='directory_id.res_id' string='Linked attachments record ID'
  • res_model Char
    related='directory_id.res_model' string='Linked attachments model'
  • root_directory_id Many2one
    related='directory_id.root_directory_id'
  • save_type Char
    compute='_compute_save_type' prefetch=False string='Current Save Type'
  • size Float
    readonly=True
  • storage_id Many2one
    prefetch=False readonly=True related='directory_id.storage_id'
  • tag_ids Many2many → dms.tag
    column1='fid' column2='tid' comodel_name='dms.tag' domain="['|', ('category_id', '=', False),('category_id', '=?', category_id)]" relation='dms_file_tag_rel' string='Tags'
Public methods (15)
  • action_migrate(self, should_logging=True)
  • action_save_onboarding_file_step(self)
  • action_wizard_dms_file_move(self)
  • check_access_rule(self, operation)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_attachment_object(self, attachment)
  • get_dms_files_from_attachments(self, attachment_ids=None)
    @api.model
    Get the dms files from uploaded attachments. :return: An Array of dms files.
  • get_human_size(self)
  • lock(self)
  • search_panel_select_multi_range(self, field_name, **kwargs)
    @api.model
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
    This method is overwritten to make it 'similar' to v13. The goal is that the directory searchpanel shows all directories (even if some folders have no files).
  • unlink(self)
  • unlock(self)

New fields (1)
  • icon_url Char
    compute='_compute_icon_url' string='Icon URL'
Public methods (0)

No public methods.

New fields (7)
  • permission_create Boolean
    compute='_compute_permissions' search='_search_permission_create' string='Create Access'
  • permission_read Boolean
    compute='_compute_permissions' search='_search_permission_read' string='Read Access'
  • permission_unlink Boolean
    compute='_compute_permissions' search='_search_permission_unlink' string='Delete Access'
  • permission_write Boolean
    compute='_compute_permissions' search='_search_permission_write' string='Write Access'
  • record_ref Reference
    compute='_compute_record_ref' selection=<expr> string='Record Referenced'
  • res_id Integer
    index='btree' store=True string='Linked attachments record ID'
  • res_model Char
    index='btree' store=True string='Linked attachments model'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (13)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='If set, directories and files will only be available for the selected company.' string='Company'
  • count_storage_directories Integer
    compute='_compute_count_storage_directories' string='Count Directories'
  • count_storage_files Integer
    compute='_compute_count_storage_files' string='Count Files'
  • include_message_attachments Boolean
    default=False help='Indicate if directories and files auto-create in mail composition process too' string='Create files from message attachments'
  • inherit_access_from_parent_record Boolean
    default=False help='Indicate if directories and files access work only with related model access (for example, if some directories are related with any sale, only users with read access to these sale can access)' string='Inherit permissions from related record'
  • is_hidden Boolean
    default=False help='Indicates if directories and files are hidden by default.' string='Storage is Hidden'
  • model Char
    search='_search_model' store=False
  • model_ids Many2many → ir.model
    string='Linked Models' args: 'ir.model'
  • name Char
    required=True
  • root_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=False string='Root Directories'
  • save_type Selection
    default='database' help='The save type is used to determine how a file is saved by the system. If you change this setting, you can migrate existing files manually by triggering the action.' required=True selection=[('database', _('Database')), ('file', _('Filestore')), ('attachment', _('Attachment'))]
  • storage_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=True string='Directories'
  • storage_file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='storage_id' readonly=True string='Files'
Public methods (3)
  • action_save_onboarding_storage_step(self)
  • action_storage_migrate(self)
  • write(self, values)

New fields (8)
  • active Boolean
    default=True help='The active field allows you to hide the tag without removing it.'
  • category_id Many2one → dms.category
    comodel_name='dms.category' context={'dms_category_show_path': True} ondelete='set null' string='Category'
  • color Integer
    default=10 string='Color Index'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_files Integer
    compute='_compute_count_files'
  • directory_ids Many2many → dms.directory
    column1='tid' column2='did' comodel_name='dms.directory' readonly=True relation='dms_directory_tag_rel' string='Directories'
  • file_ids Many2many → dms.file
    column1='tid' column2='fid' comodel_name='dms.file' readonly=True relation='dms_file_tag_rel' string='Files'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_close_panel_dms_file(self)
    @api.model

New fields (0)

No new fields.

Public methods (3)
  • action_open_documents_onboarding_directory(self)
    @api.model
    Open the form to create a new directory from the onboarding panel.
  • action_open_documents_onboarding_file(self)
    @api.model
    Open the form to create a new file from the onboarding panel.
  • action_open_documents_onboarding_storage(self)
    @api.model
    Open the form to create a new storage from the onboarding panel.

New fields (4)
  • documents_onboarding_directory_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_file_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_storage_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
Public methods (3)
  • action_close_documents_onboarding(self)
    @api.model
  • get_and_update_documents_onboarding_state(self)
  • set_onboarding_step_done(self, step)

New fields (2)
  • documents_binary_max_size Integer
    config_parameter='dms.binary_max_size' help='Defines the maximum upload size in MB. Default (25MB)' string='Size'
  • documents_forbidden_extensions Char
    config_parameter='dms.forbidden_extensions' help="Defines a list of forbidden file extensions. (Example: 'exe,msi')" string='Extensions'
Public methods (0)

No public methods.

New fields (2)
  • count_files Integer
    readonly=True
  • directory_id Many2one → dms.directory
    comodel_name='dms.directory' required=True string='Directory'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/dms
GIT
GIThttps://github.com/OCA/dms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/dms/tree/16.0/dms
VERSION
VERSION 1.8.6
CATEGORY
CATEGORYDocument Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), MuK IT
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), MuK IT
COMMITTERS
COMMITTERSDaniel Reis, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, Carlos Roca, Gil Arasa Verge, PicchiSeba, Adasat Torres de León, Lijo Antony, KB, Adasat torres de León
WEBSITE
WEBSITEhttps://github.com/OCA/dms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - http_routing
    - portal
    - web_editor
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (40)
XML IDNameModelTypeStatus
assets_backend dms_assets ir.ui.view qweb Inherits web.assets_backend
document_onboarding_directory_panel document_onboarding_panel ir.ui.view qweb New
document_onboarding_file_panel document_onboarding_panel ir.ui.view qweb New
onboarding_directory_step onboarding_directory_step ir.ui.view qweb New
onboarding_file_step onboarding_file_step ir.ui.view qweb New
onboarding_storage_step onboarding_storage_step ir.ui.view qweb New
portal_my_dms My DMS ir.ui.view qweb New
portal_my_dms_breadcrumbs My DMS: Breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_dms Portal My Home : dms entries ir.ui.view qweb Inherits portal.portal_my_home
res_config_settings_view_form res.config.settings.view.form.inherit.dms res.config.settings xpath Inherits base.res_config_settings_view_form
search_dms_directory dms_directory.search dms.directory search New
search_dms_file dms_file.search dms.file search New
search_dms_file_migration dms_file.search dms.file search New
view_dms_access_groups_form dms_access.group.form dms.access.group form New
view_dms_access_groups_tree dms_access_groups.tree dms.access.group tree New
view_dms_category_form dms_category.form dms.category form New
view_dms_category_search dms_category.search dms.category search New
view_dms_category_tree dms_category.tree dms.category tree New
view_dms_directory_form dms_directory.form dms.directory form New
view_dms_directory_kanban dms_directory.kanban dms.directory kanban New
view_dms_directory_new_form dms_directory.form dms.directory xpath Inherits view_dms_directory_form
view_dms_directory_tree dms_directory.tree dms.directory tree New
view_dms_file_form dms_file.form dms.file form New
view_dms_file_graph dms_file.graph dms.file graph New
view_dms_file_kanban dms_file.kanban dms.file kanban New
view_dms_file_kanban_wizard_selection dms_file.kanban.wizard.selection dms.file kanban Inherits dms.view_dms_file_kanban
view_dms_file_migration_tree dms_file.tree dms.file tree New
view_dms_file_new_form dms_file.form dms.file xpath Inherits view_dms_file_form
view_dms_file_pivot dms_file.pivot dms.file pivot New
view_dms_file_tree dms_file.tree dms.file tree New
view_dms_storage_form dms_storage.form dms.storage form New
view_dms_storage_new_form dms_storage.form dms.storage xpath Inherits view_dms_storage_form
view_dms_storage_search dms_storage.search dms.storage search New
view_dms_storage_tree dms_storage.tree dms.storage tree New
view_dms_tag_form dms_tag.form dms.tag form New
view_dms_tag_kanban dms_tag.kanban dms.tag kanban New
view_dms_tag_search dms_tag.search dms.tag search New
view_dms_tag_tree dms_tag.tree dms.tag tree New
wizard_dms_file_move_form_view wizard.dms.file.move.form wizard.dms.file.move form New
wizard_dms_share_form wizard.dms.share.form wizard.dms.share field Inherits portal.portal_share_wizard
Models touched (16)

New fields (7)
  • category_id Many2one → dms.category
    comodel_name='dms.category' context="{'dms_category_show_path': True}" string='Category'
  • color Integer
    default=0
  • company_id Many2one → res.company
    comodel_name='res.company' index='btree' readonly=True related='storage_id.company_id' store=True string='Company'
  • is_hidden Boolean
    readonly=True related='storage_id.is_hidden' store=True string='Storage is Hidden'
  • name Char
    index='btree' required=True
  • storage_id Many2one → dms.storage
    comodel_name='dms.storage' copy=True store=True string='Storage'
  • storage_id_save_type Selection
    related='storage_id.save_type' store=False
Public methods (1)
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
    Add context to display short folder name.

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)
    Cascade DMS related resources removal. Avoid executing in ir.* models (ir.mode, ir.model.fields, etc), in transient models and in the models we want to check.

New fields (17)
  • child_group_ids One2many → dms.access.group
    comodel_name='dms.access.group' inverse_name='parent_group_id' string='Child Groups'
  • complete_directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_complete_groups_rel' string='Complete directories'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_users Integer
    compute='_compute_users' store=True
  • directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_groups_rel' string='Directories'
  • explicit_user_ids Many2many → res.users
    column1='gid' column2='uid' comodel_name='res.users' relation='dms_access_group_explicit_users_rel' string='Explicit Users'
  • group_ids Many2many → res.groups
    column1='gid' column2='rid' comodel_name='res.groups' relation='dms_access_group_groups_rel' string='Groups'
  • name Char
    required=True string='Group Name' translate=True
  • parent_group_id Many2one → dms.access.group
    comodel_name='dms.access.group' index='btree' ondelete='cascade' string='Parent Group'
  • parent_path Char
    index='btree' unaccent=False
  • perm_create Boolean
    string='Create Access'
  • perm_inclusive_create Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Create Access'
  • perm_inclusive_unlink Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Unlink Access'
  • perm_inclusive_write Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Write Access'
  • perm_unlink Boolean
    string='Unlink Access'
  • perm_write Boolean
    string='Write Access'
  • users Many2many → res.users
    auto_join=True column1='gid' column2='uid' comodel_name='res.users' compute='_compute_users' recursive=True relation='dms_access_group_users_rel' store=True string='Group Users'
Public methods (1)
  • default_get(self, fields_list)
    @api.model

New fields (13)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • child_category_ids One2many → dms.category
    comodel_name='dms.category' inverse_name='parent_id' string='Child Categories'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • count_categories Integer
    compute='_compute_count_categories' string='Count Subcategories'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_files Integer
    compute='_compute_count_files'
  • count_tags Integer
    compute='_compute_count_tags'
  • directory_ids One2many → dms.directory
    comodel_name='dms.directory' inverse_name='category_id' readonly=True string='Directories'
  • file_ids One2many → dms.file
    comodel_name='dms.file' inverse_name='category_id' readonly=True string='Files'
  • name Char
    required=True translate=True
  • parent_id Many2one → dms.category
    comodel_name='dms.category' index='btree' ondelete='cascade' string='Parent Category'
  • parent_path Char
    index='btree' unaccent=False
  • tag_ids One2many → dms.tag
    comodel_name='dms.tag' inverse_name='category_id' string='Tags'
Public methods (1)
  • name_get(self)

New fields (29)
  • alias_process Selection
    default='directory' help=' Define how incoming emails are processed:\n\n - Single Files: The email gets attached to the directory and\n all attachments are created as files.\n\n - Subdirectory: A new subdirectory is created for each email\n and the mail is attached to this subdirectory. The attachments\n are created as files of the subdirectory.\n ' required=True selection=[('files', 'Single Files'), ('directory', 'Subdirectory')] string='Unpack Emails as'
  • allowed_model_ids Many2many → ir.model
    comodel_name='ir.model' related='storage_id.model_ids'
  • child_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='parent_id' string='Subdirectories'
  • complete_group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' compute='_compute_groups' compute_sudo=True readonly=True recursive=True relation='dms_directory_complete_groups_rel' store=True string='Complete Groups'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • count_directories Integer
    compute='_compute_count_directories' string='Count Subdirectories Title'
  • count_directories_title Char
    compute='_compute_count_directories' string='Count Subdirectories'
  • count_elements Integer
    compute='_compute_count_elements'
  • count_files Integer
    compute='_compute_count_files' string='Count Files Title'
  • count_files_title Char
    compute='_compute_count_files' string='Count Files'
  • count_total_directories Integer
    compute='_compute_count_total_directories' string='Total Subdirectories'
  • count_total_elements Integer
    compute='_compute_count_total_elements' string='Total Elements'
  • count_total_files Integer
    compute='_compute_count_total_files' string='Total Files'
  • file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='directory_id' string='Files'
  • group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' relation='dms_directory_groups_rel' string='Groups'
  • human_size Char
    compute='_compute_human_size' string='Size (human readable)'
  • inherit_group_ids Boolean
    default=True string='Inherit Groups'
  • is_root_directory Boolean
    default=False help='Indicates if the directory is a root directory.\n A root directory has a settings object, while a directory with a set\n parent inherits the settings form its parent.'
  • model_id Many2one → ir.model
    comodel_name='ir.model' compute='_compute_model_id' domain="[('id', 'in', allowed_model_ids)]" inverse='_inverse_model_id' store=True string='Model'
  • parent_id Many2one → dms.directory
    comodel_name='dms.directory' compute='_compute_parent_id' copy=True default=<expr> domain="[('permission_create', '=', True)]" index='btree' ondelete='restrict' prefetch=False readonly=False store=True string='Parent Directory'
  • parent_path Char
    index='btree' unaccent=False
  • root_directory_id Many2one → dms.directory
    compute='_compute_root_id' store=True args: 'dms.directory', 'Root Directory'
  • size Float
    compute='_compute_size'
  • starred Boolean
    compute='_compute_starred' inverse='_inverse_starred' search='_search_starred'
  • storage_id Many2one → dms.storage
    auto_join=True comodel_name='dms.storage' compute='_compute_storage_id' compute_sudo=True ondelete='restrict' readonly=False store=True string='Storage'
  • storage_id_inherit_access_from_parent_record Boolean
    related='storage_id.inherit_access_from_parent_record' related_sudo=True store=True
  • storage_id_save_type Selection
    prefetch=False readonly=True related='storage_id.save_type' related_sudo=True store=False
  • tag_ids Many2many → dms.tag
    column1='did' column2='tid' comodel_name='dms.tag' compute='_compute_tags' domain="[\n '|', ['category_id', '=', False],\n ['category_id', 'child_of', category_id]]\n " readonly=False relation='dms_directory_tag_rel' store=True string='Tags'
  • user_star_ids Many2many → res.users
    column1='did' column2='uid' comodel_name='res.users' relation='dms_directory_star_rel' string='Stars'
Public methods (14)
  • action_dms_directories_all_directory(self)
  • action_dms_files_all_directory(self)
  • action_save_onboarding_directory_step(self)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • message_new(self, msg_dict, custom_values=None)
    @api.model
  • message_update(self, msg_dict, update_vals=None)
  • name_get(self)
  • search_panel_select_multi_range(self, field_name, **kwargs)
    @api.model
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
  • toggle_starred(self)
  • unlink(self)
    Custom cascade unlink. Cannot rely on DB backend's cascade because subfolder and subfile unlinks must check custom permissions implementation.
  • write(self, vals)

New fields (25)
  • active Boolean
    default=True help='If a file is set to archived, it is not displayed, but still exists.' string='Archived'
  • attachment_id Many2one → ir.attachment
    comodel_name='ir.attachment' index=True invisible=True ondelete='cascade' prefetch=False string='Attachment File'
  • checksum Char
    index='btree' readonly=True string='Checksum/SHA1'
  • content Binary
    attachment=False compute='_compute_content' inverse='_inverse_content' prefetch=False required=True store=False
  • content_binary Binary
    attachment=False invisible=True prefetch=False
  • content_file Binary
    attachment=True invisible=True prefetch=False
  • directory_id Many2one → dms.directory
    auto_join=True comodel_name='dms.directory' context="{'dms_directory_show_path': True}" domain="[('permission_create', '=', True)]" index='btree' ondelete='restrict' required=True string='Directory' tracking=True
  • extension Char
    compute='_compute_extension' readonly=True store=True
  • human_size Char
    compute='_compute_human_size' readonly=True store=True string='Size (human readable)'
  • image_1920 Image
    compute='_compute_image_1920' readonly=False store=True
  • is_lock_editor Boolean
    compute='_compute_locked' string='Editor'
  • is_locked Boolean
    compute='_compute_locked' string='Locked'
  • locked_by Many2one → res.users
    comodel_name='res.users'
  • migration Char
    compute='_compute_migration' compute_sudo=True prefetch=False readonly=True string='Migration Status'
  • mimetype Char
    compute='_compute_mimetype' readonly=True store=True string='Type'
  • path_json Text
    compute='_compute_path' compute_sudo=True readonly=True store=False
  • path_names Char
    compute='_compute_path' compute_sudo=True readonly=True store=False
  • require_migration Boolean
    compute='_compute_migration' compute_sudo=True store=True
  • res_id Integer
    related='directory_id.res_id' string='Linked attachments record ID'
  • res_model Char
    related='directory_id.res_model' string='Linked attachments model'
  • root_directory_id Many2one
    related='directory_id.root_directory_id'
  • save_type Char
    compute='_compute_save_type' invisible=True prefetch=False string='Current Save Type'
  • size Float
    readonly=True
  • storage_id Many2one
    prefetch=False readonly=True related='directory_id.storage_id' store=True
  • tag_ids Many2many → dms.tag
    column1='fid' column2='tid' comodel_name='dms.tag' domain="['|', ('category_id', '=', False),('category_id', '=?', category_id)]" relation='dms_file_tag_rel' string='Tags'
Public methods (15)
  • action_migrate(self, logging=True)
  • action_save_onboarding_file_step(self)
  • action_wizard_dms_file_move(self)
  • check_access_rule(self, operation)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_attachment_object(self, attachment)
  • get_dms_files_from_attachments(self, attachment_ids=None)
    Get the dms files from uploaded attachments. :return: An Array of dms files.
  • get_human_size(self)
  • lock(self)
  • search_panel_select_multi_range(self, field_name, **kwargs)
    @api.model
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
    This method is overwritten to make it 'similar' to v13. The goal is that the directory searchpanel shows all directories (even if some folders have no files).
  • unlink(self)
  • unlock(self)

New fields (1)
  • icon_url Char
    compute='_compute_icon_url' string='Icon URL'
Public methods (0)

No public methods.

New fields (7)
  • permission_create Boolean
    compute='_compute_permissions' search='_search_permission_create' string='Create Access'
  • permission_read Boolean
    compute='_compute_permissions' search='_search_permission_read' string='Read Access'
  • permission_unlink Boolean
    compute='_compute_permissions' search='_search_permission_unlink' string='Delete Access'
  • permission_write Boolean
    compute='_compute_permissions' search='_search_permission_write' string='Write Access'
  • record_ref Reference
    compute='_compute_record_ref' selection=<expr> string='Record Referenced'
  • res_id Integer
    index='btree' store=True string='Linked attachments record ID'
  • res_model Char
    index='btree' store=True string='Linked attachments model'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (13)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='If set, directories and files will only be available for the selected company.' string='Company'
  • count_storage_directories Integer
    compute='_compute_count_storage_directories' string='Count Directories'
  • count_storage_files Integer
    compute='_compute_count_storage_files' string='Count Files'
  • include_message_attachments Boolean
    default=False help='Indicate if directories and files auto-create in mail composition process too' string='Create files from message attachments'
  • inherit_access_from_parent_record Boolean
    default=False help='Indicate if directories and files access work only with related model access (for example, if some directories are related with any sale, only users with read access to these sale can acess)' string='Inherit permissions from related record'
  • is_hidden Boolean
    default=False help='Indicates if directories and files are hidden by default.' string='Storage is Hidden'
  • model Char
    search='_search_model' store=False
  • model_ids Many2many → ir.model
    string='Linked Models' args: 'ir.model'
  • name Char
    required=True
  • root_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=False string='Root Directories'
  • save_type Selection
    default='database' help='The save type is used to determine how a file is saved by the\n system. If you change this setting, you can migrate existing files\n manually by triggering the action.' required=True selection=[('database', _('Database')), ('file', _('Filestore')), ('attachment', _('Attachment'))]
  • storage_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=True string='Directories'
  • storage_file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='storage_id' readonly=True string='Files'
Public methods (3)
  • action_save_onboarding_storage_step(self)
  • action_storage_migrate(self)
  • write(self, values)

New fields (8)
  • active Boolean
    default=True help='The active field allows you to hide the tag without removing it.'
  • category_id Many2one → dms.category
    comodel_name='dms.category' context="{'dms_category_show_path': True}" ondelete='set null' string='Category'
  • color Integer
    default=10 string='Color Index'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_files Integer
    compute='_compute_count_files'
  • directory_ids Many2many → dms.directory
    column1='tid' column2='did' comodel_name='dms.directory' readonly=True relation='dms_directory_tag_rel' string='Directories'
  • file_ids Many2many → dms.file
    column1='tid' column2='fid' comodel_name='dms.file' readonly=True relation='dms_file_tag_rel' string='Files'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • documents_onboarding_directory_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_file_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_storage_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
Public methods (6)
  • action_close_documents_onboarding(self)
    @api.model
  • action_open_documents_onboarding_directory(self)
    @api.model
  • action_open_documents_onboarding_file(self)
    @api.model
  • action_open_documents_onboarding_storage(self)
    @api.model
  • get_and_update_documents_onboarding_state(self)
  • get_documents_steps_states_names(self)

New fields (2)
  • documents_binary_max_size Integer
    config_parameter='dms.binary_max_size' help='Defines the maximum upload size in MB. Default (25MB)' string='Size'
  • documents_forbidden_extensions Char
    config_parameter='dms.forbidden_extensions' help="Defines a list of forbidden file extensions. (Example: 'exe,msi')" string='Extensions'
Public methods (0)

No public methods.

New fields (2)
  • count_files Integer
    readonly=True
  • directory_id Many2one → dms.directory
    comodel_name='dms.directory' required=True string='Directory'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/dms
GIT
GIThttps://github.com/OCA/dms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/dms/tree/15.0/dms
VERSION
VERSION 1.14.1
CATEGORY
CATEGORYDocument Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), MuK IT
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), MuK IT
COMMITTERS
COMMITTERSGiedrius Slavinskas, Enric Tobella, OCA Transbot, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, Marcel Savegnago, Alessandro Uffreduzzi, Jasmin Solanki, PicchiSeba
WEBSITE
WEBSITEhttps://github.com/OCA/dms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:31
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/social:
    - mail_preview_base
OCA/web:
    - web_drop_target
odoo/odoo:
    - web
    - base
    - mail
    - base_setup
    - bus
    - web_tour
    - http_routing
    - portal
    - web_editor
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (42)
XML IDNameModelTypeStatus
assets_backend dms_assets ir.ui.view qweb Inherits web.assets_backend
document_onboarding_directory_panel document_onboarding_panel ir.ui.view qweb New
document_onboarding_file_panel document_onboarding_panel ir.ui.view qweb New
onboarding_directory_step onboarding_directory_step ir.ui.view qweb New
onboarding_file_step onboarding_file_step ir.ui.view qweb New
onboarding_storage_step onboarding_storage_step ir.ui.view qweb New
portal_my_dms My DMS ir.ui.view qweb New
portal_my_dms_breadcrumbs My DMS: Breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_dms Portal My Home : dms entries ir.ui.view qweb Inherits portal.portal_my_home
res_config_settings_view_form res.config.settings.view.form.inherit.dms res.config.settings xpath Inherits base.res_config_settings_view_form
search_dms_directory dms_directory.search dms.directory search New
search_dms_file dms_file.search dms.file search New
search_dms_file_migration dms_file.search dms.file search New
view_dms_access_groups_form dms_access.group.form dms.access.group form New
view_dms_access_groups_tree dms_access_groups.tree dms.access.group tree New
view_dms_category_form dms_category.form dms.category form New
view_dms_category_search dms_category.search dms.category search New
view_dms_category_tree dms_category.tree dms.category tree New
view_dms_directory_form dms_directory.form dms.directory form New
view_dms_directory_kanban dms_directory.kanban dms.directory kanban New
view_dms_directory_manager_form dms_directory.form dms.directory field Inherits view_dms_directory_form
view_dms_directory_new_form dms_directory.form dms.directory xpath Inherits view_dms_directory_form
view_dms_directory_tree dms_directory.tree dms.directory tree New
view_dms_file_form dms_file.form dms.file form New
view_dms_file_graph dms_file.graph dms.file graph New
view_dms_file_kanban dms_file.kanban dms.file kanban New
view_dms_file_kanban_wizard_selection dms_file.kanban.wizard.selection dms.file kanban Inherits dms.view_dms_file_kanban
view_dms_file_manager_form dms_file.form dms.file field Inherits view_dms_file_form
view_dms_file_migration_tree dms_file.tree dms.file tree New
view_dms_file_new_form dms_file.form dms.file xpath Inherits view_dms_file_form
view_dms_file_pivot dms_file.pivot dms.file pivot New
view_dms_file_tree dms_file.tree dms.file tree New
view_dms_storage_form dms_storage.form dms.storage form New
view_dms_storage_new_form dms_storage.form dms.storage xpath Inherits view_dms_storage_form
view_dms_storage_search dms_storage.search dms.storage search New
view_dms_storage_tree dms_storage.tree dms.storage tree New
view_dms_tag_form dms_tag.form dms.tag form New
view_dms_tag_kanban dms_tag.kanban dms.tag kanban New
view_dms_tag_search dms_tag.search dms.tag search New
view_dms_tag_tree dms_tag.tree dms.tag tree New
wizard_dms_file_move_form_view wizard.dms.file.move.form wizard.dms.file.move form New
wizard_dms_share_form wizard.dms.share.form wizard.dms.share field Inherits portal.portal_share_wizard
Models touched (16)

New fields (7)
  • category_id Many2one → dms.category
    comodel_name='dms.category' context="{'dms_category_show_path': True}" string='Category'
  • color Integer
    default=0
  • company_id Many2one → res.company
    comodel_name='res.company' index=True readonly=True related='storage_id.company_id' store=True string='Company'
  • is_hidden Boolean
    readonly=True related='storage_id.is_hidden' store=True string='Storage is Hidden'
  • name Char
    index=True required=True
  • storage_id Many2one → dms.storage
    comodel_name='dms.storage' copy=True store=True string='Storage'
  • storage_id_save_type Selection
    related='storage_id.save_type' store=False
Public methods (1)
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
    Add context to display short folder name.

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)
    Cascade DMS related resources removal. Avoid executing in ir.* models (ir.mode, ir.model.fields, etc), in transient models and in the models we want to check.

New fields (17)
  • child_group_ids One2many → dms.access.group
    comodel_name='dms.access.group' inverse_name='parent_group_id' string='Child Groups'
  • complete_directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_complete_groups_rel' string='Complete directories'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_users Integer
    compute='_compute_users' store=True
  • directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_groups_rel' string='Directories'
  • explicit_user_ids Many2many → res.users
    column1='gid' column2='uid' comodel_name='res.users' relation='dms_access_group_explicit_users_rel' string='Explicit Users'
  • group_ids Many2many → res.groups
    column1='gid' column2='rid' comodel_name='res.groups' relation='dms_access_group_groups_rel' string='Groups'
  • name Char
    required=True string='Group Name' translate=True
  • parent_group_id Many2one → dms.access.group
    comodel_name='dms.access.group' index=True ondelete='cascade' string='Parent Group'
  • parent_path Char
    index=True
  • perm_create Boolean
    string='Create Access'
  • perm_inclusive_create Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Create Access'
  • perm_inclusive_unlink Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Unlink Access'
  • perm_inclusive_write Boolean
    compute='_compute_inclusive_permissions' recursive=True store=True string='Inherited Write Access'
  • perm_unlink Boolean
    string='Unlink Access'
  • perm_write Boolean
    string='Write Access'
  • users Many2many → res.users
    auto_join=True column1='gid' column2='uid' comodel_name='res.users' compute='_compute_users' recursive=True relation='dms_access_group_users_rel' store=True string='Group Users'
Public methods (1)
  • default_get(self, fields_list)
    @api.model

New fields (13)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • child_category_ids One2many → dms.category
    comodel_name='dms.category' inverse_name='parent_id' string='Child Categories'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • count_categories Integer
    compute='_compute_count_categories' string='Count Subcategories'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_files Integer
    compute='_compute_count_files'
  • count_tags Integer
    compute='_compute_count_tags'
  • directory_ids One2many → dms.directory
    comodel_name='dms.directory' inverse_name='category_id' readonly=True string='Directories'
  • file_ids One2many → dms.file
    comodel_name='dms.file' inverse_name='category_id' readonly=True string='Files'
  • name Char
    required=True translate=True
  • parent_id Many2one → dms.category
    comodel_name='dms.category' index=True ondelete='cascade' string='Parent Category'
  • parent_path Char
    index=True
  • tag_ids One2many → dms.tag
    comodel_name='dms.tag' inverse_name='category_id' string='Tags'
Public methods (1)
  • name_get(self)

New fields (29)
  • alias_process Selection
    default='directory' help=' Define how incoming emails are processed:\n\n - Single Files: The email gets attached to the directory and\n all attachments are created as files.\n\n - Subdirectory: A new subdirectory is created for each email\n and the mail is attached to this subdirectory. The attachments\n are created as files of the subdirectory.\n ' required=True selection=[('files', 'Single Files'), ('directory', 'Subdirectory')] string='Unpack Emails as'
  • allowed_model_ids Many2many → ir.model
    comodel_name='ir.model' related='storage_id.model_ids'
  • child_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='parent_id' string='Subdirectories'
  • complete_group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' compute='_compute_groups' compute_sudo=True readonly=True recursive=True relation='dms_directory_complete_groups_rel' store=True string='Complete Groups'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • count_directories Integer
    compute='_compute_count_directories' string='Count Subdirectories Title'
  • count_directories_title Char
    compute='_compute_count_directories' string='Count Subdirectories'
  • count_elements Integer
    compute='_compute_count_elements'
  • count_files Integer
    compute='_compute_count_files' string='Count Files Title'
  • count_files_title Char
    compute='_compute_count_files' string='Count Files'
  • count_total_directories Integer
    compute='_compute_count_total_directories' string='Total Subdirectories'
  • count_total_elements Integer
    compute='_compute_count_total_elements' string='Total Elements'
  • count_total_files Integer
    compute='_compute_count_total_files' string='Total Files'
  • file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='directory_id' string='Files'
  • group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' relation='dms_directory_groups_rel' string='Groups'
  • human_size Char
    compute='_compute_human_size' string='Size'
  • inherit_group_ids Boolean
    default=True string='Inherit Groups'
  • is_root_directory Boolean
    default=False help='Indicates if the directory is a root directory.\n A root directory has a settings object, while a directory with a set\n parent inherits the settings form its parent.'
  • model_id Many2one → ir.model
    comodel_name='ir.model' compute='_compute_model_id' domain="[('id', 'in', allowed_model_ids)]" inverse='_inverse_model_id' store=True string='Model'
  • parent_id Many2one → dms.directory
    comodel_name='dms.directory' compute='_compute_parent_id' copy=True default=<expr> domain="[('permission_create', '=', True)]" index=True ondelete='restrict' prefetch=False readonly=False store=True string='Parent Directory'
  • parent_path Char
    index=True
  • root_directory_id Many2one → dms.directory
    compute='_compute_root_id' store=True args: 'dms.directory', 'Root Directory'
  • size Float
    compute='_compute_size'
  • starred Boolean
    compute='_compute_starred' inverse='_inverse_starred' search='_search_starred'
  • storage_id Many2one → dms.storage
    auto_join=True comodel_name='dms.storage' compute='_compute_storage_id' compute_sudo=True ondelete='restrict' readonly=False store=True string='Storage'
  • storage_id_inherit_access_from_parent_record Boolean
    related='storage_id.inherit_access_from_parent_record' related_sudo=True store=True
  • storage_id_save_type Selection
    prefetch=False readonly=True related='storage_id.save_type' related_sudo=True store=False
  • tag_ids Many2many → dms.tag
    column1='did' column2='tid' comodel_name='dms.tag' compute='_compute_tags' domain="[\n '|', ['category_id', '=', False],\n ['category_id', 'child_of', category_id]]\n " readonly=False relation='dms_directory_tag_rel' store=True string='Tags'
  • user_star_ids Many2many → res.users
    column1='did' column2='uid' comodel_name='res.users' relation='dms_directory_star_rel' string='Stars'
Public methods (14)
  • action_dms_directories_all_directory(self)
  • action_dms_files_all_directory(self)
  • action_save_onboarding_directory_step(self)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • message_new(self, msg_dict, custom_values=None)
    @api.model
  • message_update(self, msg_dict, update_vals=None)
  • name_get(self)
  • search_panel_select_multi_range(self, field_name, **kwargs)
    @api.model
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
  • toggle_starred(self)
  • unlink(self)
    Custom cascade unlink. Cannot rely on DB backend's cascade because subfolder and subfile unlinks must check custom permissions implementation.
  • write(self, vals)

New fields (25)
  • active Boolean
    default=True help='If a file is set to archived, it is not displayed, but still exists.' string='Archived'
  • attachment_id Many2one → ir.attachment
    comodel_name='ir.attachment' invisible=True ondelete='cascade' prefetch=False string='Attachment File'
  • checksum Char
    index=True readonly=True string='Checksum/SHA1'
  • content Binary
    attachment=False compute='_compute_content' inverse='_inverse_content' prefetch=False required=True store=False
  • content_binary Binary
    attachment=False invisible=True prefetch=False
  • content_file Binary
    attachment=True invisible=True prefetch=False
  • directory_id Many2one → dms.directory
    auto_join=True comodel_name='dms.directory' context="{'dms_directory_show_path': True}" domain="[('permission_create', '=', True)]" index=True ondelete='restrict' required=True string='Directory' tracking=True
  • extension Char
    compute='_compute_extension' readonly=True store=True
  • human_size Char
    compute='_compute_human_size' readonly=True store=True string='Size'
  • image_1920 Image
    compute='_compute_image_1920' readonly=False store=True
  • is_lock_editor Boolean
    compute='_compute_locked' string='Editor'
  • is_locked Boolean
    compute='_compute_locked' string='Locked'
  • locked_by Many2one → res.users
    comodel_name='res.users'
  • migration Char
    compute='_compute_migration' compute_sudo=True prefetch=False readonly=True string='Migration Status'
  • mimetype Char
    compute='_compute_mimetype' readonly=True store=True string='Type'
  • path_json Text
    compute='_compute_path' compute_sudo=True readonly=True store=False
  • path_names Char
    compute='_compute_path' compute_sudo=True readonly=True store=False
  • require_migration Boolean
    compute='_compute_migration' compute_sudo=True store=True
  • res_id Integer
    related='directory_id.res_id' string='Linked attachments record ID'
  • res_model Char
    related='directory_id.res_model' string='Linked attachments model'
  • root_directory_id Many2one
    related='directory_id.root_directory_id'
  • save_type Char
    compute='_compute_save_type' invisible=True prefetch=False string='Current Save Type'
  • size Float
    readonly=True
  • storage_id Many2one
    prefetch=False readonly=True related='directory_id.storage_id' store=True
  • tag_ids Many2many → dms.tag
    column1='fid' column2='tid' comodel_name='dms.tag' domain="['|', ('category_id', '=', False),('category_id', '=?', category_id)]" relation='dms_file_tag_rel' string='Tags'
Public methods (12)
  • action_migrate(self, logging=True)
  • action_save_onboarding_file_step(self)
  • action_wizard_dms_file_move(self)
  • check_access_rule(self, operation)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_human_size(self)
  • lock(self)
  • search_panel_select_multi_range(self, field_name, **kwargs)
    @api.model
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
    This method is overwritten to make it 'similar' to v13. The goal is that the directory searchpanel shows all directories (even if some folders have no files).
  • unlock(self)

New fields (1)
  • icon_url Char
    compute='_compute_icon_url' string='Icon URL'
Public methods (0)

No public methods.

New fields (7)
  • permission_create Boolean
    compute='_compute_permissions' search='_search_permission_create' string='Create Access'
  • permission_read Boolean
    compute='_compute_permissions' search='_search_permission_read' string='Read Access'
  • permission_unlink Boolean
    compute='_compute_permissions' search='_search_permission_unlink' string='Delete Access'
  • permission_write Boolean
    compute='_compute_permissions' search='_search_permission_write' string='Write Access'
  • record_ref Reference
    compute='_compute_record_ref' selection=<expr> string='Record Referenced'
  • res_id Integer
    index=True store=True string='Linked attachments record ID'
  • res_model Char
    index=True store=True string='Linked attachments model'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (13)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='If set, directories and files will only be available for the selected company.' string='Company'
  • count_storage_directories Integer
    compute='_compute_count_storage_directories' string='Count Directories'
  • count_storage_files Integer
    compute='_compute_count_storage_files' string='Count Files'
  • include_message_attachments Boolean
    default=False help='Indicate if directories and files auto-create in mail composition process too' string='Create files from message attachments'
  • inherit_access_from_parent_record Boolean
    default=False help='Indicate if directories and files access work only with related model access (for example, if some directories are related with any sale, only users with read access to these sale can acess)' string='Inherit permissions from related record'
  • is_hidden Boolean
    default=False help='Indicates if directories and files are hidden by default.' string='Storage is Hidden'
  • model Char
    search='_search_model' store=False
  • model_ids Many2many → ir.model
    string='Linked Models' args: 'ir.model'
  • name Char
    required=True
  • root_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=False string='Root Directories'
  • save_type Selection
    default='database' help='The save type is used to determine how a file is saved by the\n system. If you change this setting, you can migrate existing files\n manually by triggering the action.' required=True selection=[('database', _('Database')), ('file', _('Filestore')), ('attachment', _('Attachment'))]
  • storage_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=True string='Directories'
  • storage_file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='storage_id' readonly=True string='Files'
Public methods (3)
  • action_save_onboarding_storage_step(self)
  • action_storage_migrate(self)
  • write(self, values)

New fields (8)
  • active Boolean
    default=True help='The active field allows you to hide the tag without removing it.'
  • category_id Many2one → dms.category
    comodel_name='dms.category' context="{'dms_category_show_path': True}" ondelete='set null' string='Category'
  • color Integer
    default=10 string='Color Index'
  • count_directories Integer
    compute='_compute_count_directories'
  • count_files Integer
    compute='_compute_count_files'
  • directory_ids Many2many → dms.directory
    column1='tid' column2='did' comodel_name='dms.directory' readonly=True relation='dms_directory_tag_rel' string='Directories'
  • file_ids Many2many → dms.file
    column1='tid' column2='fid' comodel_name='dms.file' readonly=True relation='dms_file_tag_rel' string='Files'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • documents_onboarding_directory_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_file_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
  • documents_onboarding_storage_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
Public methods (6)
  • action_close_documents_onboarding(self)
    @api.model
  • action_open_documents_onboarding_directory(self)
    @api.model
  • action_open_documents_onboarding_file(self)
    @api.model
  • action_open_documents_onboarding_storage(self)
    @api.model
  • get_and_update_documents_onboarding_state(self)
  • get_documents_steps_states_names(self)

New fields (2)
  • documents_binary_max_size Integer
    config_parameter='dms.binary_max_size' help='Defines the maximum upload size in MB. Default (25MB)' string='Size'
  • documents_forbidden_extensions Char
    config_parameter='dms.forbidden_extensions' help="Defines a list of forbidden file extensions. (Example: 'exe,msi')" string='Extensions'
Public methods (0)

No public methods.

New fields (2)
  • count_files Integer
    readonly=True
  • directory_id Many2one → dms.directory
    comodel_name='dms.directory' required=True string='Directory'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • process(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/dms
GIT
GIThttps://github.com/OCA/dms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/dms/tree/14.0/dms
VERSION
VERSION 4.10.2
CATEGORY
CATEGORYDocument Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), MuK IT
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), MuK IT
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, Jairo Llopis, Enric Tobella, OCA Transbot, Víctor Martínez, oca-travis, Weblate, OCA-git-bot, oca-ci, Yu Weng, Marcel Savegnago, Alessandro Uffreduzzi, PicchiSeba, Adasat Torres de León, FrancescoBallerini, Matt Jenkins
WEBSITE
WEBSITEhttps://github.com/OCA/dms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:52
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/social:
    - mail_preview_base
OCA/web:
    - web_drop_target
odoo/odoo:
    - web
    - base
    - mail
    - base_setup
    - bus
    - web_tour
    - http_routing
    - portal
    - web_editor
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (41)
XML IDNameModelTypeStatus
assets_backend dms_assets ir.ui.view qweb Inherits web.assets_backend
dms_frontend_demo dms_frontend_demo ir.ui.view qweb Inherits web.assets_frontend
document_onboarding_directory_panel document_onboarding_panel ir.ui.view qweb New
document_onboarding_file_panel document_onboarding_panel ir.ui.view qweb New
onboarding_directory_step onboarding_directory_step ir.ui.view qweb New
onboarding_file_step onboarding_file_step ir.ui.view qweb New
onboarding_storage_step onboarding_storage_step ir.ui.view qweb New
portal_my_dms My DMS ir.ui.view qweb New
portal_my_dms_breadcrumbs My DMS: Breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_dms Portal My Home : dms entries ir.ui.view qweb Inherits portal.portal_my_home
res_config_settings_view_form res.config.settings.view.form.inherit.dms res.config.settings xpath Inherits base.res_config_settings_view_form
search_dms_directory dms_directory.search dms.directory search New
search_dms_file dms_file.search dms.file search New
search_dms_file_migration dms_file.search dms.file search New
view_dms_access_groups_form dms_access.group.form dms.access.group form New
view_dms_access_groups_tree dms_access_groups.tree dms.access.group tree New
view_dms_category_form dms_category.form dms.category form New
view_dms_category_search dms_category.search dms.category search New
view_dms_category_tree dms_category.tree dms.category tree New
view_dms_directory_form dms_directory.form dms.directory form New
view_dms_directory_kanban dms_directory.kanban dms.directory kanban New
view_dms_directory_manager_form dms_directory.form dms.directory field Inherits view_dms_directory_form
view_dms_directory_new_form dms_directory.form dms.directory xpath Inherits view_dms_directory_form
view_dms_directory_tree dms_directory.tree dms.directory tree New
view_dms_file_form dms_file.form dms.file form New
view_dms_file_graph dms_file.graph dms.file graph New
view_dms_file_kanban dms_file.kanban dms.file kanban New
view_dms_file_kanban_wizard_selection dms_file.kanban.wizard.selection dms.file kanban Inherits dms.view_dms_file_kanban
view_dms_file_manager_form dms_file.form dms.file field Inherits view_dms_file_form
view_dms_file_migration_tree dms_file.tree dms.file tree New
view_dms_file_new_form dms_file.form dms.file xpath Inherits view_dms_file_form
view_dms_file_pivot dms_file.pivot dms.file pivot New
view_dms_file_tree dms_file.tree dms.file tree New
view_dms_storage_form dms_storage.form dms.storage form New
view_dms_storage_new_form dms_storage.form dms.storage xpath Inherits view_dms_storage_form
view_dms_storage_search dms_storage.search dms.storage search New
view_dms_storage_tree dms_storage.tree dms.storage tree New
view_dms_tag_form dms_tag.form dms.tag form New
view_dms_tag_kanban dms_tag.kanban dms.tag kanban New
view_dms_tag_search dms_tag.search dms.tag search New
view_dms_tag_tree dms_tag.tree dms.tag tree New
Models touched (14)

New fields (7)
  • category_id Many2one → dms.category
    comodel_name='dms.category' context="{'dms_category_show_path': True}" string='Category'
  • color Integer
    default=0 string='Color'
  • company_id Many2one → res.company
    comodel_name='res.company' index=True readonly=True related='storage_id.company_id' store=True string='Company'
  • is_hidden Boolean
    readonly=True related='storage_id.is_hidden' store=True string='Storage is Hidden'
  • name Char
    index=True required=True string='Name'
  • storage_id Many2one → dms.storage
    comodel_name='dms.storage' copy=True store=True string='Storage'
  • storage_id_save_type Selection
    related='storage_id.save_type' store=False
Public methods (1)
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
    Remove the limit of records (default is 200 since js).

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)
    Cascade DMS related resources removal.

New fields (17)
  • child_group_ids One2many → dms.access.group
    comodel_name='dms.access.group' inverse_name='parent_group_id' string='Child Groups'
  • complete_directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_complete_groups_rel' string='Complete directories'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Directories'
  • count_users Integer
    compute='_compute_users' store=True string='Users'
  • directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_groups_rel' string='Directories'
  • explicit_user_ids Many2many → res.users
    column1='gid' column2='uid' comodel_name='res.users' relation='dms_access_group_explicit_users_rel' string='Explicit Users'
  • group_ids Many2many → res.groups
    column1='gid' column2='rid' comodel_name='res.groups' relation='dms_access_group_groups_rel' string='Groups'
  • name Char
    required=True string='Group Name' translate=True
  • parent_group_id Many2one → dms.access.group
    comodel_name='dms.access.group' index=True ondelete='cascade' string='Parent Group'
  • parent_path Char
    index=True string='Parent Path'
  • perm_create Boolean
    string='Create Access'
  • perm_inclusive_create Boolean
    compute='_compute_inclusive_permissions' store=True string='Inherited Create Access'
  • perm_inclusive_unlink Boolean
    compute='_compute_inclusive_permissions' store=True string='Inherited Unlink Access'
  • perm_inclusive_write Boolean
    compute='_compute_inclusive_permissions' store=True string='Inherited Write Access'
  • perm_unlink Boolean
    string='Unlink Access'
  • perm_write Boolean
    string='Write Access'
  • users Many2many → res.users
    auto_join=True column1='gid' column2='uid' comodel_name='res.users' compute='_compute_users' relation='dms_access_group_users_rel' store=True string='Group Users'
Public methods (1)
  • default_get(self, fields_list)
    @api.model

New fields (13)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • child_category_ids One2many → dms.category
    comodel_name='dms.category' inverse_name='parent_id' string='Child Categories'
  • complete_name Char
    compute='_compute_complete_name' store=True
  • count_categories Integer
    compute='_compute_count_categories' string='Count Subcategories'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Directories'
  • count_files Integer
    compute='_compute_count_files' string='Count Files'
  • count_tags Integer
    compute='_compute_count_tags' string='Count Tags'
  • directory_ids One2many → dms.directory
    comodel_name='dms.directory' inverse_name='category_id' readonly=True string='Directories'
  • file_ids One2many → dms.file
    comodel_name='dms.file' inverse_name='category_id' readonly=True string='Files'
  • name Char
    required=True string='Name' translate=True
  • parent_id Many2one → dms.category
    comodel_name='dms.category' index=True ondelete='cascade' string='Parent Category'
  • parent_path Char
    index=True string='Parent Path'
  • tag_ids One2many → dms.tag
    comodel_name='dms.tag' inverse_name='category_id' string='Tags'
Public methods (0)

No public methods.

New fields (28)
  • alias_process Selection
    default='directory' help=' Define how incoming emails are processed:\n\n - Single Files: The email gets attached to the directory and\n all attachments are created as files.\n\n - Subdirectory: A new subdirectory is created for each email\n and the mail is attached to this subdirectory. The attachments\n are created as files of the subdirectory.\n ' required=True selection=[('files', 'Single Files'), ('directory', 'Subdirectory')] string='Unpack Emails as'
  • allowed_model_ids Many2many → ir.model
    comodel_name='ir.model' related='storage_id.model_ids'
  • child_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='parent_id' string='Subdirectories'
  • complete_group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' compute='_compute_groups' compute_sudo=True readonly=True relation='dms_directory_complete_groups_rel' store=True string='Complete Groups'
  • complete_name Char
    compute='_compute_complete_name' store=True args: 'Complete Name'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Subdirectories Title'
  • count_directories_title Char
    compute='_compute_count_directories' string='Count Subdirectories'
  • count_elements Integer
    compute='_compute_count_elements' string='Count Elements'
  • count_files Integer
    compute='_compute_count_files' string='Count Files Title'
  • count_files_title Char
    compute='_compute_count_files' string='Count Files'
  • count_total_directories Integer
    compute='_compute_count_total_directories' string='Total Subdirectories'
  • count_total_elements Integer
    compute='_compute_count_total_elements' string='Total Elements'
  • count_total_files Integer
    compute='_compute_count_total_files' string='Total Files'
  • file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='directory_id' string='Files'
  • group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' relation='dms_directory_groups_rel' string='Groups'
  • inherit_group_ids Boolean
    default=True string='Inherit Groups'
  • is_root_directory Boolean
    default=False help='Indicates if the directory is a root directory.\n A root directory has a settings object, while a directory with a set\n parent inherits the settings form its parent.' string='Is Root Directory'
  • model_id Many2one → ir.model
    comodel_name='ir.model' compute='_compute_model_id' domain="[('id', 'in', allowed_model_ids)]" inverse='_inverse_model_id' store=True string='Model'
  • parent_id Many2one → dms.directory
    comodel_name='dms.directory' compute='_compute_parent_id' copy=True default=<expr> domain="[('permission_create', '=', True)]" index=True ondelete='restrict' prefetch=False readonly=False store=True string='Parent Directory'
  • parent_path Char
    index=True
  • root_directory_id Many2one → dms.directory
    compute='_compute_root_id' store=True args: 'dms.directory', 'Root Directory'
  • size Float
    compute='_compute_size' string='Size'
  • starred Boolean
    compute='_compute_starred' inverse='_inverse_starred' search='_search_starred' string='Starred'
  • storage_id Many2one → dms.storage
    auto_join=True comodel_name='dms.storage' compute='_compute_storage_id' compute_sudo=True ondelete='restrict' readonly=False store=True string='Storage'
  • storage_id_inherit_access_from_parent_record Boolean
    related='storage_id.inherit_access_from_parent_record' related_sudo=True store=True
  • storage_id_save_type Selection
    prefetch=False readonly=True related='storage_id.save_type' related_sudo=True store=False
  • tag_ids Many2many → dms.tag
    column1='did' column2='tid' comodel_name='dms.tag' compute='_compute_tags' domain="[\n '|', ['category_id', '=', False],\n ['category_id', 'child_of', category_id]]\n " readonly=False relation='dms_directory_tag_rel' store=True string='Tags'
  • user_star_ids Many2many → res.users
    column1='did' column2='uid' comodel_name='res.users' relation='dms_directory_star_rel' string='Stars'
Public methods (10)
  • action_save_onboarding_directory_step(self)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • message_new(self, msg_dict, custom_values=None)
    @api.model
  • message_update(self, msg_dict, update_vals=None)
  • name_get(self)
  • toggle_starred(self)
  • unlink(self)
    Custom cascade unlink. Cannot rely on DB backend's cascade because subfolder and subfile unlinks must check custom permissions implementation.
  • write(self, vals)

New fields (23)
  • active Boolean
    default=True help='If a file is set to archived, it is not displayed, but still exists.' string='Archived'
  • attachment_id Many2one → ir.attachment
    comodel_name='ir.attachment' invisible=True ondelete='cascade' prefetch=False string='Attachment File'
  • checksum Char
    index=True readonly=True string='Checksum/SHA1'
  • content Binary
    attachment=False compute='_compute_content' inverse='_inverse_content' prefetch=False required=True store=False string='Content'
  • content_binary Binary
    attachment=False invisible=True prefetch=False string='Content Binary'
  • content_file Binary
    attachment=True invisible=True prefetch=False string='Content File'
  • directory_id Many2one → dms.directory
    auto_join=True comodel_name='dms.directory' context="{'dms_directory_show_path': True}" domain="[('permission_create', '=', True)]" index=True ondelete='restrict' required=True string='Directory'
  • extension Char
    compute='_compute_extension' readonly=True store=True string='Extension'
  • image_1920 Image
    compute='_compute_image_1920' readonly=False store=True
  • is_lock_editor Boolean
    compute='_compute_locked' string='Editor'
  • is_locked Boolean
    compute='_compute_locked' string='Locked'
  • locked_by Many2one → res.users
    comodel_name='res.users' string='Locked by'
  • migration Char
    compute='_compute_migration' compute_sudo=True prefetch=False readonly=True string='Migration Status'
  • mimetype Char
    compute='_compute_mimetype' readonly=True store=True string='Type'
  • path_json Text
    compute='_compute_path' compute_sudo=True readonly=True store=False string='Path Json'
  • path_names Char
    compute='_compute_path' compute_sudo=True readonly=True store=False string='Path Names'
  • require_migration Boolean
    compute='_compute_migration' compute_sudo=True store=True
  • res_id Integer
    related='directory_id.res_id' string='Linked attachments record ID'
  • res_model Char
    related='directory_id.res_model' string='Linked attachments model'
  • save_type Char
    compute='_compute_save_type' invisible=True prefetch=False string='Current Save Type'
  • size Float
    readonly=True string='Size'
  • storage_id Many2one
    prefetch=False readonly=True related='directory_id.storage_id' store=True
  • tag_ids Many2many → dms.tag
    column1='fid' column2='tid' comodel_name='dms.tag' domain="['|', ('category_id', '=', False),('category_id', '=?', category_id)]" relation='dms_file_tag_rel' string='Tags'
Public methods (11)
  • action_migrate(self, logging=True)
  • action_save_onboarding_file_step(self)
  • check_access_rule(self, operation)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_human_size(self)
  • lock(self)
  • search_panel_select_multi_range(self, field_name, **kwargs)
    @api.model
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
  • unlock(self)

New fields (1)
  • icon_url Char
    compute='_compute_icon_url' string='Icon URL'
Public methods (0)

No public methods.

New fields (7)
  • permission_create Boolean
    compute='_compute_permissions' search='_search_permission_create' string='Create Access'
  • permission_read Boolean
    compute='_compute_permissions' search='_search_permission_read' string='Read Access'
  • permission_unlink Boolean
    compute='_compute_permissions' search='_search_permission_unlink' string='Delete Access'
  • permission_write Boolean
    compute='_compute_permissions' search='_search_permission_write' string='Write Access'
  • record_ref Reference
    compute='_compute_record_ref' selection=<expr> string='Record Referenced'
  • res_id Integer
    index=True store=True string='Linked attachments record ID'
  • res_model Char
    index=True store=True string='Linked attachments model'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (12)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='If set, directories and files will only be available for the selected company.' string='Company'
  • count_storage_directories Integer
    compute='_compute_count_storage_directories' string='Count Directories'
  • count_storage_files Integer
    compute='_compute_count_storage_files' string='Count Files'
  • include_message_attachments Boolean
    default=False help='Indicate if directories and files auto-create in mail composition process too' string='Create files from message attachments'
  • inherit_access_from_parent_record Boolean
    default=False help='Indicate if directories and files access work only with related model access (for example, if some directories are related with any sale, only users with read access to these sale can acess)' string='Inherit permissions from related record'
  • is_hidden Boolean
    default=False help='Indicates if directories and files are hidden by default.' string='Storage is Hidden'
  • model_ids Many2many → ir.model
    string='Linked Models' args: 'ir.model'
  • name Char
    required=True string='Name'
  • root_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=False string='Root Directories'
  • save_type Selection
    default='database' help='The save type is used to determine how a file is saved by the\n system. If you change this setting, you can migrate existing files\n manually by triggering the action.' required=True selection=[('database', _('Database')), ('file', _('Filestore')), ('attachment', _('Attachment'))] string='Save Type'
  • storage_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=True string='Directories'
  • storage_file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='storage_id' readonly=True string='Files'
Public methods (2)
  • action_save_onboarding_storage_step(self)
  • action_storage_migrate(self)

New fields (8)
  • active Boolean
    default=True help='The active field allows you to hide the tag without removing it.'
  • category_id Many2one → dms.category
    comodel_name='dms.category' context="{'dms_category_show_path': True}" ondelete='set null' string='Category'
  • color Integer
    default=10 string='Color Index'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Directories'
  • count_files Integer
    compute='_compute_count_files' string='Count Files'
  • directory_ids Many2many → dms.directory
    column1='tid' column2='did' comodel_name='dms.directory' readonly=True relation='dms_directory_tag_rel' string='Directories'
  • file_ids Many2many → dms.file
    column1='tid' column2='fid' comodel_name='dms.file' readonly=True relation='dms_file_tag_rel' string='Files'
  • name Char
    required=True string='Name' translate=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • documents_onboarding_directory_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding Directory State'
  • documents_onboarding_file_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding File State'
  • documents_onboarding_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding State'
  • documents_onboarding_storage_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding Storage State'
Public methods (6)
  • action_close_documents_onboarding(self)
    @api.model
  • action_open_documents_onboarding_directory(self)
    @api.model
  • action_open_documents_onboarding_file(self)
    @api.model
  • action_open_documents_onboarding_storage(self)
    @api.model
  • get_and_update_documents_onboarding_state(self)
  • get_documents_steps_states_names(self)

New fields (2)
  • documents_binary_max_size Integer
    config_parameter='dms.binary_max_size' help='Defines the maximum upload size in MB. Default (25MB)' string='Size'
  • documents_forbidden_extensions Char
    config_parameter='dms.forbidden_extensions' help="Defines a list of forbidden file extensions. (Example: 'exe,msi')" string='Extensions'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/dms
GIT
GIThttps://github.com/OCA/dms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/dms/tree/13.0/dms
VERSION
VERSION 8.5.2
CATEGORY
CATEGORYDocument Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), MuK IT
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), MuK IT
COMMITTERS
COMMITTERSPedro M. Baeza, Jairo Llopis, Daniel Reis, Enric Tobella, OCA Transbot, Víctor Martínez, Alexandre D. Díaz, oca-travis, Weblate, OCA-git-bot, oca-ci, Jaime Arroyo, Alessandro Uffreduzzi
WEBSITE
WEBSITEhttps://github.com/OCA/dms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/social:
    - mail_preview_base
OCA/web:
    - web_drop_target
odoo/odoo:
    - web
    - base
    - mail
    - base_setup
    - bus
    - web_tour
    - http_routing
    - portal
    - web_editor
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (41)
XML IDNameModelTypeStatus
assets_backend dms_assets ir.ui.view qweb Inherits web.assets_backend
dms_frontend_demo dms_frontend_demo ir.ui.view qweb Inherits web.assets_frontend
document_onboarding_directory_panel document_onboarding_panel ir.ui.view qweb New
document_onboarding_file_panel document_onboarding_panel ir.ui.view qweb New
onboarding_directory_step onboarding_directory_step ir.ui.view qweb New
onboarding_file_step onboarding_file_step ir.ui.view qweb New
onboarding_storage_step onboarding_storage_step ir.ui.view qweb New
portal_my_dms My DMS ir.ui.view qweb New
portal_my_dms_breadcrumbs My DMS: Breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_dms Portal My Home : dms entries ir.ui.view qweb Inherits portal.portal_my_home
res_config_settings_view_form res.config.settings.view.form.inherit.dms res.config.settings xpath Inherits base.res_config_settings_view_form
search_dms_directory dms_directory.search dms.directory search New
search_dms_file dms_file.search dms.file search New
search_dms_file_migration dms_file.search dms.file search New
view_dms_access_groups_form dms_access.group.form dms.access.group form New
view_dms_access_groups_tree dms_access_groups.tree dms.access.group tree New
view_dms_category_form dms_category.form dms.category form New
view_dms_category_search dms_category.search dms.category search New
view_dms_category_tree dms_category.tree dms.category tree New
view_dms_directory_form dms_directory.form dms.directory form New
view_dms_directory_kanban dms_directory.kanban dms.directory kanban New
view_dms_directory_manager_form dms_directory.form dms.directory field Inherits view_dms_directory_form
view_dms_directory_new_form dms_directory.form dms.directory xpath Inherits view_dms_directory_form
view_dms_directory_tree dms_directory.tree dms.directory tree New
view_dms_file_form dms_file.form dms.file form New
view_dms_file_graph dms_file.graph dms.file graph New
view_dms_file_kanban dms_file.kanban dms.file kanban New
view_dms_file_kanban_wizard_selection dms_file.kanban.wizard.selection dms.file kanban Inherits dms.view_dms_file_kanban
view_dms_file_manager_form dms_file.form dms.file field Inherits view_dms_file_form
view_dms_file_migration_tree dms_file.tree dms.file tree New
view_dms_file_new_form dms_file.form dms.file xpath Inherits view_dms_file_form
view_dms_file_pivot dms_file.pivot dms.file pivot New
view_dms_file_tree dms_file.tree dms.file tree New
view_dms_storage_form dms_storage.form dms.storage form New
view_dms_storage_new_form dms_storage.form dms.storage xpath Inherits view_dms_storage_form
view_dms_storage_search dms_storage.search dms.storage search New
view_dms_storage_tree dms_storage.tree dms.storage tree New
view_dms_tag_form dms_tag.form dms.tag form New
view_dms_tag_kanban dms_tag.kanban dms.tag kanban New
view_dms_tag_search dms_tag.search dms.tag search New
view_dms_tag_tree dms_tag.tree dms.tag tree New
Models touched (14)

New fields (7)
  • category_id Many2one → dms.category
    comodel_name='dms.category' context="{'dms_category_show_path': True}" string='Category'
  • color Integer
    default=0 string='Color'
  • company_id Many2one → res.company
    comodel_name='res.company' index=True readonly=True related='storage_id.company_id' store=True string='Company'
  • is_hidden Boolean
    readonly=True related='storage_id.is_hidden' store=True string='Storage is Hidden'
  • name Char
    index=True required=True string='Name'
  • storage_id Many2one → dms.storage
    comodel_name='dms.storage' copy=True store=True string='Storage'
  • storage_id_save_type Selection
    related='storage_id.save_type' store=False
Public methods (1)
  • search_panel_select_range(self, field_name)
    @api.model
    We need to override function to prevent 200 records limit in search panel

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)
    Cascade DMS related resources removal.

New fields (17)
  • child_group_ids One2many → dms.access.group
    comodel_name='dms.access.group' inverse_name='parent_group_id' string='Child Groups'
  • complete_directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_complete_groups_rel' string='Complete directories'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Directories'
  • count_users Integer
    compute='_compute_users' store=True string='Users'
  • directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_groups_rel' string='Directories'
  • explicit_user_ids Many2many → res.users
    column1='gid' column2='uid' comodel_name='res.users' relation='dms_access_group_explicit_users_rel' string='Explicit Users'
  • group_ids Many2many → res.groups
    column1='gid' column2='rid' comodel_name='res.groups' relation='dms_access_group_groups_rel' string='Groups'
  • name Char
    required=True string='Group Name' translate=True
  • parent_group_id Many2one → dms.access.group
    comodel_name='dms.access.group' index=True ondelete='cascade' string='Parent Group'
  • parent_path Char
    index=True string='Parent Path'
  • perm_create Boolean
    string='Create Access'
  • perm_inclusive_create Boolean
    compute='_compute_inclusive_permissions' store=True string='Inherited Create Access'
  • perm_inclusive_unlink Boolean
    compute='_compute_inclusive_permissions' store=True string='Inherited Unlink Access'
  • perm_inclusive_write Boolean
    compute='_compute_inclusive_permissions' store=True string='Inherited Write Access'
  • perm_unlink Boolean
    string='Unlink Access'
  • perm_write Boolean
    string='Write Access'
  • users Many2many → res.users
    auto_join=True column1='gid' column2='uid' comodel_name='res.users' compute='_compute_users' relation='dms_access_group_users_rel' store=True string='Group Users'
Public methods (1)
  • default_get(self, fields_list)
    @api.model

New fields (13)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • child_category_ids One2many → dms.category
    comodel_name='dms.category' inverse_name='parent_id' string='Child Categories'
  • complete_name Char
    compute='_compute_complete_name' store=True
  • count_categories Integer
    compute='_compute_count_categories' string='Count Subcategories'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Directories'
  • count_files Integer
    compute='_compute_count_files' string='Count Files'
  • count_tags Integer
    compute='_compute_count_tags' string='Count Tags'
  • directory_ids One2many → dms.directory
    comodel_name='dms.directory' inverse_name='category_id' readonly=True string='Directories'
  • file_ids One2many → dms.file
    comodel_name='dms.file' inverse_name='category_id' readonly=True string='Files'
  • name Char
    required=True string='Name' translate=True
  • parent_id Many2one → dms.category
    comodel_name='dms.category' index=True ondelete='cascade' string='Parent Category'
  • parent_path Char
    index=True string='Parent Path'
  • tag_ids One2many → dms.tag
    comodel_name='dms.tag' inverse_name='category_id' string='Tags'
Public methods (0)

No public methods.

New fields (27)
  • alias_process Selection
    default='directory' help=' Define how incoming emails are processed:\n\n - Single Files: The email gets attached to the directory and\n all attachments are created as files.\n\n - Subdirectory: A new subdirectory is created for each email\n and the mail is attached to this subdirectory. The attachments\n are created as files of the subdirectory.\n ' required=True selection=[('files', 'Single Files'), ('directory', 'Subdirectory')] string='Unpack Emails as'
  • allowed_model_ids Many2many → ir.model
    comodel_name='ir.model' related='storage_id.model_ids'
  • child_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='parent_id' string='Subdirectories'
  • complete_group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' compute='_compute_groups' compute_sudo=True readonly=True relation='dms_directory_complete_groups_rel' store=True string='Complete Groups'
  • complete_name Char
    compute='_compute_complete_name' store=True args: 'Complete Name'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Subdirectories Title'
  • count_directories_title Char
    compute='_compute_count_directories' string='Count Subdirectories'
  • count_elements Integer
    compute='_compute_count_elements' string='Count Elements'
  • count_files Integer
    compute='_compute_count_files' string='Count Files Title'
  • count_files_title Char
    compute='_compute_count_files' string='Count Files'
  • count_total_directories Integer
    compute='_compute_count_total_directories' string='Total Subdirectories'
  • count_total_elements Integer
    compute='_compute_count_total_elements' string='Total Elements'
  • count_total_files Integer
    compute='_compute_count_total_files' string='Total Files'
  • file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='directory_id' string='Files'
  • group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' relation='dms_directory_groups_rel' string='Groups'
  • inherit_group_ids Boolean
    default=True string='Inherit Groups'
  • is_root_directory Boolean
    default=False help='Indicates if the directory is a root directory.\n A root directory has a settings object, while a directory with a set\n parent inherits the settings form its parent.' string='Is Root Directory'
  • model_id Many2one → ir.model
    comodel_name='ir.model' compute='_compute_model_id' domain="[('id', 'in', allowed_model_ids)]" inverse='_inverse_model_id' store=True string='Model'
  • parent_id Many2one → dms.directory
    comodel_name='dms.directory' compute='_compute_parent_id' copy=True default=<expr> domain="[('permission_create', '=', True)]" index=True ondelete='restrict' prefetch=False readonly=False store=True string='Parent Directory'
  • parent_path Char
    index=True
  • size Float
    compute='_compute_size' string='Size'
  • starred Boolean
    compute='_compute_starred' inverse='_inverse_starred' search='_search_starred' string='Starred'
  • storage_id Many2one → dms.storage
    auto_join=True comodel_name='dms.storage' compute='_compute_storage_id' compute_sudo=True ondelete='restrict' readonly=False store=True string='Storage'
  • storage_id_inherit_access_from_parent_record Boolean
    auto_join=True related='storage_id.inherit_access_from_parent_record' related_sudo=True store=True
  • storage_id_save_type Selection
    prefetch=False readonly=True related='storage_id.save_type' related_sudo=True store=False
  • tag_ids Many2many → dms.tag
    column1='did' column2='tid' comodel_name='dms.tag' compute='_compute_tags' domain="[\n '|', ['category_id', '=', False],\n ['category_id', 'child_of', category_id]]\n " readonly=False relation='dms_directory_tag_rel' store=True string='Tags'
  • user_star_ids Many2many → res.users
    column1='did' column2='uid' comodel_name='res.users' relation='dms_directory_star_rel' string='Stars'
Public methods (11)
  • action_save_onboarding_directory_step(self)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_alias_model_name(self, vals)
    @api.model
  • get_alias_values(self)
  • message_new(self, msg_dict, custom_values=None)
    @api.model
  • message_update(self, msg_dict, update_vals=None)
  • toggle_starred(self)
  • unlink(self)
    Custom cascade unlink. Cannot rely on DB backend's cascade because subfolder and subfile unlinks must check custom permissions implementation.
  • write(self, vals)

New fields (23)
  • active Boolean
    default=True help='If a file is set to archived, it is not displayed, but still exists.' string='Archived'
  • attachment_id Many2one → ir.attachment
    comodel_name='ir.attachment' invisible=True ondelete='cascade' prefetch=False string='Attachment File'
  • checksum Char
    index=True readonly=True size=40 string='Checksum/SHA1'
  • content Binary
    attachment=False compute='_compute_content' inverse='_inverse_content' prefetch=False required=True store=False string='Content'
  • content_binary Binary
    attachment=False invisible=True prefetch=False string='Content Binary'
  • content_file Binary
    attachment=True invisible=True prefetch=False string='Content File'
  • directory_id Many2one → dms.directory
    auto_join=True comodel_name='dms.directory' context="{'dms_directory_show_path': True}" domain="[('permission_create', '=', True)]" index=True ondelete='restrict' required=True string='Directory'
  • extension Char
    compute='_compute_extension' readonly=True store=True string='Extension'
  • image_1920 Image
    compute='_compute_image_1920' readonly=False store=True
  • is_lock_editor Boolean
    compute='_compute_locked' string='Editor'
  • is_locked Boolean
    compute='_compute_locked' string='Locked'
  • locked_by Many2one → res.users
    comodel_name='res.users' string='Locked by'
  • migration Char
    compute='_compute_migration' compute_sudo=True prefetch=False readonly=True string='Migration Status'
  • path_json Text
    compute='_compute_path' compute_sudo=True readonly=True store=False string='Path Json'
  • path_names Char
    compute='_compute_path' compute_sudo=True readonly=True store=False string='Path Names'
  • require_migration Boolean
    compute='_compute_migration' compute_sudo=True store=True
  • res_id Integer
    related='directory_id.res_id' string='Linked attachments record ID'
  • res_mimetype Char
    compute='_compute_mimetype' readonly=True store=True string='Type'
  • res_model Char
    related='directory_id.res_model' string='Linked attachments model'
  • save_type Char
    compute='_compute_save_type' invisible=True prefetch=False string='Current Save Type'
  • size Float
    readonly=True string='Size'
  • storage_id Many2one
    prefetch=False readonly=True related='directory_id.storage_id' store=True
  • tag_ids Many2many → dms.tag
    column1='fid' column2='tid' comodel_name='dms.tag' relation='dms_file_tag_rel' string='Tags'
Public methods (11)
  • action_migrate(self, logging=True)
  • action_save_onboarding_file_step(self)
  • check_access_rule(self, operation)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_human_size(self)
  • lock(self)
  • search_panel_select_multi_range(self, field_name, **kwargs)
    @api.model
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
  • unlock(self)

New fields (1)
  • icon_url Char
    compute='_compute_icon_url' string='Icon URL'
Public methods (0)

No public methods.

New fields (7)
  • permission_create Boolean
    compute='_compute_permissions' search='_search_permission_create' string='Create Access'
  • permission_read Boolean
    compute='_compute_permissions' search='_search_permission_read' string='Read Access'
  • permission_unlink Boolean
    compute='_compute_permissions' search='_search_permission_unlink' string='Delete Access'
  • permission_write Boolean
    compute='_compute_permissions' search='_search_permission_write' string='Write Access'
  • record_ref Reference
    compute='_compute_record_ref' selection=<expr> string='Record Referenced'
  • res_id Integer
    index=True store=True string='Linked attachments record ID'
  • res_model Char
    index=True store=True string='Linked attachments model'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (12)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='If set, directories and files will only be available for the selected company.' string='Company'
  • count_storage_directories Integer
    compute='_compute_count_storage_directories' string='Count Directories'
  • count_storage_files Integer
    compute='_compute_count_storage_files' string='Count Files'
  • include_message_attachments Boolean
    default=False help='Indicate if directories and files auto-create in mail composition process too' string='Create files from message attachments'
  • inherit_access_from_parent_record Boolean
    default=False help='Indicate if directories and files access work only with related model access (for example, if some directories are related with any sale, only users with read access to these sale can acess)' string='Inherit permissions from related record'
  • is_hidden Boolean
    default=False help='Indicates if directories and files are hidden by default.' string='Storage is Hidden'
  • model_ids Many2many → ir.model
    string='Linked Models' args: 'ir.model'
  • name Char
    required=True string='Name'
  • root_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=False string='Root Directories'
  • save_type Selection
    default='database' help='The save type is used to determine how a file is saved by the\n system. If you change this setting, you can migrate existing files\n manually by triggering the action.' required=True selection=[('database', _('Database')), ('file', _('Filestore')), ('attachment', _('Attachment'))] string='Save Type'
  • storage_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=True string='Directories'
  • storage_file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='storage_id' readonly=True string='Files'
Public methods (2)
  • action_save_onboarding_storage_step(self)
  • action_storage_migrate(self)

New fields (8)
  • active Boolean
    default=True help='The active field allows you to hide the tag without removing it.'
  • category_id Many2one → dms.category
    comodel_name='dms.category' context="{'dms_category_show_path': True}" ondelete='set null' string='Category'
  • color Integer
    default=10 string='Color Index'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Directories'
  • count_files Integer
    compute='_compute_count_files' string='Count Files'
  • directory_ids Many2many → dms.directory
    column1='tid' column2='did' comodel_name='dms.directory' readonly=True relation='dms_directory_tag_rel' string='Directories'
  • file_ids Many2many → dms.file
    column1='tid' column2='fid' comodel_name='dms.file' readonly=True relation='dms_file_tag_rel' string='Files'
  • name Char
    required=True string='Name' translate=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • documents_onboarding_directory_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding Directory State'
  • documents_onboarding_file_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding File State'
  • documents_onboarding_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding State'
  • documents_onboarding_storage_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding Storage State'
Public methods (6)
  • action_close_documents_onboarding(self)
    @api.model
  • action_open_documents_onboarding_directory(self)
    @api.model
  • action_open_documents_onboarding_file(self)
    @api.model
  • action_open_documents_onboarding_storage(self)
    @api.model
  • get_and_update_documents_onboarding_state(self)
  • get_documents_steps_states_names(self)

New fields (2)
  • documents_binary_max_size Integer
    config_parameter='dms.binary_max_size' help='Defines the maximum upload size in MB. Default (25MB)' string='Size'
  • documents_forbidden_extensions Char
    config_parameter='dms.forbidden_extensions' help="Defines a list of forbidden file extensions. (Example: 'exe,msi')" string='Extensions'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/dms
GIT
GIThttps://github.com/OCA/dms.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/dms/tree/12.0/dms
VERSION
VERSION 8.0.3
CATEGORY
CATEGORYDocument Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), MuK IT
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), MuK IT
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, Jairo Llopis, Enric Tobella, OCA Transbot, Víctor Martínez, João Marques, oca-travis, Weblate, OCA-git-bot, Alessandro Uffreduzzi, Eduardo de Miguel
WEBSITE
WEBSITEhttps://github.com/OCA/dms
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:14
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/social:
    - mail_preview_base
OCA/web:
    - web_drop_target
    - web_view_searchpanel
odoo/odoo:
    - web
    - base
    - document
    - mail
    - base_setup
    - bus
    - web_tour
    - http_routing
    - portal
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (40)
XML IDNameModelTypeStatus
assets_backend dms_assets ir.ui.view qweb Inherits web.assets_backend
dms_frontend_demo dms_frontend_demo ir.ui.view qweb Inherits web.assets_frontend
document_onboarding_directory_panel document_onboarding_panel ir.ui.view qweb New
document_onboarding_file_panel document_onboarding_panel ir.ui.view qweb New
onboarding_directory_step onboarding_directory_step ir.ui.view qweb New
onboarding_file_step onboarding_file_step ir.ui.view qweb New
onboarding_storage_step onboarding_storage_step ir.ui.view qweb New
portal_my_dms My DMS ir.ui.view qweb New
portal_my_dms_breadcrumbs My DMS: Breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_dms Portal My Home : dms entries ir.ui.view qweb Inherits portal.portal_my_home
res_config_settings_view_form res.config.settings.view.form.inherit.dms res.config.settings xpath Inherits base.res_config_settings_view_form
search_dms_directory dms_directory.search dms.directory search New
search_dms_file dms_file.search dms.file search New
search_dms_file_migration dms_file.search dms.file search New
view_dms_access_groups_form dms_access.group.form dms.access.group form New
view_dms_access_groups_tree dms_access_groups.tree dms.access.group tree New
view_dms_category_form dms_category.form dms.category form New
view_dms_category_search dms_category.search dms.category search New
view_dms_category_tree dms_category.tree dms.category tree New
view_dms_directory_form dms_directory.form dms.directory form New
view_dms_directory_kanban dms_directory.kanban dms.directory kanban New
view_dms_directory_manager_form dms_directory.form dms.directory field Inherits view_dms_directory_form
view_dms_directory_new_form dms_directory.form dms.directory xpath Inherits view_dms_directory_form
view_dms_directory_tree dms_directory.tree dms.directory tree New
view_dms_file_form dms_file.form dms.file form New
view_dms_file_graph dms_file.graph dms.file graph New
view_dms_file_kanban dms_file.kanban dms.file kanban New
view_dms_file_manager_form dms_file.form dms.file field Inherits view_dms_file_form
view_dms_file_migration_tree dms_file.tree dms.file tree New
view_dms_file_new_form dms_file.form dms.file xpath Inherits view_dms_file_form
view_dms_file_pivot dms_file.pivot dms.file pivot New
view_dms_file_tree dms_file.tree dms.file tree New
view_dms_storage_form dms_storage.form dms.storage form New
view_dms_storage_new_form dms_storage.form dms.storage xpath Inherits view_dms_storage_form
view_dms_storage_search dms_storage.search dms.storage search New
view_dms_storage_tree dms_storage.tree dms.storage tree New
view_dms_tag_form dms_tag.form dms.tag form New
view_dms_tag_kanban dms_tag.kanban dms.tag kanban New
view_dms_tag_search dms_tag.search dms.tag search New
view_dms_tag_tree dms_tag.tree dms.tag tree New
Models touched (13)

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)
    Cascade DMS related resources removal.

New fields (17)
  • child_group_ids One2many → dms.access.group
    comodel_name='dms.access.group' inverse_name='parent_group_id' string='Child Groups'
  • complete_directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_complete_groups_rel' string='Complete directories'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Directories'
  • count_users Integer
    compute='_compute_users' store=True string='Users'
  • directory_ids Many2many → dms.directory
    auto_join=True column1='gid' column2='aid' comodel_name='dms.directory' readonly=True relation='dms_directory_groups_rel' string='Directories'
  • explicit_user_ids Many2many → res.users
    column1='gid' column2='uid' comodel_name='res.users' relation='dms_access_group_explicit_users_rel' string='Explicit Users'
  • group_ids Many2many → res.groups
    column1='gid' column2='rid' comodel_name='res.groups' relation='dms_access_group_groups_rel' string='Groups'
  • name Char
    required=True string='Group Name' translate=True
  • parent_group_id Many2one → dms.access.group
    comodel_name='dms.access.group' index=True ondelete='cascade' string='Parent Group'
  • parent_path Char
    index=True string='Parent Path'
  • perm_create Boolean
    string='Create Access'
  • perm_inclusive_create Boolean
    compute='_compute_inclusive_permissions' store=True string='Inherited Create Access'
  • perm_inclusive_unlink Boolean
    compute='_compute_inclusive_permissions' store=True string='Inherited Unlink Access'
  • perm_inclusive_write Boolean
    compute='_compute_inclusive_permissions' store=True string='Inherited Write Access'
  • perm_unlink Boolean
    string='Unlink Access'
  • perm_write Boolean
    string='Write Access'
  • users Many2many → res.users
    auto_join=True column1='gid' column2='uid' comodel_name='res.users' compute='_compute_users' relation='dms_access_group_users_rel' store=True string='Group Users'
Public methods (1)
  • default_get(self, fields_list)
    @api.model

New fields (13)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • child_category_ids One2many → dms.category
    comodel_name='dms.category' inverse_name='parent_id' string='Child Categories'
  • complete_name Char
    compute='_compute_complete_name' store=True
  • count_categories Integer
    compute='_compute_count_categories' string='Count Subcategories'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Directories'
  • count_files Integer
    compute='_compute_count_files' string='Count Files'
  • count_tags Integer
    compute='_compute_count_tags' string='Count Tags'
  • directory_ids One2many → dms.directory
    comodel_name='dms.directory' inverse_name='category_id' readonly=True string='Directories'
  • file_ids One2many → dms.file
    comodel_name='dms.file' inverse_name='category_id' readonly=True string='Files'
  • name Char
    required=True string='Name' translate=True
  • parent_id Many2one → dms.category
    comodel_name='dms.category' index=True ondelete='cascade' string='Parent Category'
  • parent_path Char
    index=True string='Parent Path'
  • tag_ids One2many → dms.tag
    comodel_name='dms.tag' inverse_name='category_id' string='Tags'
Public methods (0)

No public methods.

New fields (33)
  • alias_process Selection
    default='directory' help=' Define how incoming emails are processed:\n\n - Single Files: The email gets attached to the directory and\n all attachments are created as files.\n\n - Subdirectory: A new subdirectory is created for each email\n and the mail is attached to this subdirectory. The attachments\n are created as files of the subdirectory.\n ' required=True selection=[('files', 'Single Files'), ('directory', 'Subdirectory')] string='Unpack Emails as'
  • allowed_model_ids Many2many → ir.model
    comodel_name='ir.model' compute='_compute_allowed_model_ids' store=False
  • category_id Many2one → dms.category
    comodel_name='dms.category' context="{'dms_category_show_path': True}" string='Category'
  • child_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='parent_id' string='Subdirectories'
  • color Integer
    default=0 string='Color'
  • company_id Many2one → res.company
    comodel_name='res.company' index=True readonly=True related='storage_id.company_id' store=True string='Company'
  • complete_group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' compute='_compute_groups' compute_sudo=True readonly=True relation='dms_directory_complete_groups_rel' store=True string='Complete Groups'
  • complete_name Char
    compute='_compute_complete_name' store=True args: 'Complete Name'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Subdirectories Title'
  • count_directories_title Char
    compute='_compute_count_directories' string='Count Subdirectories'
  • count_elements Integer
    compute='_compute_count_elements' string='Count Elements'
  • count_files Integer
    compute='_compute_count_files' string='Count Files Title'
  • count_files_title Char
    compute='_compute_count_files' string='Count Files'
  • count_total_directories Integer
    compute='_compute_count_total_directories' string='Total Subdirectories'
  • count_total_elements Integer
    compute='_compute_count_total_elements' string='Total Elements'
  • count_total_files Integer
    compute='_compute_count_total_files' string='Total Files'
  • file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='directory_id' string='Files'
  • group_ids Many2many → dms.access.group
    column1='aid' column2='gid' comodel_name='dms.access.group' relation='dms_directory_groups_rel' string='Groups'
  • inherit_group_ids Boolean
    default=True string='Inherit Groups'
  • is_hidden Boolean
    readonly=True related='storage_id.is_hidden' string='Storage is Hidden'
  • is_root_directory Boolean
    default=False help='Indicates if the directory is a root directory.\n A root directory has a settings object, while a directory with a set\n parent inherits the settings form its parent.' string='Is Root Directory'
  • model_id Many2one → ir.model
    comodel_name='ir.model' compute='_compute_model_id' domain="[('id', 'in', allowed_model_ids)]" inverse='_inverse_model_id' store=True string='Model'
  • name Char
    index=True required=True string='Name'
  • parent_id Many2one → dms.directory
    comodel_name='dms.directory' copy=True domain="[('permission_create', '=', True)]" index=True ondelete='restrict' prefetch=False string='Parent Directory'
  • parent_path Char
    index=True
  • root_storage_id Many2one → dms.storage
    comodel_name='dms.storage' copy=True ondelete='restrict' string='Root Storage'
  • size Integer
    compute='_compute_size' string='Size'
  • starred Boolean
    compute='_compute_starred' inverse='_inverse_starred' search='_search_starred' string='Starred'
  • storage_id Many2one → dms.storage
    auto_join=True comodel_name='dms.storage' compute='_compute_storage' compute_sudo=True ondelete='restrict' store=True string='Storage'
  • storage_id_inherit_access_from_parent_record Boolean
    auto_join=True related='storage_id.inherit_access_from_parent_record' related_sudo=True store=True
  • storage_id_save_type Selection
    prefetch=False readonly=True related='storage_id.save_type' related_sudo=True store=False
  • tag_ids Many2many → dms.tag
    column1='did' column2='tid' comodel_name='dms.tag' domain="[\n '|', ['category_id', '=', False],\n ['category_id', 'child_of', category_id]]\n " relation='dms_directory_tag_rel' string='Tags'
  • user_star_ids Many2many → res.users
    column1='did' column2='uid' comodel_name='res.users' relation='dms_directory_star_rel' string='Stars'
Public methods (11)
  • action_save_onboarding_directory_step(self)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_alias_model_name(self, vals)
    @api.model
  • get_alias_values(self)
  • message_new(self, msg_dict, custom_values=None)
    @api.model
  • message_update(self, msg_dict, update_vals=None)
  • toggle_starred(self)
  • unlink(self)
    @api.multi
    Custom cascade unlink. Cannot rely on DB backend's cascade because subfolder and subfile unlinks must check custom permissions implementation.
  • write(self, vals)

New fields (26)
  • active Boolean
    default=True help='If a file is set to archived, it is not displayed, but still exists.' string='Archived'
  • attachment_id Many2one → ir.attachment
    comodel_name='ir.attachment' invisible=True ondelete='cascade' prefetch=False string='Attachment File'
  • category_id Many2one → dms.category
    comodel_name='dms.category' context="{'dms_category_show_path': True}" string='Category'
  • checksum Char
    index=True readonly=True size=40 string='Checksum/SHA1'
  • color Integer
    default=0 string='Color'
  • company_id Many2one → res.company
    comodel_name='res.company' index=True readonly=True related='storage_id.company_id' store=True string='Company'
  • content Binary
    attachment=False compute='_compute_content' inverse='_inverse_content' prefetch=False required=True store=False string='Content'
  • content_binary Binary
    attachment=False invisible=True prefetch=False string='Content Binary'
  • content_file Binary
    attachment=True invisible=True prefetch=False string='Content File'
  • directory_id Many2one → dms.directory
    auto_join=True comodel_name='dms.directory' context="{'dms_directory_show_path': True}" domain="[('permission_create', '=', True)]" index=True ondelete='restrict' required=True string='Directory'
  • extension Char
    compute='_compute_extension' readonly=True store=True string='Extension'
  • is_hidden Boolean
    readonly=True related='storage_id.is_hidden' string='Storage is Hidden'
  • is_lock_editor Boolean
    compute='_compute_locked' string='Editor'
  • is_locked Boolean
    compute='_compute_locked' string='Locked'
  • locked_by Many2one → res.users
    comodel_name='res.users' string='Locked by'
  • migration Char
    compute='_compute_migration' compute_sudo=True prefetch=False readonly=True string='Migration Status'
  • name Char
    index=True required=True string='Filename'
  • path_json Text
    compute='_compute_path' readonly=True store=False string='Path Json'
  • path_names Char
    compute='_compute_path' readonly=True store=False string='Path Names'
  • require_migration Boolean
    compute='_compute_migration' compute_sudo=True store=True
  • res_mimetype Char
    compute='_compute_mimetype' readonly=True store=True string='Type'
  • save_type Char
    compute='_compute_save_type' invisible=True prefetch=False string='Current Save Type'
  • size Integer
    readonly=True string='Size'
  • storage_id Many2one
    prefetch=False readonly=True related='directory_id.storage_id' store=True
  • storage_id_save_type Selection
    related='storage_id.save_type' store=False
  • tag_ids Many2many → dms.tag
    column1='fid' column2='tid' comodel_name='dms.tag' relation='dms_file_tag_rel' string='Tags'
Public methods (11)
  • action_migrate(self, logging=True)
  • action_save_onboarding_file_step(self)
  • check_access_rule(self, operation)
  • check_access_token(self, access_token=False)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_human_size(self)
  • lock(self)
  • search_panel_select_multi_range(self, field_name, **kwargs)
    @api.model
  • search_panel_select_range(self, field_name, **kwargs)
    @api.model
  • unlock(self)

New fields (7)
  • custom_thumbnail Binary
    attachment=False string='Custom Thumbnail'
  • custom_thumbnail_medium Binary
    attachment=True compute='_compute_custom_thumbnail' store=True args: 'Medium Custom Thumbnail'
  • custom_thumbnail_small Binary
    attachment=True compute='_compute_custom_thumbnail' store=True args: 'Small Custom Thumbnail'
  • icon_url Char
    compute='_compute_icon_url' args: 'Icon URL'
  • thumbnail Binary
    compute='_compute_thumbnail' string='Thumbnail'
  • thumbnail_medium Binary
    compute='_compute_thumbnail' args: 'Medium Thumbnail'
  • thumbnail_small Binary
    compute='_compute_thumbnail' args: 'Small Thumbnail'
Public methods (0)

No public methods.

New fields (7)
  • permission_create Boolean
    compute='_compute_permissions' search='_search_permission_create' string='Create Access'
  • permission_read Boolean
    compute='_compute_permissions' search='_search_permission_read' string='Read Access'
  • permission_unlink Boolean
    compute='_compute_permissions' search='_search_permission_unlink' string='Delete Access'
  • permission_write Boolean
    compute='_compute_permissions' search='_search_permission_write' string='Write Access'
  • record_ref Reference
    compute='_compute_record_ref' selection=[] string='Record Referenced'
  • res_id Integer
    index=True string='Linked attachments record ID'
  • res_model Char
    index=True string='Linked attachments model'
Public methods (0)

No public methods.

New fields (12)
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='If set, directories and files will only be available for the selected company.' string='Company'
  • count_storage_directories Integer
    compute='_compute_count_storage_directories' string='Count Directories'
  • count_storage_files Integer
    compute='_compute_count_storage_files' string='Count Files'
  • include_message_attachments Boolean
    default=False help='Indicate if directories and files auto-create in mail composition process too' string='Create files from message attachments'
  • inherit_access_from_parent_record Boolean
    default=False help='Indicate if directories and files access work only with related model access (for example, if some directories are related with any sale, only users with read access to these sale can acess)' string='Inherit permissions from related record'
  • is_hidden Boolean
    default=False help='Indicates if directories and files are hidden by default.' string='Storage is Hidden'
  • model_ids Many2many → ir.model
    string='Linked Models' args: 'ir.model'
  • name Char
    required=True string='Name'
  • root_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='root_storage_id' readonly=False string='Root Directories'
  • save_type Selection
    default='database' help='The save type is used to determine how a file is saved by the\n system. If you change this setting, you can migrate existing files\n manually by triggering the action.' required=True selection=[('database', _('Database')), ('file', _('Filestore')), ('attachment', _('Attachment'))] string='Save Type'
  • storage_directory_ids One2many → dms.directory
    auto_join=False comodel_name='dms.directory' copy=False inverse_name='storage_id' readonly=True string='Directories'
  • storage_file_ids One2many → dms.file
    auto_join=False comodel_name='dms.file' copy=False inverse_name='storage_id' readonly=True string='Files'
Public methods (2)
  • action_save_onboarding_storage_step(self)
  • action_storage_migrate(self)

New fields (8)
  • active Boolean
    default=True help='The active field allows you to hide the tag without removing it.'
  • category_id Many2one → dms.category
    comodel_name='dms.category' context="{'dms_category_show_path': True}" ondelete='set null' string='Category'
  • color Integer
    default=10 string='Color Index'
  • count_directories Integer
    compute='_compute_count_directories' string='Count Directories'
  • count_files Integer
    compute='_compute_count_files' string='Count Files'
  • directory_ids Many2many → dms.directory
    column1='tid' column2='did' comodel_name='dms.directory' readonly=True relation='dms_directory_tag_rel' string='Directories'
  • file_ids Many2many → dms.file
    column1='tid' column2='fid' comodel_name='dms.file' readonly=True relation='dms_file_tag_rel' string='Files'
  • name Char
    required=True string='Name' translate=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • documents_onboarding_directory_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding Directory State'
  • documents_onboarding_file_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding File State'
  • documents_onboarding_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding State'
  • documents_onboarding_storage_state Selection
    default='not_done' selection=[('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')] string='Documents Onboarding Storage State'
Public methods (6)
  • action_close_documents_onboarding(self)
    @api.model
  • action_open_documents_onboarding_directory(self)
    @api.model
  • action_open_documents_onboarding_file(self)
    @api.model
  • action_open_documents_onboarding_storage(self)
    @api.model
  • get_and_update_documents_onboarding_state(self)
  • get_documents_steps_states_names(self)

New fields (2)
  • documents_binary_max_size Integer
    config_parameter='dms.binary_max_size' help='Defines the maximum upload size in MB. Default (25MB)' string='Size'
  • documents_forbidden_extensions Char
    config_parameter='dms.forbidden_extensions' help="Defines a list of forbidden file extensions. (Example: 'exe,msi')" string='Extensions'
Public methods (0)

No public methods.

STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/dms
PULL REQUEST
PULL REQUEST[19.0][MIG] dms: Migration to 19.0 (#475)