| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-tools |
| GIT | |
| GIT | https://github.com/OCA/server-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-tools/tree/18.0/attachment_synchronize |
| VERSION | |
| VERSION | 1.0.0 |
| CATEGORY | |
| CATEGORY | Generic Modules |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Akretion |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Akretion |
| COMMITTERS | |
| COMMITTERS | Florian da Costa, OCA-git-bot, oca-ci |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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'
onchange_task_id(self)
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'
button_duplicate_record(self)
copy(self, default=None)
run(self)
run_export(self)
run_import(self)
run_task_import_scheduler(self, domain=None)
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'
action_related_export_task(self)
action_related_import_task(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-tools |
| GIT | |
| GIT | https://github.com/OCA/server-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-tools/tree/16.0/attachment_synchronize |
| VERSION | |
| VERSION | 1.0.2 |
| CATEGORY | |
| CATEGORY | Generic Modules |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Akretion |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Akretion |
| COMMITTERS | |
| COMMITTERS | Florian da Costa, Weblate, OCA-git-bot, clementmbr, oca-ci |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - 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 | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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'
onchange_task_id(self)
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'
button_duplicate_record(self)
copy(self, default=None)
run(self)
run_export(self)
run_import(self)
run_task_import_scheduler(self, domain=None)
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'
action_related_export_task(self)
action_related_import_task(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-tools |
| GIT | |
| GIT | https://github.com/OCA/server-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-tools/tree/14.0/attachment_synchronize |
| VERSION | |
| VERSION | 1.0.3 |
| CATEGORY | |
| CATEGORY | Generic Modules |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Akretion |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Akretion |
| COMMITTERS | |
| COMMITTERS | Enric Tobella, Sébastien BEAU, Weblate, OCA-git-bot, oca-ci, Núria Sancho |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - base_setup - web - bus - web_tour - base_sparse_field |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES |
cachetools |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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'
onchange_task_id(self)
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'
button_duplicate_record(self)
copy(self, default=None)
run(self)
run_export(self)
run_import(self)
run_task_import_scheduler(self, domain=None)
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'
action_related_export_task(self)
action_related_import_task(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-tools |
| GIT | |
| GIT | https://github.com/OCA/server-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-tools/tree/12.0/attachment_synchronize |
| VERSION | |
| VERSION | 2.0.1 |
| CATEGORY | |
| CATEGORY | Generic Modules |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Akretion |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Akretion |
| COMMITTERS | |
| COMMITTERS | Sébastien BEAU, David Beal, oca-travis, OCA-git-bot, Tom Blauwendraat |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 - base_setup - web - bus - web_tour - base_sparse_field |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES |
cachetools |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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'
onchange_task_id(self)
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'
button_duplicate_record(self)
copy(self, default=None)
run(self)
run_export(self)
run_import(self)
run_task_import_scheduler(self, domain=None)
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'
action_related_export_task(self)
action_related_import_task(self)
| STATUS | |
|---|---|
| STATUS | Open migration PR - not merged yet for this version |
| REPOSITORY | |
| REPOSITORY | OCA/server-tools |
| PULL REQUEST | |
| PULL REQUEST | [19.0][MIG] attachment_synchronize: Migration to 19.0 (#3615) |