diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 8cbb2baf06..5013d616ea 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,7 +1,7 @@ [bumpversion] commit = False tag = False -current_version = 2.8.0-alpha.0 +current_version = 2.8.0-beta.0 parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\-(?P
[a-z]+)\.(?P\d+))?
 serialize = 
 	{major}.{minor}.{patch}-{pre}.{build}
diff --git a/.sdk-release b/.sdk-release
index 125c35fe11..3bd478bbbc 100644
--- a/.sdk-release
+++ b/.sdk-release
@@ -1 +1 @@
-2.4.0-alpha.0
+2.4.0-beta.0
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index fb3d753ee1..669cd72744 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,6 +2,78 @@
 Changelog
 =========
 
+2.8.0-beta.0 (2024-09-17)
+=========================
+
+The (first) beta version for 2.8.0 is available for testing now.
+
+.. warning:: We encourage you to test out this beta version on non-production
+   environments and report your findings back to use. This release is not suitable for
+   production yet though.
+
+Upgrade notes
+-------------
+
+There are no manual actions required - all upgrades and migrations are automatic.
+
+.. note:: The UX rework in the ZGW APIs registration plugin is not entirely finished
+   yet. The Objects API integration in particular can be a bit confusing since it's not
+   possible yet to select which Objects API should be used. The plugin now uses the API
+   group that's listed first in the admin interface (**Admin** > **Miscellaneous** >
+   **Objects API Groups**).
+
+Detailed changes
+----------------
+
+**New features**
+
+* [:backend:`4577`] We improved the user experience when configuring the Objects API
+  registration plugin. Copy-pasting URLs is being phased out - you can now select the
+  relevant configurations in dropdowns.
+* [:backend:`4606`] Improved the user experience of the ZGW APIs registration plugin.
+  We're making this consistent with the Objects API. More improvements will be done in
+  the future.
+* [:backend:`4542`] Email components now support optional verification - when enabled,
+  users must verify their email address before they can continue submitting the form.
+* [:backend:`4582`] The SAML metadata for the DigiD/eHerkenning identity providers is
+  now automatically refreshed on a weekly basis.
+* [:backend:`4380`] The StUF-ZDS registration plugin now supports sending payment
+  details in the ``extraElementen`` data. For 2.7 this was available in an extension,
+  which has been merged in core - migrating is automatic.
+* [:backend:`4545`] You can now optionally configure an introduction page, which is
+  displayed before the start of the form.
+* [:backend:`4543`] You can now optionally enable a short progress summary showing the
+  current step number and the total number of steps in a form.
+
+.. note:: The ``addressNL`` component is not yet a fully capable replacement for
+   individual address fields. Currently, it's only recommended for BRK-validation
+   purposes.
+
+**Bugfixes**
+
+* [:backend:`4597`] Revert message for not-filled-in-fields in confirmation PDF back to
+  just empty space.
+* Fixed processing of empty file upload components in the Objects API registration plugin.
+* Fixed an upgrade check incorrectly reporting problems.
+* [:backend:`4627`] Fixed a crash in the eHerkenning-via-OIDC plugin if no ActingSubjectID
+  claim is present.
+* [:backend:`4602`] Fixed missing Dutch translation for minimum required checked items
+  error message in the selectboxes component.
+* [:backend:`4587`] Fixed the product not being copied along when copying a form.
+
+**Project maintenance**
+
+* Addressed broken test isolation in CI leading to flaky tests.
+* Upgraded a number of dependencies to their latest (security) releases.
+* Improved the static type annotations in the codebase.
+* Failing end-to-end tests now produce Playwright traces in CI to help debug the problem.
+* Added a utility script to find VCR cassette directories.
+* [:backend:`4646`, :backend:`4396`] Restructured the Objects API configuration to be
+  in a shared code package, which can be used by the registration and prefill plugins.
+* [:backend:`4648`] Corrected the documentation about the minimum PostgreSQL version
+  (v12) and confirmed support for PostgreSQL 15.
+* Squashed migrations.
+
 2.7.6 (2024-09-05)
 ==================
 
diff --git a/Dockerfile b/Dockerfile
index 0f480e0fcb..9f0aff9394 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -90,8 +90,6 @@ RUN mkdir /app/bin /app/log /app/media /app/private_media /app/certifi_ca_bundle
 COPY \
     ./bin/check_celery_worker_liveness.py \
     ./bin/report_component_problems.py \
-    ./bin/check_objecttype_urls.py \
-    ./bin/check_zgw_groups.py \
     ./bin/
 
 # prevent writing to the container layer, which would degrade performance.
diff --git a/README.NL.rst b/README.NL.rst
index a4004ecb2d..031fef3e03 100644
--- a/README.NL.rst
+++ b/README.NL.rst
@@ -2,7 +2,7 @@
 Open Formulieren
 ================
 
-:Version: 2.8.0-alpha.0
+:Version: 2.8.0-beta.0
 :Source: https://github.com/open-formulieren/open-forms
 :Keywords: e-Formulieren, Common Ground, FormIO, API
 
diff --git a/README.rst b/README.rst
index 9c24e7cdbf..3e3b8c9286 100644
--- a/README.rst
+++ b/README.rst
@@ -2,7 +2,7 @@
 Open Forms
 ==========
 
-:Version: 2.8.0-alpha.0
+:Version: 2.8.0-beta.0
 :Source: https://github.com/open-formulieren/open-forms
 :Keywords: e-Formulieren, Common Ground, FormIO, API
 
diff --git a/bin/check_objecttype_urls.py b/bin/check_objecttype_urls.py
deleted file mode 100644
index 1beddb2576..0000000000
--- a/bin/check_objecttype_urls.py
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/env python
-from __future__ import annotations
-
-import sys
-from pathlib import Path
-from uuid import UUID
-
-import django
-from django.db import connections
-from django.db.migrations.recorder import MigrationRecorder
-
-import click
-from tabulate import tabulate
-
-SRC_DIR = Path(__file__).parent.parent / "src"
-sys.path.insert(0, str(SRC_DIR.resolve()))
-
-
-def check_objecttype_urls() -> bool:
-    from openforms.forms.models import FormRegistrationBackend
-
-    problems: list[list[str]] = []
-
-    for backend in FormRegistrationBackend.objects.filter(backend="objects_api"):
-        objecttype_url = backend.options.get("objecttype")
-        if not objecttype_url:
-            problems.append(
-                [
-                    backend.form.admin_name,
-                    backend.name,
-                    backend.key,
-                    "No objecttype URL present",
-                ]
-            )
-            continue
-
-        try:
-            UUID(objecttype_url.rsplit("/", 1)[1])
-        except (IndexError, ValueError):
-            problems.append(
-                [
-                    backend.form.admin_name,
-                    backend.name,
-                    backend.key,
-                    f"Invalid objecttype URL: {objecttype_url}",
-                ]
-            )
-
-    if not problems:
-        click.echo(click.style("No problems found.", fg="green"))
-        return True
-
-    click.echo(click.style("Found problems in form registration backends.", fg="red"))
-    click.echo("")
-    click.echo(
-        tabulate(
-            problems,
-            headers=(
-                "Form",
-                "Registration backend name",
-                "Regisration backend key",
-                "Problem",
-            ),
-        )
-    )
-
-    return False
-
-
-def get_applied_migrations(database="default"):
-    connection = connections[database]
-    recorder = MigrationRecorder(connection)
-    applied_migrations = recorder.applied_migrations()
-    return applied_migrations
-
-
-def main(skip_setup: bool = False) -> bool:
-    from openforms.setup import setup_env
-
-    if not skip_setup:
-        setup_env()
-        django.setup()
-
-    # a data migration converts from URLs to UUIDs, if it's been executed, no point
-    # in checking for valid URLs as a UUID will never be a valid URL
-    applied_migrations = get_applied_migrations()
-    target_migration = ("registrations_objects_api", "0020_objecttype_url_to_uuid")
-    if target_migration in applied_migrations:
-        return True
-
-    return check_objecttype_urls()
-
-
-@click.command()
-def cli():
-    return main()
-
-
-if __name__ == "__main__":
-    cli()
diff --git a/bin/check_zgw_groups.py b/bin/check_zgw_groups.py
deleted file mode 100644
index 82c1472e02..0000000000
--- a/bin/check_zgw_groups.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env python
-from __future__ import annotations
-
-import sys
-from pathlib import Path
-
-import django
-
-import click
-from tabulate import tabulate
-
-SRC_DIR = Path(__file__).parent.parent / "src"
-sys.path.insert(0, str(SRC_DIR.resolve()))
-
-
-def check_zgw_groups() -> bool:
-    from openforms.forms.models import FormRegistrationBackend
-    from openforms.registrations.contrib.zgw_apis.models import ZgwConfig
-
-    # hack to allow using the model in upgrade checks but preventing usage otherwise
-    ZgwConfig.BLOCK_USAGE = False
-
-    zgw_config = ZgwConfig.get_solo()
-    default_group = zgw_config.default_zgw_api_group
-
-    problems: list[list[str]] = []
-
-    for backend in FormRegistrationBackend.objects.filter(backend="zgw-create-zaak"):
-        zgw_api_group = backend.options.get("zgw_api_group")
-        if zgw_api_group is None and default_group is None:
-            problems.append(
-                [
-                    backend.form.admin_name,
-                    backend.name,
-                    backend.key,
-                    "No ZGW API group set and no default group available",
-                ]
-            )
-            continue
-
-    if not problems:
-        click.echo(click.style("No problems found.", fg="green"))
-        return True
-
-    click.echo(click.style("Found problems in form registration backends.", fg="red"))
-    click.echo("")
-    click.echo(
-        tabulate(
-            problems,
-            headers=(
-                "Form",
-                "Registration backend name",
-                "Regisration backend key",
-                "Problem",
-            ),
-        )
-    )
-
-    return False
-
-
-def main(skip_setup: bool = False) -> bool:
-    from openforms.setup import setup_env
-
-    if not skip_setup:
-        setup_env()
-        django.setup()
-
-    return check_zgw_groups()
-
-
-@click.command()
-def cli():
-    return main()
-
-
-if __name__ == "__main__":
-    cli()
diff --git a/docs/developers/versioning.rst b/docs/developers/versioning.rst
index f10443789e..b044ffad30 100644
--- a/docs/developers/versioning.rst
+++ b/docs/developers/versioning.rst
@@ -46,6 +46,7 @@ experimental feature changes (see :ref:`developers_versioning_api`).
    2.1.0       2.4.0               n/a
    2.2.0       2.4.0               2.6.x
    2.3.0       2.7.0               n/a
+   2.4.0       2.8.0               n/a
    =========== =================== ===================
 
 End-of-life versions are not listed in this table.
@@ -73,6 +74,8 @@ Version         Release date    API specification
 ==============  ==============  =============================
 latest          n/a             `ReDoc `__,
                                 `Swagger `__
+2.8.0           2024-09-16      `ReDoc `__,
+                                `Swagger `__
 2.7.0           2024-07-09      `ReDoc `__,
                                 `Swagger `__
 2.6.0           2024-03-25      `ReDoc `__,
@@ -142,6 +145,7 @@ backend version.
    =============== ===========
    Backend version API version
    =============== ===========
+   2.8.x           2.8.y
    2.7.x           2.7.y
    2.6.x           2.6.y
    2.5.x           2.5.y
diff --git a/package-lock.json b/package-lock.json
index 876ed5b6d5..cd74cfe04c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "openforms",
-  "version": "2.8.0-alpha.0",
+  "version": "2.8.0-beta.0",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "openforms",
-      "version": "2.8.0-alpha.0",
+      "version": "2.8.0-beta.0",
       "license": "UNLICENSED",
       "dependencies": {
         "@fortawesome/fontawesome-free": "^6.1.1",
diff --git a/package.json b/package.json
index dfe3a0ad98..5f6616cbc1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "openforms",
-  "version": "2.8.0-alpha.0",
+  "version": "2.8.0-beta.0",
   "description": "Open Forms",
   "main": "src/static/openforms/js/openforms.js",
   "directories": {
diff --git a/publiccode.yaml b/publiccode.yaml
index b0d9b271fc..b186b75f1a 100644
--- a/publiccode.yaml
+++ b/publiccode.yaml
@@ -7,7 +7,7 @@ publiccodeYmlVersion: '0.2'
 name: Open Forms Builder and API
 url: 'http://github.com/open-formulieren/open-forms.git'
 softwareType: standalone/backend
-softwareVersion: 2.8.0-alpha.0
+softwareVersion: 2.8.0-beta.0
 releaseDate: '2022-03-10'
 logo: 'https://github.com/open-formulieren/open-forms/blob/master/docs/logo.svg'
 platforms:
diff --git a/src/openapi.yaml b/src/openapi.yaml
index 3b52f1afda..6559baa1c7 100644
--- a/src/openapi.yaml
+++ b/src/openapi.yaml
@@ -1,7 +1,7 @@
 openapi: 3.0.3
 info:
   title: Open Forms API
-  version: 2.8.0-alpha.0
+  version: 2.8.0
   description: |2
 
     Open Forms provides an API to manage multi-page or multi-step forms.
diff --git a/src/openforms/__init__.py b/src/openforms/__init__.py
index 2e104e5bec..d50ed34fc7 100644
--- a/src/openforms/__init__.py
+++ b/src/openforms/__init__.py
@@ -1,6 +1,6 @@
 from .celery import app as celery_app
 
 __all__ = ("celery_app",)
-__version__ = "2.8.0-alpha.0"
+__version__ = "2.8.0-beta.0"
 __author__ = "Maykin Media"
 __homepage__ = "https://github.com/open-formulieren/open-forms"
diff --git a/src/openforms/conf/base.py b/src/openforms/conf/base.py
index 70cec28102..c1cfbb3962 100644
--- a/src/openforms/conf/base.py
+++ b/src/openforms/conf/base.py
@@ -956,7 +956,7 @@
 and it plays nice with other available components.
 """
 
-API_VERSION = "2.8.0-alpha.0"
+API_VERSION = "2.8.0"
 
 SPECTACULAR_SETTINGS = {
     "SCHEMA_PATH_PREFIX": "/api/v2",
diff --git a/src/openforms/contrib/objects_api/admin.py b/src/openforms/contrib/objects_api/admin.py
index 1f754e95c0..ba891a3e82 100644
--- a/src/openforms/contrib/objects_api/admin.py
+++ b/src/openforms/contrib/objects_api/admin.py
@@ -28,7 +28,10 @@ class ObjectsAPIGroupConfigAdmin(admin.ModelAdmin):
         "drc_service",
         "catalogi_service",
     )
-    ordering = ("name",)
+    ordering = (
+        "id",
+        "name",
+    )
     fieldsets = [
         (None, {"fields": ["name"]}),
         (
diff --git a/src/openforms/upgrades/upgrade_paths.py b/src/openforms/upgrades/upgrade_paths.py
index 4bc1ed1f36..3e2674af20 100644
--- a/src/openforms/upgrades/upgrade_paths.py
+++ b/src/openforms/upgrades/upgrade_paths.py
@@ -81,21 +81,6 @@ def run_checks(self) -> bool:
             VersionRange(minimum="2.7.4"),
         },
     ),
-    "2.7": UpgradeConstraint(
-        valid_ranges={
-            # 2.6.x: more migration squashing and removing squashed sources
-            # 2.6.7: patch release with new migrations, easiest is to force people to
-            # have executed that one
-            VersionRange(minimum="2.6.7"),
-        },
-        scripts={"check_objecttype_urls", "check_zgw_groups"},
-    ),
-    "2.6": UpgradeConstraint(
-        valid_ranges={
-            # more migration squashing and removing squashed sources
-            VersionRange(minimum="2.5.2"),
-        },
-    ),
 }