From 96469c0212567545c53fad2e00089722b06bcf89 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Mon, 27 Oct 2025 15:37:58 +0100 Subject: [PATCH 01/83] add changelog tooling --- docs/modules/ROOT/nav.adoc | 3 +- .../ROOT/pages/web-portal-changelog.adoc | 20 +++ hack/README.md | 116 ++++++++++++++ hack/bumpver-post-commit-hook.sh | 141 ++++++++++++++++++ hack/bumpver-pre-commit-hook.sh | 134 +++++++++++++++++ pyproject.toml | 4 +- 6 files changed, 415 insertions(+), 3 deletions(-) create mode 100644 docs/modules/ROOT/pages/web-portal-changelog.adoc create mode 100644 hack/README.md create mode 100755 hack/bumpver-post-commit-hook.sh create mode 100755 hack/bumpver-pre-commit-hook.sh diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index cff0b83..d133fa2 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -5,6 +5,7 @@ ** xref:web-portal-admin.adoc[Admin] ** xref:web-portal-controlplanes.adoc[Control-Planes] ** xref:web-portal-billingentity.adoc[Billing Entities] +** xref:web-portal-changelog.adoc[Changelog] * xref:web-portal-planning.adoc[] ** xref:user-stories.adoc[] @@ -16,4 +17,4 @@ ** xref:api.adoc[] * Cloud Providers -** xref:exoscale-osb.adoc[] \ No newline at end of file +** xref:exoscale-osb.adoc[] diff --git a/docs/modules/ROOT/pages/web-portal-changelog.adoc b/docs/modules/ROOT/pages/web-portal-changelog.adoc new file mode 100644 index 0000000..bf2d3aa --- /dev/null +++ b/docs/modules/ROOT/pages/web-portal-changelog.adoc @@ -0,0 +1,20 @@ += Portal Changelog + +== 2025.10.27-0 + +=== UI/UX +* Restrict user input to more sensible ranges (link:https://servala.app.codey.ch/servala/servala-portal/pulls/251[#251]) +* Inline user info in service offering page (link:https://servala.app.codey.ch/servala/servala-portal/pulls/250[#250]) + +=== bug +* Fix generated FQDN not being submitted (link:https://servala.app.codey.ch/servala/servala-portal/pulls/249[#249]) + +=== dependencies +* Update dependency isort to v7 (link:https://servala.app.codey.ch/servala/servala-portal/pulls/252[#252]) +* Update dependency pillow to v12 (link:https://servala.app.codey.ch/servala/servala-portal/pulls/253[#253]) +* Lock file maintenance (link:https://servala.app.codey.ch/servala/servala-portal/pulls/255[#255]) +* Update https://github.com/astral-sh/setup-uv action to v7 (link:https://servala.app.codey.ch/servala/servala-portal/pulls/254[#254]) +* Update dependency flake8-bugbear to v25 (link:https://servala.app.codey.ch/servala/servala-portal/pulls/248[#248]) +* Update https://github.com/renovatebot/github-action action to v43.0.18 - autoclosed (link:https://servala.app.codey.ch/servala/servala-portal/pulls/239[#239]) +* Update actions/setup-node action to v6 (link:https://servala.app.codey.ch/servala/servala-portal/pulls/247[#247]) + diff --git a/hack/README.md b/hack/README.md new file mode 100644 index 0000000..6626efc --- /dev/null +++ b/hack/README.md @@ -0,0 +1,116 @@ +# Automation Scripts + +This directory contains automation scripts for release management and changelog generation. + +## Scripts + +### bumpver-pre-commit-hook.sh + +**Purpose**: Generates a changelog based on merged Pull Requests since the last release. + +**What it does**: +1. Queries the Forgejo API for merged pull requests since the last release tag +2. Groups pull requests by their labels (first label if multiple labels are present) +3. Formats the changes in AsciiDoc format with third-level headers for each label group +4. Appends the changelog to `docs/modules/ROOT/pages/web-portal-changelog.adoc` +5. Adds the changelog file to git staging area +6. Saves the changelog content for the post-commit hook + +**Note**: Pull requests without labels will be grouped under "Uncategorized". + +**Requirements**: +- `FORGEJO_TOKEN` environment variable must be set with a valid Forgejo API token +- `jq` command-line JSON processor must be installed +- `curl` must be installed + +### bumpver-post-commit-hook.sh + +**Purpose**: Creates a release on Forgejo after a version bump. + +**What it does**: +1. Gets the current version from `pyproject.toml` +2. Reads the changelog content generated by the pre-commit hook +3. Converts AsciiDoc format to Markdown (headers and links) +4. Creates or updates a release on Forgejo with the Markdown-formatted changelog +5. Cleans up temporary changelog files + +**Note**: The script automatically converts AsciiDoc syntax to Markdown for Forgejo releases: +- `=== Header` → `### Header` +- `link:url[text]` → `[text](url)` + +**Requirements**: +- `FORGEJO_TOKEN` environment variable must be set with a valid Forgejo API token +- `jq` command-line JSON processor must be installed +- `curl` must be installed + +## Setup + +### 1. Generate a Forgejo API Token + +1. Log in to Forgejo at https://servala.app.codey.ch +2. Go to Settings → Applications → Generate New Token +3. Give it a descriptive name (e.g., "bumpver-automation") +4. Select the required permissions: + - `repo` (Full control of repositories) +5. Copy the generated token + +### 2. Configure the token + +Export the token as an environment variable: + +```bash +export FORGEJO_TOKEN="your-token-here" +``` + +For permanent setup, add it to your shell profile (`~/.bashrc`, `~/.zshrc`, etc.): + +```bash +echo 'export FORGEJO_TOKEN="your-token-here"' >> ~/.bashrc +``` + +### 3. Update pyproject.toml + +Update the bumpver configuration in `pyproject.toml` to use these hooks: + +```toml +[tool.bumpver] +current_version = "2025.10.27-0" +version_pattern = "YYYY.0M.0D-INC0" +commit_message = "bump version {old_version} -> {new_version}" +tag_message = "{new_version}" +tag_scope = "default" +pre_commit_hook = "hack/bumpver-pre-commit-hook.sh" +post_commit_hook = "hack/bumpver-post-commit-hook.sh" +commit = true +tag = true +push = true +``` + +## Usage + +Once configured, the hooks will run automatically when you bump the version: + +```bash +# Or let bumpver determine the version based on the pattern +uvx bumpver update +``` + +The workflow is: +1. `bumpver` updates version files +2. **Pre-commit hook** runs: generates changelog, updates changelog file, stages changes +3. `bumpver` creates commit with version bump and changelog +4. `bumpver` creates git tag +5. **Post-commit hook** runs: creates Forgejo release +6. `bumpver` pushes commit and tags to remote + +## Manual execution + +You can also run the scripts manually: + +```bash +# Generate changelog (run before committing) +./hack/pre-commit-hook.sh + +# Create release (run after committing and tagging) +./hack/post-commit-hook.sh +``` diff --git a/hack/bumpver-post-commit-hook.sh b/hack/bumpver-post-commit-hook.sh new file mode 100755 index 0000000..ca175bd --- /dev/null +++ b/hack/bumpver-post-commit-hook.sh @@ -0,0 +1,141 @@ +#!/bin/bash +set -euo pipefail + +# Post-commit hook for bumpver to create a Forgejo release +# This script creates a release on Forgejo using the changelog generated in the pre-commit hook + +# Configuration +FORGEJO_URL="https://servala.app.codey.ch" +REPO_OWNER="servala" +REPO_NAME="servala-portal" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Check for required environment variable +if [ -z "${FORGEJO_TOKEN:-}" ]; then + echo -e "${RED}Error: FORGEJO_TOKEN environment variable is not set${NC}" + echo "Please set FORGEJO_TOKEN to your Forgejo API token" + exit 1 +fi + +# Get the current version from pyproject.toml +CURRENT_VERSION=$(grep -E 'current_version = ".*"' pyproject.toml | head -1 | sed -E 's/current_version = "(.*)"/\1/') +echo -e "${GREEN}Creating release for version: ${CURRENT_VERSION}${NC}" + +# Get the latest tag (should match CURRENT_VERSION) +LATEST_TAG=$(git tag -l --sort=-v:refname | head -1) +if [ "$LATEST_TAG" != "$CURRENT_VERSION" ]; then + echo -e "${YELLOW}Warning: Latest tag (${LATEST_TAG}) doesn't match current version (${CURRENT_VERSION})${NC}" + echo -e "${YELLOW}Using current version: ${CURRENT_VERSION}${NC}" +fi + +# Try to read the changelog generated by the pre-commit hook +CHANGELOG_DIR=".git/changelog" +CHANGELOG_FILE="${CHANGELOG_DIR}/${CURRENT_VERSION}.txt" + +if [ -f "$CHANGELOG_FILE" ]; then + CHANGELOG_CONTENT=$(cat "$CHANGELOG_FILE") + echo -e "${GREEN}Found changelog content from pre-commit hook${NC}" +else + echo -e "${YELLOW}Warning: Changelog file not found at ${CHANGELOG_FILE}${NC}" + echo -e "${YELLOW}Generating changelog from tag information${NC}" + + # Fallback: use git log to get commits since previous tag + PREVIOUS_TAG=$(git tag -l --sort=-v:refname | head -2 | tail -1) + if [ -n "$PREVIOUS_TAG" ]; then + CHANGELOG_CONTENT=$(git log --pretty=format:"* %s" "${PREVIOUS_TAG}..${LATEST_TAG}") + else + CHANGELOG_CONTENT="* Initial release" + fi +fi + +# Convert AsciiDoc to Markdown +# 1. Convert === headers to ### (third-level headers) +# 2. Convert link:url[text] to [text](url) +CHANGELOG_MARKDOWN=$(echo "$CHANGELOG_CONTENT" | sed -E 's/^=== /### /g' | sed -E 's/link:([^[]+)\[([^]]+)\]/[\2](\1)/g') + +# Create release body in Markdown format +RELEASE_BODY="## Release ${CURRENT_VERSION} + +${CHANGELOG_MARKDOWN} +" + +# Check if release already exists +API_URL="${FORGEJO_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/releases/tags/${CURRENT_VERSION}" +EXISTING_RELEASE=$(curl -s -H "Authorization: token ${FORGEJO_TOKEN}" "${API_URL}") + +# Check if we got a release back (not an error) +if echo "$EXISTING_RELEASE" | jq -e '.id' > /dev/null 2>&1; then + echo -e "${YELLOW}Release ${CURRENT_VERSION} already exists${NC}" + RELEASE_ID=$(echo "$EXISTING_RELEASE" | jq -r '.id') + echo -e "${GREEN}Updating existing release (ID: ${RELEASE_ID})${NC}" + + # Update the existing release + UPDATE_URL="${FORGEJO_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/releases/${RELEASE_ID}" + + RESPONSE=$(curl -s -X PATCH \ + -H "Authorization: token ${FORGEJO_TOKEN}" \ + -H "Content-Type: application/json" \ + -d "$(jq -n \ + --arg tag "${CURRENT_VERSION}" \ + --arg name "Release ${CURRENT_VERSION}" \ + --arg body "${RELEASE_BODY}" \ + '{ + tag_name: $tag, + name: $name, + body: $body + }')" \ + "${UPDATE_URL}") + + if echo "$RESPONSE" | jq -e '.id' > /dev/null 2>&1; then + RELEASE_URL=$(echo "$RESPONSE" | jq -r '.html_url') + echo -e "${GREEN}Release updated successfully!${NC}" + echo -e "${GREEN}Release URL: ${RELEASE_URL}${NC}" + else + echo -e "${RED}Error updating release${NC}" + echo "$RESPONSE" | jq . + exit 1 + fi +else + echo -e "${GREEN}Creating new release${NC}" + + # Create new release + CREATE_URL="${FORGEJO_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/releases" + + RESPONSE=$(curl -s -X POST \ + -H "Authorization: token ${FORGEJO_TOKEN}" \ + -H "Content-Type: application/json" \ + -d "$(jq -n \ + --arg tag "${CURRENT_VERSION}" \ + --arg name "Release ${CURRENT_VERSION}" \ + --arg body "${RELEASE_BODY}" \ + '{ + tag_name: $tag, + name: $name, + body: $body, + draft: false, + prerelease: false + }')" \ + "${CREATE_URL}") + + if echo "$RESPONSE" | jq -e '.id' > /dev/null 2>&1; then + RELEASE_URL=$(echo "$RESPONSE" | jq -r '.html_url') + echo -e "${GREEN}Release created successfully!${NC}" + echo -e "${GREEN}Release URL: ${RELEASE_URL}${NC}" + else + echo -e "${RED}Error creating release${NC}" + echo "$RESPONSE" | jq . + exit 1 + fi +fi + +# Clean up the changelog file +if [ -f "$CHANGELOG_FILE" ]; then + rm -f "$CHANGELOG_FILE" +fi + +exit 0 diff --git a/hack/bumpver-pre-commit-hook.sh b/hack/bumpver-pre-commit-hook.sh new file mode 100755 index 0000000..89ce3c4 --- /dev/null +++ b/hack/bumpver-pre-commit-hook.sh @@ -0,0 +1,134 @@ +#!/bin/bash +set -euo pipefail + +# Pre-commit hook for bumpver to generate changelog from Forgejo merge requests +# This script queries the Forgejo API for merged pull requests since the last release +# and appends them to the changelog file in AsciiDoc format + +# Configuration +FORGEJO_URL="https://servala.app.codey.ch" +REPO_OWNER="servala" +REPO_NAME="servala-portal" +CHANGELOG_FILE="docs/modules/ROOT/pages/web-portal-changelog.adoc" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Check for required environment variable +if [ -z "${FORGEJO_TOKEN:-}" ]; then + echo -e "${RED}Error: FORGEJO_TOKEN environment variable is not set${NC}" + echo "Please set FORGEJO_TOKEN to your Forgejo API token" + exit 1 +fi + +# Get the new version from pyproject.toml (bumpver updates this before running the hook) +NEW_VERSION=$(grep -E 'current_version = ".*"' pyproject.toml | head -1 | sed -E 's/current_version = "(.*)"/\1/') +echo -e "${GREEN}Generating changelog for version: ${NEW_VERSION}${NC}" + +# Get the previous tag +PREVIOUS_TAG=$(git tag -l --sort=-v:refname | head -2 | tail -1) +if [ -z "$PREVIOUS_TAG" ]; then + echo -e "${YELLOW}Warning: No previous tag found, using all merge requests${NC}" + # Get date of first commit + SINCE_DATE=$(git log --reverse --format=%aI | head -1) +else + echo -e "${GREEN}Previous version: ${PREVIOUS_TAG}${NC}" + # Get the date of the previous tag + SINCE_DATE=$(git log -1 --format=%aI "${PREVIOUS_TAG}") +fi + +echo -e "${GREEN}Fetching merge requests since ${SINCE_DATE}${NC}" + +# Query Forgejo API for closed/merged pull requests +# Forgejo API returns pull requests sorted by updated time +API_URL="${FORGEJO_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/pulls?state=closed&sort=updated&limit=100" + +RESPONSE=$(curl -s -H "Authorization: token ${FORGEJO_TOKEN}" "${API_URL}") + +# Check if curl was successful +if [ $? -ne 0 ]; then + echo -e "${RED}Error: Failed to fetch pull requests from Forgejo API${NC}" + exit 1 +fi + +# Filter merged PRs since the previous tag and group by labels +# Using jq to parse JSON, filter by merge date, and group by labels +CHANGELOG_ENTRIES=$(echo "${RESPONSE}" | jq -r --arg since "${SINCE_DATE}" ' + # Filter merged PRs since the last tag + [.[] | select(.merged_at != null and .merged_at > $since)] | + sort_by(.merged_at) | reverse | + + # Group by primary label (first label if multiple, or "Uncategorized") + group_by( + if (.labels | length) > 0 then + .labels[0].name + else + "Uncategorized" + end + ) | + + # Format each group + map( + # Group header + "=== " + ( + if .[0].labels | length > 0 then + .[0].labels[0].name + else + "Uncategorized" + end + ) + "\n" + + + # List items in this group + (map("* " + .title + " (link:" + .html_url + "[#" + (.number | tostring) + "])") | join("\n")) + ) | + join("\n\n") +') + +if [ -z "$CHANGELOG_ENTRIES" ]; then + echo -e "${YELLOW}Warning: No merged pull requests found since ${PREVIOUS_TAG}${NC}" + CHANGELOG_ENTRIES="=== Uncategorized\n\n* No changes recorded" +fi + +# Create changelog section +CHANGELOG_SECTION=" +== ${NEW_VERSION} + +${CHANGELOG_ENTRIES} +" + +# Check if changelog file exists +if [ ! -f "$CHANGELOG_FILE" ]; then + echo -e "${RED}Error: Changelog file ${CHANGELOG_FILE} not found${NC}" + exit 1 +fi + +# Create temporary file with new changelog entry at the top +TMP_FILE=$(mktemp) +{ + # Keep the title + head -1 "$CHANGELOG_FILE" + # Add the new changelog section + echo "$CHANGELOG_SECTION" + # Add the rest of the file (skip the title) + tail -n +2 "$CHANGELOG_FILE" +} > "$TMP_FILE" + +# Replace the original file +mv "$TMP_FILE" "$CHANGELOG_FILE" +chmod 0644 "$CHANGELOG_FILE" + +# Add the changelog file to git +git add "$CHANGELOG_FILE" + +echo -e "${GREEN}Changelog updated successfully${NC}" +echo -e "${GREEN}Added ${CHANGELOG_FILE} to git staging area${NC}" + +# Save changelog for post-commit hook +CHANGELOG_DIR=".git/changelog" +mkdir -p "$CHANGELOG_DIR" +echo "$CHANGELOG_ENTRIES" > "${CHANGELOG_DIR}/${NEW_VERSION}.txt" + +exit 0 diff --git a/pyproject.toml b/pyproject.toml index 60b51da..f10e50d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,8 +66,8 @@ version_pattern = "YYYY.0M.0D-INC0" commit_message = "bump version {old_version} -> {new_version}" tag_message = "{new_version}" tag_scope = "default" -pre_commit_hook = "" -post_commit_hook = "" +pre_commit_hook = "hack/bumpver-pre-commit-hook.sh" +post_commit_hook = "hack/bumpver-post-commit-hook.sh" commit = true tag = true push = true From 660ea8af20017d7a9b75eeeb696f8ee96878124f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 30 Oct 2025 03:01:05 +0000 Subject: [PATCH 02/83] Update dependency sentry-sdk to >=2.43.0 --- pyproject.toml | 2 +- uv.lock | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f10e50d..dc94dd4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ dependencies = [ "pyjwt>=2.10.1", "requests>=2.32.5", "rules>=3.5", - "sentry-sdk[django]>=2.42.1", + "sentry-sdk[django]>=2.43.0", "urlman>=2.0.2", ] diff --git a/uv.lock b/uv.lock index ddffdee..532c9dd 100644 --- a/uv.lock +++ b/uv.lock @@ -831,8 +831,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/11/32/b2ffe8f3853c181e88f0a157c5fb4e383102238d73c52ac6d93a5c8bffe6/psycopg2_binary-2.9.11-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c55b385daa2f92cb64b12ec4536c66954ac53654c7f15a203578da4e78105c0", size = 4411242, upload-time = "2025-10-10T11:12:42.388Z" }, { url = "https://files.pythonhosted.org/packages/10/04/6ca7477e6160ae258dc96f67c371157776564679aefd247b66f4661501a2/psycopg2_binary-2.9.11-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c0377174bf1dd416993d16edc15357f6eb17ac998244cca19bc67cdc0e2e5766", size = 4468258, upload-time = "2025-10-10T11:12:48.654Z" }, { url = "https://files.pythonhosted.org/packages/3c/7e/6a1a38f86412df101435809f225d57c1a021307dd0689f7a5e7fe83588b1/psycopg2_binary-2.9.11-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c6ff3335ce08c75afaed19e08699e8aacf95d4a260b495a4a8545244fe2ceb3", size = 4166295, upload-time = "2025-10-10T11:12:52.525Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7d/c07374c501b45f3579a9eb761cbf2604ddef3d96ad48679112c2c5aa9c25/psycopg2_binary-2.9.11-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:84011ba3109e06ac412f95399b704d3d6950e386b7994475b231cf61eec2fc1f", size = 3983133, upload-time = "2025-10-30T02:55:24.329Z" }, { url = "https://files.pythonhosted.org/packages/82/56/993b7104cb8345ad7d4516538ccf8f0d0ac640b1ebd8c754a7b024e76878/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba34475ceb08cccbdd98f6b46916917ae6eeb92b5ae111df10b544c3a4621dc4", size = 3652383, upload-time = "2025-10-10T11:12:56.387Z" }, { url = "https://files.pythonhosted.org/packages/2d/ac/eaeb6029362fd8d454a27374d84c6866c82c33bfc24587b4face5a8e43ef/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b31e90fdd0f968c2de3b26ab014314fe814225b6c324f770952f7d38abf17e3c", size = 3298168, upload-time = "2025-10-10T11:13:00.403Z" }, + { url = "https://files.pythonhosted.org/packages/2b/39/50c3facc66bded9ada5cbc0de867499a703dc6bca6be03070b4e3b65da6c/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d526864e0f67f74937a8fce859bd56c979f5e2ec57ca7c627f5f1071ef7fee60", size = 3044712, upload-time = "2025-10-30T02:55:27.975Z" }, { url = "https://files.pythonhosted.org/packages/9c/8e/b7de019a1f562f72ada81081a12823d3c1590bedc48d7d2559410a2763fe/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04195548662fa544626c8ea0f06561eb6203f1984ba5b4562764fbeb4c3d14b1", size = 3347549, upload-time = "2025-10-10T11:13:03.971Z" }, { url = "https://files.pythonhosted.org/packages/80/2d/1bb683f64737bbb1f86c82b7359db1eb2be4e2c0c13b947f80efefa7d3e5/psycopg2_binary-2.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:efff12b432179443f54e230fdf60de1f6cc726b6c832db8701227d089310e8aa", size = 2714215, upload-time = "2025-10-10T11:13:07.14Z" }, { url = "https://files.pythonhosted.org/packages/64/12/93ef0098590cf51d9732b4f139533732565704f45bdc1ffa741b7c95fb54/psycopg2_binary-2.9.11-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:92e3b669236327083a2e33ccfa0d320dd01b9803b3e14dd986a4fc54aa00f4e1", size = 3756567, upload-time = "2025-10-10T11:13:11.885Z" }, @@ -840,8 +842,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/13/1e/98874ce72fd29cbde93209977b196a2edae03f8490d1bd8158e7f1daf3a0/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b52a3f9bb540a3e4ec0f6ba6d31339727b2950c9772850d6545b7eae0b9d7c5", size = 4411646, upload-time = "2025-10-10T11:13:24.432Z" }, { url = "https://files.pythonhosted.org/packages/5a/bd/a335ce6645334fb8d758cc358810defca14a1d19ffbc8a10bd38a2328565/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:db4fd476874ccfdbb630a54426964959e58da4c61c9feba73e6094d51303d7d8", size = 4468701, upload-time = "2025-10-10T11:13:29.266Z" }, { url = "https://files.pythonhosted.org/packages/44/d6/c8b4f53f34e295e45709b7568bf9b9407a612ea30387d35eb9fa84f269b4/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47f212c1d3be608a12937cc131bd85502954398aaa1320cb4c14421a0ffccf4c", size = 4166293, upload-time = "2025-10-10T11:13:33.336Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e0/f8cc36eadd1b716ab36bb290618a3292e009867e5c97ce4aba908cb99644/psycopg2_binary-2.9.11-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e35b7abae2b0adab776add56111df1735ccc71406e56203515e228a8dc07089f", size = 3983184, upload-time = "2025-10-30T02:55:32.483Z" }, { url = "https://files.pythonhosted.org/packages/53/3e/2a8fe18a4e61cfb3417da67b6318e12691772c0696d79434184a511906dc/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fcf21be3ce5f5659daefd2b3b3b6e4727b028221ddc94e6c1523425579664747", size = 3652650, upload-time = "2025-10-10T11:13:38.181Z" }, { url = "https://files.pythonhosted.org/packages/76/36/03801461b31b29fe58d228c24388f999fe814dfc302856e0d17f97d7c54d/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:9bd81e64e8de111237737b29d68039b9c813bdf520156af36d26819c9a979e5f", size = 3298663, upload-time = "2025-10-10T11:13:44.878Z" }, + { url = "https://files.pythonhosted.org/packages/97/77/21b0ea2e1a73aa5fa9222b2a6b8ba325c43c3a8d54272839c991f2345656/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:32770a4d666fbdafab017086655bcddab791d7cb260a16679cc5a7338b64343b", size = 3044737, upload-time = "2025-10-30T02:55:35.69Z" }, { url = "https://files.pythonhosted.org/packages/67/69/f36abe5f118c1dca6d3726ceae164b9356985805480731ac6712a63f24f0/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3cb3a676873d7506825221045bd70e0427c905b9c8ee8d6acd70cfcbd6e576d", size = 3347643, upload-time = "2025-10-10T11:13:53.499Z" }, { url = "https://files.pythonhosted.org/packages/e1/36/9c0c326fe3a4227953dfb29f5d0c8ae3b8eb8c1cd2967aa569f50cb3c61f/psycopg2_binary-2.9.11-cp314-cp314-win_amd64.whl", hash = "sha256:4012c9c954dfaccd28f94e84ab9f94e12df76b4afb22331b1f0d3154893a6316", size = 2803913, upload-time = "2025-10-10T11:13:57.058Z" }, ] @@ -1229,15 +1233,15 @@ wheels = [ [[package]] name = "sentry-sdk" -version = "2.42.1" +version = "2.43.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/31/04/ec8c1dd9250847303d98516e917978cb1c7083024770d86d657d2ccb5a70/sentry_sdk-2.42.1.tar.gz", hash = "sha256:8598cc6edcfe74cb8074ba6a7c15338cdee93d63d3eb9b9943b4b568354ad5b6", size = 354839, upload-time = "2025-10-20T12:38:40.45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/18/09875b4323b03ca9025bae7e6539797b27e4fc032998a466b4b9c3d24653/sentry_sdk-2.43.0.tar.gz", hash = "sha256:52ed6e251c5d2c084224d73efee56b007ef5c2d408a4a071270e82131d336e20", size = 368953, upload-time = "2025-10-29T11:26:08.156Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/cb/c21b96ff379923310b4fb2c06e8d560d801e24aeb300faa72a04776868fc/sentry_sdk-2.42.1-py2.py3-none-any.whl", hash = "sha256:f8716b50c927d3beb41bc88439dc6bcd872237b596df5b14613e2ade104aee02", size = 380952, upload-time = "2025-10-20T12:38:38.88Z" }, + { url = "https://files.pythonhosted.org/packages/69/31/8228fa962f7fd8814d634e4ebece8780e2cdcfbdf0cd2e14d4a6861a7cd5/sentry_sdk-2.43.0-py2.py3-none-any.whl", hash = "sha256:4aacafcf1756ef066d359ae35030881917160ba7f6fc3ae11e0e58b09edc2d5d", size = 400997, upload-time = "2025-10-29T11:26:05.77Z" }, ] [package.optional-dependencies] @@ -1306,7 +1310,7 @@ requires-dist = [ { name = "pyjwt", specifier = ">=2.10.1" }, { name = "requests", specifier = ">=2.32.5" }, { name = "rules", specifier = ">=3.5" }, - { name = "sentry-sdk", extras = ["django"], specifier = ">=2.42.1" }, + { name = "sentry-sdk", extras = ["django"], specifier = ">=2.43.0" }, { name = "urlman", specifier = ">=2.0.2" }, ] From 82842f0c8e6e8d8282d1866a4053696b8a6eede0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 28 Oct 2025 03:01:41 +0000 Subject: [PATCH 03/83] Update dependency node to v24 --- .forgejo/workflows/renovate.yaml | 2 +- .forgejo/workflows/tests.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/renovate.yaml b/.forgejo/workflows/renovate.yaml index 300e7b3..59e65f8 100644 --- a/.forgejo/workflows/renovate.yaml +++ b/.forgejo/workflows/renovate.yaml @@ -16,7 +16,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: "22" + node-version: "24" - name: Renovate uses: https://github.com/renovatebot/github-action@v43.0.18 diff --git a/.forgejo/workflows/tests.yaml b/.forgejo/workflows/tests.yaml index 2447fa8..e3900b3 100644 --- a/.forgejo/workflows/tests.yaml +++ b/.forgejo/workflows/tests.yaml @@ -23,7 +23,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: "22" + node-version: "24" - name: Install uv uses: https://github.com/astral-sh/setup-uv@v7 From 575a4c7f8f726708102e3a68b9f905eea666d9c6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 28 Oct 2025 03:01:19 +0000 Subject: [PATCH 04/83] Update https://github.com/renovatebot/github-action action to v43.0.19 --- .forgejo/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/renovate.yaml b/.forgejo/workflows/renovate.yaml index 59e65f8..19e5ce8 100644 --- a/.forgejo/workflows/renovate.yaml +++ b/.forgejo/workflows/renovate.yaml @@ -19,7 +19,7 @@ jobs: node-version: "24" - name: Renovate - uses: https://github.com/renovatebot/github-action@v43.0.18 + uses: https://github.com/renovatebot/github-action@v43.0.19 with: token: ${{ secrets.RENOVATE_TOKEN }} env: From ac8d38eee1eb47010847c21da55576146c6f9e5f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 1 Nov 2025 03:01:01 +0000 Subject: [PATCH 05/83] Update dependency django-allauth to >=65.13.0 --- pyproject.toml | 2 +- uv.lock | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index dc94dd4..1a50fbc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ dependencies = [ "argon2-cffi>=25.1.0", "cryptography>=46.0.3", "django==5.2.7", - "django-allauth>=65.12.1", + "django-allauth>=65.13.0", "django-auditlog>=3.3.0", "django-fernet-encrypted-fields>=0.3.0", "django-jsonform>=2.23.2", diff --git a/uv.lock b/uv.lock index 532c9dd..e8f88a1 100644 --- a/uv.lock +++ b/uv.lock @@ -403,13 +403,16 @@ wheels = [ [[package]] name = "django-allauth" -version = "65.12.1" +version = "65.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref" }, { name = "django" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/94/75d7f8c59e061d1b66a6d917b287817fe02d2671c9e6376a4ddfb3954989/django_allauth-65.12.1.tar.gz", hash = "sha256:662666ff2d5c71766f66b1629ac7345c30796813221184e13e11ed7460940c6a", size = 1967971, upload-time = "2025-10-16T16:39:58.342Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/05/36b9de6d0109948717ee0fa8076d5b57396bc838d5239f5b44b7d4c29fb0/django_allauth-65.13.0.tar.gz", hash = "sha256:7d7b7e7ad603eb3864c142f051e2cce7be2f9a9c6945a51172ec83d48c6c843b", size = 1987616, upload-time = "2025-10-31T10:20:03.954Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/17/f2fd703781aeeb6d314059408df77360f09625cc3ce85f264b104443108c/django_allauth-65.13.0-py3-none-any.whl", hash = "sha256:119c0cf1cc2e0d1a0fe2f13588f30951d64989256084de2d60f13ab9308f9fa0", size = 1787213, upload-time = "2025-10-31T10:20:00.587Z" }, +] [[package]] name = "django-auditlog" @@ -1296,7 +1299,7 @@ requires-dist = [ { name = "argon2-cffi", specifier = ">=25.1.0" }, { name = "cryptography", specifier = ">=46.0.3" }, { name = "django", specifier = "==5.2.7" }, - { name = "django-allauth", specifier = ">=65.12.1" }, + { name = "django-allauth", specifier = ">=65.13.0" }, { name = "django-auditlog", specifier = ">=3.3.0" }, { name = "django-fernet-encrypted-fields", specifier = ">=0.3.0" }, { name = "django-jsonform", specifier = ">=2.23.2" }, From 078f5aa90fbfccae6c7191880790b26249587978 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 3 Nov 2025 03:01:08 +0000 Subject: [PATCH 06/83] Lock file maintenance --- uv.lock | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/uv.lock b/uv.lock index 532c9dd..92c42be 100644 --- a/uv.lock +++ b/uv.lock @@ -90,30 +90,30 @@ wheels = [ [[package]] name = "boto3" -version = "1.40.59" +version = "1.40.64" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, { name = "jmespath" }, { name = "s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/f4/65f3a0a58a42abaa57cb42968535dc7c209232c2614d5ac1d8354b0bc0b7/boto3-1.40.59.tar.gz", hash = "sha256:b1a5a203511e594872b39a129365f02eb5846eea990629e8daf47a3c01e7fd49", size = 111577, upload-time = "2025-10-24T19:23:33.763Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/d2/e508e5f42dc1c8a7412f5170751e626a18ed32c6e95c5df30bde6c5addf1/boto3-1.40.64.tar.gz", hash = "sha256:b92d6961c352f2bb8710c9892557d4b0e11258b70967d4e740e1c97375bcd779", size = 111543, upload-time = "2025-10-31T19:33:24.336Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/61/25cbd486b03d4f786507584025a35ae74fa52fe2408fbf0318d91e3e96db/boto3-1.40.59-py3-none-any.whl", hash = "sha256:75752e7dc445131700a58926a50ca705794232f0f47d0e21edb59fbf1898db95", size = 139323, upload-time = "2025-10-24T19:23:31.824Z" }, + { url = "https://files.pythonhosted.org/packages/65/c2/27da558ceb90d17b1e4c0cca5dab29f8aea7f63242a1005a8f54230ce5e6/boto3-1.40.64-py3-none-any.whl", hash = "sha256:35ca3dd80dd90d5f4e8ed032440f28790696fdf50f48c0d16a09a75675f9112f", size = 139321, upload-time = "2025-10-31T19:33:22.92Z" }, ] [[package]] name = "botocore" -version = "1.40.59" +version = "1.40.64" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/0a/4abd361449e495bc6f0eb24dc14213c1468253a5be63cfcd3b6f9feca992/botocore-1.40.59.tar.gz", hash = "sha256:842a466d8735272a30fe5b7f97df559d9e211a18e412f62a17ed249fd62f85fe", size = 14472896, upload-time = "2025-10-24T19:23:22.467Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/15/109cb31c156a64bfaf4c809d2638fd95d8ba39b6deb7f1d0526c05257fd7/botocore-1.40.64.tar.gz", hash = "sha256:a13af4009f6912eafe32108f6fa584fb26e24375149836c2bcaaaaec9a7a9e58", size = 14409921, upload-time = "2025-10-31T19:33:12.291Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/34/72ba24f52b14669384ede828ea08927b444c52311e67e02d9cdc6f00b882/botocore-1.40.59-py3-none-any.whl", hash = "sha256:042dd844ca82155ca1ab9608b9bef36d517515c775d075f57b89257108ae843b", size = 14139459, upload-time = "2025-10-24T19:23:18.425Z" }, + { url = "https://files.pythonhosted.org/packages/8f/c5/70bec18aef3fe9af63847d8766f81864b20daacd1dc7bf0c1d1ad90c7e98/botocore-1.40.64-py3-none-any.whl", hash = "sha256:6902b3dadfba1fbacc9648171bef3942530d8f823ff2bdb0e585a332323f89fc", size = 14072939, upload-time = "2025-10-31T19:33:09.081Z" }, ] [[package]] @@ -403,13 +403,16 @@ wheels = [ [[package]] name = "django-allauth" -version = "65.12.1" +version = "65.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref" }, { name = "django" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/94/75d7f8c59e061d1b66a6d917b287817fe02d2671c9e6376a4ddfb3954989/django_allauth-65.12.1.tar.gz", hash = "sha256:662666ff2d5c71766f66b1629ac7345c30796813221184e13e11ed7460940c6a", size = 1967971, upload-time = "2025-10-16T16:39:58.342Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/05/36b9de6d0109948717ee0fa8076d5b57396bc838d5239f5b44b7d4c29fb0/django_allauth-65.13.0.tar.gz", hash = "sha256:7d7b7e7ad603eb3864c142f051e2cce7be2f9a9c6945a51172ec83d48c6c843b", size = 1987616, upload-time = "2025-10-31T10:20:03.954Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/17/f2fd703781aeeb6d314059408df77360f09625cc3ce85f264b104443108c/django_allauth-65.13.0-py3-none-any.whl", hash = "sha256:119c0cf1cc2e0d1a0fe2f13588f30951d64989256084de2d60f13ab9308f9fa0", size = 1787213, upload-time = "2025-10-31T10:20:00.587Z" }, +] [[package]] name = "django-auditlog" @@ -572,16 +575,16 @@ wheels = [ [[package]] name = "google-auth" -version = "2.41.1" +version = "2.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachetools" }, { name = "pyasn1-modules" }, { name = "rsa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/af/5129ce5b2f9688d2fa49b463e544972a7c82b0fdb50980dafee92e121d9f/google_auth-2.41.1.tar.gz", hash = "sha256:b76b7b1f9e61f0cb7e88870d14f6a94aeef248959ef6992670efee37709cbfd2", size = 292284, upload-time = "2025-09-30T22:51:26.363Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/6b/22a77135757c3a7854c9f008ffed6bf4e8851616d77faf13147e9ab5aae6/google_auth-2.42.1.tar.gz", hash = "sha256:30178b7a21aa50bffbdc1ffcb34ff770a2f65c712170ecd5446c4bef4dc2b94e", size = 295541, upload-time = "2025-10-30T16:42:19.381Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/a4/7319a2a8add4cc352be9e3efeff5e2aacee917c85ca2fa1647e29089983c/google_auth-2.41.1-py2.py3-none-any.whl", hash = "sha256:754843be95575b9a19c604a848a41be03f7f2afd8c019f716dc1f51ee41c639d", size = 221302, upload-time = "2025-09-30T22:51:24.212Z" }, + { url = "https://files.pythonhosted.org/packages/92/05/adeb6c495aec4f9d93f9e2fc29eeef6e14d452bba11d15bdb874ce1d5b10/google_auth-2.42.1-py2.py3-none-any.whl", hash = "sha256:eb73d71c91fc95dbd221a2eb87477c278a355e7367a35c0d84e6b0e5f9b4ad11", size = 222550, upload-time = "2025-10-30T16:42:17.878Z" }, ] [[package]] From 9eb6d71212728d0eb9c3c30b092ba07be8b67436 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 4 Nov 2025 03:00:56 +0000 Subject: [PATCH 07/83] Update https://github.com/renovatebot/github-action action to v43.0.20 --- .forgejo/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/renovate.yaml b/.forgejo/workflows/renovate.yaml index 19e5ce8..851664f 100644 --- a/.forgejo/workflows/renovate.yaml +++ b/.forgejo/workflows/renovate.yaml @@ -19,7 +19,7 @@ jobs: node-version: "24" - name: Renovate - uses: https://github.com/renovatebot/github-action@v43.0.19 + uses: https://github.com/renovatebot/github-action@v43.0.20 with: token: ${{ secrets.RENOVATE_TOKEN }} env: From 880d10c5e57064ab18936cac1c4dd80e669e38fb Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Fri, 31 Oct 2025 11:40:09 +0100 Subject: [PATCH 08/83] Remove Advanced Fields feature we don't need it, as the new expert mode will be just the full current form --- src/servala/core/crd.py | 33 +------- src/servala/core/models/service.py | 15 +--- .../includes/tabbed_fieldset_form.html | 17 +--- src/servala/static/css/servala.css | 27 ------ src/servala/static/js/advanced-fields.js | 83 ------------------- 5 files changed, 4 insertions(+), 171 deletions(-) delete mode 100644 src/servala/static/js/advanced-fields.js diff --git a/src/servala/core/crd.py b/src/servala/core/crd.py index fe8edbb..5d5c34e 100644 --- a/src/servala/core/crd.py +++ b/src/servala/core/crd.py @@ -327,18 +327,6 @@ class CrdModelFormMixin: field.widget = forms.HiddenInput() field.required = False - # Mark advanced fields with a CSS class and data attribute - for name, field in self.fields.items(): - if self.is_field_advanced(name): - field.widget.attrs.update( - { - "class": ( - field.widget.attrs.get("class", "") + " advanced-field" - ).strip(), - "data-advanced": "true", - } - ) - if self.instance and self.instance.pk: self.fields["name"].disabled = True self.fields["name"].help_text = _("Name cannot be changed after creation.") @@ -355,17 +343,6 @@ class CrdModelFormMixin: return True return False - def is_field_advanced(self, field_name): - advanced_fields = getattr(self, "ADVANCED_FIELDS", []) - return field_name in advanced_fields or any( - field_name.startswith(f"{af}.") for af in advanced_fields - ) - - def are_all_fields_advanced(self, field_list): - if not field_list: - return False - return all(self.is_field_advanced(field_name) for field_name in field_list) - def get_fieldsets(self): fieldsets = [] @@ -381,7 +358,6 @@ class CrdModelFormMixin: "fields": general_fields, "fieldsets": [], "has_mandatory": self.has_mandatory_fields(general_fields), - "is_advanced": self.are_all_fields_advanced(general_fields), } if all( [ @@ -448,9 +424,6 @@ class CrdModelFormMixin: title = f"{fieldset['title']}: {sub_fieldset['title']}: " for field in sub_fieldset["fields"]: self.strip_title(field, title) - sub_fieldset["is_advanced"] = self.are_all_fields_advanced( - sub_fieldset["fields"] - ) nested_fieldsets_list.append(sub_fieldset) fieldset["fieldsets"] = nested_fieldsets_list @@ -467,8 +440,6 @@ class CrdModelFormMixin: all_fields.extend(sub_fieldset["fields"]) fieldset["has_mandatory"] = self.has_mandatory_fields(all_fields) - fieldset["is_advanced"] = self.are_all_fields_advanced(all_fields) - fieldsets.append(fieldset) # Add 'others' tab if there are any fields @@ -479,7 +450,6 @@ class CrdModelFormMixin: "fields": others, "fieldsets": [], "has_mandatory": self.has_mandatory_fields(others), - "is_advanced": self.are_all_fields_advanced(others), } ) @@ -543,7 +513,7 @@ class CrdModelFormMixin: pass -def generate_model_form_class(model, advanced_fields=None): +def generate_model_form_class(model): meta_attrs = { "model": model, "fields": "__all__", @@ -551,7 +521,6 @@ def generate_model_form_class(model, advanced_fields=None): fields = { "Meta": type("Meta", (object,), meta_attrs), "__module__": "crd_models", - "ADVANCED_FIELDS": advanced_fields or [], } class_name = f"{model.__name__}ModelForm" return ModelFormMetaclass(class_name, (CrdModelFormMixin, ModelForm), fields) diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 3af8c89..d03ef6b 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -360,16 +360,6 @@ class ServiceDefinition(ServalaModelMixin, models.Model): null=True, blank=True, ) - advanced_fields = models.JSONField( - verbose_name=_("Advanced fields"), - help_text=_( - "Array of field names that should be hidden behind an 'Advanced' toggle. " - "Use dot notation (e.g., ['spec.parameters.monitoring.enabled', 'spec.parameters.backup.schedule'])" - ), - null=True, - blank=True, - default=list, - ) service = models.ForeignKey( to="Service", on_delete=models.CASCADE, @@ -510,10 +500,7 @@ class ControlPlaneCRD(ServalaModelMixin, models.Model): if not self.django_model: return - advanced_fields = self.service_definition.advanced_fields or [] - return generate_model_form_class( - self.django_model, advanced_fields=advanced_fields - ) + return generate_model_form_class(self.django_model) class ServiceOffering(ServalaModelMixin, models.Model): diff --git a/src/servala/frontend/templates/includes/tabbed_fieldset_form.html b/src/servala/frontend/templates/includes/tabbed_fieldset_form.html index 74fa22a..c34c41a 100644 --- a/src/servala/frontend/templates/includes/tabbed_fieldset_form.html +++ b/src/servala/frontend/templates/includes/tabbed_fieldset_form.html @@ -6,22 +6,10 @@ {% if form_action %}action="{{ form_action }}"{% endif %}> {% csrf_token %} {% include "frontend/forms/errors.html" %} - {% if form.ADVANCED_FIELDS %} -
- -
- {% endif %}