diff --git a/.github/workflows/aggregate.yml b/.github/workflows/aggregate.yml new file mode 100644 index 000000000000..6a84fd5f89bc --- /dev/null +++ b/.github/workflows/aggregate.yml @@ -0,0 +1,94 @@ +name: Aggregate fork branches + +on: + push: + branches: + - ledoent + - "19.0-fix-*" + workflow_dispatch: + +permissions: + contents: write + +jobs: + aggregate: + runs-on: ubuntu-latest + steps: + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install git-aggregator + run: pip install git-aggregator==4.1 + + - name: Configure git identity (gitaggregate needs this before merging) + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + + - name: Checkout fork (no working tree needed; gitaggregate clones fresh) + uses: actions/checkout@v4 + with: + ref: ledoent + path: fork-meta + fetch-depth: 1 + + - name: Write aggregate config + # gitaggregate clones into ./openupgrade so the lab's repos.yaml layout is reproduced. + # `target ledoent aggregated` is what gets pushed back. + run: | + cat > aggregate.yml <<'YAML' + ./openupgrade: + defaults: + depth: 500 + remotes: + origin: https://github.com/OCA/OpenUpgrade.git + ledoent: https://github.com/ledoent/OpenUpgrade.git + target: ledoent aggregated + merges: + - ledoent ledoent + - ledoent 19.0-fix-user-groups-id-rename + # 19.0-fix-rollup is a conflict-resolved combination of the five + # OCA/OpenUpgrade PRs #5628-5632 (cherry-picked onto origin/19.0 + # in dependency order). Listing them individually here fails + # because #5628 and #5630 both touch hr/19.0.1.1/pre-migration.py + # with non-overlapping additions that gitaggregate's straight + # `git pull --no-rebase` can't auto-merge. When any OCA PR + # changes, rebase the rollup branch. + - ledoent 19.0-fix-rollup + YAML + + - name: Run gitaggregate + run: gitaggregate -c aggregate.yml + + - name: Force-push aggregated + id: push + working-directory: openupgrade + env: + PUSH_TOKEN: ${{ secrets.AGGREGATE_PUSH_TOKEN || secrets.GITHUB_TOKEN }} + run: | + git remote set-url ledoent "https://x-access-token:${PUSH_TOKEN}@github.com/ledoent/OpenUpgrade.git" + git push --force ledoent HEAD:refs/heads/aggregated + sha=$(git rev-parse HEAD) + echo "Aggregated head: $sha" + echo "sha=$sha" >> "$GITHUB_OUTPUT" + + - name: Trigger build-image workflow + # GITHUB_TOKEN-driven branch pushes don't fire downstream workflows + # (loop protection). Use repository_dispatch with a PAT so build-image + # can react. Falls back to no-op if AGGREGATE_PUSH_TOKEN is unset. + env: + GH_TOKEN: ${{ secrets.AGGREGATE_PUSH_TOKEN }} + run: | + if [ -z "$GH_TOKEN" ]; then + echo "AGGREGATE_PUSH_TOKEN not set; skipping repository_dispatch." + echo "Run \`gh workflow run build-image.yml --ref aggregated\` manually." + exit 0 + fi + gh api \ + -X POST \ + "/repos/${{ github.repository }}/dispatches" \ + -f event_type=aggregated-updated \ + -f "client_payload[sha]=${{ steps.push.outputs.sha }}" + echo "Fired repository_dispatch event_type=aggregated-updated" diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml new file mode 100644 index 000000000000..3b684ed68606 --- /dev/null +++ b/.github/workflows/build-image.yml @@ -0,0 +1,58 @@ +name: Build openupgrade image + +# Builds an Odoo 19 image with the aggregated OpenUpgrade tree baked in +# and pushes to the ledoent Zot registry at registry.hz.ledoweb.com. +# +# Auth: basic-auth via the `robot-ci` Zot user. +# Secrets: ZOT_USERNAME (= robot-ci), ZOT_PASSWORD (set on this repo). +# +# Image: registry.hz.ledoweb.com/openupgrade/openupgrade +# Consumed by: openupgrade-lab/docker-compose.yml (odoo-19 service) + +on: + push: + branches: + - aggregated + repository_dispatch: + types: [aggregated-updated] + workflow_dispatch: + +concurrency: + group: build-image-${{ github.ref }} + cancel-in-progress: true + +env: + ZOT_HOST: registry.hz.ledoweb.com + ZOT_IMAGE: registry.hz.ledoweb.com/openupgrade/openupgrade + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v4 + with: + ref: aggregated + fetch-depth: 1 + + - uses: docker/login-action@v3 + with: + registry: ${{ env.ZOT_HOST }} + username: ${{ secrets.ZOT_USERNAME }} + password: ${{ secrets.ZOT_PASSWORD }} + + - uses: docker/setup-buildx-action@v3 + + - name: Build and push (amd64 only — cluster is amd64; M-series uses Rosetta) + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile.openupgrade + push: true + platforms: linux/amd64 + tags: | + ${{ env.ZOT_IMAGE }}:latest + ${{ env.ZOT_IMAGE }}:${{ github.sha }} + cache-from: type=registry,ref=${{ env.ZOT_IMAGE }}:buildcache + cache-to: type=registry,ref=${{ env.ZOT_IMAGE }}:buildcache,mode=max diff --git a/.github/workflows/documentation-commit.yml b/.github/workflows/documentation-commit.yml index c7d445ee6521..84842b18ecf6 100644 --- a/.github/workflows/documentation-commit.yml +++ b/.github/workflows/documentation-commit.yml @@ -8,10 +8,15 @@ name: Build and commit documentation on: push: + branches: ["19.0"] paths: ["docsource/modules180-190.rst"] jobs: documentation-commit: + # Docs publishing only makes sense on OCA upstream (default branch + # publishes to https://oca.github.io/OpenUpgrade/). Forks don't have + # a `documentation` branch — checkout would fail. Restrict to OCA. + if: ${{ github.repository_owner == 'OCA' }} runs-on: ubuntu-latest steps: - name: Check out OpenUpgrade Documentation diff --git a/.github/workflows/mirror-upstream.yml b/.github/workflows/mirror-upstream.yml new file mode 100644 index 000000000000..7d1819a4dc17 --- /dev/null +++ b/.github/workflows/mirror-upstream.yml @@ -0,0 +1,62 @@ +name: Mirror upstream OCA/OpenUpgrade + +on: + schedule: + - cron: "0 6 * * *" # daily 06:00 UTC + workflow_dispatch: + +permissions: + contents: write + +jobs: + mirror: + runs-on: ubuntu-latest + steps: + - name: Checkout fork + uses: actions/checkout@v4 + with: + ref: ledoent + fetch-depth: 0 + token: ${{ secrets.GIT_PUSH_TOKEN || secrets.GITHUB_TOKEN }} + + - name: Fetch upstream + run: | + git remote add upstream https://github.com/OCA/OpenUpgrade.git + git fetch upstream 19.0 + + - name: Force-push upstream/19.0 to fork's 19.0 + run: | + git push origin "upstream/19.0:refs/heads/19.0" --force-with-lease || \ + git push origin "upstream/19.0:refs/heads/19.0" --force + + - name: Check whether ledoent has drifted from upstream/19.0 + id: drift + run: | + # ledoent should be upstream/19.0 + custom-CI commits. If a merge-base + # comparison shows ledoent missing upstream commits, we need a rebase. + if git merge-base --is-ancestor upstream/19.0 ledoent; then + echo "drift=no" >> "$GITHUB_OUTPUT" + echo "ledoent is up to date with upstream/19.0" + else + echo "drift=yes" >> "$GITHUB_OUTPUT" + behind=$(git rev-list --count ledoent..upstream/19.0) + echo "ledoent is behind upstream/19.0 by $behind commits — rebase needed" + fi + + - name: Open issue if drift detected + if: steps.drift.outputs.drift == 'yes' + uses: actions/github-script@v7 + with: + script: | + const { owner, repo } = context.repo; + const title = 'ledoent branch needs rebase onto upstream/19.0'; + const existing = await github.rest.issues.listForRepo({ + owner, repo, labels: 'mirror-drift', state: 'open' + }); + if (existing.data.length === 0) { + await github.rest.issues.create({ + owner, repo, title, + labels: ['mirror-drift'], + body: 'upstream OCA/OpenUpgrade `19.0` has advanced. Rebase `ledoent` onto it and force-push.\n\n```bash\ngit fetch origin\ngit checkout ledoent\ngit rebase origin/19.0\ngit push -f origin ledoent\n```' + }); + } diff --git a/.github/workflows/test-migration-enriched.yml b/.github/workflows/test-migration-enriched.yml new file mode 100644 index 000000000000..1323b9975f9d --- /dev/null +++ b/.github/workflows/test-migration-enriched.yml @@ -0,0 +1,185 @@ +# Fork-only variant of test-migration.yml that exercises the migration +# against the enriched 18.0 seed (OCA's 18.0.psql + populate-factory +# volume + curated edge cases from scripts/seed-edge-cases.py in the +# lab repo). Built and uploaded by scripts/build-fork-seed.sh. +# +# Catches migration regressions on edge-case data that OCA's vanilla +# demo seed doesn't contain — VATEX_ legacy codes, crm.stage with +# team_id set, archived parents, etc. +# +# Runs in parallel with `test-migration.yml` so a green build means +# both the upstream baseline AND our enriched seed migrate cleanly. + +name: Test OpenUpgrade migration (enriched seed) + +on: + push: + branches: + - "19.0" + - "19.0-ocabot-*" + - "19.0-mig-*" + - "19.0-fix-*" + - "aggregated" + - "ledoent" + +jobs: + test: + # Fork-only: OCA upstream doesn't have our enriched seed. + if: ${{ github.repository_owner == 'ledoent' }} + runs-on: ubuntu-22.04 + env: + DB: "openupgrade" + DB_HOST: "localhost" + DB_PASSWORD: "odoo" + DB_PORT: 5432 + DB_USERNAME: "odoo" + # Enriched seed lives on ledoent/OpenUpgrade `databases` release. + DOWNLOADS: https://github.com/ledoent/OpenUpgrade/releases/download/databases + SEED_NAME: 18.0-ledoent.psql + ODOO: "./odoo/odoo-bin" + PGHOST: "localhost" + PGPASSWORD: "odoo" + PGUSER: "odoo" + OPENUPGRADE_USE_DEMO: "yes" + services: + postgres: + # PG16 to match the lab's local postgres used by build-fork-seed.sh. + # PG14 in OCA's test-migration.yml can't restore custom-format dumps + # written by PG16 (file header version 1.15 vs max-supported 1.14). + image: postgres:16 + env: + POSTGRES_USER: odoo + POSTGRES_PASSWORD: odoo + POSTGRES_DB: odoo + ports: + - 5432:5432 + steps: + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + - name: Sleep for 10 seconds + run: sleep 10s + - name: Install postgresql-client-16 + run: | + # Ubuntu 22.04 ships pg_restore v14 — can't read PG16 custom-format + # dumps from the lab's local postgres:16. Install matching client. + sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' + wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - + sudo apt-get update -qq + sudo apt-get install -y postgresql-client-16 + echo "/usr/lib/postgresql/16/bin" >> $GITHUB_PATH + - name: DB Creation + run: createdb $DB + - name: DB Restore (enriched seed) + run: | + wget -q -O- $DOWNLOADS/$SEED_NAME | pg_restore -d $DB --no-owner + psql $DB -c "UPDATE ir_module_module SET demo=False" + - name: Check out Odoo + uses: actions/checkout@v4 + with: + repository: odoo/odoo + ref: "19.0" + fetch-depth: 1 + path: odoo + - name: Check out previous Odoo + uses: actions/checkout@v4 + with: + repository: odoo/odoo + ref: "18.0" + fetch-depth: 1 + path: odoo-old + - name: Check out OpenUpgrade + uses: actions/checkout@v4 + with: + path: openupgrade + - name: Configuration + run: | + sudo apt update + sudo apt install \ + expect \ + expect-dev \ + libevent-dev \ + libldap2-dev \ + libsasl2-dev \ + libxml2-dev \ + libxslt1-dev \ + nodejs \ + python3-lxml \ + python3-passlib \ + python3-psycopg2 \ + python3-serial \ + python3-simplejson \ + python3-werkzeug \ + python3-yaml \ + unixodbc-dev + - name: Requirements Installation + run: | + sed -i -E "s/(gevent==)21\.8\.0( ; sys_platform != 'win32' and python_version == '3.10')/\122.10.2\2/;s/(greenlet==)1.1.2( ; sys_platform != 'win32' and python_version == '3.10')/\12.0.2\2/" odoo/requirements.txt + pip install -q -r odoo/requirements.txt + pip install -r ./openupgrade/requirements.txt + pip install -U git+https://github.com/oca/openupgradelib + # this is for v18 l10n_eg_edi_eta which crashes without it + pip install asn1crypto + # required by v18 + pip install decorator + pip install coverage + # this is for account_peppol + pip install phonenumbers + - name: Test data + run: | + if test -n "$(ls openupgrade/openupgrade_scripts/scripts/*/tests/data*.py 2> /dev/null)"; then + for snippet in openupgrade/openupgrade_scripts/scripts/*/tests/data*.py; do + odoo-old/odoo-bin shell -d $DB < $snippet + done + fi + - name: OpenUpgrade test (enriched) + id: run_migration + run: | + # select modules and perform the upgrade + MODULES_OLD=$(\ + sed -n '/^+========/,$p' \ + openupgrade/docsource/modules180-190.rst \ + | grep "Done\|Partial\|Nothing" \ + | grep -v "theme_" \ + | sed -rn 's/((^\| *\|del\| *)|^\| *)([0-9a-z_]*)[ \|].*/\3/g p' \ + | sed '/^\s*$/d' \ + | paste -d, -s) + MODULES_NEW=$(\ + sed -n '/^+========/,$p' \ + openupgrade/docsource/modules180-190.rst \ + | grep "Done\|Partial\|Nothing" \ + | grep -v "theme_" \ + | sed -rn 's/((^\| *\|new\| *)|^\| *)([0-9a-z_]*)[ \|].*/\3/g p' \ + | sed '/^\s*$/d' \ + | paste -d, -s) + echo "modules_old=$MODULES_OLD" >> $GITHUB_OUTPUT + echo "modules_new=$MODULES_NEW" >> $GITHUB_OUTPUT + if [ -z "$MODULES_NEW" ]; then + echo "No modules to test yet" + exit + fi + REQUEST="update ir_module_module set state='uninstalled' \ + where name not in ('$(echo $MODULES_OLD | sed -e "s/,/','/g")')" + echo Set the modules as not installable if they are not in the following list : $MODULES_OLD + echo Running $REQUEST + psql $DB -c "$REQUEST" + ADDONS_PATHS="\ + $GITHUB_WORKSPACE/odoo/addons \ + $GITHUB_WORKSPACE/odoo/odoo/addons \ + $GITHUB_WORKSPACE/openupgrade" + echo Execution of Openupgrade with the update of the following modules : $MODULES_NEW + $ODOO \ + --addons-path=`echo $ADDONS_PATHS | awk -v OFS="," '$1=$1'` \ + --database=$DB \ + --db_host=$DB_HOST \ + --db_password=$DB_PASSWORD \ + --db_port=$DB_PORT \ + --db_user=$DB_USERNAME \ + --load=base,web,openupgrade_framework \ + --test-enable \ + --test-tags openupgrade \ + --log-handler odoo.models.unlink:WARNING \ + --stop-after-init \ + --without-demo=$MODULES_NEW \ + --update=$MODULES_NEW diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index bc425add5de4..46da397ffc28 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -13,6 +13,10 @@ on: branches: - "19.0" - "19.0-ocabot-*" + - "19.0-mig-*" + - "19.0-fix-*" + - "aggregated" + - "ledoent" jobs: test: @@ -23,7 +27,9 @@ jobs: DB_PASSWORD: "odoo" DB_PORT: 5432 DB_USERNAME: "odoo" - DOWNLOADS: https://github.com/${{github.repository}}/releases/download/databases + # Test databases live only on OCA upstream; forks reuse them so we + # don't have to mirror multi-GB psql dumps. + DOWNLOADS: https://github.com/OCA/OpenUpgrade/releases/download/databases ODOO: "./odoo/odoo-bin" PGHOST: "localhost" PGPASSWORD: "odoo" diff --git a/Dockerfile.openupgrade b/Dockerfile.openupgrade new file mode 100644 index 000000000000..5d946f732c28 --- /dev/null +++ b/Dockerfile.openupgrade @@ -0,0 +1,34 @@ +## Image: registry.ledoweb.com/openupgrade +## +## Built by .github/workflows/build-image.yml on every push to `aggregated`. +## Contains: +## - Odoo 19.0 base +## - Python deps the openupgrade-lab uses (s3fs, redis, sentry-sdk, etc.) +## - The full `aggregated` checkout of this repo as /opt/openupgrade +## The lab's docker-compose mounts the openupgradelib source over the +## pip-installed lib so it can hot-swap during development. + +FROM odoo:19.0 + +USER root + +# git needed for the openupgradelib install (no pinned PyPI release yet for 19.0). +RUN apt-get update && \ + apt-get install -y --no-install-recommends git && \ + rm -rf /var/lib/apt/lists/* + +RUN pip install --no-cache-dir --break-system-packages \ + fsspec>=2025.3.0 \ + s3fs \ + packaging \ + python-json-logger \ + redis \ + sentry-sdk \ + python-slugify \ + plaid-python \ + cssselect \ + "git+https://github.com/OCA/openupgradelib@master" + +COPY --chown=odoo:odoo . /opt/openupgrade + +USER odoo diff --git a/docsource/modules180-190.rst b/docsource/modules180-190.rst index 39d37c51049d..5377fc4a6b5b 100644 --- a/docsource/modules180-190.rst +++ b/docsource/modules180-190.rst @@ -38,7 +38,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | analytic |Nothing to do | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| |new| api_doc | | | +| |new| api_doc |Done |Nothing to do | +---------------------------------------------------+----------------------+-------------------------------------------------+ | attachment_indexation | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -76,7 +76,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | base_address_extended | |No DB layout changes. | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| base_automation | | | +| base_automation |Done |Nothing to do | +---------------------------------------------------+----------------------+-------------------------------------------------+ | base_geolocalize | |No DB layout changes. | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -86,7 +86,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | base_import_module | |No DB layout changes. | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| base_install_request | | | +| base_install_request |Done |Nothing to do | +---------------------------------------------------+----------------------+-------------------------------------------------+ | base_setup |Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -700,7 +700,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | loyalty | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| lunch | | | +| lunch |Done |Nothing to do | +---------------------------------------------------+----------------------+-------------------------------------------------+ | mail |Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -758,11 +758,11 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | mrp_repair | |No DB layout changes. | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| mrp_subcontracting | | | +| mrp_subcontracting |Done |Nothing to do | +---------------------------------------------------+----------------------+-------------------------------------------------+ | mrp_subcontracting_account | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| mrp_subcontracting_dropshipping | | | +| mrp_subcontracting_dropshipping |Done |Nothing to do | +---------------------------------------------------+----------------------+-------------------------------------------------+ | mrp_subcontracting_landed_costs | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -774,7 +774,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | partner_autocomplete | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| |new| partnership | | | +| |new| partnership |Done |Nothing to do | +---------------------------------------------------+----------------------+-------------------------------------------------+ | payment |Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -914,7 +914,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | product_email_template | |No DB layout changes. | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| product_expiry | | | +| product_expiry |Done |Nothing to do | +---------------------------------------------------+----------------------+-------------------------------------------------+ | |del| product_images | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -968,7 +968,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | purchase_repair | |No DB layout changes. | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| purchase_requisition | | | +| purchase_requisition |Done |Nothing to do | +---------------------------------------------------+----------------------+-------------------------------------------------+ | purchase_requisition_sale | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -978,7 +978,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | rating |Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| repair | | | +| repair |Done |Nothing to do | +---------------------------------------------------+----------------------+-------------------------------------------------+ | resource |Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -1070,7 +1070,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | spreadsheet_dashboard_hr_timesheet | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| spreadsheet_dashboard_im_livechat | | | +| spreadsheet_dashboard_im_livechat |Done |Nothing to do | +---------------------------------------------------+----------------------+-------------------------------------------------+ | spreadsheet_dashboard_pos_hr | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ diff --git a/openupgrade_scripts/scripts/api_doc/19.0.1.0/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/api_doc/19.0.1.0/upgrade_analysis_work.txt new file mode 100644 index 000000000000..297196fbfd2c --- /dev/null +++ b/openupgrade_scripts/scripts/api_doc/19.0.1.0/upgrade_analysis_work.txt @@ -0,0 +1,9 @@ +---Models in module 'api_doc'--- + +---Fields in module 'api_doc'--- + +---XML records in module 'api_doc'--- +NEW ir.ui.view: api_doc.docclient +NEW res.groups: api_doc.group_allow_doc + +# NOTHING TO DO diff --git a/openupgrade_scripts/scripts/base/19.0.1.3/pre-migration.py b/openupgrade_scripts/scripts/base/19.0.1.3/pre-migration.py index 39b145615b4b..699de5d46ed7 100644 --- a/openupgrade_scripts/scripts/base/19.0.1.3/pre-migration.py +++ b/openupgrade_scripts/scripts/base/19.0.1.3/pre-migration.py @@ -176,3 +176,48 @@ def migrate(env, version): openupgrade.rename_xmlids(env.cr, _renamed_xmlids) openupgrade.rename_xmlids(env.cr, _merged_xmlids, allow_merge=True) openupgrade.rename_fields(env, _renamed_fields) + _fix_user_groups_id_references(env) + + +def _fix_user_groups_id_references(env): + """rename_fields() renames the field column on res_users and quoted + references in ir.filters.domain, but it does not process ir.rule + domain_force, nor does it match unquoted dotted references like + ``user.groups_id.ids`` in Python-evaluated domain expressions. + + Concretely, an ir.rule with + domain_force = "[('groups_id', 'in', user.groups_id.ids)]" + has its LHS migrated to 'group_ids' but the RHS is left untouched, + so any view referencing the rule crashes at runtime with + ``AttributeError: 'res.users' object has no attribute 'groups_id'``. + """ + openupgrade.logged_query( + env.cr, + r""" + UPDATE ir_rule + SET domain_force = regexp_replace( + domain_force, '\muser\.groups_id\M', 'user.group_ids', 'g' + ) + WHERE domain_force ~ '\muser\.groups_id\M' + """, + ) + openupgrade.logged_query( + env.cr, + r""" + UPDATE ir_filters + SET domain = regexp_replace( + domain, '\muser\.groups_id\M', 'user.group_ids', 'g' + ) + WHERE domain ~ '\muser\.groups_id\M' + """, + ) + openupgrade.logged_query( + env.cr, + r""" + UPDATE ir_act_server + SET code = regexp_replace( + code, '\muser\.groups_id\M', 'user.group_ids', 'g' + ) + WHERE code ~ '\muser\.groups_id\M' + """, + ) diff --git a/openupgrade_scripts/scripts/base_automation/19.0.1.0/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/base_automation/19.0.1.0/upgrade_analysis_work.txt new file mode 100644 index 000000000000..a3b5e8eec41d --- /dev/null +++ b/openupgrade_scripts/scripts/base_automation/19.0.1.0/upgrade_analysis_work.txt @@ -0,0 +1,19 @@ +---Models in module 'base_automation'--- + +---Fields in module 'base_automation'--- +base_automation / base.automation / activity_ids (one2many) : NEW relation: mail.activity +base_automation / base.automation / message_follower_ids (one2many): NEW relation: mail.followers +base_automation / base.automation / message_ids (one2many) : NEW relation: mail.message +base_automation / base.automation / previous_domain (char) : NEW hasdefault: default, stored: False +base_automation / base.automation / rating_ids (one2many) : NEW relation: rating.rating +base_automation / base.automation / trg_date_range_mode (selection): NEW selection_keys: ['after', 'before'], hasdefault: compute +base_automation / base.automation / website_message_ids (one2many): NEW relation: mail.message +base_automation / ir.actions.server / name (False) : DEL mode: modify + +# NOTHING TO DO + +---XML records in module 'base_automation'--- +NEW ir.ui.view: base_automation.view_server_action_form +DEL ir.ui.view: base_automation.ir_actions_server_view_form_automation + +# NOTHING TO DO diff --git a/openupgrade_scripts/scripts/base_install_request/19.0.1.0/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/base_install_request/19.0.1.0/upgrade_analysis_work.txt new file mode 100644 index 000000000000..60379430ea7f --- /dev/null +++ b/openupgrade_scripts/scripts/base_install_request/19.0.1.0/upgrade_analysis_work.txt @@ -0,0 +1,9 @@ +---Models in module 'base_install_request'--- + +---Fields in module 'base_install_request'--- + +---XML records in module 'base_install_request'--- +NEW ir.model.access: base_install_request.access_ir_module_module_dependency_group_user +NEW ir.model.access: base_install_request.access_ir_module_module_exclusion_group_user + +# NOTHING TO DO diff --git a/openupgrade_scripts/scripts/lunch/19.0.1.0/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/lunch/19.0.1.0/upgrade_analysis_work.txt new file mode 100644 index 000000000000..0fb710263371 --- /dev/null +++ b/openupgrade_scripts/scripts/lunch/19.0.1.0/upgrade_analysis_work.txt @@ -0,0 +1,10 @@ +---Models in module 'lunch'--- + +---Fields in module 'lunch'--- + +---XML records in module 'lunch'--- +NEW ir.model.constraint: lunch.constraint_lunch_order_user_product_date +DEL ir.module.category: lunch.module_lunch_category +NEW res.groups.privilege: lunch.res_groups_privilege_lunch + +# NOTHING TO DO diff --git a/openupgrade_scripts/scripts/mrp_subcontracting/19.0.0.1/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/mrp_subcontracting/19.0.0.1/upgrade_analysis_work.txt new file mode 100644 index 000000000000..5b521195b769 --- /dev/null +++ b/openupgrade_scripts/scripts/mrp_subcontracting/19.0.0.1/upgrade_analysis_work.txt @@ -0,0 +1,14 @@ +---Models in module 'mrp_subcontracting'--- + +---Fields in module 'mrp_subcontracting'--- +mrp_subcontracting / stock.location / is_subcontracting_location (boolean): DEL + +# NOTHING TO DO + +---XML records in module 'mrp_subcontracting'--- +NEW ir.model.access: mrp_subcontracting.access_subcontracting_portal_mrp_production_serials +NEW ir.model.access: mrp_subcontracting.access_subcontracting_portal_sequence +DEL ir.rule: mrp_subcontracting.uom_subcontracting_rule +DEL ir.ui.view: mrp_subcontracting.view_location_form + +# NOTHING TO DO diff --git a/openupgrade_scripts/scripts/mrp_subcontracting_dropshipping/19.0.0.1/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/mrp_subcontracting_dropshipping/19.0.0.1/upgrade_analysis_work.txt new file mode 100644 index 000000000000..02ce99bc67ac --- /dev/null +++ b/openupgrade_scripts/scripts/mrp_subcontracting_dropshipping/19.0.0.1/upgrade_analysis_work.txt @@ -0,0 +1,14 @@ +---Models in module 'mrp_subcontracting_dropshipping'--- + +---Fields in module 'mrp_subcontracting_dropshipping'--- +mrp_subcontracting_dropshipping / purchase.order / default_location_dest_id_is_subcontracting_loc (boolean): not related anymore +mrp_subcontracting_dropshipping / purchase.order / default_location_dest_id_is_subcontracting_loc (boolean): now a function +mrp_subcontracting_dropshipping / stock.warehouse / subcontracting_dropshipping_to_resupply (boolean): DEL + +# NOTHING TO DO + +---XML records in module 'mrp_subcontracting_dropshipping'--- +DEL ir.ui.view: mrp_subcontracting_dropshipping.view_warehouse_inherit_mrp_subcontracting_dropshipping +DEL stock.route: mrp_subcontracting_dropshipping.route_subcontracting_dropshipping (noupdate) + +# NOTHING TO DO diff --git a/openupgrade_scripts/scripts/partnership/19.0.1.0/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/partnership/19.0.1.0/upgrade_analysis_work.txt new file mode 100644 index 000000000000..e893a8003488 --- /dev/null +++ b/openupgrade_scripts/scripts/partnership/19.0.1.0/upgrade_analysis_work.txt @@ -0,0 +1,102 @@ +---Models in module 'partnership'--- +obsolete model membership.invoice [transient] +obsolete model membership.membership_line +obsolete model report.membership [sql_view] +model res.partner.grade (moved from website_crm_partner_assign) + +# NOTHING TO DO + +---Fields in module 'partnership'--- +membership / membership.membership_line / account_invoice_line (many2one): DEL relation: account.move.line +membership / membership.membership_line / company_id (many2one) : DEL relation: res.company +membership / membership.membership_line / date (date) : DEL +membership / membership.membership_line / date_cancel (date) : DEL +membership / membership.membership_line / date_from (date) : DEL +membership / membership.membership_line / date_to (date) : DEL +membership / membership.membership_line / member_price (float) : DEL required +membership / membership.membership_line / membership_id (many2one) : DEL relation: product.product, required +membership / membership.membership_line / partner (many2one) : DEL relation: res.partner +membership / membership.membership_line / state (selection) : DEL selection_keys: ['canceled', 'free', 'invoiced', 'none', 'old', 'paid', 'waiting'] +membership / product.template / membership (boolean) : DEL +membership / product.template / membership_date_from (date) : DEL +membership / product.template / membership_date_to (date) : DEL +membership / res.partner / associate_member (many2one) : DEL relation: res.partner +membership / res.partner / free_member (boolean) : DEL +membership / res.partner / member_lines (one2many) : DEL relation: membership.membership_line +membership / res.partner / membership_amount (float) : DEL +membership / res.partner / membership_cancel (date) : DEL +membership / res.partner / membership_start (date) : DEL +membership / res.partner / membership_state (selection) : DEL selection_keys: ['canceled', 'free', 'invoiced', 'none', 'old', 'paid', 'waiting'] +membership / res.partner / membership_stop (date) : DEL +partnership / product.template / grade_id (many2one) : NEW relation: res.partner.grade +partnership / product.template / service_tracking (False) : NEW selection_keys: ['event', 'no', 'partnership'], mode: modify +partnership / res.company / partnership_label (char) : NEW hasdefault: default, translate +partnership / res.partner / grade_id (many2one) : previously in module website_crm_partner_assign +partnership / res.partner.grade / _order : previously in module website_crm_partner_assign +partnership / res.partner.grade / active (boolean) : previously in module website_crm_partner_assign +partnership / res.partner.grade / company_id (many2one) : NEW relation: res.company, hasdefault: default +partnership / res.partner.grade / default_pricelist_id (many2one): NEW relation: product.pricelist +partnership / res.partner.grade / display_name (char) : previously in module website_crm_partner_assign +partnership / res.partner.grade / name (char) : previously in module website_crm_partner_assign +partnership / res.partner.grade / sequence (integer) : previously in module website_crm_partner_assign +partnership / res.users / grade_id (many2one) : previously in module website_crm_partner_assign + +# NOTHING TO DO + +---XML records in module 'partnership'--- +NEW ir.actions.act_window: partnership.action_grade_partners +NEW ir.actions.act_window: partnership.action_pricelist_partners +NEW ir.actions.act_window: partnership.res_partner_grade_action [renamed from website_crm_partner_assign module] +DEL ir.actions.act_window: membership.action_membership_invoice_view +DEL ir.actions.act_window: membership.action_membership_members +DEL ir.actions.act_window: membership.action_membership_products +DEL ir.actions.act_window: membership.action_report_membership_tree +DEL ir.actions.act_window.view: membership.action_membership_members_view_form +DEL ir.actions.act_window.view: membership.action_membership_members_view_kanban +DEL ir.actions.act_window.view: membership.action_membership_members_view_tree +DEL ir.actions.act_window.view: membership.action_membership_product_view_form +DEL ir.actions.act_window.view: membership.action_membership_product_view_kanban +DEL ir.actions.act_window.view: membership.action_membership_product_view_tree +DEL ir.cron: membership.ir_cron_update_membership (noupdate) +NEW ir.model.access: partnership.access_res_partner_grade [renamed from website_crm_partner_assign module] +NEW ir.model.access: partnership.access_res_partner_grade_admin +NEW ir.model.access: partnership.access_res_partner_grade_manager [renamed from website_crm_partner_assign module] +NEW ir.model.access: partnership.access_res_partner_grade_user +DEL ir.model.access: membership.access_membership_invoice +DEL ir.model.access: membership.access_membership_membership_line_employee +DEL ir.model.access: membership.access_membership_membership_line_partner_manager +DEL ir.model.access: membership.access_report_membership +DEL ir.model.constraint: membership.constraint_product_template_membership_date_greater +NEW ir.ui.menu: partnership.crm_menu_partners +NEW ir.ui.menu: partnership.menu_res_partner_grade_action [renamed from website_crm_partner_assign module] +DEL ir.ui.menu: membership.menu_association +DEL ir.ui.menu: membership.menu_marketing_config_association +DEL ir.ui.menu: membership.menu_membership +DEL ir.ui.menu: membership.menu_membership_products +DEL ir.ui.menu: membership.menu_report_membership +NEW ir.ui.view: partnership.product_template_form_view +NEW ir.ui.view: partnership.res_config_settings_view_form +NEW ir.ui.view: partnership.res_partner_grade_view_search +NEW ir.ui.view: partnership.view_partner_grade_form +NEW ir.ui.view: partnership.view_partner_grade_tree +NEW ir.ui.view: partnership.view_partner_pricelist_form +NEW ir.ui.view: partnership.view_res_partner_filter_assign +NEW ir.ui.view: partnership.view_res_partner_form +NEW ir.ui.view: partnership.view_res_partner_grade_tree +DEL ir.ui.view: membership.membership_members_tree +DEL ir.ui.view: membership.membership_product_search_form_view +DEL ir.ui.view: membership.membership_products_form +DEL ir.ui.view: membership.membership_products_kanban +DEL ir.ui.view: membership.membership_products_tree +DEL ir.ui.view: membership.report_membership_view_tree +DEL ir.ui.view: membership.view_membership_invoice_view +DEL ir.ui.view: membership.view_partner_form +DEL ir.ui.view: membership.view_report_membership_graph1 +DEL ir.ui.view: membership.view_report_membership_pivot +DEL ir.ui.view: membership.view_report_membership_search +DEL ir.ui.view: membership.view_res_partner_member_filter +NEW res.partner.grade: partnership.res_partner_grade_data_bronze [renamed from website_crm_partner_assign module] +NEW res.partner.grade: partnership.res_partner_grade_data_gold [renamed from website_crm_partner_assign module] +NEW res.partner.grade: partnership.res_partner_grade_data_silver [renamed from website_crm_partner_assign module] + +# NOTHING TO DO diff --git a/openupgrade_scripts/scripts/product_expiry/19.0.1.0/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/product_expiry/19.0.1.0/upgrade_analysis_work.txt new file mode 100644 index 000000000000..b5be28144959 --- /dev/null +++ b/openupgrade_scripts/scripts/product_expiry/19.0.1.0/upgrade_analysis_work.txt @@ -0,0 +1,11 @@ +---Models in module 'product_expiry'--- + +---Fields in module 'product_expiry'--- +product_expiry / stock.move.line / removal_date (datetime) : NEW hasdefault: compute + +# NOTHING TO DO + +---XML records in module 'product_expiry'--- +DEL mail.activity.type: product_expiry.mail_activity_type_alert_date_reached + +# NOTHING TO DO diff --git a/openupgrade_scripts/scripts/purchase_requisition/19.0.0.1/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/purchase_requisition/19.0.0.1/upgrade_analysis_work.txt new file mode 100644 index 000000000000..403aed69aeeb --- /dev/null +++ b/openupgrade_scripts/scripts/purchase_requisition/19.0.0.1/upgrade_analysis_work.txt @@ -0,0 +1,9 @@ +---Models in module 'purchase_requisition'--- + +---Fields in module 'purchase_requisition'--- + +---XML records in module 'purchase_requisition'--- +DEL ir.ui.view: purchase_requisition.purchase_order_kpis_tree_inherit_purchase_requisition +DEL ir.ui.view: purchase_requisition.purchase_order_tree_inherit_purchase_requisition + +# NOTHING TO DO diff --git a/openupgrade_scripts/scripts/repair/19.0.1.0/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/repair/19.0.1.0/upgrade_analysis_work.txt new file mode 100644 index 000000000000..9cc00abdcdbd --- /dev/null +++ b/openupgrade_scripts/scripts/repair/19.0.1.0/upgrade_analysis_work.txt @@ -0,0 +1,21 @@ +---Models in module 'repair'--- + +---Fields in module 'repair'--- +repair / product.template / create_repair (boolean) : DEL +repair / product.template / service_tracking (False) : NEW selection_keys: ['event', 'no', 'partnership', 'repair'], mode: modify +repair / repair.order / procurement_group_id (many2one): DEL relation: procurement.group +repair / repair.order / product_uom (many2one) : not a function anymore +repair / repair.order / reference_ids (many2many) : NEW relation: stock.reference +repair / stock.picking.type / is_repairable (boolean) : DEL +repair / stock.picking.type / return_type_of_ids (one2many) : DEL relation: stock.picking.type + +# NOTHING TO DO + +---XML records in module 'repair'--- +DEL ir.actions.act_window: repair.action_repair_picking_type_kanban +NEW ir.actions.server: repair.action_create_repair_order +DEL ir.actions.server: repair.action_repair_overview +DEL ir.ui.menu: repair.repair_picking_type_menu +DEL ir.ui.view: repair.view_repair_tag_form + +# NOTHING TO DO diff --git a/openupgrade_scripts/scripts/spreadsheet_dashboard_im_livechat/19.0.1.0/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/spreadsheet_dashboard_im_livechat/19.0.1.0/upgrade_analysis_work.txt new file mode 100644 index 000000000000..90da01667fe0 --- /dev/null +++ b/openupgrade_scripts/scripts/spreadsheet_dashboard_im_livechat/19.0.1.0/upgrade_analysis_work.txt @@ -0,0 +1,18 @@ +---Models in module 'spreadsheet_dashboard_im_livechat'--- + +---Fields in module 'spreadsheet_dashboard_im_livechat'--- + +---XML records in module 'spreadsheet_dashboard_im_livechat'--- +NEW ir.actions.act_window: spreadsheet_dashboard_im_livechat.ongoing_sessions_agents_in_call_action +NEW ir.actions.act_window: spreadsheet_dashboard_im_livechat.ongoing_sessions_all_action +NEW ir.actions.act_window: spreadsheet_dashboard_im_livechat.ongoing_sessions_escalated_action +NEW ir.actions.act_window: spreadsheet_dashboard_im_livechat.ongoing_sessions_handle_by_agent_action +NEW ir.actions.act_window: spreadsheet_dashboard_im_livechat.ongoing_sessions_handle_by_bot_action +NEW ir.ui.menu: spreadsheet_dashboard_im_livechat.ongoing_session_all_menu +NEW ir.ui.menu: spreadsheet_dashboard_im_livechat.ongoing_sessions_agents_in_call_menu +NEW ir.ui.menu: spreadsheet_dashboard_im_livechat.ongoing_sessions_escalated_menu +NEW ir.ui.menu: spreadsheet_dashboard_im_livechat.ongoing_sessions_handle_by_agent_menu +NEW ir.ui.menu: spreadsheet_dashboard_im_livechat.ongoing_sessions_handle_by_bot_menu +NEW spreadsheet.dashboard: spreadsheet_dashboard_im_livechat.spreadsheet_dashboard_livechat_ongoing + +# NOTHING TO DO