From 23ad634126efbb394927d2ba1ff845e7d6bba123 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nguy=E1=BB=85n=20=C4=90=E1=BA=A1i=20D=C6=B0=C6=A1ng?=
 <daiduongnguyen2709@gmail.com>
Date: Wed, 22 May 2024 11:44:13 +0700
Subject: [PATCH] [OU-ADD] base: migration to 17.0

---
 docsource/modules160-170.rst                  |   2 +-
 .../scripts/base/17.0.1.3/end-migration.py    |  20 ++
 .../scripts/base/17.0.1.3/post-migration.py   |  25 ++
 .../scripts/base/17.0.1.3/pre-migration.py    | 151 ++++++++++
 .../base/17.0.1.3/upgrade_analysis_work.txt   | 279 ++++++++++++++++++
 5 files changed, 476 insertions(+), 1 deletion(-)
 create mode 100644 openupgrade_scripts/scripts/base/17.0.1.3/end-migration.py
 create mode 100644 openupgrade_scripts/scripts/base/17.0.1.3/post-migration.py
 create mode 100644 openupgrade_scripts/scripts/base/17.0.1.3/pre-migration.py
 create mode 100644 openupgrade_scripts/scripts/base/17.0.1.3/upgrade_analysis_work.txt

diff --git a/docsource/modules160-170.rst b/docsource/modules160-170.rst
index 0ae89b703492..0d66ae5d504b 100644
--- a/docsource/modules160-170.rst
+++ b/docsource/modules160-170.rst
@@ -70,7 +70,7 @@ Module coverage 16.0 -> 17.0
 +---------------------------------------------------+----------------------+-------------------------------------------------+
 | barcodes_gs1_nomenclature                         |                      |No DB layout changes.                            |
 +---------------------------------------------------+----------------------+-------------------------------------------------+
-| base                                              |                      |                                                 |
+| base                                              | Done                 |                                                 |
 +---------------------------------------------------+----------------------+-------------------------------------------------+
 | base_address_extended                             |                      |                                                 |
 +---------------------------------------------------+----------------------+-------------------------------------------------+
diff --git a/openupgrade_scripts/scripts/base/17.0.1.3/end-migration.py b/openupgrade_scripts/scripts/base/17.0.1.3/end-migration.py
new file mode 100644
index 000000000000..90a00655babd
--- /dev/null
+++ b/openupgrade_scripts/scripts/base/17.0.1.3/end-migration.py
@@ -0,0 +1,20 @@
+# Copyright 2024 Viindoo Technology Joint Stock Company (Viindoo)
+# Copyright 2022 ForgeFlow S.L.  <https://www.forgeflow.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+from openupgradelib import openupgrade
+
+_deleted_xml_records = [
+    "base.icp_mail_bounce_alias",
+    "base.icp_mail_catchall_alias",
+    "base.icp_mail_default_from",
+]
+
+
+@openupgrade.migrate()
+def migrate(env, version):
+    """Call disable_invalid_filters in every edition of openupgrade"""
+    openupgrade.disable_invalid_filters(env)
+    openupgrade.delete_records_safely_by_xml_id(
+        env,
+        _deleted_xml_records,
+    )
diff --git a/openupgrade_scripts/scripts/base/17.0.1.3/post-migration.py b/openupgrade_scripts/scripts/base/17.0.1.3/post-migration.py
new file mode 100644
index 000000000000..6ea8031f4d7d
--- /dev/null
+++ b/openupgrade_scripts/scripts/base/17.0.1.3/post-migration.py
@@ -0,0 +1,25 @@
+# Copyright 2024 Viindoo Technology Joint Stock Company (Viindoo)
+# Copyright 2023 Hunki Enterprises BV (https://hunki-enterprises.com)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openupgradelib import openupgrade
+
+_deleted_xml_records = [
+    "base.res_partner_rule_private_employee",
+    "base.res_partner_rule_private_group",
+]
+
+
+def _partner_update_complete_name(env):
+    partners = env["res.partner"].with_context(active_test=False).search([])
+    partners._compute_complete_name()
+
+
+@openupgrade.migrate()
+def migrate(env, version):
+    openupgrade.load_data(env, "base", "17.0.1.3/noupdate_changes.xml")
+    openupgrade.delete_records_safely_by_xml_id(
+        env,
+        _deleted_xml_records,
+    )
+    _partner_update_complete_name(env)
diff --git a/openupgrade_scripts/scripts/base/17.0.1.3/pre-migration.py b/openupgrade_scripts/scripts/base/17.0.1.3/pre-migration.py
new file mode 100644
index 000000000000..d08f7f7aa676
--- /dev/null
+++ b/openupgrade_scripts/scripts/base/17.0.1.3/pre-migration.py
@@ -0,0 +1,151 @@
+# Copyright 2024 Viindoo Technology Joint Stock Company (Viindoo)
+# Copyright 2020 Odoo Community Association (OCA)
+# Copyright 2020 Opener B.V. <stefan@opener.am>
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+import logging
+
+from openupgradelib import openupgrade
+
+from odoo import tools
+
+from odoo.addons.openupgrade_scripts.apriori import merged_modules, renamed_modules
+
+_logger = logging.getLogger(__name__)
+
+_xmlids_renames = [
+    (
+        "mail.access_res_users_settings_all",
+        "base.access_res_users_settings_all",
+    ),
+    (
+        "mail.access_res_users_settings_user",
+        "base.access_res_users_settings_user",
+    ),
+    (
+        "mail.res_users_settings_rule_admin",
+        "base.res_users_settings_rule_admin",
+    ),
+    (
+        "mail.res_users_settings_rule_user",
+        "base.res_users_settings_rule_user",
+    ),
+    (
+        "mail.constraint_res_users_settings_unique_user_id",
+        "base.constraint_res_users_settings_unique_user_id",
+    ),
+]
+
+
+def _fill_ir_server_object_lines_into_action_server(cr):
+    openupgrade.logged_query(
+        cr,
+        """
+        ALTER TABLE ir_act_server
+            ADD COLUMN IF NOT EXISTS evaluation_type VARCHAR,
+            ADD COLUMN IF NOT EXISTS resource_ref VARCHAR,
+            ADD COLUMN IF NOT EXISTS selection_value INTEGER,
+            ADD COLUMN IF NOT EXISTS update_boolean_value VARCHAR,
+            ADD COLUMN IF NOT EXISTS update_field_id INTEGER,
+            ADD COLUMN IF NOT EXISTS update_m2m_operation VARCHAR,
+            ADD COLUMN IF NOT EXISTS update_path VARCHAR,
+            ADD COLUMN IF NOT EXISTS update_related_model_id INTEGER,
+            ADD COLUMN IF NOT EXISTS value TEXT;
+        """,
+    )
+    openupgrade.logged_query(
+        cr,
+        """
+        WITH tmp AS (
+            SELECT t1.id, t1.state, t2.col1, t2.value, t2.evaluation_type,
+            t3.name AS update_field_name, t3.ttype,
+            t3.relation, t4.id AS selection_field_id
+            FROM ir_act_server t1
+            JOIN ir_server_object_lines t2 on t1.id = t2.server_id
+            JOIN ir_model_fields t3 on t2.col1 = t3.id
+            LEFT JOIN ir_model_fields_selection t4 on t3.id = t4.field_id
+        )
+        UPDATE ir_act_server ias
+            SET
+                update_field_id = CASE
+                    WHEN tmp.state = 'object_create' THEN NULL
+                    WHEN tmp.state = 'object_write' THEN tmp.col1
+                    ELSE NULL
+                END,
+                update_path = CASE
+                    WHEN tmp.state = 'object_create' THEN NULL
+                    WHEN tmp.state = 'object_write' THEN tmp.update_field_name
+                    ELSE NULL
+                END,
+                update_related_model_id = CASE
+                    WHEN tmp.state = 'object_write' AND tmp.evaluation_type = 'value'
+                    AND tmp.relation IS NOT NULL THEN
+                    (SELECT id FROM ir_model WHERE model=tmp.relation LIMIT 1)
+                    ELSE NULL
+                END,
+                update_m2m_operation = 'add',
+                evaluation_type = CASE
+                    WHEN tmp.evaluation_type = 'value' then 'value'
+                    WHEN tmp.evaluation_type = 'reference' then 'value'
+                    WHEN tmp.evaluation_type = 'equation' then 'equation'
+                    ELSE 'VALUE'
+                END,
+                value = tmp.value,
+                resource_ref = CASE
+                    WHEN tmp.ttype in ('many2one', 'many2many')
+                    THEN tmp.relation || ',' || tmp.value
+                    ELSE NULL
+                END,
+                selection_value = CASE
+                    WHEN tmp.ttype = 'selection' THEN tmp.selection_field_id
+                    ELSE NULL
+                END,
+                update_boolean_value = CASE
+                    WHEN tmp.ttype = 'boolean' then 'true'
+                    ELSE NULL
+                END
+        FROM tmp
+        WHERE ias.id = tmp.id
+        """,
+    )
+
+
+def _partner_create_column_complete_name(cr):
+    openupgrade.logged_query(
+        cr,
+        """
+        ALTER TABLE res_partner
+            ADD COLUMN IF NOT EXISTS complete_name VARCHAR;
+        """,
+    )
+
+
+def _update_partner_private_type(cr):
+    openupgrade.logged_query(
+        cr,
+        """
+        UPDATE res_partner
+        SET type = 'contact'
+        WHERE type = 'private'
+        """,
+    )
+
+
+@openupgrade.migrate(use_env=False)
+def migrate(cr, version):
+    """
+    Don't request an env for the base pre-migration as flushing the env in
+    odoo/modules/registry.py will break on the 'base' module not yet having
+    been instantiated.
+    """
+    if "openupgrade_framework" not in tools.config["server_wide_modules"]:
+        _logger.error(
+            "openupgrade_framework is not preloaded. You are highly "
+            "recommended to run the Odoo with --load=openupgrade_framework "
+            "when migrating your database."
+        )
+    openupgrade.update_module_names(cr, renamed_modules.items())
+    openupgrade.update_module_names(cr, merged_modules.items(), merge_modules=True)
+    openupgrade.rename_xmlids(cr, _xmlids_renames)
+    _fill_ir_server_object_lines_into_action_server(cr)
+    _update_partner_private_type(cr)
+    _partner_create_column_complete_name(cr)
diff --git a/openupgrade_scripts/scripts/base/17.0.1.3/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/base/17.0.1.3/upgrade_analysis_work.txt
new file mode 100644
index 000000000000..22577e76d946
--- /dev/null
+++ b/openupgrade_scripts/scripts/base/17.0.1.3/upgrade_analysis_work.txt
@@ -0,0 +1,279 @@
+---Models in module 'base'---
+obsolete model ir.server.object.lines
+# Done pre-migration: fill value into ir.actions.server
+
+new model ir.model.inherit
+# NOTHING TO DO: new feature to store model inheritance tree handle by Odoo registry itself
+
+model res.users.settings (moved from mail)
+# Done pre-migration: rename xml
+
+---Fields in module 'base'---
+base         / ir.actions.act_url       / target (selection)            : selection_keys is now '['download', 'new', 'self']' ('['new', 'self']')
+base         / ir.actions.act_window    / mobile_view_mode (char)       : NEW hasdefault: default
+# NOTHING TO DO: new feature
+
+base         / ir.actions.server        / evaluation_type (selection)   : NEW selection_keys: ['equation', 'value'], hasdefault: default
+base         / ir.actions.server        / fields_lines (one2many)       : DEL relation: ir.server.object.lines
+base         / ir.actions.server        / resource_ref (reference)      : NEW
+base         / ir.actions.server        / selection_value (many2one)    : NEW relation: ir.model.fields.selection
+# Done pre-migration: fill value into ir.actions.server
+
+base         / ir.actions.server        / state (selection)             : selection_keys is now '['code', 'multi', 'object_create', 'object_write', 'webhook']' ('['code', 'multi', 'object_create', 'object_write']')
+# NOTHING TO DO: new feature
+
+base         / ir.actions.server        / update_boolean_value (selection): NEW selection_keys: ['false', 'true'], hasdefault: default
+base         / ir.actions.server        / update_field_id (many2one)    : NEW relation: ir.model.fields, hasdefault: compute
+base         / ir.actions.server        / update_m2m_operation (selection): NEW selection_keys: ['add', 'clear', 'remove', 'set'], hasdefault: default
+base         / ir.actions.server        / update_path (char)            : NEW hasdefault: default
+base         / ir.actions.server        / update_related_model_id (many2one): NEW relation: ir.model, isfunction: function, stored
+base         / ir.actions.server        / value (text)                  : NEW
+base         / ir.actions.server        / webhook_field_ids (many2many) : NEW relation: ir.model.fields
+base         / ir.actions.server        / webhook_url (char)            : NEW
+# Done pre-migration: fill value into ir.actions.server
+
+base         / ir.cron                  / cron_name (char)              : not related anymore
+base         / ir.cron                  / cron_name (char)              : now a function
+base         / ir.mail_server           / _order                        : _order is now 'sequence, id' ('sequence')
+base         / ir.mail_server           / smtp_authentication (selection): selection_keys is now '['certificate', 'cli', 'login']' ('['certificate', 'login']')
+# NOTHING TO DO
+
+base         / ir.model.fields          / currency_field (char)         : NEW
+base         / ir.model.fields          / sanitize (boolean)            : NEW hasdefault: default
+base         / ir.model.fields          / sanitize_attributes (boolean) : NEW hasdefault: default
+base         / ir.model.fields          / sanitize_form (boolean)       : NEW hasdefault: default
+base         / ir.model.fields          / sanitize_overridable (boolean): NEW hasdefault: default
+base         / ir.model.fields          / sanitize_style (boolean)      : NEW hasdefault: default
+base         / ir.model.fields          / sanitize_tags (boolean)       : NEW hasdefault: default
+base         / ir.model.fields          / strip_classes (boolean)       : NEW hasdefault: default
+base         / ir.model.fields          / strip_style (boolean)         : NEW hasdefault: default
+# NOTHING TO DO: handle by odoo registry itself
+
+base         / ir.model.inherit         / model_id (many2one)           : NEW relation: ir.model, required
+base         / ir.model.inherit         / parent_field_id (many2one)    : NEW relation: ir.model.fields
+base         / ir.model.inherit         / parent_id (many2one)          : NEW relation: ir.model, required
+# NOTHING TO DO: new feature to store model inheritance tree handle by Odoo registry itself
+
+base         / ir.property              / type (selection)              : selection_keys is now '['binary', 'boolean', 'char', 'date', 'datetime', 'float', 'html', 'integer', 'many2one', 'selection', 'text']' ('['binary', 'boolean', 'char', 'date', 'datetime', 'float', 'integer', 'many2one', 'selection', 'text']')
+# NOTHING TO DO: new feature
+
+base         / ir.server.object.lines   / col1 (many2one)               : DEL relation: ir.model.fields, required
+base         / ir.server.object.lines   / evaluation_type (selection)   : DEL required, selection_keys: ['equation', 'reference', 'value']
+base         / ir.server.object.lines   / server_id (many2one)          : DEL relation: ir.actions.server
+base         / ir.server.object.lines   / value (text)                  : DEL required
+# Done pre-migration: fill value into ir.actions.server
+
+base         / ir.ui.view               / field_parent (char)           : DEL
+# NOTHING TO DO: deprecated from very longtime ago since https://github.com/odoo/odoo/commit/905e01921f3c3ef43ace6fc537d1d8c0d280002c 2017
+
+base         / res.company              / all_child_ids (one2many)      : NEW relation: res.company
+base         / res.company              / parent_path (char)            : NEW
+# NOTHING TO DO: new branch feature
+
+base         / res.company              / base_onboarding_company_state (selection): DEL selection_keys: ['done', 'just_done', 'not_done']
+# NOTHING TO DO: but need to do in account module and some module that will use onboarding at post_install perhaps , use _search_or_create_progress method
+
+base         / res.company              / favicon (binary)              : DEL attachment: True
+# NOTHING TO DO: remove feature without replacement
+
+base         / res.company              / uses_default_logo (boolean)   : NEW isfunction: function, stored
+# NOTHING TO DO: computed by ORM
+
+base         / res.country              / code (char)                   : now required
+# NOTHING TO DO: if it blank we will know where to fill in, normally it doesn't blank
+
+base         / res.partner              / _order                        : _order is now 'complete_name ASC, id DESC' ('display_name ASC, id DESC')
+# NOTHING TO DO
+
+base         / res.partner              / complete_name (char)          : NEW isfunction: function, stored
+base         / res.partner              / display_name (char)           : not stored anymore
+# Done pre/post-migration: create column in pre and fill value in post
+
+base         / res.partner              / type (selection)              : selection_keys is now '['contact', 'delivery', 'invoice', 'other']' ('['contact', 'delivery', 'invoice', 'other', 'private']')
+# Done pre-migration: update 'private' type with 'contact' type
+
+base         / res.users                / res_users_settings_id (many2one): previously in module mail
+base         / res.users                / res_users_settings_ids (one2many): previously in module mail
+base         / res.users.settings       / _order                        : previously in module mail
+base         / res.users.settings       / display_name (char)           : previously in module mail
+base         / res.users.settings       / user_id (many2one)            : previously in module mail
+# NOTHING TO DO
+
+---XML records in module 'base'---
+NEW ir.actions.act_window: base.ir_client_actions_report
+DEL ir.actions.act_window: base.action_open_base_onboarding_company
+DEL ir.actions.client: base.modules_act_cl
+DEL ir.actions.client: base.modules_updates_act_cl
+DEL ir.actions.server: base.action_server_module_immediate_install
+# NOTHING TO DO: noupdate records
+
+DEL ir.config_parameter: base.icp_mail_bounce_alias (noupdate)
+DEL ir.config_parameter: base.icp_mail_catchall_alias (noupdate)
+DEL ir.config_parameter: base.icp_mail_default_from (noupdate)
+# DONE: removed in end-migration, to create new alias domain record in mail module
+
+NEW ir.cron: base.ir_cron_res_users_deletion
+NEW ir.model.access: base.access_ir_model_inherit
+NEW ir.model.access: base.access_res_company_employee
+NEW ir.model.access: base.access_res_company_portal
+NEW ir.model.access: base.access_res_company_public
+NEW ir.model.access: base.access_res_country_employee
+NEW ir.model.access: base.access_res_country_group_employee
+NEW ir.model.access: base.access_res_country_group_portal
+NEW ir.model.access: base.access_res_country_group_public
+NEW ir.model.access: base.access_res_country_portal
+NEW ir.model.access: base.access_res_country_public
+NEW ir.model.access: base.access_res_country_state_employee
+NEW ir.model.access: base.access_res_country_state_portal
+NEW ir.model.access: base.access_res_country_state_public
+NEW ir.model.access: base.access_res_currency_employee
+NEW ir.model.access: base.access_res_currency_portal
+NEW ir.model.access: base.access_res_currency_public
+NEW ir.model.access: base.access_res_currency_rate_employee
+NEW ir.model.access: base.access_res_currency_rate_portal
+NEW ir.model.access: base.access_res_currency_rate_public
+NEW ir.model.access: base.access_res_lang_employee
+NEW ir.model.access: base.access_res_lang_group_system
+NEW ir.model.access: base.access_res_lang_portal
+NEW ir.model.access: base.access_res_lang_public
+NEW ir.model.access: base.access_res_users_employee
+NEW ir.model.access: base.access_res_users_log_system
+NEW ir.model.access: base.access_res_users_portal
+NEW ir.model.access: base.access_res_users_public
+# NOTHING TO DO: noupdate records
+
+NEW ir.model.access: base.access_res_users_settings_all [renamed from mail module]
+NEW ir.model.access: base.access_res_users_settings_user [renamed from mail module]
+# DONE: renamed in pre-migration
+
+DEL ir.model.access: base.access_ir_server_object_lines_group_system
+DEL ir.model.access: base.access_res_company_group_user
+DEL ir.model.access: base.access_res_country_group_all
+DEL ir.model.access: base.access_res_country_group_group_all
+DEL ir.model.access: base.access_res_country_state_group_all
+DEL ir.model.access: base.access_res_currency_group_all
+DEL ir.model.access: base.access_res_currency_rate_group_all
+DEL ir.model.access: base.access_res_lang_group_all
+DEL ir.model.access: base.access_res_lang_group_user
+DEL ir.model.access: base.access_res_users_all
+DEL ir.model.access: base.access_res_users_log_all
+NEW ir.model.constraint: base.constraint_ir_model_fields_name_manual_field
+NEW ir.model.constraint: base.constraint_ir_model_inherit_uniq
+# NOTHING TO DO: noupdate records
+
+NEW ir.model.constraint: base.constraint_res_users_settings_unique_user_id [renamed from mail module]
+# DONE: renamed in pre-migration
+
+NEW ir.module.category: base.module_category_services_appointment
+NEW ir.module.module: base.module_sale_amazon (noupdate)
+# NOTHING TO DO: new records
+
+NEW ir.rule: base.res_users_settings_rule_admin [renamed from mail module] (noupdate)
+NEW ir.rule: base.res_users_settings_rule_user [renamed from mail module] (noupdate)
+# DONE: renamed in pre-migration
+
+DEL ir.rule: base.res_partner_rule_private_employee (noupdate)
+DEL ir.rule: base.res_partner_rule_private_group (noupdate)
+# DONE: removed in post-migration
+
+NEW ir.ui.menu: base.menu_ir_client_actions_report
+DEL ir.ui.menu: base.menu_board_root
+DEL ir.ui.menu: base.menu_module_updates
+DEL ir.ui.menu: base.menu_reporting_config
+DEL ir.ui.menu: base.menu_reporting_dashboard
+DEL ir.ui.menu: base.module_mi
+NEW ir.ui.view: base.no_contact
+NEW ir.ui.view: base.res_users_identitycheck_view_form
+NEW ir.ui.view: base.res_users_identitycheck_view_form_revokedevices
+NEW ir.ui.view: base.view_client_action_form
+NEW ir.ui.view: base.view_client_action_tree
+NEW ir.ui.view: base.view_country_search
+DEL ir.ui.view: base.base_onboarding_company_form
+DEL ir.ui.view: base.identity_check_wizard
+DEL ir.ui.view: base.onboarding_company_step
+DEL ir.ui.view: base.onboarding_container
+DEL ir.ui.view: base.onboarding_step
+DEL ir.ui.view: base.view_module_category_tree
+# NOTHING TO DO: noupdate records
+
+NEW res.country.group: base.eurasian_economic_union (noupdate)
+# NOTHING TO DO: new record
+
+NEW res.country.state: base.state_hk_hk
+NEW res.country.state: base.state_hk_kln
+NEW res.country.state: base.state_hk_nt
+NEW res.country.state: base.state_ke_01
+NEW res.country.state: base.state_ke_02
+NEW res.country.state: base.state_ke_03
+NEW res.country.state: base.state_ke_04
+NEW res.country.state: base.state_ke_05
+NEW res.country.state: base.state_ke_06
+NEW res.country.state: base.state_ke_07
+NEW res.country.state: base.state_ke_08
+NEW res.country.state: base.state_ke_09
+NEW res.country.state: base.state_ke_10
+NEW res.country.state: base.state_ke_11
+NEW res.country.state: base.state_ke_12
+NEW res.country.state: base.state_ke_13
+NEW res.country.state: base.state_ke_14
+NEW res.country.state: base.state_ke_15
+NEW res.country.state: base.state_ke_16
+NEW res.country.state: base.state_ke_17
+NEW res.country.state: base.state_ke_18
+NEW res.country.state: base.state_ke_19
+NEW res.country.state: base.state_ke_20
+NEW res.country.state: base.state_ke_21
+NEW res.country.state: base.state_ke_22
+NEW res.country.state: base.state_ke_23
+NEW res.country.state: base.state_ke_24
+NEW res.country.state: base.state_ke_25
+NEW res.country.state: base.state_ke_26
+NEW res.country.state: base.state_ke_27
+NEW res.country.state: base.state_ke_28
+NEW res.country.state: base.state_ke_29
+NEW res.country.state: base.state_ke_30
+NEW res.country.state: base.state_ke_31
+NEW res.country.state: base.state_ke_32
+NEW res.country.state: base.state_ke_33
+NEW res.country.state: base.state_ke_34
+NEW res.country.state: base.state_ke_35
+NEW res.country.state: base.state_ke_36
+NEW res.country.state: base.state_ke_37
+NEW res.country.state: base.state_ke_38
+NEW res.country.state: base.state_ke_39
+NEW res.country.state: base.state_ke_40
+NEW res.country.state: base.state_ke_41
+NEW res.country.state: base.state_ke_42
+NEW res.country.state: base.state_ke_43
+NEW res.country.state: base.state_ke_44
+NEW res.country.state: base.state_ke_45
+NEW res.country.state: base.state_ke_46
+NEW res.country.state: base.state_ke_47
+NEW res.country.state: base.state_uy_01
+NEW res.country.state: base.state_uy_02
+NEW res.country.state: base.state_uy_03
+NEW res.country.state: base.state_uy_04
+NEW res.country.state: base.state_uy_05
+NEW res.country.state: base.state_uy_06
+NEW res.country.state: base.state_uy_07
+NEW res.country.state: base.state_uy_08
+NEW res.country.state: base.state_uy_09
+NEW res.country.state: base.state_uy_10
+NEW res.country.state: base.state_uy_11
+NEW res.country.state: base.state_uy_12
+NEW res.country.state: base.state_uy_13
+NEW res.country.state: base.state_uy_14
+NEW res.country.state: base.state_uy_15
+NEW res.country.state: base.state_uy_16
+NEW res.country.state: base.state_uy_17
+NEW res.country.state: base.state_uy_18
+NEW res.country.state: base.state_uy_19
+# NOTHING TO DO: noupdate records
+
+NEW res.currency: base.SLE (noupdate)
+# NOTHING TO DO: new record
+
+DEL res.groups: base.group_private_addresses
+NEW res.lang: base.lang_en_NZ
+NEW res.lang: base.lang_es_419
+# NOTHING TO DO: noupdate records
