Storage File

storage_file
REPOSITORY
REPOSITORYOCA/storage
GIT
GIThttps://github.com/OCA/storage.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/storage/tree/19.0/storage_file
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYStorage
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSStéphane Bidoul, Laurent Mignon (ACSONE)
WEBSITE
WEBSITEhttps://github.com/OCA/storage
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:49
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/server-env:
    - server_environment
OCA/storage:
    - storage_backend
odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES python_slugify
cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
External file management depending on Storage Backend module.

It include these features: \* link to any Odoo model/record \* store
metadata like: checksum, mimetype

Use cases (with help of additional modules): - store pdf (like invoices)
on a file server with high SLA - access attachments with read/write on
prod environment and only read only on dev / testing

Code Analysis

Views touched (4)
XML IDNameModelTypeStatus
storage_backend_view_form storage.backend field Inherits storage_backend.storage_backend_view_form
storage_file_view_form storage.file form New
storage_file_view_search storage.file search New
storage_file_view_tree storage.file list New
Models touched (4)

New fields (0)

No new fields.

Public methods (1)
  • render_qweb_pdf(self, res_ids=None, data=None)

New fields (7)
  • backend_view_use_internal_url Boolean
    help='Decide if Odoo backend views should use the external URL (usually a CDN) or the internal url with direct access to the storage. This could save you some money if you pay by CDN traffic.'
  • base_url Char
    default=''
  • base_url_for_files Char
    compute='_compute_base_url_for_files' store=True
  • filename_strategy Selection
    default='name_with_id' help='Strategy to build the name of the file to be stored.\nName and ID: will store the file with its name + its id.\nSHA Hash: will use the hash of the file as filename (same method as the native attachment storage)' selection=[('name_with_id', 'Name and ID'), ('hash', 'SHA hash')]
  • is_public Boolean
    default=False help='Define if every files stored into this backend are public or not. Examples:\nPrivate: your file/image can not be displayed is the user is not logged (not available on other website);\nPublic: your file/image can be displayed if nobody is logged (useful to display files on external websites)'
  • served_by Selection
    default='odoo' required=True selection=[('odoo', 'Odoo'), ('external', 'External')]
  • url_include_directory_path Boolean
    default=False help="Normally the directory_path it's for internal usage. If this flag is enabled the path will be used to compute the public URL."
Public methods (2)
  • action_recompute_base_url_for_files(self)
    Refresh base URL for files. Rationale: all the params for computing this URL might come from server env. When this is the case, the URL - being stored - might be out of date. This is because changes to server env fields are not detected at startup. Hence, let's offer an easy way to promptly force this manually when needed.
  • write(self, vals)

New fields (18)
  • active Boolean
    default=True
  • backend_id Many2one → storage.backend
    index=True required=True args: 'storage.backend', 'Storage'
  • checksum Char
    index=True size=40 args: 'Checksum/SHA1'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • data Binary
    compute='_compute_data' copy=True help='Data' inverse='_inverse_data' store=False
  • extension Char
    compute='_compute_extract_filename' store=True
  • file_size Integer
  • file_type Selection
    args: []
  • filename Char
    compute='_compute_extract_filename' store=True args: 'Filename without extension'
  • human_file_size Char
    compute='_compute_human_file_size' store=True
  • internal_url Char
    compute='_compute_internal_url' help='HTTP URL to load the file directly from storage.'
  • mimetype Char
    compute='_compute_extract_filename' store=True args: 'Mime Type'
  • name Char
    index=True required=True
  • relative_path Char
    copy=False help='Relative location for backend'
  • slug Char
    compute='_compute_slug' help='Slug-ified name with ID for URL' store=True
  • to_delete Boolean
  • url Char
    compute='_compute_url' help='HTTP accessible path to the file'
  • url_path Char
    compute='_compute_url_path' help='Accessible path, no base URL'
Public methods (3)
  • get_from_slug_name_with_id(self, slug_name_with_id)
    @api.model
    Return a browse record from a string generated by the method _slugify_name_with_id :param slug_name_with_id: :return: a BrowseRecord (could be empty...)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • data Binary
  • file_id Many2one → storage.file
    args: 'storage.file'
  • file_name Char
Public methods (1)
  • confirm(self)
REPOSITORY
REPOSITORYOCA/storage
GIT
GIThttps://github.com/OCA/storage.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/storage/tree/18.0/storage_file
VERSION
VERSION 1.3.0
CATEGORY
CATEGORYStorage
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, Simone Orsi, oca-ci, thien
WEBSITE
WEBSITEhttps://github.com/OCA/storage
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:15
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/server-env:
    - server_environment
OCA/storage:
    - storage_backend
odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES python_slugify
cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
External file management depending on Storage Backend module.

It include these features: \* link to any Odoo model/record \* store
metadata like: checksum, mimetype

Use cases (with help of additional modules): - store pdf (like invoices)
on a file server with high SLA - access attachments with read/write on
prod environment and only read only on dev / testing

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
storage_backend_view_form storage.backend field Inherits storage_backend.storage_backend_view_form
storage_file_swap_backend_view_form storage.file.swap.backend.form storage.file.swap.backend form New
storage_file_view_form storage.file form New
storage_file_view_search storage.file search New
storage_file_view_tree storage.file list New
Models touched (5)

New fields (0)

No new fields.

Public methods (1)
  • render_qweb_pdf(self, res_ids=None, data=None)

New fields (7)
  • backend_view_use_internal_url Boolean
    help='Decide if Odoo backend views should use the external URL (usually a CDN) or the internal url with direct access to the storage. This could save you some money if you pay by CDN traffic.'
  • base_url Char
    default=''
  • base_url_for_files Char
    compute='_compute_base_url_for_files' store=True
  • filename_strategy Selection
    default='name_with_id' help='Strategy to build the name of the file to be stored.\nName and ID: will store the file with its name + its id.\nSHA Hash: will use the hash of the file as filename (same method as the native attachment storage)' selection=[('name_with_id', 'Name and ID'), ('hash', 'SHA hash')]
  • is_public Boolean
    default=False help='Define if every files stored into this backend are public or not. Examples:\nPrivate: your file/image can not be displayed is the user is not logged (not available on other website);\nPublic: your file/image can be displayed if nobody is logged (useful to display files on external websites)'
  • served_by Selection
    default='odoo' required=True selection=[('odoo', 'Odoo'), ('external', 'External')]
  • url_include_directory_path Boolean
    default=False help="Normally the directory_path it's for internal usage. If this flag is enabled the path will be used to compute the public URL."
Public methods (2)
  • action_recompute_base_url_for_files(self)
    Refresh base URL for files. Rationale: all the params for computing this URL might come from server env. When this is the case, the URL - being stored - might be out of date. This is because changes to server env fields are not detected at startup. Hence, let's offer an easy way to promptly force this manually when needed.
  • write(self, vals)

New fields (20)
  • active Boolean
    default=True
  • backend_categ_id Many2one → storage.backend.category
    related='backend_id.categ_id' string='Backend Category' args: 'storage.backend.category'
  • backend_id Many2one → storage.backend
    default=<expr> index=True required=True args: 'storage.backend', 'Storage'
  • checksum Char
    index=True size=40 args: 'Checksum/SHA1'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • data Binary
    compute='_compute_data' copy=True help='Data' inverse='_inverse_data' store=False
  • extension Char
    compute='_compute_extract_filename' store=True
  • file_size Integer
  • file_type Selection
    args: []
  • filename Char
    compute='_compute_extract_filename' store=True args: 'Filename without extension'
  • human_file_size Char
    compute='_compute_human_file_size' store=True
  • internal_url Char
    compute='_compute_internal_url' help='HTTP URL to load the file directly from storage.'
  • is_public Boolean
    compute='_compute_is_public' compute_sudo=True help='Reflects the `is_public` flag of the related backend.' search='_search_is_public'
  • mimetype Char
    compute='_compute_extract_filename' store=True args: 'Mime Type'
  • name Char
    index=True required=True
  • relative_path Char
    copy=False help='Relative location for backend'
  • slug Char
    compute='_compute_slug' help='Slug-ified name with ID for URL' store=True
  • to_delete Boolean
  • url Char
    compute='_compute_url' help='HTTP accessible path to the file'
  • url_path Char
    compute='_compute_url_path' help='Accessible path, no base URL'
Public methods (3)
  • get_from_slug_name_with_id(self, slug_name_with_id)
    @api.model
    Return a browse record from a string generated by the method _slugify_name_with_id :param slug_name_with_id: :return: a BrowseRecord (could be empty...)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • data Binary
  • file_id Many2one → storage.file
    args: 'storage.file'
  • file_name Char
Public methods (1)
  • confirm(self)

New fields (4)
  • dest_backend_id Many2one → storage.backend
    string='Destination Storage' args: 'storage.backend'
  • file_ids Many2many → storage.file
    domain="[('backend_id', '=', source_backend_id)]" string='Files' args: 'storage.file'
  • source_backend_categ_id Many2one → storage.backend.category
    readonly=True related='source_backend_id.categ_id' string='Source Backend Category' args: 'storage.backend.category'
  • source_backend_id Many2one → storage.backend
    readonly=True string='Source Storage' args: 'storage.backend'
Public methods (2)
  • action_apply(self)
  • default_get(self, fields_list)
    @api.model
REPOSITORY
REPOSITORYOCA/storage
GIT
GIThttps://github.com/OCA/storage.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/storage/tree/16.0/storage_file
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYStorage
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, Simone Orsi, oca-ci, Héctor Vi Or
WEBSITE
WEBSITEhttps://github.com/OCA/storage
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:52
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/server-env:
    - server_environment
OCA/storage:
    - storage_backend
odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES python_slugify
cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (4)
XML IDNameModelTypeStatus
storage_backend_view_form storage.backend field Inherits storage_backend.storage_backend_view_form
storage_file_view_form storage.file form New
storage_file_view_search storage.file search New
storage_file_view_tree storage.file tree New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • render_qweb_pdf(self, res_ids=None, data=None)

New fields (7)
  • backend_view_use_internal_url Boolean
    help='Decide if Odoo backend views should use the external URL (usually a CDN) or the internal url with direct access to the storage. This could save you some money if you pay by CDN traffic.'
  • base_url Char
    default=''
  • base_url_for_files Char
    compute='_compute_base_url_for_files' store=True
  • filename_strategy Selection
    default='name_with_id' help='Strategy to build the name of the file to be stored.\nName and ID: will store the file with its name + its id.\nSHA Hash: will use the hash of the file as filename (same method as the native attachment storage)' selection=[('name_with_id', 'Name and ID'), ('hash', 'SHA hash')]
  • is_public Boolean
    default=False help='Define if every files stored into this backend are public or not. Examples:\nPrivate: your file/image can not be displayed is the user is not logged (not available on other website);\nPublic: your file/image can be displayed if nobody is logged (useful to display files on external websites)'
  • served_by Selection
    default='odoo' required=True selection=[('odoo', 'Odoo'), ('external', 'External')]
  • url_include_directory_path Boolean
    default=False help="Normally the directory_path it's for internal usage. If this flag is enabled the path will be used to compute the public URL."
Public methods (2)
  • action_recompute_base_url_for_files(self)
    Refresh base URL for files. Rationale: all the params for computing this URL might come from server env. When this is the case, the URL - being stored - might be out of date. This is because changes to server env fields are not detected at startup. Hence, let's offer an easy way to promptly force this manually when needed.
  • write(self, vals)

New fields (17)
  • active Boolean
    default=True
  • backend_id Many2one → storage.backend
    index=True required=True args: 'storage.backend', 'Storage'
  • checksum Char
    index=True readonly=True size=40 args: 'Checksum/SHA1'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • data Binary
    compute='_compute_data' help='Datas' inverse='_inverse_data' store=False
  • extension Char
    compute='_compute_extract_filename' store=True
  • file_size Integer
  • file_type Selection
    args: []
  • filename Char
    compute='_compute_extract_filename' store=True args: 'Filename without extension'
  • human_file_size Char
    compute='_compute_human_file_size' store=True
  • internal_url Char
    compute='_compute_internal_url' help='HTTP URL to load the file directly from storage.'
  • mimetype Char
    compute='_compute_extract_filename' store=True args: 'Mime Type'
  • name Char
    index=True required=True
  • relative_path Char
    help='Relative location for backend' readonly=True
  • slug Char
    compute='_compute_slug' help='Slug-ified name with ID for URL' store=True
  • to_delete Boolean
  • url Char
    compute='_compute_url' help='HTTP accessible path to the file'
Public methods (3)
  • get_from_slug_name_with_id(self, slug_name_with_id)
    @api.model
    Return a browse record from a string generated by the method _slugify_name_with_id :param slug_name_with_id: :return: a BrowseRecord (could be empty...)
  • unlink(self)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/storage
GIT
GIThttps://github.com/OCA/storage.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/storage/tree/15.0/storage_file
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYStorage
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSOCA-git-bot, oca-ci, Jasmin Solanki
WEBSITE
WEBSITEhttps://github.com/OCA/storage
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:37
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/server-env:
    - server_environment
OCA/storage:
    - storage_backend
odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES python_slugify
cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (4)
XML IDNameModelTypeStatus
storage_backend_view_form storage.backend field Inherits storage_backend.storage_backend_view_form
storage_file_view_form storage.file form New
storage_file_view_search storage.file search New
storage_file_view_tree storage.file tree New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • render_qweb_pdf(self, res_ids=None, data=None)

New fields (7)
  • backend_view_use_internal_url Boolean
    help='Decide if Odoo backend views should use the external URL (usually a CDN) or the internal url with direct access to the storage. This could save you some money if you pay by CDN traffic.'
  • base_url Char
    default=''
  • base_url_for_files Char
    compute='_compute_base_url_for_files' store=True
  • filename_strategy Selection
    default='name_with_id' help='Strategy to build the name of the file to be stored.\nName and ID: will store the file with its name + its id.\nSHA Hash: will use the hash of the file as filename (same method as the native attachment storage)' selection=[('name_with_id', 'Name and ID'), ('hash', 'SHA hash')]
  • is_public Boolean
    default=False help='Define if every files stored into this backend are public or not. Examples:\nPrivate: your file/image can not be displayed is the user is not logged (not available on other website);\nPublic: your file/image can be displayed if nobody is logged (useful to display files on external websites)'
  • served_by Selection
    default='odoo' required=True selection=[('odoo', 'Odoo'), ('external', 'External')]
  • url_include_directory_path Boolean
    default=False help="Normally the directory_path it's for internal usage. If this flag is enabled the path will be used to compute the public URL."
Public methods (2)
  • action_recompute_base_url_for_files(self)
    Refresh base URL for files. Rationale: all the params for computing this URL might come from server env. When this is the case, the URL - being stored - might be out of date. This is because changes to server env fields are not detected at startup. Hence, let's offer an easy way to promptly force this manually when needed.
  • write(self, vals)

New fields (17)
  • active Boolean
    default=True
  • backend_id Many2one → storage.backend
    index=True required=True args: 'storage.backend', 'Storage'
  • checksum Char
    index=True readonly=True size=40 args: 'Checksum/SHA1'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • data Binary
    compute='_compute_data' help='Datas' inverse='_inverse_data' store=False
  • extension Char
    compute='_compute_extract_filename' store=True
  • file_size Integer
  • file_type Selection
    args: []
  • filename Char
    compute='_compute_extract_filename' store=True args: 'Filename without extension'
  • human_file_size Char
    compute='_compute_human_file_size' store=True
  • internal_url Char
    compute='_compute_internal_url' help='HTTP URL to load the file directly from storage.'
  • mimetype Char
    compute='_compute_extract_filename' store=True args: 'Mime Type'
  • name Char
    index=True required=True
  • relative_path Char
    help='Relative location for backend' readonly=True
  • slug Char
    compute='_compute_slug' help='Slug-ified name with ID for URL' store=True
  • to_delete Boolean
  • url Char
    compute='_compute_url' help='HTTP accessible path to the file'
Public methods (3)
  • get_from_slug_name_with_id(self, slug_name_with_id)
    @api.model
    Return a browse record from a string generated by the method _slugify_name_with_id :param slug_name_with_id: :return: a BrowseRecord (could be empty...)
  • unlink(self)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/storage
GIT
GIThttps://github.com/OCA/storage.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/storage/tree/14.0/storage_file
VERSION
VERSION 2.4.1
CATEGORY
CATEGORYStorage
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSEnric Tobella, Ivàn Todorovich, Sébastien Alix, Sébastien BEAU, oca-travis, Weblate, OCA-git-bot, Simone Orsi, Pierrick Brun, oca-ci, oca-git-bot, Mmequignon
WEBSITE
WEBSITEhttps://github.com/OCA/storage
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:04
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/server-env:
    - server_environment
OCA/storage:
    - storage_backend
odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES python_slugify
cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (4)
XML IDNameModelTypeStatus
storage_backend_view_form storage.backend field Inherits storage_backend.storage_backend_view_form
storage_file_view_form storage.file form New
storage_file_view_search storage.file search New
storage_file_view_tree storage.file tree New
Models touched (4)

New fields (0)

No new fields.

Public methods (1)
  • render_qweb_pdf(self, res_ids=None, data=None)

New fields (7)
  • backend_view_use_internal_url Boolean
    help='Decide if Odoo backend views should use the external URL (usually a CDN) or the internal url with direct access to the storage. This could save you some money if you pay by CDN traffic.'
  • base_url Char
    default=''
  • base_url_for_files Char
    compute='_compute_base_url_for_files' store=True
  • filename_strategy Selection
    default='name_with_id' help='Strategy to build the name of the file to be stored.\nName and ID: will store the file with its name + its id.\nSHA Hash: will use the hash of the file as filename (same method as the native attachment storage)' selection=[('name_with_id', 'Name and ID'), ('hash', 'SHA hash')]
  • is_public Boolean
    default=False help='Define if every files stored into this backend are public or not. Examples:\nPrivate: your file/image can not be displayed is the user is not logged (not available on other website);\nPublic: your file/image can be displayed if nobody is logged (useful to display files on external websites)'
  • served_by Selection
    default='odoo' required=True selection=[('odoo', 'Odoo'), ('external', 'External')]
  • url_include_directory_path Boolean
    default=False help="Normally the directory_path it's for internal usage. If this flag is enabled the path will be used to compute the public URL."
Public methods (2)
  • action_recompute_base_url_for_files(self)
    Refresh base URL for files. Rationale: all the params for computing this URL might come from server env. When this is the case, the URL - being stored - might be out of date. This is because changes to server env fields are not detected at startup. Hence, let's offer an easy way to promptly force this manually when needed.
  • write(self, vals)

New fields (18)
  • active Boolean
    default=True
  • backend_id Many2one → storage.backend
    index=True required=True args: 'storage.backend', 'Storage'
  • checksum Char
    index=True readonly=True size=40 args: 'Checksum/SHA1'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • data Binary
    compute='_compute_data' copy=True help='Data' inverse='_inverse_data' store=False
  • extension Char
    compute='_compute_extract_filename' store=True args: 'Extension'
  • file_size Integer
    args: 'File Size'
  • file_type Selection
    args: []
  • filename Char
    compute='_compute_extract_filename' store=True args: 'Filename without extension'
  • human_file_size Char
    compute='_compute_human_file_size' store=True args: 'Human File Size'
  • internal_url Char
    compute='_compute_internal_url' help='HTTP URL to load the file directly from storage.'
  • mimetype Char
    compute='_compute_extract_filename' store=True args: 'Mime Type'
  • name Char
    index=True required=True
  • relative_path Char
    copy=False help='Relative location for backend' readonly=True
  • slug Char
    compute='_compute_slug' help='Slug-ified name with ID for URL' store=True
  • to_delete Boolean
  • url Char
    compute='_compute_url' help='HTTP accessible path to the file'
  • url_path Char
    compute='_compute_url_path' help='Accessible path, no base URL'
Public methods (3)
  • get_from_slug_name_with_id(self, slug_name_with_id)
    @api.model
    Return a browse record from a string generated by the method _slugify_name_with_id :param slug_name_with_id: :return: a BrowseRecord (could be empty...)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • data Binary
  • file_id Many2one → storage.file
    args: 'storage.file'
  • file_name Char
Public methods (1)
  • confirm(self)
REPOSITORY
REPOSITORYOCA/storage
GIT
GIThttps://github.com/OCA/storage.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/storage/tree/13.0/storage_file
VERSION
VERSION 1.5.1
CATEGORY
CATEGORYStorage
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSLaurent Mignon (ACSONE), Enric Tobella, Miquel Raïch, Sébastien BEAU, oca-travis, OCA-git-bot, Simone Orsi
WEBSITE
WEBSITEhttps://github.com/OCA/storage
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:16
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/server-env:
    - server_environment
OCA/storage:
    - storage_backend
odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES python_slugify
cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (4)
XML IDNameModelTypeStatus
storage_backend_view_form storage.backend field Inherits storage_backend.storage_backend_view_form
storage_file_view_form storage.file form New
storage_file_view_search storage.file search New
storage_file_view_tree storage.file tree New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • render_qweb_pdf(self, res_ids=None, data=None)

New fields (6)
  • base_url Char
    default=''
  • base_url_for_files Char
    compute='_compute_base_url_for_files' store=True
  • filename_strategy Selection
    default='name_with_id' help='Strategy to build the name of the file to be stored.\nName and ID: will store the file with its name + its id.\nSHA Hash: will use the hash of the file as filename (same method as the native attachment storage)' selection=[('name_with_id', 'Name and ID'), ('hash', 'SHA hash')]
  • is_public Boolean
    default=False help='Define if every files stored into this backend are public or not. Examples:\nPrivate: your file/image can not be displayed is the user is not logged (not available on other website);\nPublic: your file/image can be displayed if nobody is logged (useful to display files on external websites)'
  • served_by Selection
    default='odoo' required=True selection=[('odoo', 'Odoo'), ('external', 'External')]
  • url_include_directory_path Boolean
    default=False help="Normally the directory_path it's for internal usage. If this flag is enabled the path will be used to compute the public URL."
Public methods (2)
  • action_recompute_base_url_for_files(self)
    Refresh base URL for files. Rationale: all the params for computing this URL might come from server env. When this is the case, the URL - being stored - might be out of date. This is because changes to server env fields are not detected at startup. Hence, let's offer an easy way to promptly force this manually when needed.
  • write(self, vals)

New fields (16)
  • active Boolean
    default=True
  • backend_id Many2one → storage.backend
    index=True required=True args: 'storage.backend', 'Storage'
  • checksum Char
    index=True readonly=True size=40 args: 'Checksum/SHA1'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • data Binary
    compute='_compute_data' help='Datas' inverse='_inverse_data' store=False
  • extension Char
    compute='_compute_extract_filename' store=True args: 'Extension'
  • file_size Integer
    args: 'File Size'
  • file_type Selection
    args: []
  • filename Char
    compute='_compute_extract_filename' store=True args: 'Filename without extension'
  • human_file_size Char
    compute='_compute_human_file_size' store=True args: 'Human File Size'
  • mimetype Char
    compute='_compute_extract_filename' store=True args: 'Mime Type'
  • name Char
    index=True required=True
  • relative_path Char
    help='Relative location for backend' readonly=True
  • slug Char
    compute='_compute_slug' help='Slug-ified name with ID for URL' store=True
  • to_delete Boolean
  • url Char
    compute='_compute_url' help='HTTP accessible path to the file'
Public methods (3)
  • get_from_slug_name_with_id(self, slug_name_with_id)
    @api.model
    Return a browse record from a string generated by the method _slugify_name_with_id :param slug_name_with_id: :return: a BrowseRecord (could be empty...)
  • unlink(self)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/storage
GIT
GIThttps://github.com/OCA/storage.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/storage/tree/12.0/storage_file
VERSION
VERSION 2.0.4
CATEGORY
CATEGORYStorage
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSLaurent Mignon (ACSONE), Denis Roussel, Stéphane Bidoul (ACSONE), Sébastien BEAU, oca-travis, OCA-git-bot, Tom Blauwendraat, Simone Orsi, hparfr
WEBSITE
WEBSITEhttps://github.com/OCA/storage
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:21
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/server-env:
    - server_environment
OCA/storage:
    - storage_backend
odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES slugify
cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (4)
XML IDNameModelTypeStatus
storage_backend_view_form storage.backend field Inherits storage_backend.storage_backend_view_form
storage_file_view_form storage.file form New
storage_file_view_search storage.file search New
storage_file_view_tree storage.file tree New
Models touched (2)

New fields (5)
  • base_url Char
    default=''
  • filename_strategy Selection
    default='name_with_id' help='Strategy to build the name of the file to be stored.\nName and ID: will store the file with its name + its id.\nSHA Hash: will use the hash of the file as filename (same method as the native attachment storage)' selection=[('name_with_id', 'Name and ID'), ('hash', 'SHA hash')]
  • is_public Boolean
    default=False help='Define if every files stored into this backend are public or not. Examples:\nPrivate: your file/image can not be displayed is the user is not logged (not available on other website);\nPublic: your file/image can be displayed if nobody is logged (useful to display files on external websites)'
  • served_by Selection
    default='odoo' required=True selection=[('odoo', 'Odoo'), ('external', 'External')]
  • url_include_directory_path Boolean
    default=False help="Normally the directory_path it's for internal usage. If this flag is enabled the path will be used to compute the public URL."
Public methods (0)

No public methods.

New fields (15)
  • active Boolean
    default=True
  • backend_id Many2one → storage.backend
    index=True required=True args: 'storage.backend', 'Storage'
  • checksum Char
    index=True readonly=True size=40 args: 'Checksum/SHA1'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • data Binary
    compute='_compute_data' help='Datas' inverse='_inverse_data' store=False
  • extension Char
    compute='_compute_extract_filename' store=True args: 'Extension'
  • file_size Integer
    args: 'File Size'
  • file_type Selection
    args: []
  • filename Char
    compute='_compute_extract_filename' store=True args: 'Filename without extension'
  • human_file_size Char
    compute='_compute_human_file_size' store=True args: 'Human File Size'
  • mimetype Char
    compute='_compute_extract_filename' store=True args: 'Mime Type'
  • name Char
    index=True required=True
  • relative_path Char
    help='Relative location for backend' readonly=True
  • to_delete Boolean
  • url Char
    compute='_compute_url' help='HTTP accessible path to the file'
Public methods (3)
  • get_from_slug_name_with_id(self, slug_name_with_id)
    @api.model
    Return a browse record from a string generated by the method _slugify_name_with_id :param slug_name_with_id: :return: a BrowseRecord (could be empty...)
  • unlink(self)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/storage
GIT
GIThttps://github.com/OCA/storage.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/storage/tree/10.0/storage_file
VERSION
VERSION 1.1.2
CATEGORY
CATEGORYStorage
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSRenato Lima, GitHub, Laurent Mignon (ACSONE), Denis Roussel, Sébastien BEAU, Florian da Costa, beau sebastien, David Beal, oca-travis, OCA-git-bot, Benoit, Raph, François Honoré
WEBSITE
WEBSITEhttps://github.com/OCA/storage
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:19:59
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/server-tools:
    - keychain
OCA/storage:
    - storage_backend
odoo/odoo:
    - base
    - base_setup
    - web_kanban
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES slugify
cryptography
cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (4)
XML IDNameModelTypeStatus
storage_backend_view_form storage.backend field Inherits storage_backend.storage_backend_view_form
storage_file_view_form storage.file form New
storage_file_view_search storage.file search New
storage_file_view_tree storage.file tree New
Models touched (2)

New fields (4)
  • base_url Char
  • filename_strategy Selection
    default='name_with_id' help='Strategy to build the name of the file to be stored.\nName and ID: will store the file with its name + its id.\nSHA Hash: will use the hash of the file as filename (same method as the native attachment storage)' selection=[('name_with_id', 'Name and ID'), ('hash', 'SHA hash')]
  • is_public Boolean
    default=False help='Define if every files stored into this backend are public or not. Examples:\nPrivate: your file/image can not be displayed is the user is not logged (not available on other website);\nPublic: your file/image can be displayed if nobody is logged (useful to display files on external websites)'
  • served_by Selection
    default='odoo' required=True selection=[('odoo', 'Odoo'), ('external', 'External')]
Public methods (0)

No public methods.

New fields (15)
  • active Boolean
    default=True
  • backend_id Many2one → storage.backend
    index=True required=True args: 'storage.backend', 'Storage'
  • checksum Char
    index=True readonly=True size=40 args: 'Checksum/SHA1'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • data Binary
    compute='_compute_data' help='Datas' inverse='_inverse_data' store=False
  • extension Char
    compute='_compute_extract_filename' store=True args: 'Extension'
  • file_size Integer
    args: 'File Size'
  • file_type Selection
    args: []
  • filename Char
    compute='_compute_extract_filename' store=True args: 'Filename without extension'
  • human_file_size Char
    compute='_compute_human_file_size' store=True args: 'Human File Size'
  • mimetype Char
    compute='_compute_extract_filename' store=True args: 'Mime Type'
  • name Char
    index=True required=True
  • relative_path Char
    help='Relative location for backend' readonly=True
  • to_delete Boolean
  • url Char
    compute='_compute_url' compute_sudo=True help='HTTP accessible path to the file' store=True
Public methods (3)
  • get_from_slug_name_with_id(self, slug_name_with_id)
    @api.model
    Return a browse record from a string generated by the method _slugify_name_with_id :param slug_name_with_id: :return: a BrowseRecord (could be empty...)
  • unlink(self)
  • write(self, vals)