{"id":13936682,"url":"https://github.com/OCA/server-tools","last_synced_at":"2025-07-19T22:31:46.680Z","repository":{"id":17925911,"uuid":"20896532","full_name":"OCA/server-tools","owner":"OCA","description":"Tools for Odoo Administrators to improve some technical features on Odoo.","archived":false,"fork":false,"pushed_at":"2024-10-25T11:33:20.000Z","size":54292,"stargazers_count":694,"open_issues_count":307,"forks_count":1483,"subscribers_count":132,"default_branch":"16.0","last_synced_at":"2024-10-29T20:54:38.451Z","etag":null,"topics":["erp","hacktoberfest","odoo","python"],"latest_commit_sha":null,"homepage":"https://odoo-community.org/psc-teams/tools-30","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OCA.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":"auditlog/README.rst","citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"OCA"}},"created_at":"2014-06-16T18:52:44.000Z","updated_at":"2024-10-29T15:14:40.000Z","dependencies_parsed_at":"2024-01-02T09:51:43.666Z","dependency_job_id":"cde330d5-b455-4e5d-895f-df762ba09fcd","html_url":"https://github.com/OCA/server-tools","commit_stats":{"total_commits":802,"total_committers":148,"mean_commits":5.418918918918919,"dds":0.756857855361596,"last_synced_commit":"5e61b76927ce65cd035a8b91b85cdfef2e400fc3"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OCA%2Fserver-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OCA%2Fserver-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OCA%2Fserver-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OCA%2Fserver-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OCA","download_url":"https://codeload.github.com/OCA/server-tools/tar.gz/refs/heads/16.0","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":226318066,"owners_count":17605777,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["erp","hacktoberfest","odoo","python"],"created_at":"2024-08-07T23:02:54.523Z","updated_at":"2025-07-19T22:31:46.664Z","avatar_url":"https://github.com/OCA.png","language":"Python","readme":"\n[![Runboat](https://img.shields.io/badge/runboat-Try%20me-875A7B.png)](https://runboat.odoo-community.org/builds?repo=OCA/server-tools\u0026target_branch=16.0)\n[![Pre-commit Status](https://github.com/OCA/server-tools/actions/workflows/pre-commit.yml/badge.svg?branch=16.0)](https://github.com/OCA/server-tools/actions/workflows/pre-commit.yml?query=branch%3A16.0)\n[![Build Status](https://github.com/OCA/server-tools/actions/workflows/test.yml/badge.svg?branch=16.0)](https://github.com/OCA/server-tools/actions/workflows/test.yml?query=branch%3A16.0)\n[![codecov](https://codecov.io/gh/OCA/server-tools/branch/16.0/graph/badge.svg)](https://codecov.io/gh/OCA/server-tools)\n[![Translation Status](https://translation.odoo-community.org/widgets/server-tools-16-0/-/svg-badge.svg)](https://translation.odoo-community.org/engage/server-tools-16-0/?utm_source=widget)\n\n\u003c!-- /!\\ do not modify above this line --\u003e\n\n# server-tools\n\nTODO: add repo description.\n\n\u003c!-- /!\\ do not modify below this line --\u003e\n\n\u003c!-- prettier-ignore-start --\u003e\n\n[//]: # (addons)\n\nAvailable addons\n----------------\naddon | version | maintainers | summary\n--- | --- | --- | ---\n[attachment_delete_restrict](attachment_delete_restrict/) | 16.0.1.0.0 | \u003ca href='https://github.com/yostashiro'\u003e\u003cimg src='https://github.com/yostashiro.png' width='32' height='32' style='border-radius:50%;' alt='yostashiro'/\u003e\u003c/a\u003e \u003ca href='https://github.com/Kev-Roche'\u003e\u003cimg src='https://github.com/Kev-Roche.png' width='32' height='32' style='border-radius:50%;' alt='Kev-Roche'/\u003e\u003c/a\u003e | Restrict Deletion of Attachments\n[attachment_logging](attachment_logging/) | 16.0.1.0.0 |  | Show attachment information in chatter\n[attachment_queue](attachment_queue/) | 16.0.1.2.1 | \u003ca href='https://github.com/florian-dacosta'\u003e\u003cimg src='https://github.com/florian-dacosta.png' width='32' height='32' style='border-radius:50%;' alt='florian-dacosta'/\u003e\u003c/a\u003e \u003ca href='https://github.com/sebastienbeau'\u003e\u003cimg src='https://github.com/sebastienbeau.png' width='32' height='32' style='border-radius:50%;' alt='sebastienbeau'/\u003e\u003c/a\u003e | Base module adding the concept of queue for processing files\n[attachment_synchronize](attachment_synchronize/) | 16.0.1.0.1 | \u003ca href='https://github.com/florian-dacosta'\u003e\u003cimg src='https://github.com/florian-dacosta.png' width='32' height='32' style='border-radius:50%;' alt='florian-dacosta'/\u003e\u003c/a\u003e \u003ca href='https://github.com/sebastienbeau'\u003e\u003cimg src='https://github.com/sebastienbeau.png' width='32' height='32' style='border-radius:50%;' alt='sebastienbeau'/\u003e\u003c/a\u003e \u003ca href='https://github.com/GSLabIt'\u003e\u003cimg src='https://github.com/GSLabIt.png' width='32' height='32' style='border-radius:50%;' alt='GSLabIt'/\u003e\u003c/a\u003e \u003ca href='https://github.com/bealdav'\u003e\u003cimg src='https://github.com/bealdav.png' width='32' height='32' style='border-radius:50%;' alt='bealdav'/\u003e\u003c/a\u003e | Attachment Synchronize\n[attachment_unindex_content](attachment_unindex_content/) | 16.0.1.0.0 | \u003ca href='https://github.com/moylop260'\u003e\u003cimg src='https://github.com/moylop260.png' width='32' height='32' style='border-radius:50%;' alt='moylop260'/\u003e\u003c/a\u003e \u003ca href='https://github.com/ebirbe'\u003e\u003cimg src='https://github.com/ebirbe.png' width='32' height='32' style='border-radius:50%;' alt='ebirbe'/\u003e\u003c/a\u003e \u003ca href='https://github.com/luisg123v'\u003e\u003cimg src='https://github.com/luisg123v.png' width='32' height='32' style='border-radius:50%;' alt='luisg123v'/\u003e\u003c/a\u003e | Disable indexing of attachments\n[auditlog](auditlog/) | 16.0.2.2.3 |  | Audit Log\n[auto_backup](auto_backup/) | 16.0.1.0.1 |  | Backups database\n[autovacuum_message_attachment](autovacuum_message_attachment/) | 16.0.1.0.1 | \u003ca href='https://github.com/florian-dacosta'\u003e\u003cimg src='https://github.com/florian-dacosta.png' width='32' height='32' style='border-radius:50%;' alt='florian-dacosta'/\u003e\u003c/a\u003e | Automatically delete old mail messages and attachments\n[base_changeset](base_changeset/) | 16.0.1.0.0 | \u003ca href='https://github.com/astirpe'\u003e\u003cimg src='https://github.com/astirpe.png' width='32' height='32' style='border-radius:50%;' alt='astirpe'/\u003e\u003c/a\u003e | Track record changesets\n[base_conditional_image](base_conditional_image/) | 16.0.1.0.0 |  | This module extends the functionality to support conditional images\n[base_cron_exclusion](base_cron_exclusion/) | 16.0.1.0.0 | \u003ca href='https://github.com/LoisRForgeFlow'\u003e\u003cimg src='https://github.com/LoisRForgeFlow.png' width='32' height='32' style='border-radius:50%;' alt='LoisRForgeFlow'/\u003e\u003c/a\u003e \u003ca href='https://github.com/ChrisOForgeFlow'\u003e\u003cimg src='https://github.com/ChrisOForgeFlow.png' width='32' height='32' style='border-radius:50%;' alt='ChrisOForgeFlow'/\u003e\u003c/a\u003e | Allow you to select scheduled actions that should not run simultaneously.\n[base_domain_inverse_function](base_domain_inverse_function/) | 16.0.1.0.0 | \u003ca href='https://github.com/grindtildeath'\u003e\u003cimg src='https://github.com/grindtildeath.png' width='32' height='32' style='border-radius:50%;' alt='grindtildeath'/\u003e\u003c/a\u003e | Provide function to inverse domain into parts\n[base_exception](base_exception/) | 16.0.2.1.0 | \u003ca href='https://github.com/hparfr'\u003e\u003cimg src='https://github.com/hparfr.png' width='32' height='32' style='border-radius:50%;' alt='hparfr'/\u003e\u003c/a\u003e \u003ca href='https://github.com/sebastienbeau'\u003e\u003cimg src='https://github.com/sebastienbeau.png' width='32' height='32' style='border-radius:50%;' alt='sebastienbeau'/\u003e\u003c/a\u003e | This module provide an abstract model to manage customizable exceptions to be applied on different models (sale order, invoice, ...)\n[base_fontawesome](base_fontawesome/) | 16.0.6.6.1 |  | Up to date Fontawesome resources.\n[base_force_record_noupdate](base_force_record_noupdate/) | 16.0.1.0.0 |  | Manually force noupdate=True on models\n[base_import_default_enable_tracking](base_import_default_enable_tracking/) | 16.0.1.0.0 | \u003ca href='https://github.com/benwillig'\u003e\u003cimg src='https://github.com/benwillig.png' width='32' height='32' style='border-radius:50%;' alt='benwillig'/\u003e\u003c/a\u003e | This modules simply enables history tracking when doing an import.\n[base_import_odoo](base_import_odoo/) | 16.0.1.0.1 | \u003ca href='https://github.com/hbrunn'\u003e\u003cimg src='https://github.com/hbrunn.png' width='32' height='32' style='border-radius:50%;' alt='hbrunn'/\u003e\u003c/a\u003e \u003ca href='https://github.com/thomaspaulb'\u003e\u003cimg src='https://github.com/thomaspaulb.png' width='32' height='32' style='border-radius:50%;' alt='thomaspaulb'/\u003e\u003c/a\u003e | Import records from another Odoo instance\n[base_m2m_custom_field](base_m2m_custom_field/) | 16.0.1.0.0 |  | Customizations of Many2many\n[base_multi_image](base_multi_image/) | 16.0.1.0.1 |  | Allow multiple images for database objects\n[base_name_search_improved](base_name_search_improved/) | 16.0.1.0.2 |  | Friendlier search when typing in relation fields\n[base_partition](base_partition/) | 16.0.1.0.0 |  | Base module that provide the partition method on all models\n[base_remote](base_remote/) | 16.0.1.0.3 |  | Remote Base\n[base_search_fuzzy](base_search_fuzzy/) | 16.0.1.0.0 |  | Fuzzy search with the PostgreSQL trigram extension\n[base_sequence_default](base_sequence_default/) | 16.0.1.0.2 | \u003ca href='https://github.com/Shide'\u003e\u003cimg src='https://github.com/Shide.png' width='32' height='32' style='border-radius:50%;' alt='Shide'/\u003e\u003c/a\u003e \u003ca href='https://github.com/yajo'\u003e\u003cimg src='https://github.com/yajo.png' width='32' height='32' style='border-radius:50%;' alt='yajo'/\u003e\u003c/a\u003e \u003ca href='https://github.com/rafaelbn'\u003e\u003cimg src='https://github.com/rafaelbn.png' width='32' height='32' style='border-radius:50%;' alt='rafaelbn'/\u003e\u003c/a\u003e | Use sequences for default values of fields when creating a new record\n[base_sequence_option](base_sequence_option/) | 16.0.1.0.1 | \u003ca href='https://github.com/kittiu'\u003e\u003cimg src='https://github.com/kittiu.png' width='32' height='32' style='border-radius:50%;' alt='kittiu'/\u003e\u003c/a\u003e | Alternative sequence options for specific models\n[base_sparse_field_list_support](base_sparse_field_list_support/) | 16.0.1.0.0 |  | add list support to convert_to_cache()\n[base_technical_user](base_technical_user/) | 16.0.1.0.0 |  | Add a technical user parameter on the company\n[base_time_window](base_time_window/) | 16.0.1.1.0 |  | Base model to handle time windows\n[base_view_inheritance_extension](base_view_inheritance_extension/) | 16.0.1.2.2 |  | Adds more operators for view inheritance\n[bus_alt_connection](bus_alt_connection/) | 16.0.1.0.0 |  | Needed when using PgBouncer as a connection pooler\n[cron_daylight_saving_time_resistant](cron_daylight_saving_time_resistant/) | 16.0.1.0.1 | \u003ca href='https://github.com/florian-dacosta'\u003e\u003cimg src='https://github.com/florian-dacosta.png' width='32' height='32' style='border-radius:50%;' alt='florian-dacosta'/\u003e\u003c/a\u003e | Run cron on fixed hours\n[database_cleanup](database_cleanup/) | 16.0.1.2.1 |  | Database cleanup\n[datetime_formatter](datetime_formatter/) | 16.0.1.0.0 |  | Helper functions to give correct format to date[time] fields\n[dbfilter_from_header](dbfilter_from_header/) | 16.0.1.0.1 |  | Filter databases with HTTP headers\n[excel_import_export](excel_import_export/) | 16.0.1.3.1 | \u003ca href='https://github.com/kittiu'\u003e\u003cimg src='https://github.com/kittiu.png' width='32' height='32' style='border-radius:50%;' alt='kittiu'/\u003e\u003c/a\u003e | Base module for developing Excel import/export/report\n[excel_import_export_demo](excel_import_export_demo/) | 16.0.1.1.0 | \u003ca href='https://github.com/kittiu'\u003e\u003cimg src='https://github.com/kittiu.png' width='32' height='32' style='border-radius:50%;' alt='kittiu'/\u003e\u003c/a\u003e | Excel Import/Export/Report Demo\n[excel_import_export_unidecode](excel_import_export_unidecode/) | 16.0.1.0.1 |  | Add unidecode option to excel import/export/report\n[fetchmail_attach_from_folder](fetchmail_attach_from_folder/) | 16.0.1.6.0 | \u003ca href='https://github.com/NL66278'\u003e\u003cimg src='https://github.com/NL66278.png' width='32' height='32' style='border-radius:50%;' alt='NL66278'/\u003e\u003c/a\u003e | Attach mails in an IMAP folder to existing objects\n[html_text](html_text/) | 16.0.1.0.1 |  | Generate excerpts from any HTML field\n[iap_alternative_provider](iap_alternative_provider/) | 16.0.1.0.0 | \u003ca href='https://github.com/sebastienbeau'\u003e\u003cimg src='https://github.com/sebastienbeau.png' width='32' height='32' style='border-radius:50%;' alt='sebastienbeau'/\u003e\u003c/a\u003e | Base module for providing alternative provider for iap apps\n[jsonifier](jsonifier/) | 16.0.0.1.0 |  | JSON-ify data for all models\n[letsencrypt](letsencrypt/) | 16.0.1.1.1 | \u003ca href='https://github.com/hbrunn'\u003e\u003cimg src='https://github.com/hbrunn.png' width='32' height='32' style='border-radius:50%;' alt='hbrunn'/\u003e\u003c/a\u003e | Request SSL certificates from letsencrypt.org\n[module_analysis](module_analysis/) | 16.0.1.0.4 | \u003ca href='https://github.com/legalsylvain'\u003e\u003cimg src='https://github.com/legalsylvain.png' width='32' height='32' style='border-radius:50%;' alt='legalsylvain'/\u003e\u003c/a\u003e | Add analysis tools regarding installed modules to know which installed modules comes from Odoo Core, OCA, or are custom modules\n[module_auto_update](module_auto_update/) | 16.0.1.0.2 |  | Automatically update Odoo modules\n[module_change_auto_install](module_change_auto_install/) | 16.0.1.0.2 | \u003ca href='https://github.com/legalsylvain'\u003e\u003cimg src='https://github.com/legalsylvain.png' width='32' height='32' style='border-radius:50%;' alt='legalsylvain'/\u003e\u003c/a\u003e | Customize auto installables modules by configuration\n[nsca_client](nsca_client/) | 16.0.1.0.0 |  | Send passive alerts to monitor your Odoo application.\n[odoo_test_xmlrunner](odoo_test_xmlrunner/) | 16.0.1.0.1 |  | This module override Odoo testing method to run them with xmlrunner tool.\n[onchange_helper](onchange_helper/) | 16.0.1.0.0 |  | Technical module that ease execution of onchange in Python code\n[postgres_vacuum](postgres_vacuum/) | 16.0.1.0.0 |  | Vacuum or analyze Odoo's database tables\n[rpc_helper](rpc_helper/) | 16.0.1.0.0 | \u003ca href='https://github.com/simahawk'\u003e\u003cimg src='https://github.com/simahawk.png' width='32' height='32' style='border-radius:50%;' alt='simahawk'/\u003e\u003c/a\u003e | Helpers for disabling RPC calls\n[scheduler_error_mailer](scheduler_error_mailer/) | 16.0.1.0.0 |  | Scheduler Error Mailer\n[sentry](sentry/) | 16.0.3.0.3 | \u003ca href='https://github.com/barsi'\u003e\u003cimg src='https://github.com/barsi.png' width='32' height='32' style='border-radius:50%;' alt='barsi'/\u003e\u003c/a\u003e \u003ca href='https://github.com/naglis'\u003e\u003cimg src='https://github.com/naglis.png' width='32' height='32' style='border-radius:50%;' alt='naglis'/\u003e\u003c/a\u003e \u003ca href='https://github.com/versada'\u003e\u003cimg src='https://github.com/versada.png' width='32' height='32' style='border-radius:50%;' alt='versada'/\u003e\u003c/a\u003e \u003ca href='https://github.com/moylop260'\u003e\u003cimg src='https://github.com/moylop260.png' width='32' height='32' style='border-radius:50%;' alt='moylop260'/\u003e\u003c/a\u003e \u003ca href='https://github.com/fernandahf'\u003e\u003cimg src='https://github.com/fernandahf.png' width='32' height='32' style='border-radius:50%;' alt='fernandahf'/\u003e\u003c/a\u003e | Report Odoo errors to Sentry\n[sequence_python](sequence_python/) | 16.0.1.0.0 |  | Calculate a sequence number from a Python expression\n[server_action_logging](server_action_logging/) | 16.0.1.0.0 |  | Module that provides a logging mechanism for server actions\n[session_db](session_db/) | 16.0.1.0.7 | \u003ca href='https://github.com/sbidoul'\u003e\u003cimg src='https://github.com/sbidoul.png' width='32' height='32' style='border-radius:50%;' alt='sbidoul'/\u003e\u003c/a\u003e | Store sessions in DB\n[tracking_manager](tracking_manager/) | 16.0.1.1.8 | \u003ca href='https://github.com/Kev-Roche'\u003e\u003cimg src='https://github.com/Kev-Roche.png' width='32' height='32' style='border-radius:50%;' alt='Kev-Roche'/\u003e\u003c/a\u003e \u003ca href='https://github.com/sebastienbeau'\u003e\u003cimg src='https://github.com/sebastienbeau.png' width='32' height='32' style='border-radius:50%;' alt='sebastienbeau'/\u003e\u003c/a\u003e | This module tracks all fields of a model, including one2many and many2many ones.\n[upgrade_analysis](upgrade_analysis/) | 16.0.1.2.1 | \u003ca href='https://github.com/StefanRijnhart'\u003e\u003cimg src='https://github.com/StefanRijnhart.png' width='32' height='32' style='border-radius:50%;' alt='StefanRijnhart'/\u003e\u003c/a\u003e \u003ca href='https://github.com/legalsylvain'\u003e\u003cimg src='https://github.com/legalsylvain.png' width='32' height='32' style='border-radius:50%;' alt='legalsylvain'/\u003e\u003c/a\u003e | Performs a difference analysis between modules installed on two different Odoo instances\n[url_attachment_search_fuzzy](url_attachment_search_fuzzy/) | 16.0.1.0.0 | \u003ca href='https://github.com/mariadforgelow'\u003e\u003cimg src='https://github.com/mariadforgelow.png' width='32' height='32' style='border-radius:50%;' alt='mariadforgelow'/\u003e\u003c/a\u003e | Fuzzy Search of URL in Attachments\n\n[//]: # (end addons)\n\n\u003c!-- prettier-ignore-end --\u003e\n\n## Licenses\n\nThis repository is licensed under [AGPL-3.0](LICENSE).\n\nHowever, each module can have a totally different license, as long as they adhere to Odoo Community Association (OCA)\npolicy. Consult each module's `__manifest__.py` file, which contains a `license` key\nthat explains its license.\n\n----\nOCA, or the [Odoo Community Association](http://odoo-community.org/), is a nonprofit\norganization whose mission is to support the collaborative development of Odoo features\nand promote its widespread use.\n","funding_links":["https://github.com/sponsors/OCA"],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOCA%2Fserver-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FOCA%2Fserver-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOCA%2Fserver-tools/lists"}