Attachment Synchronize

attachment_synchronize
REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/18.0/attachment_synchronize
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYGeneric Modules
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSFlorian da Costa, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/queue:
    - queue_job
OCA/server-env:
    - server_environment
OCA/server-tools:
    - attachment_queue
OCA/storage:
    - fs_storage
odoo/odoo:
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES openupgradelib
requests
fsspec>=2024.5.0
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows to **import/export files** from/to backend servers.

A backend server is defined by the basic
[fs_storage](https://github.com/OCA/storage/tree/16.0/fs_storage) OCA
module, while it can be configured (amazon S3, sftp,...) with additional
modules fs python libraries

The imported files (and the files to be exported) are stored in Odoo as
`attachment.queue` objects, defined by the
[attachment_queue](https://github.com/OCA/server-tools/tree/16.0/attachment_queue)
module while the importation itself (resp. exportation) is realized by
**"Attachments Import Tasks"** (resp. "Attachments Export Tasks")
defined by this current module.

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
attachment_queue_view_search attachment.queue field Inherits attachment_queue.view_attachment_queue_search
view_attachment_queue_form attachment.queue xpath Inherits attachment_queue.view_attachment_queue_form
view_attachment_queue_list attachment.queue xpath Inherits attachment_queue.view_attachment_queue_list
view_attachment_task_form attachment.synchronize.task form New
view_attachment_task_list attachment.synchronize.task list New
view_attachment_task_search attachment.synchronize.task search New
view_fs_storage_form fs.storage xpath Inherits fs_storage.fs_storage_form_view
Models touched (3)

New fields (4)
  • file_type Selection
    selection_add=[('export', 'Export File (External location)')]
  • fs_storage_id Many2one → fs.storage
    related='task_id.backend_id' store=True string='Filestore Storage' args: 'fs.storage'
  • method_type Selection
    related='task_id.method_type'
  • task_id Many2one → attachment.synchronize.task
    string='Task' args: 'attachment.synchronize.task'
Public methods (1)
  • onchange_task_id(self)
    @api.onchange('task_id')

New fields (16)
  • active Boolean
    default=True args: 'Enabled'
  • after_import Selection
    help='Action after import a file' selection=[('rename', 'Rename'), ('move', 'Move'), ('move_rename', 'Move & Rename'), ('delete', 'Delete')]
  • attachment_ids One2many → attachment.queue
    string='Attachment' args: 'attachment.queue', 'task_id'
  • avoid_duplicated_files Boolean
    help='If checked, a file will not be imported if an Attachment Queue with the same name already exists.' string='Avoid importing duplicated files'
  • backend_id Many2one → fs.storage
    string='Backend' args: 'fs.storage'
  • count_attachment_done Integer
    compute='_compute_count_state'
  • count_attachment_failed Integer
    compute='_compute_count_state'
  • count_attachment_pending Integer
    compute='_compute_count_state'
  • failure_emails Char
    help="Used to fill the 'Failure Emails' field in the 'Attachments Queues' related to this task.\nAn alert will be sent to these emails if any operation on these Attachment Queue's file type fails."
  • file_type Selection
    help="Used to fill the 'File Type' field in the imported 'Attachments Queues'.\nFurther operations will be realized on these Attachments Queues depending on their 'File Type' value." selection=[]
  • filepath Char
    help='Path to imported/exported files in the Backend' string='File Path'
  • method_type Selection
    required=True args: [('import', 'Import Task'), ('export', 'Export Task')]
  • move_path Char
    help='Imported File will be moved to this path'
  • name Char
    required=True
  • new_name Char
    help="Imported File will be renamed to this name.\nNew Name can use 'mako' template where 'obj' is the original file's name.\nFor instance : ${obj.name}-${obj.create_date}.csv"
  • pattern Char
    help="Pattern used to select the files to be imported following the 'fnmatch' special characters (e.g. '*.txt' to catch all the text files).\nIf empty, import all the files found in 'File Path'." string='Selection Pattern'
Public methods (6)
  • button_duplicate_record(self)
  • copy(self, default=None)
  • run(self)
  • run_export(self)
  • run_import(self)
  • run_task_import_scheduler(self, domain=None)
    @api.model

New fields (3)
  • export_task_count Integer
    compute='_compute_export_task_count' args: 'Export Tasks'
  • import_task_count Integer
    compute='_compute_import_task_count' args: 'Import Tasks'
  • synchronize_task_ids One2many → attachment.synchronize.task
    string='Tasks' args: 'attachment.synchronize.task', 'backend_id'
Public methods (2)
  • action_related_export_task(self)
  • action_related_import_task(self)
REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/16.0/attachment_synchronize
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYGeneric Modules
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSFlorian da Costa, Weblate, OCA-git-bot, clementmbr, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/queue:
    - queue_job
OCA/server-tools:
    - attachment_queue
OCA/storage:
    - fs_storage
odoo/odoo:
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES requests
fsspec>=2024.5.0
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
attachment_queue_view_search attachment.queue field Inherits attachment_queue.view_attachment_queue_search
view_attachment_queue_form attachment.queue xpath Inherits attachment_queue.view_attachment_queue_form
view_attachment_queue_tree attachment.queue xpath Inherits attachment_queue.view_attachment_queue_tree
view_attachment_task_form attachment.synchronize.task form New
view_attachment_task_search attachment.synchronize.task search New
view_attachment_task_tree attachment.synchronize.task tree New
view_fs_storage_form fs.storage xpath Inherits fs_storage.fs_storage_form_view
Models touched (3)

New fields (4)
  • file_type Selection
    selection_add=[('export', 'Export File (External location)')]
  • fs_storage_id Many2one → fs.storage
    related='task_id.backend_id' store=True string='Filestore Storage' args: 'fs.storage'
  • method_type Selection
    related='task_id.method_type'
  • task_id Many2one → attachment.synchronize.task
    string='Task' args: 'attachment.synchronize.task'
Public methods (1)
  • onchange_task_id(self)
    @api.onchange('task_id')

New fields (16)
  • active Boolean
    default=True args: 'Enabled'
  • after_import Selection
    help='Action after import a file' selection=[('rename', 'Rename'), ('move', 'Move'), ('move_rename', 'Move & Rename'), ('delete', 'Delete')]
  • attachment_ids One2many → attachment.queue
    string='Attachment' args: 'attachment.queue', 'task_id'
  • avoid_duplicated_files Boolean
    help='If checked, a file will not be imported if an Attachment Queue with the same name already exists.' string='Avoid importing duplicated files'
  • backend_id Many2one → fs.storage
    string='Backend' args: 'fs.storage'
  • count_attachment_done Integer
    compute='_compute_count_state'
  • count_attachment_failed Integer
    compute='_compute_count_state'
  • count_attachment_pending Integer
    compute='_compute_count_state'
  • failure_emails Char
    help="Used to fill the 'Failure Emails' field in the 'Attachments Queues' related to this task.\nAn alert will be sent to these emails if any operation on these Attachment Queue's file type fails."
  • file_type Selection
    help="Used to fill the 'File Type' field in the imported 'Attachments Queues'.\nFurther operations will be realized on these Attachments Queues depending on their 'File Type' value." selection=[]
  • filepath Char
    help='Path to imported/exported files in the Backend' string='File Path'
  • method_type Selection
    required=True args: [('import', 'Import Task'), ('export', 'Export Task')]
  • move_path Char
    help='Imported File will be moved to this path'
  • name Char
    required=True
  • new_name Char
    help="Imported File will be renamed to this name.\nNew Name can use 'mako' template where 'obj' is the original file's name.\nFor instance : ${obj.name}-${obj.create_date}.csv"
  • pattern Char
    help="Pattern used to select the files to be imported following the 'fnmatch' special characters (e.g. '*.txt' to catch all the text files).\nIf empty, import all the files found in 'File Path'." string='Selection Pattern'
Public methods (6)
  • button_duplicate_record(self)
  • copy(self, default=None)
  • run(self)
  • run_export(self)
  • run_import(self)
  • run_task_import_scheduler(self, domain=None)
    @api.model

New fields (3)
  • export_task_count Integer
    compute='_compute_export_task_count' args: 'Export Tasks'
  • import_task_count Integer
    compute='_compute_import_task_count' args: 'Import Tasks'
  • synchronize_task_ids One2many → attachment.synchronize.task
    string='Tasks' args: 'attachment.synchronize.task', 'backend_id'
Public methods (2)
  • action_related_export_task(self)
  • action_related_import_task(self)
REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/14.0/attachment_synchronize
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYGeneric Modules
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSEnric Tobella, Sébastien BEAU, Weblate, OCA-git-bot, oca-ci, Núria Sancho
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:06
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/server-env:
    - server_environment
OCA/server-tools:
    - attachment_queue
OCA/storage:
    - storage_backend
odoo/odoo:
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
attachment_queue_view_search attachment.queue field Inherits attachment_queue.view_attachment_queue_search
view_attachment_queue_form attachment.queue xpath Inherits attachment_queue.view_attachment_queue_form
view_attachment_queue_tree attachment.queue xpath Inherits attachment_queue.view_attachment_queue_tree
view_attachment_task_form attachment.synchronize.task form New
view_attachment_task_search attachment.synchronize.task search New
view_attachment_task_tree attachment.synchronize.task tree New
view_storage_backend_form storage.backend xpath Inherits storage_backend.storage_backend_view_form
Models touched (3)

New fields (4)
  • file_type Selection
    selection_add=[('export', 'Export File (External location)')]
  • method_type Selection
    related='task_id.method_type'
  • storage_backend_id Many2one → storage.backend
    related='task_id.backend_id' store=True string='Storage Backend' args: 'storage.backend'
  • task_id Many2one → attachment.synchronize.task
    string='Task' args: 'attachment.synchronize.task'
Public methods (1)
  • onchange_task_id(self)
    @api.onchange('task_id')

New fields (16)
  • active Boolean
    default=True args: 'Enabled'
  • after_import Selection
    help='Action after import a file' selection=[('rename', 'Rename'), ('move', 'Move'), ('move_rename', 'Move & Rename'), ('delete', 'Delete')]
  • attachment_ids One2many → attachment.queue
    string='Attachment' args: 'attachment.queue', 'task_id'
  • avoid_duplicated_files Boolean
    help='If checked, a file will not be imported if an Attachment Queue with the same name already exists.' string='Avoid importing duplicated files'
  • backend_id Many2one → storage.backend
    string='Backend' args: 'storage.backend'
  • count_attachment_done Integer
    compute='_compute_count_state'
  • count_attachment_failed Integer
    compute='_compute_count_state'
  • count_attachment_pending Integer
    compute='_compute_count_state'
  • failure_emails Char
    help="Used to fill the 'Failure Emails' field in the 'Attachments Queues' related to this task.\nAn alert will be sent to these emails if any operation on these Attachment Queue's file type fails." string='Failure Emails'
  • file_type Selection
    help="Used to fill the 'File Type' field in the imported 'Attachments Queues'.\nFurther operations will be realized on these Attachments Queues depending on their 'File Type' value." selection=[] string='File Type'
  • filepath Char
    help='Path to imported/exported files in the Backend' string='File Path'
  • method_type Selection
    required=True args: [('import', 'Import Task'), ('export', 'Export Task')]
  • move_path Char
    help='Imported File will be moved to this path' string='Move Path'
  • name Char
    required=True
  • new_name Char
    help="Imported File will be renamed to this name.\nNew Name can use 'mako' template where 'obj' is the original file's name.\nFor instance : ${obj.name}-${obj.create_date}.csv" string='New Name'
  • pattern Char
    help="Pattern used to select the files to be imported following the 'fnmatch' special characters (e.g. '*.txt' to catch all the text files).\nIf empty, import all the files found in 'File Path'." string='Selection Pattern'
Public methods (6)
  • button_duplicate_record(self)
  • copy(self, default=None)
  • run(self)
  • run_export(self)
  • run_import(self)
  • run_task_import_scheduler(self, domain=None)
    @api.model

New fields (3)
  • export_task_count Integer
    compute='_compute_export_task_count' args: 'Export Tasks'
  • import_task_count Integer
    compute='_compute_import_task_count' args: 'Import Tasks'
  • synchronize_task_ids One2many → attachment.synchronize.task
    string='Tasks' args: 'attachment.synchronize.task', 'backend_id'
Public methods (2)
  • action_related_export_task(self)
  • action_related_import_task(self)
REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/12.0/attachment_synchronize
VERSION
VERSION 2.0.1
CATEGORY
CATEGORYGeneric Modules
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSSébastien BEAU, David Beal, oca-travis, OCA-git-bot, Tom Blauwendraat
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:22
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/server-env:
    - server_environment
OCA/server-tools:
    - attachment_queue
OCA/storage:
    - storage_backend
odoo/odoo:
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
attachment_queue_view_search attachment.queue field Inherits attachment_queue.view_attachment_queue_search
view_attachment_queue_form attachment.queue xpath Inherits attachment_queue.view_attachment_queue_form
view_attachment_queue_tree attachment.queue xpath Inherits attachment_queue.view_attachment_queue_tree
view_attachment_task_form attachment.synchronize.task form New
view_attachment_task_search attachment.synchronize.task search New
view_attachment_task_tree attachment.synchronize.task tree New
view_storage_backend_form storage.backend xpath Inherits storage_backend.storage_backend_view_form
Models touched (3)

New fields (4)
  • file_type Selection
    selection_add=[('export', 'Export File (External location)')]
  • method_type Selection
    related='task_id.method_type'
  • storage_backend_id Many2one → storage.backend
    related='task_id.backend_id' store=True string='Storage Backend' args: 'storage.backend'
  • task_id Many2one → attachment.synchronize.task
    string='Task' args: 'attachment.synchronize.task'
Public methods (1)
  • onchange_task_id(self)
    @api.onchange('task_id')

New fields (16)
  • active Boolean
    default=True old='enabled' args: 'Enabled'
  • after_import Selection
    help='Action after import a file' selection=[('rename', 'Rename'), ('move', 'Move'), ('move_rename', 'Move & Rename'), ('delete', 'Delete')]
  • attachment_ids One2many → attachment.queue
    string='Attachment' args: 'attachment.queue', 'task_id'
  • avoid_duplicated_files Boolean
    help='If checked, a file will not be imported if an Attachment Queue with the same name already exists.' string='Avoid importing duplicated files'
  • backend_id Many2one → storage.backend
    string='Backend' args: 'storage.backend'
  • count_attachment_done Integer
    compute='_compute_count_state'
  • count_attachment_failed Integer
    compute='_compute_count_state'
  • count_attachment_pending Integer
    compute='_compute_count_state'
  • failure_emails Char
    help="Used to fill the 'Failure Emails' field in the 'Attachments Queues' related to this task.\nAn alert will be sent to these emails if any operation on these Attachment Queue's file type fails." string='Failure Emails'
  • file_type Selection
    help="Used to fill the 'File Type' field in the imported 'Attachments Queues'.\nFurther operations will be realized on these Attachments Queues depending on their 'File Type' value." selection=[] string='File Type'
  • filepath Char
    help='Path to imported/exported files in the Backend' string='File Path'
  • method_type Selection
    required=True args: [('import', 'Import Task'), ('export', 'Export Task')]
  • move_path Char
    help='Imported File will be moved to this path' string='Move Path'
  • name Char
    required=True
  • new_name Char
    help="Imported File will be renamed to this name.\nNew Name can use 'mako' template where 'obj' is the original file's name.\nFor instance : ${obj.name}-${obj.create_date}.csv" string='New Name'
  • pattern Char
    help="Pattern used to select the files to be imported following the 'fnmatch' special characters (e.g. '*.txt' to catch all the text files).\nIf empty, import all the files found in 'File Path'." string='Selection Pattern'
Public methods (6)
  • button_duplicate_record(self)
  • copy(self, default=None)
  • run(self)
  • run_export(self)
  • run_import(self)
  • run_task_import_scheduler(self, domain=None)
    @api.model

New fields (3)
  • export_task_count Integer
    compute='_compute_export_task_count' args: 'Export Tasks'
  • import_task_count Integer
    compute='_compute_import_task_count' args: 'Import Tasks'
  • synchronize_task_ids One2many → attachment.synchronize.task
    string='Tasks' args: 'attachment.synchronize.task', 'backend_id'
Public methods (2)
  • action_related_export_task(self)
  • action_related_import_task(self)
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/server-tools
PULL REQUEST
PULL REQUEST[19.0][MIG] attachment_synchronize: Migration to 19.0 (#3615)