diff --git a/.gitignore b/.gitignore index 7476255..c0fb221 100644 --- a/.gitignore +++ b/.gitignore @@ -281,3 +281,7 @@ reenact/media/ !.envs/.local/ .idea/ + +# Tailwind +*/static/css/tailwind.css +package-lock.json diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c4ef51e --- /dev/null +++ b/Makefile @@ -0,0 +1,3 @@ + +tailwind: + npx tailwindcss -i reenact/static/css/tailwind_input.css -o reenact/static/css/tailwind.css diff --git a/config/settings/base.py b/config/settings/base.py index 132e9d1..11b0597 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -10,7 +10,7 @@ APPS_DIR = BASE_DIR / "reenact" env = environ.Env() -READ_DOT_ENV_FILE = env.bool("DJANGO_READ_DOT_ENV_FILE", default=False) +READ_DOT_ENV_FILE = env.bool("DJANGO_READ_DOT_ENV_FILE", default=True) if READ_DOT_ENV_FILE: # OS environment variables take precedence over variables from .env env.read_env(str(BASE_DIR / ".env")) @@ -78,10 +78,12 @@ "allauth.mfa", "allauth.socialaccount", "django_celery_beat", + "django_cotton", ] LOCAL_APPS = [ "reenact.users", + "reenact.reenact", # Your stuff: custom apps go here ] # https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps diff --git a/config/settings/local.py b/config/settings/local.py index 6746951..abae71a 100644 --- a/config/settings/local.py +++ b/config/settings/local.py @@ -30,7 +30,8 @@ # ------------------------------------------------------------------------------ # https://docs.djangoproject.com/en/dev/ref/settings/#email-backend EMAIL_BACKEND = env( - "DJANGO_EMAIL_BACKEND", default="django.core.mail.backends.console.EmailBackend", + "DJANGO_EMAIL_BACKEND", + default="django.core.mail.backends.console.EmailBackend", ) # WhiteNoise diff --git a/config/urls.py b/config/urls.py index 67711dc..af42b2c 100644 --- a/config/urls.py +++ b/config/urls.py @@ -8,7 +8,7 @@ from django.views.generic import TemplateView urlpatterns = [ - path("", TemplateView.as_view(template_name="pages/home.html"), name="home"), + # path("", TemplateView.as_view(template_name="pages/home.html"), name="home"), path( "about/", TemplateView.as_view(template_name="pages/about.html"), @@ -19,8 +19,7 @@ # User management path("users/", include("reenact.users.urls", namespace="users")), path("accounts/", include("allauth.urls")), - # Your stuff: custom urls includes go here - # ... + path("", include("reenact.reenact.urls")), # Media files *static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT), ] diff --git a/docker-compose.local.yml b/docker-compose.local.yml index 52b3e37..a4ca564 100644 --- a/docker-compose.local.yml +++ b/docker-compose.local.yml @@ -37,10 +37,10 @@ services: redis: image: docker.io/redis:6 container_name: reenact_local_redis - + volumes: - reenact_local_redis_data:/data - + celeryworker: <<: *django diff --git a/docker-compose.production.yml b/docker-compose.production.yml index 1ff72a3..294cfe0 100644 --- a/docker-compose.production.yml +++ b/docker-compose.production.yml @@ -3,9 +3,9 @@ volumes: production_postgres_data_backups: {} production_traefik: {} production_django_media: {} - + production_redis_data: {} - + services: @@ -52,10 +52,10 @@ services: redis: image: docker.io/redis:6 - + volumes: - production_redis_data:/data - + celeryworker: <<: *django diff --git a/package.json b/package.json new file mode 100644 index 0000000..986ec7d --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "tailwindcss": "^3.4.13" + } +} diff --git a/reenact/reenact/__init__.py b/reenact/reenact/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/reenact/reenact/admin.py b/reenact/reenact/admin.py new file mode 100644 index 0000000..846f6b4 --- /dev/null +++ b/reenact/reenact/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/reenact/reenact/apps.py b/reenact/reenact/apps.py new file mode 100644 index 0000000..d50f508 --- /dev/null +++ b/reenact/reenact/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ReenactConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "reenact.reenact" diff --git a/reenact/reenact/migrations/__init__.py b/reenact/reenact/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/reenact/reenact/models.py b/reenact/reenact/models.py new file mode 100644 index 0000000..6b20219 --- /dev/null +++ b/reenact/reenact/models.py @@ -0,0 +1 @@ +# Create your models here. diff --git a/reenact/reenact/tests.py b/reenact/reenact/tests.py new file mode 100644 index 0000000..a39b155 --- /dev/null +++ b/reenact/reenact/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/reenact/reenact/urls.py b/reenact/reenact/urls.py new file mode 100644 index 0000000..64d73d0 --- /dev/null +++ b/reenact/reenact/urls.py @@ -0,0 +1,52 @@ +from django.urls import path +from django.views.generic.base import TemplateView + +from . import views + +app_name = "reenact" + +urlpatterns = [ + path("", TemplateView.as_view(template_name="reenact/index.html"), name="index"), + path( + "infos", + TemplateView.as_view(template_name="reenact/infos.html"), + name="infos", + ), + path( + "questionsDefault/regionToday", + TemplateView.as_view(template_name="reenact/regionToday.html"), + name="region_today", + ), + path("pages/scenario", views.scenario, name="scenario"), + path( + "questionsDefault/scenariosOverview", + TemplateView.as_view(template_name="reenact/scenariosOverview.html"), + name="scenarios_overview", + ), + path( + "questionsDefault/createScenario", + TemplateView.as_view(template_name="reenact/createScenario.html"), + name="create_scenario", + ), + path( + "questionsDefault/scenarioDetail", + TemplateView.as_view(template_name="reenact/scenarioDetail.html"), + name="scenario_detail", + ), + path( + "questionsDefault/challenges", + TemplateView.as_view(template_name="reenact/challenges.html"), + name="challenges", + ), + path( + "pages/comparison", + TemplateView.as_view(template_name="reenact/comparison.html"), + name="comparison", + ), + path( + "source", + TemplateView.as_view(template_name="reenact/source.html"), + name="sources", + ), + path("help", TemplateView.as_view(template_name="reenact/help.html"), name="help"), +] diff --git a/reenact/reenact/views.py b/reenact/reenact/views.py new file mode 100644 index 0000000..1d69a71 --- /dev/null +++ b/reenact/reenact/views.py @@ -0,0 +1,209 @@ +from django.shortcuts import render + + +def scenario(request): + id = request.GET.get("id") + # get scenario texts according to ID + infos = { + "1": { + "name": "Wind-Repowering", + "kpi": { + "total_production": [234, 8.3], + "landuse": [8.8, 150], + "wind": [100, 200], + "pv": [111, 200], + "biomass": [3, 50], + "h2": [4.8, 125], + }, + "description": [ + "Dieses Szenario setzt auf eine ausgewogene Mischung aus erneuerbaren Energiequellen, um die Klimaziele 2040 zu erreichen. Durch die Kombination von Photovoltaikanlagen, Windparks, Biomasse und Bioenergie wird der Energiebedarf nachhaltig gedeckt und die Abhängigkeit von einer einzelnen Energieart reduziert.", + "Der Einsatz von PV-Anlagen auf Dächern und Freiflächen ergänzt die Windenergie und nutzt vorhandene Ressourcen optimal. Moderater Flächenverbrauch schützt natürliche Gebiete und berücksichtigt den Naturschutz.", + "Einwohner und lokale Wirtschaft sind eingeladen, aktiv teilzunehmen. Die Maßnahmen sind nicht nur umweltschonend, sondern auch neu wirtschaftlich.", + ], + "pro": [ + "Ausgewogener Energiemix erhöht Resilienz und Zuverlässigkeit.", + "Nutzung mehrerer erneuerbarer Quellen reduziert die Abhängigkeit von einer einzigen Energieart.", + "Moderater Flächenverbrauch, wodurch natürliche Gebiete besser erhalten bleiben.", + ], + "contra": [ + "Komplexere Infrastruktur und Verwaltung aufgrund der Vielfalt der Energiequellen.", + "Höhere Anfangskosten und logistische Herausforderungen beim Aufbau diverser erneuerbarer Projekte.", + ], + }, + "2": { + "name": "Zubau Wind und PV", + "kpi": { + "total_production": [300, 25], + "landuse": [12, 180], + "wind": [180, 220], + "pv": [120, 210], + "biomass": [2.5, 30], + "h2": [6, 140], + }, + "description": { + "In diesem Szenario wird der Ausbau von Windkraftanlagen und Photovoltaikanlagen stark vorangetrieben, um den wachsenden Energiebedarf zu decken und die Klimaziele 2040 zu erreichen.", + "Durch den großflächigen Einsatz von Freiflächen-Photovoltaik und neuen Windparks steigt die Energieproduktion erheblich. Der Fokus liegt dabei auf der optimalen Nutzung vorhandener Flächen.", + "Die lokale Bevölkerung wird in die Entscheidungsprozesse eingebunden, um die Akzeptanz der Maßnahmen zu erhöhen.", + }, + "pro": [ + "Hohe Energieerträge durch den starken Ausbau von Wind- und PV-Anlagen.", + "Geringere Abhängigkeit von fossilen Energieträgern durch die verstärkte Nutzung erneuerbarer Energien.", + "Neue Arbeitsplätze in der erneuerbaren Energiebranche.", + ], + "contra": [ + "Hoher Flächenverbrauch für Photovoltaikanlagen könnte zu Konflikten mit Naturschutzbelangen führen.", + "Erhöhte Investitionskosten aufgrund der umfangreichen Infrastrukturmaßnahmen.", + ], + }, + "3": { + "name": "Zubau PV", + "kpi": { + "total_production": [220, 15], + "landuse": [14, 200], + "wind": [80, 150], + "pv": [140, 250], + "biomass": [1.8, 10], + "h2": [2, 80], + }, + "description": [ + "In diesem Szenario liegt der Schwerpunkt auf einem massiven Ausbau von Photovoltaikanlagen auf Dächern und Freiflächen. Ziel ist es, die Energieproduktion durch PV deutlich zu steigern.", + "Durch den starken Zubau von PV-Anlagen wird ein großer Teil des Energiebedarfs gedeckt, insbesondere in sonnenreichen Regionen. Die Flächennutzung steigt entsprechend, was jedoch mit geringen Eingriffen in natürliche Gebiete kombiniert wird.", + "Die lokale Bevölkerung profitiert von Einsparungen bei den Energiekosten, da die Nutzung von Solarenergie lokal verfügbar ist.", + ], + "pro": [ + "Deutliche Steigerung der Energieproduktion durch Photovoltaik.", + "Geringe Betriebskosten nach der Installation.", + "Wenig Emissionen bei der Energieproduktion.", + ], + "contra": [ + "Hoher Flächenverbrauch für PV-Anlagen auf Freiflächen.", + "Saisonale Schwankungen bei der Energieproduktion, abhängig von Sonneneinstrahlung.", + ], + }, + "4": { + "name": "Moorbewirtschaftung", + "kpi": { + "total_production": [150, 5], + "landuse": [6, 50], + "wind": [60, 100], + "pv": [70, 120], + "biomass": [20, 200], + "h2": [0.5, 10], + }, + "description": [ + "Dieses Szenario konzentriert sich auf die nachhaltige Bewirtschaftung von Mooren, um CO2-Emissionen zu verringern und die Biodiversität zu fördern.", + "Durch die Renaturierung und nachhaltige Nutzung von Moorflächen kann nicht nur CO2 gebunden werden, sondern auch Energie aus Biomasse gewonnen werden. Die Energieproduktion steigt moderat, aber der Umweltnutzen ist signifikant.", + "Die Maßnahmen zur Moorbewirtschaftung werden mit erneuerbaren Energiequellen wie Windkraft und Photovoltaik kombiniert, um die Energieproduktion zu ergänzen.", + ], + "pro": [ + "Erheblicher Beitrag zum Klimaschutz durch CO2-Bindung.", + "Förderung der Biodiversität durch Renaturierung von Mooren.", + "Zusätzliche Energiegewinnung aus Biomasse.", + ], + "contra": [ + "Geringere Gesamtenergieproduktion im Vergleich zu anderen Szenarien.", + "Hohe Investitionskosten für Renaturierungsmaßnahmen.", + ], + }, + "5": { + "name": "Wasserstoff", + "kpi": { + "total_production": [180, 10], + "landuse": [7, 70], + "wind": [100, 150], + "pv": [60, 100], + "biomass": [15, 80], + "h2": [30, 300], + }, + "description": [ + "In diesem Szenario wird der Fokus auf die Erzeugung und Nutzung von grünem Wasserstoff gelegt. Dieser wird als zentraler Energieträger für Industrie und Verkehr eingesetzt.", + "Die Produktion von Wasserstoff erfolgt durch Elektrolyse, die durch erneuerbare Energien betrieben wird. Dies reduziert die Abhängigkeit von fossilen Brennstoffen und ermöglicht eine emissionsfreie Energieversorgung in verschiedenen Sektoren.", + "Wasserstoff kann als Speichermedium genutzt werden, um Energieüberschüsse aus Wind- und Sonnenenergie auszugleichen.", + ], + "pro": [ + "Hohe Flexibilität bei der Nutzung von Wasserstoff als Energieträger.", + "Speicherung und Nutzung von Energieüberschüssen.", + "Reduzierung der CO2-Emissionen in der Industrie und im Verkehr.", + ], + "contra": [ + "Hohe Kosten für die Infrastruktur zur Wasserstofferzeugung und -verteilung.", + "Geringe Effizienz bei der Umwandlung von Strom in Wasserstoff und zurück.", + ], + }, + "6": { + "name": "Kostenoptimierung", + "kpi": { + "total_production": [210, 12], + "landuse": [9, 100], + "wind": [110, 170], + "pv": [90, 180], + "biomass": [7.5, 40], + "h2": [5, 90], + }, + "description": [ + "Das Szenario der Kostenoptimierung konzentriert sich darauf, die Energiewende kosteneffizient zu gestalten, ohne die langfristigen Klimaziele zu gefährden.", + "Durch den Einsatz der kostengünstigsten Technologien und die Optimierung bestehender Infrastruktur wird die Energieproduktion gesteigert, während die Kosten im Vergleich zu anderen Szenarien geringer ausfallen.", + "Die Nutzung von Wind- und Solarenergie wird gezielt ausgebaut, wobei der Fokus auf niedrigeren Investitions- und Betriebskosten liegt.", + ], + "pro": [ + "Geringere Investitionskosten im Vergleich zu anderen Szenarien.", + "Effiziente Nutzung bestehender Infrastruktur und Technologien.", + "Kosteneinsparungen für Verbraucher durch niedrigere Energiekosten.", + ], + "contra": [ + "Möglicherweise geringere Innovationskraft bei der Einführung neuer Technologien.", + "Längere Amortisationszeiten bei bestimmten Investitionen.", + ], + }, + "7": { + "name": "Hohe CO2-Preise", + "kpi": { + "total_production": [250, 18], + "landuse": [10, 120], + "wind": [120, 180], + "pv": [100, 190], + "biomass": [5, 70], + "h2": [7, 150], + }, + "description": [ + "Dieses Szenario basiert auf einem hohen CO2-Preis, der als wirtschaftlicher Anreiz dient, den Ausbau erneuerbarer Energien voranzutreiben und fossile Energieträger zu reduzieren.", + "Durch hohe CO2-Kosten wird die Nutzung von Wind- und Solarenergie erheblich attraktiver, während die Nutzung von Kohle und Gas deutlich abnimmt. Unternehmen und Privatpersonen sind gezwungen, in klimafreundliche Technologien zu investieren.", + "Die Energieproduktion wird durch verstärkte Nutzung erneuerbarer Energien gesteigert, während gleichzeitig der CO2-Ausstoß drastisch gesenkt wird.", + ], + "pro": [ + "Starker Anreiz zur Reduktion von CO2-Emissionen.", + "Förderung von Investitionen in erneuerbare Energien.", + "Langfristig wirtschaftliche Vorteile durch verringerte Abhängigkeit von fossilen Brennstoffen.", + ], + "contra": [ + "Erhebliche Kostensteigerungen für Verbraucher und Unternehmen durch hohe CO2-Preise.", + "Mögliche soziale Ungleichheiten durch ungleiche Belastung.", + ], + }, + "8": { + "name": "Suffizienz", + "kpi": { + "total_production": [180, 10], + "landuse": [5, 50], + "wind": [90, 130], + "pv": [70, 100], + "biomass": [10, 60], + "h2": [2, 30], + }, + "description": [ + "Das Szenario der Suffizienz zielt darauf ab, den Energieverbrauch durch Verhaltensänderungen und Effizienzsteigerungen zu reduzieren. Es setzt weniger auf den Ausbau erneuerbarer Energien und mehr auf den bewussten Umgang mit Ressourcen.", + "Durch sparsamen Energieeinsatz und Reduktion des Konsums wird der Bedarf an neuer Energieinfrastruktur verringert. Die gesellschaftliche Akzeptanz für Einsparungen und bewussten Konsum ist dabei von zentraler Bedeutung.", + "Energieeinsparungen werden durch Maßnahmen wie Energiesparprogramme, smarte Technologien und Förderung von Konsumverzicht erzielt.", + ], + "pro": [ + "Reduzierter Energieverbrauch und geringerer Bedarf an neuer Infrastruktur.", + "Stärkung des Umweltbewusstseins und nachhaltiger Lebensstile.", + "Weniger Eingriffe in natürliche Flächen durch geringere Energieproduktion.", + ], + "contra": [ + "Möglicherweise geringere Energieproduktion im Vergleich zu Szenarien mit starkem Ausbau erneuerbarer Energien.", + "Hohe Abhängigkeit von Verhaltensänderungen der Bevölkerung, die schwer umsetzbar sind.", + ], + }, + } + return render(request, "reenact/scenario.html", {"info": infos[id]}) diff --git a/reenact/static/css/tailwind_input.css b/reenact/static/css/tailwind_input.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/reenact/static/css/tailwind_input.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/reenact/static/images/logo-reenact.jpg b/reenact/static/images/logo-reenact.jpg new file mode 100644 index 0000000..fb6c766 Binary files /dev/null and b/reenact/static/images/logo-reenact.jpg differ diff --git a/reenact/templates/403.html b/reenact/templates/403.html index 5795603..40954bb 100644 --- a/reenact/templates/403.html +++ b/reenact/templates/403.html @@ -1,6 +1,8 @@ {% extends "base.html" %} -{% block title %}Forbidden (403){% endblock title %} +{% block title %} + Forbidden (403) +{% endblock title %} {% block content %}
diff --git a/reenact/templates/403_csrf.html b/reenact/templates/403_csrf.html index 5795603..40954bb 100644 --- a/reenact/templates/403_csrf.html +++ b/reenact/templates/403_csrf.html @@ -1,6 +1,8 @@ {% extends "base.html" %} -{% block title %}Forbidden (403){% endblock title %} +{% block title %} + Forbidden (403) +{% endblock title %} {% block content %}
diff --git a/reenact/templates/404.html b/reenact/templates/404.html index 5111d3a..2399b79 100644 --- a/reenact/templates/404.html +++ b/reenact/templates/404.html @@ -1,6 +1,8 @@ {% extends "base.html" %} -{% block title %}Page not found{% endblock title %} +{% block title %} + Page not found +{% endblock title %} {% block content %}
diff --git a/reenact/templates/500.html b/reenact/templates/500.html index 1add004..c4e2fa3 100644 --- a/reenact/templates/500.html +++ b/reenact/templates/500.html @@ -1,6 +1,8 @@ {% extends "base.html" %} -{% block title %}Server Error{% endblock title %} +{% block title %} + Server Error +{% endblock title %} {% block content %}