fix: configure CI database connection properly

- Add dotenv loading to Django settings
- Update CI workflow to use correct environment variables
- Set POSTGRES_* variables instead of DATABASE_URL
- Add environment variables to all Django management commands
- Fixes CI test failures due to database connection issues
This commit is contained in:
Stiftung Development
2025-09-06 18:47:23 +02:00
parent dcc91b9f49
commit 35ba089a84
64 changed files with 7040 additions and 1419 deletions

View File

@@ -0,0 +1,16 @@
# Generated by Django 5.0.6 on 2025-08-31 20:25
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('stiftung', '0022_dokumentlink_land_verpachtung_id_and_more'),
]
operations = [
migrations.DeleteModel(
name='Verpachtung',
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.0.6 on 2025-08-31 21:22
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('stiftung', '0023_remove_legacy_verpachtung'),
]
operations = [
migrations.AddField(
model_name='dokumentlink',
name='abrechnung_id',
field=models.UUIDField(blank=True, null=True, verbose_name='Abrechnung ID'),
),
]

View File

@@ -0,0 +1,37 @@
# Generated by Django 5.0.6 on 2025-08-31 22:08
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('stiftung', '0024_dokumentlink_abrechnung_id'),
]
operations = [
migrations.CreateModel(
name='AppConfiguration',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('key', models.CharField(max_length=100, unique=True, verbose_name='Setting Key')),
('display_name', models.CharField(max_length=200, verbose_name='Display Name')),
('description', models.TextField(blank=True, null=True, verbose_name='Description')),
('value', models.TextField(verbose_name='Value')),
('default_value', models.TextField(verbose_name='Default Value')),
('setting_type', models.CharField(choices=[('text', 'Text'), ('number', 'Number'), ('boolean', 'Boolean'), ('url', 'URL'), ('tag', 'Tag Name'), ('tag_id', 'Tag ID')], default='text', max_length=20, verbose_name='Type')),
('category', models.CharField(choices=[('paperless', 'Paperless Integration'), ('general', 'General Settings'), ('notifications', 'Notifications'), ('system', 'System Settings')], default='general', max_length=50, verbose_name='Category')),
('is_active', models.BooleanField(default=True, verbose_name='Active')),
('is_system', models.BooleanField(default=False, verbose_name='System Setting (read-only)')),
('order', models.IntegerField(default=0, verbose_name='Display Order')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
options={
'verbose_name': 'App Configuration',
'verbose_name_plural': 'App Configurations',
'ordering': ['category', 'order', 'display_name'],
},
),
]

View File

@@ -0,0 +1,89 @@
# Generated by Django 5.0.6 on 2025-09-01 20:03
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('stiftung', '0025_appconfiguration'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='destinataerunterstuetzung',
name='ausgezahlt_am',
field=models.DateField(blank=True, null=True, verbose_name='Ausgezahlt am'),
),
migrations.AddField(
model_name='destinataerunterstuetzung',
name='ausgezahlt_von',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Ausgezahlt von'),
),
migrations.AddField(
model_name='destinataerunterstuetzung',
name='empfaenger_iban',
field=models.CharField(blank=True, max_length=34, verbose_name='Empfänger IBAN'),
),
migrations.AddField(
model_name='destinataerunterstuetzung',
name='empfaenger_name',
field=models.CharField(blank=True, max_length=200, verbose_name='Empfänger Name'),
),
migrations.AddField(
model_name='destinataerunterstuetzung',
name='verwendungszweck',
field=models.CharField(blank=True, max_length=140, verbose_name='Verwendungszweck'),
),
migrations.AlterField(
model_name='destinataerunterstuetzung',
name='status',
field=models.CharField(choices=[('geplant', 'Geplant'), ('faellig', 'Fällig'), ('in_bearbeitung', 'In Bearbeitung'), ('ausgezahlt', 'Ausgezahlt'), ('storniert', 'Storniert')], default='geplant', max_length=20, verbose_name='Status'),
),
migrations.CreateModel(
name='UnterstuetzungWiederkehrend',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('betrag', models.DecimalField(decimal_places=2, max_digits=12, verbose_name='Betrag (€)')),
('intervall', models.CharField(choices=[('monatlich', 'Monatlich'), ('quartalsweise', 'Vierteljährlich'), ('halbjaehrlich', 'Halbjährlich'), ('jaehrlich', 'Jährlich')], max_length=20, verbose_name='Intervall')),
('beschreibung', models.CharField(blank=True, max_length=255, verbose_name='Beschreibung')),
('empfaenger_iban', models.CharField(max_length=34, verbose_name='Empfänger IBAN')),
('empfaenger_name', models.CharField(max_length=200, verbose_name='Empfänger Name')),
('verwendungszweck', models.CharField(blank=True, max_length=140, verbose_name='Verwendungszweck')),
('erste_zahlung_am', models.DateField(verbose_name='Erste Zahlung am')),
('letzte_zahlung_am', models.DateField(blank=True, null=True, verbose_name='Letzte Zahlung am (optional)')),
('naechste_generierung', models.DateField(verbose_name='Nächste Generierung')),
('aktiv', models.BooleanField(default=True, verbose_name='Aktiv')),
('erstellt_am', models.DateTimeField(auto_now_add=True)),
('destinataer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='wiederkehrende_unterstuetzungen', to='stiftung.destinataer', verbose_name='Destinatär')),
('erstellt_von', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Erstellt von')),
('konto', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='stiftung.stiftungskonto', verbose_name='Zahlungskonto')),
],
options={
'verbose_name': 'Wiederkehrende Unterstützung',
'verbose_name_plural': 'Wiederkehrende Unterstützungen',
'ordering': ['-erstellt_am'],
},
),
migrations.AddField(
model_name='destinataerunterstuetzung',
name='wiederkehrend_von',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stiftung.unterstuetzungwiederkehrend', verbose_name='Wiederkehrende Zahlung'),
),
migrations.AddIndex(
model_name='destinataerunterstuetzung',
index=models.Index(fields=['wiederkehrend_von'], name='stiftung_de_wiederk_3d5afc_idx'),
),
migrations.AddIndex(
model_name='unterstuetzungwiederkehrend',
index=models.Index(fields=['aktiv', 'naechste_generierung'], name='stiftung_un_aktiv_b957e5_idx'),
),
migrations.AddIndex(
model_name='unterstuetzungwiederkehrend',
index=models.Index(fields=['destinataer', 'aktiv'], name='stiftung_un_destina_2232fc_idx'),
),
]

View File

@@ -0,0 +1,38 @@
# Generated by Django 5.0.6 on 2025-09-02 19:56
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('stiftung', '0026_enhance_unterstuetzung_model'),
]
operations = [
migrations.CreateModel(
name='HelpBox',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('page_key', models.CharField(choices=[('destinataer_new', 'Neuer Destinatär'), ('unterstuetzung_new', 'Neue Unterstützung'), ('foerderung_new', 'Neue Förderung'), ('paechter_new', 'Neuer Pächter'), ('laenderei_new', 'Neue Länderei'), ('verpachtung_new', 'Neue Verpachtung'), ('person_new', 'Neue Person'), ('konto_new', 'Neues Konto')], max_length=50, unique=True, verbose_name='Seite')),
('title', models.CharField(max_length=200, verbose_name='Titel der Hilfsbox')),
('content', models.TextField(help_text='Sie können Markdown verwenden: **fett**, *kursiv*, `code`, [Link](url), etc.', verbose_name='Inhalt (Markdown unterstützt)')),
('is_active', models.BooleanField(default=True, verbose_name='Aktiv')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Erstellt am')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Aktualisiert am')),
('created_by', models.CharField(blank=True, max_length=100, null=True, verbose_name='Erstellt von')),
('updated_by', models.CharField(blank=True, max_length=100, null=True, verbose_name='Aktualisiert von')),
],
options={
'verbose_name': 'Hilfs-Infobox',
'verbose_name_plural': 'Hilfs-Infoboxen',
'ordering': ['page_key'],
},
),
migrations.AlterField(
model_name='appconfiguration',
name='category',
field=models.CharField(choices=[('paperless', 'Paperless Integration'), ('general', 'General Settings'), ('corporate', 'Corporate Identity'), ('notifications', 'Notifications'), ('system', 'System Settings')], default='general', max_length=50, verbose_name='Category'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.0.6 on 2025-09-02 20:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('stiftung', '0027_helpbox_alter_appconfiguration_category'),
]
operations = [
migrations.AlterField(
model_name='helpbox',
name='page_key',
field=models.CharField(choices=[('destinataer_new', 'Neuer Destinatär'), ('unterstuetzung_new', 'Neue Unterstützung'), ('foerderung_new', 'Neue Förderung'), ('paechter_new', 'Neuer Pächter'), ('laenderei_new', 'Neue Länderei'), ('verpachtung_new', 'Neue Verpachtung'), ('land_abrechnung_new', 'Neue Landabrechnung'), ('person_new', 'Neue Person'), ('konto_new', 'Neues Konto'), ('verwaltungskosten_new', 'Neue Verwaltungskosten'), ('rentmeister_new', 'Neuer Rentmeister'), ('dokument_new', 'Neues Dokument'), ('user_new', 'Neuer Benutzer'), ('csv_import_new', 'CSV Import'), ('destinataer_notiz_new', 'Destinatär Notiz')], max_length=50, unique=True, verbose_name='Seite'),
),
]