-
Version {{ version|default:"0.980" }}
+
Version {{ version|default:"0.983" }}
diff --git a/referenzen/migrations/0004_alter_referenz_options.py b/referenzen/migrations/0004_alter_referenz_options.py
new file mode 100644
index 0000000..a678996
--- /dev/null
+++ b/referenzen/migrations/0004_alter_referenz_options.py
@@ -0,0 +1,17 @@
+# Generated by Django 6.0.1 on 2026-01-20 08:57
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('referenzen', '0003_alter_referenzerklaerung_options'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='referenz',
+ options={'verbose_name': 'Referenz', 'verbose_name_plural': 'Referenzen'},
+ ),
+ ]
diff --git a/referenzen/models.py b/referenzen/models.py
index aa99d60..477caff 100644
--- a/referenzen/models.py
+++ b/referenzen/models.py
@@ -25,6 +25,7 @@ class Referenz(MPTTModel):
class Meta:
verbose_name_plural="Referenzen"
+ verbose_name="Referenz"
class Referenzerklaerung (Textabschnitt):
erklaerung = models.ForeignKey(Referenz,on_delete=models.CASCADE)
diff --git a/referenzen/views.py b/referenzen/views.py
index 1e1821b..cf2ddfb 100644
--- a/referenzen/views.py
+++ b/referenzen/views.py
@@ -9,7 +9,7 @@ def tree(request):
def detail(request, refid):
- referenz_item = Referenz.objects.get(id=refid)
+ referenz_item = Referenz.objects.get_object_or_404(id=refid)
referenz_item.erklaerung = render_textabschnitte(referenz_item.referenzerklaerung_set.order_by("order"))
referenz_item.children = list(referenz_item.get_descendants(include_self=True))
for child in referenz_item.children:
diff --git a/requirements.txt b/requirements.txt
index 5c1cc5f..21fe605 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,37 +1,44 @@
appdirs==1.4.4
-asgiref==3.8.1
-blessed==1.21.0
-certifi==2025.8.3
-charset-normalizer==3.4.3
+asgiref==3.11.0
+bleach==6.3.0
+blessed==1.27.0
+certifi==2026.1.4
+charset-normalizer==3.4.4
+coverage==7.13.1
curtsies==0.4.3
-cwcwidth==0.1.10
-Django==5.2.9
-django-admin-sortable2==2.2.8
+cwcwidth==0.1.12
+Django==6.0.1
+django-admin-sortable2==2.3
django-js-asset==3.1.2
-django-mptt==0.17.0
-django-mptt-admin==2.8.0
-django-nested-admin==4.1.1
+django-mptt==0.18.0
+django-mptt-admin==2.9.0
+django-nested-admin==4.1.6
django-nested-inline==0.4.6
django-revproxy==0.13.0
-greenlet==3.2.4
+greenlet==3.3.0
gunicorn==23.0.0
-idna==3.10
+idna==3.11
jedi==0.19.2
-Markdown==3.8.2
+jproperties==2.1.2
+Markdown==3.10
packaging==25.0
parsedatetime==2.6
-parso==0.8.4
+parso==0.8.5
pep8==1.7.1
-prompt_toolkit==3.0.51
+prompt_toolkit==3.0.52
+pyfakefs==5.9.3
Pygments==2.19.2
+pysonar==1.2.1.3951
python-dateutil==2.9.0.post0
python-monkey-business==1.1.0
pyxdg==0.28
+PyYAML==6.0.3
requests==2.32.5
+responses==0.25.8
six==1.17.0
-sqlparse==0.5.3
+sqlparse==0.5.5
+tomli==2.2.1
urllib3==2.6.3
-wcwidth==0.2.13
-bleach==6.1.0
-coverage==7.6.1
-whitenoise==6.8.2
+wcwidth==0.2.14
+webencodings==0.5.1
+whitenoise==6.11.0
diff --git a/rollen/migrations/0002_alter_rolle_options.py b/rollen/migrations/0002_alter_rolle_options.py
new file mode 100644
index 0000000..194072d
--- /dev/null
+++ b/rollen/migrations/0002_alter_rolle_options.py
@@ -0,0 +1,17 @@
+# Generated by Django 6.0.1 on 2026-01-20 08:57
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('rollen', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='rolle',
+ options={'verbose_name': 'Rolle (für Relevanz)', 'verbose_name_plural': 'Rolleni (für Relevanz)'},
+ ),
+ ]
diff --git a/rollen/models.py b/rollen/models.py
index f5093ae..14e00fb 100644
--- a/rollen/models.py
+++ b/rollen/models.py
@@ -9,9 +9,10 @@ class Rolle(models.Model):
return self.name
class Meta:
verbose_name_plural="Rollen"
+ verbose_name="Rolle"
class RollenBeschreibung(Textabschnitt):
abschnitt=models.ForeignKey(Rolle,on_delete=models.CASCADE)
class Meta:
verbose_name_plural="Rollenbeschreibung"
- verbose_name="Rollenbeschreibungs-Abschnitt"
\ No newline at end of file
+ verbose_name="Rollenbeschreibungs-Abschnitt"
diff --git a/scripts/deploy-django-secret.sh b/scripts/deploy-django-secret.sh
deleted file mode 100755
index 5a0c695..0000000
--- a/scripts/deploy-django-secret.sh
+++ /dev/null
@@ -1,201 +0,0 @@
-#!/bin/bash
-
-# deploy-django-secret.sh
-# Script to generate a secure Django SECRET_KEY and deploy it to Kubernetes
-
-set -euo pipefail
-
-# Configuration
-NAMESPACE="${NAMESPACE:-vorgabenui}"
-SECRET_NAME="vorgabenui-secrets"
-SECRET_KEY_NAME="vorgabenui_secret"
-K8S_DIR="$(dirname "$0")/../k8s"
-SECRET_YAML="$K8S_DIR/django-secret.yaml"
-
-# Colors for output
-RED='\033[0;31m'
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-NC='\033[0m' # No Color
-
-# Logging functions
-log_info() {
- echo -e "${GREEN}[INFO]${NC} $1"
-}
-
-log_warn() {
- echo -e "${YELLOW}[WARN]${NC} $1"
-}
-
-log_error() {
- echo -e "${RED}[ERROR]${NC} $1"
-}
-
-# Function to generate a secure Django SECRET_KEY
-generate_secret_key() {
- # Generate a 50-character secret key using Python (same as Django's default)
- python3 -c "
-import secrets
-import string
-
-# Django-style secret key generation
-chars = string.ascii_letters + string.digits + '!@#$%^&*(-_=+)'
-print(''.join(secrets.choice(chars) for _ in range(50)))
-"
-}
-
-# Function to check if kubectl is available
-check_kubectl() {
- if ! command -v kubectl &> /dev/null; then
- log_error "kubectl is not installed or not in PATH"
- exit 1
- fi
-}
-
-# Function to check if Python3 is available
-check_python() {
- if ! command -v python3 &> /dev/null; then
- log_error "python3 is not installed or not in PATH"
- exit 1
- fi
-}
-
-# Function to create the secret
-create_secret() {
- local secret_key="$1"
- local encoded_key
-
- # Base64 encode the secret key
- encoded_key=$(echo -n "$secret_key" | base64 -w 0)
-
- log_info "Creating Kubernetes secret '$SECRET_NAME' in namespace '$NAMESPACE'..."
-
- # Create the secret directly with kubectl
- kubectl create secret generic "$SECRET_NAME" \
- --from-literal="$SECRET_KEY_NAME=$secret_key" \
- --namespace="$NAMESPACE" \
- --dry-run=client -o yaml | kubectl apply -f -
-
- if [ $? -eq 0 ]; then
- log_info "Successfully created/updated secret '$SECRET_NAME'"
- else
- log_error "Failed to create/update secret '$SECRET_NAME'"
- exit 1
- fi
-}
-
-# Function to verify the secret
-verify_secret() {
- log_info "Verifying secret deployment..."
-
- if kubectl get secret "$SECRET_NAME" --namespace="$NAMESPACE" &> /dev/null; then
- log_info "Secret '$SECRET_NAME' exists in namespace '$NAMESPACE'"
-
- # Show secret (without revealing the actual key)
- kubectl describe secret "$SECRET_NAME" --namespace="$NAMESPACE"
- return 0
- else
- log_error "Secret '$SECRET_NAME' not found in namespace '$NAMESPACE'"
- return 1
- fi
-}
-
-# Function to show usage
-show_usage() {
- echo "Usage: $0 [OPTIONS]"
- echo ""
- echo "Options:"
- echo " -n, --namespace NAMESPACE Kubernetes namespace (default: vorgabenui)"
- echo " -s, --secret-name NAME Secret name (default: django-secrets)"
- echo " -k, --key-name NAME Secret key name (default: django-secret-key)"
- echo " -h, --help Show this help message"
- echo ""
- echo "Environment variables:"
- echo " NAMESPACE Override default namespace"
- echo ""
- echo "Examples:"
- echo " $0 # Deploy to vorgabenui namespace"
- echo " $0 -n production # Deploy to production namespace"
- echo " NAMESPACE=staging $0 # Deploy to staging namespace"
-}
-
-# Parse command line arguments
-while [[ $# -gt 0 ]]; do
- case $1 in
- -n|--namespace)
- NAMESPACE="$2"
- shift 2
- ;;
- -s|--secret-name)
- SECRET_NAME="$2"
- shift 2
- ;;
- -k|--key-name)
- SECRET_KEY_NAME="$2"
- shift 2
- ;;
- -h|--help)
- show_usage
- exit 0
- ;;
- *)
- log_error "Unknown option: $1"
- show_usage
- exit 1
- ;;
- esac
-done
-
-# Main execution
-main() {
- log_info "Django SECRET_KEY Deployment Script"
- log_info "==================================="
- log_info "Namespace: $NAMESPACE"
- log_info "Secret Name: $SECRET_NAME"
- log_info "Secret Key Name: $SECRET_KEY_NAME"
- echo ""
-
- # Perform checks
- check_kubectl
- check_python
-
- # Generate new secret key
- log_info "Generating new Django SECRET_KEY..."
- SECRET_KEY=$(generate_secret_key)
-
- if [ -z "$SECRET_KEY" ]; then
- log_error "Failed to generate secret key"
- exit 1
- fi
-
- log_info "Generated secret key (first 10 chars): ${SECRET_KEY:0:10}..."
-
- # Create namespace if it doesn't exist
- if ! kubectl get namespace "$NAMESPACE" &> /dev/null; then
- log_warn "Namespace '$NAMESPACE' does not exist, creating..."
- kubectl create namespace "$NAMESPACE"
- fi
-
- # Create the secret
- create_secret "$SECRET_KEY"
-
- # Verify deployment
- verify_secret
-
- echo ""
- log_info "Deployment completed successfully!"
- log_info "To use this secret in your Django deployment, add the following to your pod spec:"
- echo ""
- echo " env:"
- echo " - name: VORGABENUI_SECRET"
- echo " valueFrom:"
- echo " secretKeyRef:"
- echo " name: $SECRET_NAME"
- echo " key: $SECRET_KEY_NAME"
- echo ""
- log_warn "The old secret key in settings.py has been replaced with environment variable lookup."
- log_warn "Make sure your Django deployment uses the environment variable before deploying."
-}
-
-# Run main function
-main
\ No newline at end of file
diff --git a/scripts/deploy_secret.sh b/scripts/deploy_secret.sh
index 4af545f..02b90b1 100755
--- a/scripts/deploy_secret.sh
+++ b/scripts/deploy_secret.sh
@@ -3,7 +3,7 @@
NAMESPACE="vorgabenui"
SECRET_NAME="django-secret"
-SECRET_FILE="argocd/secret.yaml"
+SECRET_FILE="templates/secret.yaml"
# Check if secret file exists
if [ ! -f "$SECRET_FILE" ]; then
diff --git a/stichworte/migrations/0004_alter_stichwort_options.py b/stichworte/migrations/0004_alter_stichwort_options.py
new file mode 100644
index 0000000..0eadd15
--- /dev/null
+++ b/stichworte/migrations/0004_alter_stichwort_options.py
@@ -0,0 +1,17 @@
+# Generated by Django 6.0.1 on 2026-01-20 08:57
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('stichworte', '0003_alter_stichworterklaerung_options'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='stichwort',
+ options={'verbose_name': 'Stichwort', 'verbose_name_plural': 'Stichworte'},
+ ),
+ ]
diff --git a/stichworte/models.py b/stichworte/models.py
index b4a82dc..4281fd8 100644
--- a/stichworte/models.py
+++ b/stichworte/models.py
@@ -9,6 +9,7 @@ class Stichwort(models.Model):
class Meta:
verbose_name_plural="Stichworte"
+ verbose_name = "Stichwort"
class Stichworterklaerung (Textabschnitt):
erklaerung = models.ForeignKey(Stichwort,on_delete=models.CASCADE)