diff --git a/README.md b/README.md index fc987dc5750..0efde1c73e0 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ addon | version | maintainers | summary [base_time_window](base_time_window/) | 18.0.1.1.1 | | Base model to handle time windows [base_view_inheritance_extension](base_view_inheritance_extension/) | 18.0.1.0.2 | | Adds more operators for view inheritance [bus_alt_connection](bus_alt_connection/) | 18.0.1.0.0 | | Needed when using PgBouncer as a connection pooler +[database_autovacuum_tuning](database_autovacuum_tuning/) | 18.0.1.0.1 | | Scheduled checks for Odoo autovacuum thresholds and scale factors [database_cleanup](database_cleanup/) | 18.0.1.0.2 | | Database cleanup [database_size](database_size/) | 18.0.1.0.2 | | Database Size [dbfilter_from_header](dbfilter_from_header/) | 18.0.1.0.0 | | Filter databases with HTTP headers @@ -56,7 +57,7 @@ addon | version | maintainers | summary [html_text](html_text/) | 18.0.1.0.0 | | Generate excerpts from any HTML field [iap_alternative_provider](iap_alternative_provider/) | 18.0.1.0.0 | sebastienbeau | Base module for providing alternative provider for iap apps [jsonifier](jsonifier/) | 18.0.1.1.1 | | JSON-ify data for all models -[mail_cleanup](mail_cleanup/) | 18.0.1.0.1 | | Mark as read or delete mails after a set time +[mail_cleanup](mail_cleanup/) | 18.0.1.0.2 | | Mark as read or delete mails after a set time [mail_template_attachment_per_lang](mail_template_attachment_per_lang/) | 18.0.1.0.0 | | Set language specific attachments on mail templates. [module_analysis](module_analysis/) | 18.0.1.0.0 | legalsylvain | Add analysis tools regarding installed modules to know which installed modules comes from Odoo Core, OCA, or are custom modules [module_auto_update](module_auto_update/) | 18.0.1.0.1 | | Automatically update Odoo modules diff --git a/auditlog/i18n/tr.po b/auditlog/i18n/tr.po index 033cbe302fa..7599479fbed 100644 --- a/auditlog/i18n/tr.po +++ b/auditlog/i18n/tr.po @@ -9,20 +9,20 @@ msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-12-06 03:40+0000\n" -"PO-Revision-Date: 2026-01-15 16:43+0000\n" -"Last-Translator: Betül Öğmen \n" +"PO-Revision-Date: 2026-04-27 00:45+0000\n" +"Last-Translator: Ediz Duman \n" "Language-Team: Turkish (https://www.transifex.com/oca/teams/23907/tr/)\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Weblate 5.10.4\n" +"X-Generator: Weblate 5.15.2\n" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__action_id msgid "Action" -msgstr "Eylem" +msgstr "Aksiyon" #. module: auditlog #: model:ir.ui.menu,name:auditlog.menu_audit @@ -37,23 +37,23 @@ msgstr "Denetim Günlüğü - Eski günlükleri sil" #. module: auditlog #: model:ir.model,name:auditlog.model_auditlog_http_session msgid "Auditlog - HTTP User session log" -msgstr "Denetim Günlüğü - HTTP kullanıcı oturum logu" +msgstr "Denetim Günlüğü - HTTP kullanıcı oturum günlüğü" #. module: auditlog #: model:ir.model,name:auditlog.model_auditlog_http_request msgid "Auditlog - HTTP request log" -msgstr "Denetim Günlüğü - HTTP istek geçmişi" +msgstr "Denetim Günlüğü - HTTP istek günlüğü" #. module: auditlog #: model:ir.model,name:auditlog.model_auditlog_log msgid "Auditlog - Log" -msgstr "Denetim Günlüğü - geçmiş" +msgstr "Denetim Günlüğü - Günlük" #. module: auditlog #: model:ir.model,name:auditlog.model_auditlog_log_line #: model:ir.model,name:auditlog.model_auditlog_log_line_view msgid "Auditlog - Log details (fields updated)" -msgstr "Denetim Günlüğü - Günlük detatları (güncellenen alanlar) " +msgstr "Denetim Günlüğü - Günlük detayları (güncellenen alanlar)" #. module: auditlog #: model:ir.model,name:auditlog.model_auditlog_rule @@ -68,7 +68,7 @@ msgstr "Denetim Günlüğü Yöneticisi" #. module: auditlog #: model:ir.module.category,name:auditlog.security_auditlog_groups msgid "Auditlog Rights" -msgstr "Denetim Günlüğü Hakları" +msgstr "Denetim Günlüğü Yetkileri" #. module: auditlog #: model:res.groups,name:auditlog.group_auditlog_user @@ -78,7 +78,7 @@ msgstr "Denetim Günlüğü Kullanıcısı" #. module: auditlog #: model:ir.actions.server,name:auditlog.ir_cron_auditlog_autovacuum_ir_actions_server msgid "Auto-vacuum audit logs" -msgstr "Otomatik vakum denetim günlüğü" +msgstr "Denetim günlüklerini otomatik temizle" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record @@ -112,7 +112,7 @@ msgstr "Oluşturan" #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_request_search #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_session_search msgid "Created on" -msgstr "Oluşturuldu" +msgstr "Oluşturulma" #. module: auditlog #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_line_search @@ -133,7 +133,7 @@ msgstr "Açıklama" #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line_view__display_name #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__display_name msgid "Display Name" -msgstr "Görünen İsim" +msgstr "Görünen Ad" #. module: auditlog #: model:ir.model.fields.selection,name:auditlog.selection__auditlog_rule__state__draft @@ -176,7 +176,7 @@ msgstr "Hariç Tutulacak Alanlar" #: model:ir.model.fields,field_description:auditlog.field_auditlog_log__line_ids #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_form msgid "Fields updated" -msgstr "Alanlar güncellendi" +msgstr "Güncellenen Alanlar" #. module: auditlog #: model:ir.model.fields.selection,name:auditlog.selection__auditlog_log__log_type__full @@ -192,10 +192,11 @@ msgid "" "Fast log: only log the changes made through the create and write operations " "(less information, but it is faster)" msgstr "" -"Tam Günlük: İşlemden önceki ve sonraki verinin farkını bulur. (hesaplanan " -"alanlar gibi bilgileri saklar ama daha yavaş çalışır)\n" -"Hızlı Günlük: Sadece oluştur ve yaz işlemleri ile yapılanları kaydeder. " -"(daha az bilgi içerir ama daha hızlıdır)" +"Tam Günlük: İşlem öncesi ve sonrası veriler arasındaki farkı bulur " +"(güncellenen hesaplanan alanlar gibi daha fazla bilgi kaydeder, ancak daha " +"yavaştır)\n" +"Hızlı Günlük: Yalnızca oluşturma ve yazma işlemleriyle yapılan " +"değişiklikleri kaydeder (daha az bilgi, ancak daha hızlıdır)" #. module: auditlog #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_request_search @@ -204,7 +205,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_search #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_rule_search msgid "Group By..." -msgstr "Grupla..." +msgstr "Gruplandır..." #. module: auditlog #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_form @@ -218,7 +219,7 @@ msgstr "HTTP Bağlamı" #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_line_search #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_search msgid "HTTP Request" -msgstr "HTTP isteği" +msgstr "HTTP İsteği" #. module: auditlog #: model:ir.actions.act_window,name:auditlog.action_auditlog_http_request_tree @@ -227,7 +228,7 @@ msgstr "HTTP isteği" #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_request_search #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_session_form msgid "HTTP Requests" -msgstr "HTTP isteği" +msgstr "HTTP İstekleri" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_autovacuum__id @@ -249,7 +250,7 @@ msgstr "ID" #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line_view__write_uid #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__write_uid msgid "Last Updated by" -msgstr "Son güncellendi" +msgstr "Son Güncelleyen" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_autovacuum__write_date @@ -260,34 +261,34 @@ msgstr "Son güncellendi" #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line_view__write_date #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__write_date msgid "Last Updated on" -msgstr "Son güncellenme" +msgstr "Son Güncelleme" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__log_id #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line_view__log_id #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_form msgid "Log" -msgstr "günlük" +msgstr "Günlük" #. module: auditlog #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_form msgid "Log - Field updated" -msgstr "Günlük - Güncellenen alan" +msgstr "Günlük - Güncellenen Alan" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__log_create msgid "Log Creates" -msgstr "Oluşturma günlükleri" +msgstr "Oluşturmaları Günlükle" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__log_unlink msgid "Log Deletes" -msgstr "Silme günlükleri" +msgstr "Silmeleri Günlükle" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__log_export_data msgid "Log Exports" -msgstr "Log Dışa Aktarımları" +msgstr "Dışa Aktarma Günlükle" #. module: auditlog #: model:ir.actions.act_window,name:auditlog.action_auditlog_line @@ -299,12 +300,12 @@ msgstr "Günlük Satırları" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__log_read msgid "Log Reads" -msgstr "Okuma günlükleri" +msgstr "Okumaları Günlükle" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__log_write msgid "Log Writes" -msgstr "Yazma günlükleri" +msgstr "Yazmaları Günlükle" #. module: auditlog #: model:ir.actions.act_window,name:auditlog.action_auditlog_log_tree @@ -313,13 +314,13 @@ msgstr "Yazma günlükleri" #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_request_form #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_search msgid "Logs" -msgstr "günlükler" +msgstr "Günlükler" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log__method #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line_view__method msgid "Method" -msgstr "Method" +msgstr "Yöntem" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log__model_id @@ -328,12 +329,12 @@ msgstr "Method" #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_line_search #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_search msgid "Model" -msgstr "Alan" +msgstr "Model" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line_view__model_model msgid "Model Model" -msgstr "" +msgstr "Model Modeli" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log__model_name @@ -348,7 +349,7 @@ msgstr "Model Adı" #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line_view__name #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__name msgid "Name" -msgstr "Adı" +msgstr "Ad" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__new_value @@ -360,7 +361,7 @@ msgstr "Yeni Değer" #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__new_value_text #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line_view__new_value_text msgid "New value Text" -msgstr "Yeni değer metni" +msgstr "Yeni Değer Metni" #. module: auditlog #. odoo-python @@ -390,7 +391,7 @@ msgstr "Eski Değer" #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__old_value_text #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line_view__old_value_text msgid "Old value Text" -msgstr "Eski değer Metni" +msgstr "Eski Değer Metni" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__name @@ -401,7 +402,7 @@ msgstr "Yol" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line_view__res_id msgid "Res" -msgstr "" +msgstr "Kaynak" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log__res_id @@ -413,7 +414,7 @@ msgstr "Kaynak ID" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log__res_ids msgid "Resource IDs" -msgstr "" +msgstr "Kaynak ID" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log__name @@ -446,7 +447,7 @@ msgstr "Günlük oluşturmak istediğiniz modeli seçin." #. module: auditlog #: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record msgid "Select this if you want to keep track of Unlink Record" -msgstr "Silme kayıtlarını takip etmek için bunu seçiniz" +msgstr "Silinen kayıtları takip etmek istiyorsanız bunu seçin" #. module: auditlog #: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create @@ -454,14 +455,16 @@ msgid "" "Select this if you want to keep track of creation on any record of the model " "of this rule" msgstr "" -"bu modelde oluşturulan her kayıt için günlük tutmak isterseniz bunu seçin." +"Bu kuralın modelinde oluşturulan kayıtları takip etmek istiyorsanız bunu " +"seçin" #. module: auditlog #: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_unlink msgid "" "Select this if you want to keep track of deletion on any record of the model " "of this rule" -msgstr "bu modelde silinen her kayıt için günlük tutmak isterseniz bunu seçin." +msgstr "" +"Bu kuralın modelinde silinen kayıtları takip etmek istiyorsanız bunu seçin" #. module: auditlog #: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_export_data @@ -476,7 +479,8 @@ msgid "" "Select this if you want to keep track of modification on any record of the " "model of this rule" msgstr "" -"bu modelde değiştirilen her kayıt için günlük tutmak isterseniz bunu seçin." +"Bu kuralın modelinde değiştirilen kayıtları takip etmek istiyorsanız bunu " +"seçin" #. module: auditlog #: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_read @@ -484,7 +488,8 @@ msgid "" "Select this if you want to keep track of read/open on any record of the " "model of this rule" msgstr "" -"bu modelde okunan/açılan her kayıt için günlük tutmak isterseniz bunu seçin." +"Bu kuralın modelinde okunan/açılan kayıtları takip etmek istiyorsanız bunu " +"seçin" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__http_session_id @@ -507,13 +512,13 @@ msgstr "Durum" #. module: auditlog #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_rule_form msgid "Subscribe" -msgstr "Üye ol" +msgstr "Abone Ol" #. module: auditlog #: model:ir.model.fields.selection,name:auditlog.selection__auditlog_rule__state__subscribed #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_rule_search msgid "Subscribed" -msgstr "Üye oldu" +msgstr "Abone Olundu" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log__model_model @@ -525,7 +530,7 @@ msgstr "Teknik Model Adı" #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__field_name #: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line_view__field_name msgid "Technical name" -msgstr "Teknik İsim" +msgstr "Teknik Ad" #. module: auditlog #. odoo-python @@ -545,8 +550,8 @@ msgid "" "There is already a rule defined on this model\n" "You cannot define another: please edit the existing one." msgstr "" -"Bu model için zaten bir kural tanımlanmış\n" -"başka kural tanımlayamazsınız: lütfen olan kaydı güncelleyin." +"Bu model için zaten bir kural tanımlanmış.\n" +"Başka bir kural tanımlayamazsınız: lütfen mevcut kuralı düzenleyin." #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_log__log_type @@ -558,7 +563,7 @@ msgstr "Tür" #. module: auditlog #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_rule_form msgid "Unsubscribe" -msgstr "Takibi bırak" +msgstr "Abonelikten Ayrıl" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_id @@ -578,14 +583,14 @@ msgstr "Kullanıcı" #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_line_search #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_search msgid "User session" -msgstr "Kullanıcı oturumu" +msgstr "Kullanıcı Oturumu" #. module: auditlog #: model:ir.actions.act_window,name:auditlog.action_auditlog_http_session_tree #: model:ir.ui.menu,name:auditlog.menu_action_auditlog_http_session_tree #: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_session_search msgid "User sessions" -msgstr "kullanıcı oturumları" +msgstr "Kullanıcı Oturumları" #. module: auditlog #: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__user_ids @@ -606,12 +611,12 @@ msgstr "Değerler" #. odoo-python #: code:addons/auditlog/models/rule.py:0 msgid "View logs" -msgstr "Günlükleri göster" +msgstr "Günlükleri Görüntüle" #. module: auditlog #: model:ir.model.fields,help:auditlog.field_auditlog_rule__user_ids msgid "if no user is added then it will applicable for all users" -msgstr "Eğer kullanıcı eklenmediyse bütün kullanıcılar için geçerli olur" +msgstr "Kullanıcı eklenmezse tüm kullanıcılar için geçerli olur" #~ msgid "Last Modified on" #~ msgstr "Son değişiklik" diff --git a/autovacuum_message_attachment/i18n/autovacuum_message_attachment.pot b/autovacuum_message_attachment/i18n/autovacuum_message_attachment.pot index 72370571696..edf2268fcfa 100644 --- a/autovacuum_message_attachment/i18n/autovacuum_message_attachment.pot +++ b/autovacuum_message_attachment/i18n/autovacuum_message_attachment.pot @@ -135,6 +135,7 @@ msgstr "" #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_model__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_module__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_table__assigned_attachment_ids +#: model:ir.model.fields,field_description:autovacuum_message_attachment.field_database_autovacuum_tuning__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_db_backup__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_decimal_precision__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_digest_digest__assigned_attachment_ids diff --git a/autovacuum_message_attachment/i18n/ca.po b/autovacuum_message_attachment/i18n/ca.po index 3549ba233e3..1764d6e3bde 100644 --- a/autovacuum_message_attachment/i18n/ca.po +++ b/autovacuum_message_attachment/i18n/ca.po @@ -136,6 +136,7 @@ msgstr "" #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_model__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_module__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_table__assigned_attachment_ids +#: model:ir.model.fields,field_description:autovacuum_message_attachment.field_database_autovacuum_tuning__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_db_backup__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_decimal_precision__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_digest_digest__assigned_attachment_ids diff --git a/autovacuum_message_attachment/i18n/es.po b/autovacuum_message_attachment/i18n/es.po index 07cc1b7e2b8..4c321589856 100644 --- a/autovacuum_message_attachment/i18n/es.po +++ b/autovacuum_message_attachment/i18n/es.po @@ -138,6 +138,7 @@ msgstr "Todos" #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_model__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_module__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_table__assigned_attachment_ids +#: model:ir.model.fields,field_description:autovacuum_message_attachment.field_database_autovacuum_tuning__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_db_backup__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_decimal_precision__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_digest_digest__assigned_attachment_ids diff --git a/autovacuum_message_attachment/i18n/es_AR.po b/autovacuum_message_attachment/i18n/es_AR.po index 346c4dde032..b3667f0cb93 100644 --- a/autovacuum_message_attachment/i18n/es_AR.po +++ b/autovacuum_message_attachment/i18n/es_AR.po @@ -138,6 +138,7 @@ msgstr "Todos" #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_model__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_module__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_table__assigned_attachment_ids +#: model:ir.model.fields,field_description:autovacuum_message_attachment.field_database_autovacuum_tuning__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_db_backup__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_decimal_precision__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_digest_digest__assigned_attachment_ids diff --git a/autovacuum_message_attachment/i18n/fr.po b/autovacuum_message_attachment/i18n/fr.po index faf09127e59..d7f73284848 100644 --- a/autovacuum_message_attachment/i18n/fr.po +++ b/autovacuum_message_attachment/i18n/fr.po @@ -138,6 +138,7 @@ msgstr "Tous" #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_model__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_module__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_table__assigned_attachment_ids +#: model:ir.model.fields,field_description:autovacuum_message_attachment.field_database_autovacuum_tuning__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_db_backup__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_decimal_precision__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_digest_digest__assigned_attachment_ids diff --git a/autovacuum_message_attachment/i18n/it.po b/autovacuum_message_attachment/i18n/it.po index 8f1c6255261..de5f4cc70e0 100644 --- a/autovacuum_message_attachment/i18n/it.po +++ b/autovacuum_message_attachment/i18n/it.po @@ -138,6 +138,7 @@ msgstr "Tutti" #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_model__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_module__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_cleanup_purge_wizard_table__assigned_attachment_ids +#: model:ir.model.fields,field_description:autovacuum_message_attachment.field_database_autovacuum_tuning__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_db_backup__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_decimal_precision__assigned_attachment_ids #: model:ir.model.fields,field_description:autovacuum_message_attachment.field_digest_digest__assigned_attachment_ids diff --git a/database_autovacuum_tuning/README.rst b/database_autovacuum_tuning/README.rst new file mode 100644 index 00000000000..60ee46d8437 --- /dev/null +++ b/database_autovacuum_tuning/README.rst @@ -0,0 +1,127 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +========================== +Database Autovacuum Tuning +========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:ed2cea913a7d93d83e99dc2d84a053972a91963c100bf3ea8ceca5e69c1c7315 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github + :target: https://github.com/OCA/server-tools/tree/18.0/database_autovacuum_tuning + :alt: OCA/server-tools +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-tools-18-0/server-tools-18-0-database_autovacuum_tuning + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Database Autovacuum Tuning helps administrators keep PostgreSQL healthy +by exposing recommended autovacuum settings in Odoo. It provides +guidance and documentation for sizing thresholds and scale factors so +large, busy databases avoid table bloat and excessive vacuum lag. Use it +to standardize autovacuum configuration across environments and speed up +maintenance operations without manual tuning. + +This module is mostly useful for PostgreSQL <= 17. PostgreSQL 18.0 +introduces the ``autovacuum_vacuum_max_threshold`` parameter, which +already provides the capability this module targets. + +The ``pgstattuple`` extension must be installed on the database. + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +1. Install the module on the database you want to tune. + +2. Go to Settings > Technical > Database Structure > Database Autovacuum + Tuning and review the recommended thresholds and scale factors. + +3. If needed, override the defaults using the following system + parameters: + + - ``database_autovacuum_tuning.autovacuum_vacuum_max_threshold`` + - ``database_autovacuum_tuning.autovacuum_vacuum_analyze_max_threshold`` + +4. The configuration parameters are applied to tables by the daily cron + job. When the number of dead tuples in a table exceeds the vacuum + threshold, it applies the following configuration: + + .. code:: sql + + ALTER TABLE {schemaname}.{tablename} SET ( + autovacuum_vacuum_scale_factor = 0, + autovacuum_vacuum_threshold = %s, + autovacuum_analyze_scale_factor = 0, + autovacuum_analyze_threshold = %s + ) + +5. Monitor vacuum activity and table bloat, then adjust the settings if + your workload changes. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Camptocamp + +Contributors +------------ + +- Telmo Santos +- Alexandre Fayolle + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/server-tools `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/database_autovacuum_tuning/__init__.py b/database_autovacuum_tuning/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/database_autovacuum_tuning/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/database_autovacuum_tuning/__manifest__.py b/database_autovacuum_tuning/__manifest__.py new file mode 100644 index 00000000000..7b1508ca6d4 --- /dev/null +++ b/database_autovacuum_tuning/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2026 Camptocamp (https://www.camptocamp.com). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +{ + "name": "Database Autovacuum Tuning", + "summary": "Scheduled checks for Odoo autovacuum thresholds and scale factors", + "version": "18.0.1.0.1", + "author": "Camptocamp, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/server-tools", + "category": "Tools", + "depends": [ + "base_setup", + ], + "data": [ + "data/config_parameter.xml", + "data/ir_cron.xml", + "security/ir.model.access.csv", + "views/res_config_settings_views.xml", + "views/database_autovacuum_tuning_views.xml", + ], + "development_status": "Alpha", + "license": "LGPL-3", + "installable": True, +} diff --git a/database_autovacuum_tuning/data/config_parameter.xml b/database_autovacuum_tuning/data/config_parameter.xml new file mode 100644 index 00000000000..057ab3e8bb6 --- /dev/null +++ b/database_autovacuum_tuning/data/config_parameter.xml @@ -0,0 +1,18 @@ + + + + database_autovacuum_tuning.autovacuum_vacuum_max_threshold + 100000 + + + database_autovacuum_tuning.autovacuum_vacuum_analyze_max_threshold + 50000 + + diff --git a/database_autovacuum_tuning/data/ir_cron.xml b/database_autovacuum_tuning/data/ir_cron.xml new file mode 100644 index 00000000000..7929b42f093 --- /dev/null +++ b/database_autovacuum_tuning/data/ir_cron.xml @@ -0,0 +1,13 @@ + + + + Database Autovacuum Tuning + + code + model._db_autovacuum_tune() + 1 + days + True + + + diff --git a/database_autovacuum_tuning/i18n/database_autovacuum_tuning.pot b/database_autovacuum_tuning/i18n/database_autovacuum_tuning.pot new file mode 100644 index 00000000000..50eb04f323d --- /dev/null +++ b/database_autovacuum_tuning/i18n/database_autovacuum_tuning.pot @@ -0,0 +1,122 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * database_autovacuum_tuning +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_database_autovacuum_tuning__analyze_threshold +msgid "Analyze Threshold" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_res_config_settings__autovacuum_vacuum_analyze_max_threshold +msgid "Autovacuum Vacuum Analyze Max Threshold" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_res_config_settings__autovacuum_vacuum_max_threshold +msgid "Autovacuum Vacuum Max Threshold" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model,name:database_autovacuum_tuning.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: database_autovacuum_tuning +#: model_terms:ir.ui.view,arch_db:database_autovacuum_tuning.databaseautovacuum_tuning_view_search +msgid "Create Date" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_database_autovacuum_tuning__create_uid +msgid "Created by" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_database_autovacuum_tuning__create_date +msgid "Created on" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.actions.server,name:database_autovacuum_tuning.cron_database_autovacuum_tuning_ir_actions_server +#: model:ir.model,name:database_autovacuum_tuning.model_database_autovacuum_tuning +#: model:ir.ui.menu,name:database_autovacuum_tuning.menu_model_autovacuum_tuning +msgid "Database Autovacuum Tuning" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.actions.act_window,name:database_autovacuum_tuning.action_model_autovacuum_tuning +msgid "Database Vacuum Tuning" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_database_autovacuum_tuning__display_name +msgid "Display Name" +msgstr "" + +#. module: database_autovacuum_tuning +#: model_terms:ir.ui.view,arch_db:database_autovacuum_tuning.databaseautovacuum_tuning_view_search +msgid "Group By" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_database_autovacuum_tuning__id +msgid "ID" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_database_autovacuum_tuning__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_database_autovacuum_tuning__write_date +msgid "Last Updated on" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_database_autovacuum_tuning__name +#: model_terms:ir.ui.view,arch_db:database_autovacuum_tuning.databaseautovacuum_tuning_view_search +msgid "Name" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_database_autovacuum_tuning__smart_search +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_res_config_settings__smart_search +msgid "Smart Search" +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,help:database_autovacuum_tuning.field_database_autovacuum_tuning__name +msgid "Table name" +msgstr "" + +#. module: database_autovacuum_tuning +#: model_terms:ir.ui.view,arch_db:database_autovacuum_tuning.res_config_settings_view_form +msgid "" +"The maximum number of tuples that can be updated or deleted before a vacuum " +"analyze is triggered." +msgstr "" + +#. module: database_autovacuum_tuning +#: model_terms:ir.ui.view,arch_db:database_autovacuum_tuning.res_config_settings_view_form +msgid "" +"The maximum number of tuples that can be updated or deleted before a vacuum " +"is triggered." +msgstr "" + +#. module: database_autovacuum_tuning +#: model:ir.model.fields,field_description:database_autovacuum_tuning.field_database_autovacuum_tuning__vacuum_threshold +msgid "Vacuum Threshold" +msgstr "" diff --git a/database_autovacuum_tuning/models/__init__.py b/database_autovacuum_tuning/models/__init__.py new file mode 100644 index 00000000000..c3700214bb1 --- /dev/null +++ b/database_autovacuum_tuning/models/__init__.py @@ -0,0 +1,2 @@ +from . import database_autovacuum_tuning +from . import res_config_settings diff --git a/database_autovacuum_tuning/models/database_autovacuum_tuning.py b/database_autovacuum_tuning/models/database_autovacuum_tuning.py new file mode 100644 index 00000000000..fc0cf017a0e --- /dev/null +++ b/database_autovacuum_tuning/models/database_autovacuum_tuning.py @@ -0,0 +1,85 @@ +# Copyright 2026 Camptocamp (https://www.camptocamp.com). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + + +from odoo import api, fields, models + + +class DatabaseAutovacuumTuning(models.Model): + _name = "database.autovacuum.tuning" + _description = "Database Autovacuum Tuning" + + name = fields.Char(required=True, help="Table name") + vacuum_threshold = fields.Integer() + analyze_threshold = fields.Integer() + + @api.model + def _db_autovacuum_tune(self): + vacuum_threshold, analyze_threshold = self._get_thresholds() + if vacuum_threshold <= 0: + return + results = self._get_tables_exceeding_dead_tuples(vacuum_threshold) + for schemaname, tablename, _ in results: + self.env.cr.execute( + f""" + ALTER TABLE {schemaname}.{tablename} SET ( + autovacuum_vacuum_scale_factor = 0, + autovacuum_vacuum_threshold = %s, + autovacuum_analyze_scale_factor = 0, + autovacuum_analyze_threshold = %s + ) + """, + (vacuum_threshold, analyze_threshold), + ) + self.sudo().create( + { + "name": f"{schemaname}.{tablename}", + "vacuum_threshold": vacuum_threshold, + "analyze_threshold": analyze_threshold, + } + ) + + def _get_tables_exceeding_dead_tuples(self, vacuum_threshold): + query = """ + SELECT + t.schemaname, + t.tablename, + st.n_dead_tup + FROM pg_tables AS t + JOIN pg_stat_all_tables AS st + ON st.schemaname = t.schemaname + AND st.relname = t.tablename + WHERE t.tableowner = current_user + AND t.schemaname = 'public' + AND st.n_dead_tup > %s + ORDER BY t.schemaname, t.tablename + """ + self.env.cr.execute(query, (vacuum_threshold,)) + return self.env.cr.fetchall() + + def _get_thresholds(self): + try: + vacuum_threshold = int( + self.env["ir.config_parameter"] + .sudo() + .get_param( + "database_autovacuum_tuning.autovacuum_vacuum_max_threshold", + default="0", + ) + ) + except ValueError: + vacuum_threshold = 0 + + try: + analyze_threshold = int( + self.env["ir.config_parameter"] + .sudo() + .get_param( + "database_autovacuum_tuning.autovacuum_vacuum_analyze_max_threshold", + default="0", + ) + ) + except ValueError: + analyze_threshold = 0 + + return vacuum_threshold, analyze_threshold diff --git a/database_autovacuum_tuning/models/res_config_settings.py b/database_autovacuum_tuning/models/res_config_settings.py new file mode 100644 index 00000000000..f864d9daaab --- /dev/null +++ b/database_autovacuum_tuning/models/res_config_settings.py @@ -0,0 +1,14 @@ +# Copyright 2026 Camptocamp (https://www.camptocamp.com). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + autovacuum_vacuum_max_threshold = fields.Integer( + config_parameter="database_autovacuum_tuning.autovacuum_vacuum_max_threshold", + ) + autovacuum_vacuum_analyze_max_threshold = fields.Integer( + config_parameter="database_autovacuum_tuning.autovacuum_vacuum_analyze_max_threshold", + ) diff --git a/database_autovacuum_tuning/pyproject.toml b/database_autovacuum_tuning/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/database_autovacuum_tuning/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/database_autovacuum_tuning/readme/CONTRIBUTORS.md b/database_autovacuum_tuning/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..62e88c57a16 --- /dev/null +++ b/database_autovacuum_tuning/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Telmo Santos \<\> +- Alexandre Fayolle \<\> diff --git a/database_autovacuum_tuning/readme/DESCRIPTION.md b/database_autovacuum_tuning/readme/DESCRIPTION.md new file mode 100644 index 00000000000..9193c261573 --- /dev/null +++ b/database_autovacuum_tuning/readme/DESCRIPTION.md @@ -0,0 +1,12 @@ +Database Autovacuum Tuning helps administrators keep PostgreSQL healthy by +exposing recommended autovacuum settings in Odoo. It provides guidance and +documentation for sizing thresholds and scale factors so large, busy databases +avoid table bloat and excessive vacuum lag. Use it to standardize autovacuum +configuration across environments and speed up maintenance operations without +manual tuning. + +This module is mostly useful for PostgreSQL <= 17. PostgreSQL 18.0 introduces +the `autovacuum_vacuum_max_threshold` parameter, which already provides the +capability this module targets. + +The `pgstattuple` extension must be installed on the database. \ No newline at end of file diff --git a/database_autovacuum_tuning/readme/USAGE.md b/database_autovacuum_tuning/readme/USAGE.md new file mode 100644 index 00000000000..c82e039acc4 --- /dev/null +++ b/database_autovacuum_tuning/readme/USAGE.md @@ -0,0 +1,20 @@ +1. Install the module on the database you want to tune. +2. Go to Settings > Technical > Database Structure > Database Autovacuum + Tuning and review the recommended thresholds and scale factors. +3. If needed, override the defaults using the following system parameters: + - `database_autovacuum_tuning.autovacuum_vacuum_max_threshold` + - `database_autovacuum_tuning.autovacuum_vacuum_analyze_max_threshold` +4. The configuration parameters are applied to tables by the daily cron job. + When the number of dead tuples in a table exceeds the vacuum threshold, it + applies the following configuration: + + ```sql + ALTER TABLE {schemaname}.{tablename} SET ( + autovacuum_vacuum_scale_factor = 0, + autovacuum_vacuum_threshold = %s, + autovacuum_analyze_scale_factor = 0, + autovacuum_analyze_threshold = %s + ) + ``` +5. Monitor vacuum activity and table bloat, then adjust the settings if your + workload changes. diff --git a/database_autovacuum_tuning/security/ir.model.access.csv b/database_autovacuum_tuning/security/ir.model.access.csv new file mode 100644 index 00000000000..432a55c91b6 --- /dev/null +++ b/database_autovacuum_tuning/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_database_autovacuum_tuning_system,access_database_autovacuum_tuning_system,model_database_autovacuum_tuning,base.group_system,1,0,1,1 diff --git a/database_autovacuum_tuning/static/description/icon.png b/database_autovacuum_tuning/static/description/icon.png new file mode 100644 index 00000000000..1dcc49c24f3 Binary files /dev/null and b/database_autovacuum_tuning/static/description/icon.png differ diff --git a/database_autovacuum_tuning/static/description/index.html b/database_autovacuum_tuning/static/description/index.html new file mode 100644 index 00000000000..3d7aa16ac8a --- /dev/null +++ b/database_autovacuum_tuning/static/description/index.html @@ -0,0 +1,478 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Database Autovacuum Tuning

+ +

Alpha License: LGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

+

Database Autovacuum Tuning helps administrators keep PostgreSQL healthy +by exposing recommended autovacuum settings in Odoo. It provides +guidance and documentation for sizing thresholds and scale factors so +large, busy databases avoid table bloat and excessive vacuum lag. Use it +to standardize autovacuum configuration across environments and speed up +maintenance operations without manual tuning.

+

This module is mostly useful for PostgreSQL <= 17. PostgreSQL 18.0 +introduces the autovacuum_vacuum_max_threshold parameter, which +already provides the capability this module targets.

+

The pgstattuple extension must be installed on the database.

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Usage

+
    +
  1. Install the module on the database you want to tune.

    +
  2. +
  3. Go to Settings > Technical > Database Structure > Database Autovacuum +Tuning and review the recommended thresholds and scale factors.

    +
  4. +
  5. If needed, override the defaults using the following system +parameters:

    +
      +
    • database_autovacuum_tuning.autovacuum_vacuum_max_threshold
    • +
    • database_autovacuum_tuning.autovacuum_vacuum_analyze_max_threshold
    • +
    +
  6. +
  7. The configuration parameters are applied to tables by the daily cron +job. When the number of dead tuples in a table exceeds the vacuum +threshold, it applies the following configuration:

    +
    +ALTER TABLE {schemaname}.{tablename} SET (
    +     autovacuum_vacuum_scale_factor = 0,
    +     autovacuum_vacuum_threshold = %s,
    +     autovacuum_analyze_scale_factor = 0,
    +     autovacuum_analyze_threshold = %s
    +)
    +
    +
  8. +
  9. Monitor vacuum activity and table bloat, then adjust the settings if +your workload changes.

    +
  10. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/server-tools project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+
+ + diff --git a/database_autovacuum_tuning/tests/__init__.py b/database_autovacuum_tuning/tests/__init__.py new file mode 100644 index 00000000000..a17e75ae912 --- /dev/null +++ b/database_autovacuum_tuning/tests/__init__.py @@ -0,0 +1 @@ +from . import test_database_autovacuum_tunning diff --git a/database_autovacuum_tuning/tests/test_database_autovacuum_tunning.py b/database_autovacuum_tuning/tests/test_database_autovacuum_tunning.py new file mode 100644 index 00000000000..e285197e9e1 --- /dev/null +++ b/database_autovacuum_tuning/tests/test_database_autovacuum_tunning.py @@ -0,0 +1,36 @@ +# Copyright 2026 Camptocamp +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from unittest.mock import patch + +from odoo.tests import TransactionCase + + +class TestAutovacuumTunning(TransactionCase): + def _set_thresholds(self, vacuum_threshold=1, analyze_threshold=1): + params = self.env["ir.config_parameter"].sudo() + params.set_param( + "database_autovacuum_tuning.autovacuum_vacuum_max_threshold", + str(vacuum_threshold), + ) + params.set_param( + "database_autovacuum_tuning.autovacuum_vacuum_analyze_max_threshold", + str(analyze_threshold), + ) + + def test_tune_creates_record_for_res_partner(self): + # Set low thresholds to ensure res_partner exceeds them + self._set_thresholds(vacuum_threshold=9, analyze_threshold=5) + # Mock the method to return res_partner as exceeding the thresholds + with patch.object( + self.env.registry["database.autovacuum.tuning"], + "_get_tables_exceeding_dead_tuples", + return_value=[("public", "res_partner", 10)], + ): + self.env["database.autovacuum.tuning"]._db_autovacuum_tune() + record = self.env["database.autovacuum.tuning"].search( + [("name", "=", "public.res_partner")], + limit=1, + ) + + self.assertTrue(record) diff --git a/database_autovacuum_tuning/views/database_autovacuum_tuning_views.xml b/database_autovacuum_tuning/views/database_autovacuum_tuning_views.xml new file mode 100644 index 00000000000..20c6e461166 --- /dev/null +++ b/database_autovacuum_tuning/views/database_autovacuum_tuning_views.xml @@ -0,0 +1,49 @@ + + + + database.autovacuum.tuning + + + + + + + + + + + + database.autovacuum.tuning + + + + + + + + + + + + + Database Vacuum Tuning + database.autovacuum.tuning + list + + + + + Database Autovacuum Tuning + + + + + diff --git a/database_autovacuum_tuning/views/res_config_settings_views.xml b/database_autovacuum_tuning/views/res_config_settings_views.xml new file mode 100644 index 00000000000..b6204ee3ab4 --- /dev/null +++ b/database_autovacuum_tuning/views/res_config_settings_views.xml @@ -0,0 +1,24 @@ + + + + Database Autovacuum Tuning Settings + res.config.settings + + + + + + + + + + + + + diff --git a/mail_cleanup/README.rst b/mail_cleanup/README.rst index 54696390bb9..55798cca8d8 100644 --- a/mail_cleanup/README.rst +++ b/mail_cleanup/README.rst @@ -11,7 +11,7 @@ Mail cleanup !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:1c8f7c5378b459f9a9fcf644ee4a95a4bc193225e58b73502defbedc4c2d6bf6 + !! source digest: sha256:b67f9f7207a78cd4df55008d31ccfb9f7b3d260bd4cccd2fbf2d0ae99fd6a749 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/mail_cleanup/__manifest__.py b/mail_cleanup/__manifest__.py index fbd5a10ea5e..8f27f3098d6 100644 --- a/mail_cleanup/__manifest__.py +++ b/mail_cleanup/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Mail cleanup", - "version": "18.0.1.0.1", + "version": "18.0.1.0.2", "category": "Tools", "summary": "Mark as read or delete mails after a set time", "author": "Camptocamp, " "Odoo Community Association (OCA)", diff --git a/mail_cleanup/models/fetchmail_server.py b/mail_cleanup/models/fetchmail_server.py index e23649a3982..ace780d31b0 100644 --- a/mail_cleanup/models/fetchmail_server.py +++ b/mail_cleanup/models/fetchmail_server.py @@ -51,7 +51,6 @@ def _cleanup_fetchmail_server(self, server, imap_server): expiration_date = datetime.date.today() expiration_date -= relativedelta(days=server.cleanup_days) search_text = expiration_date.strftime("(UNSEEN BEFORE %d-%b-%Y)") - imap_server.select() result, data = imap_server.search(None, search_text) for num in data[0].split(): try: @@ -86,7 +85,6 @@ def _purge_fetchmail_server(self, server, imap_server): purge_date = datetime.date.today() purge_date -= relativedelta(days=server.purge_days) search_text = purge_date.strftime("(BEFORE %d-%b-%Y)") - imap_server.select() result, data = imap_server.search(None, search_text) for num in data[0].split(): try: @@ -122,6 +120,7 @@ def fetch_mail(self, raise_exception=True): if server.server_type == "imap": try: imap_server = server.connect() + imap_server.select() if server.cleanup_days > 0: self._cleanup_fetchmail_server(server, imap_server) if server.purge_days > 0: diff --git a/mail_cleanup/static/description/index.html b/mail_cleanup/static/description/index.html index 40b28a93f4f..3525f9c22c0 100644 --- a/mail_cleanup/static/description/index.html +++ b/mail_cleanup/static/description/index.html @@ -372,7 +372,7 @@

Mail cleanup

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:1c8f7c5378b459f9a9fcf644ee4a95a4bc193225e58b73502defbedc4c2d6bf6 +!! source digest: sha256:b67f9f7207a78cd4df55008d31ccfb9f7b3d260bd4cccd2fbf2d0ae99fd6a749 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index c6edf428663..25d7fe2e438 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "odoo-addons-oca-server-tools" -version = "18.0.20260416.0" +version = "18.0.20260430.0" dependencies = [ "odoo-addon-attachment_delete_restrict==18.0.*", "odoo-addon-attachment_queue==18.0.*", @@ -28,6 +28,7 @@ dependencies = [ "odoo-addon-base_time_window==18.0.*", "odoo-addon-base_view_inheritance_extension==18.0.*", "odoo-addon-bus_alt_connection==18.0.*", + "odoo-addon-database_autovacuum_tuning==18.0.*", "odoo-addon-database_cleanup==18.0.*", "odoo-addon-database_size==18.0.*", "odoo-addon-dbfilter_from_header==18.0.*",