From 08bf161f0937c8503e928cf14496b1b9b346a20b Mon Sep 17 00:00:00 2001 From: Jonas Heinrich Date: Thu, 21 Aug 2025 10:43:39 +0200 Subject: [PATCH] update module --- council/models.py | 5 ++ council/urls.py | 1 + council/views.py | 31 ++++++++++++- flake.nix | 2 + fragdenrat/urls.py | 3 ++ templates/base.html | 10 ++++ templates/council/member_detail.html | 68 ++++++++++++++++++++++++++-- 7 files changed, 114 insertions(+), 6 deletions(-) diff --git a/council/models.py b/council/models.py index 40aa047..0ecbc6e 100644 --- a/council/models.py +++ b/council/models.py @@ -55,6 +55,11 @@ class Question(models.Model): body = models.TextField() member = models.ForeignKey(Member, related_name="questions", on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) + # asker metadata + asker_first_name = models.CharField(max_length=150, blank=True) + asker_last_name = models.CharField(max_length=150, blank=True) + asker_city = models.CharField(max_length=150, blank=True) + asker_email = models.EmailField(blank=True) class Meta: verbose_name = "Frage" diff --git a/council/urls.py b/council/urls.py index b97155f..798a6a7 100644 --- a/council/urls.py +++ b/council/urls.py @@ -7,6 +7,7 @@ urlpatterns = [ path("gemeinden//", views.public_body_detail, name="public_body_detail"), path("mitglieder/", views.members, name="members"), path("mitglieder//", views.member_detail, name="member_detail"), + path("mitglieder//frage/stellen", views.ask_question, name="ask_question"), path("parteien/", views.parties, name="parties"), path("parteien//", views.party_detail, name="party_detail"), path("fragen/", views.questions, name="questions"), diff --git a/council/views.py b/council/views.py index 0161474..644bf8b 100644 --- a/council/views.py +++ b/council/views.py @@ -1,4 +1,5 @@ -from django.shortcuts import render, get_object_or_404 +from django.shortcuts import render, get_object_or_404, redirect +from django.contrib import messages from .models import PublicBody, Party, Member, Question, Vote @@ -39,6 +40,34 @@ def member_detail(request, pk: int): ) +def ask_question(request, pk: int): + member = get_object_or_404(Member, pk=pk) + if request.method != "POST": + return redirect("member_detail", pk=member.pk) + + title = request.POST.get("title", "").strip() + asker_first_name = request.POST.get("asker_first_name", "").strip() + asker_last_name = request.POST.get("asker_last_name", "").strip() + asker_city = request.POST.get("asker_city", "").strip() + asker_email = request.POST.get("asker_email", "").strip() + + if not title or not asker_first_name or not asker_last_name or not asker_city or not asker_email: + messages.error(request, "Bitte alle Pflichtfelder ausfüllen.") + return redirect("member_detail", pk=member.pk) + + Question.objects.create( + title=title, + body=title, + member=member, + asker_first_name=asker_first_name, + asker_last_name=asker_last_name, + asker_city=asker_city, + asker_email=asker_email, + ) + messages.success(request, "Frage wurde eingereicht.") + return redirect("member_detail", pk=member.pk) + + def parties(request): items = Party.objects.all() return render(request, "council/parties.html", {"items": items}) diff --git a/flake.nix b/flake.nix index 5cf142e..b00c55a 100644 --- a/flake.nix +++ b/flake.nix @@ -31,6 +31,8 @@ mkdir -p $out/share/fragdenrat # Project code cp -r "${./fragdenrat}/." $out/share/fragdenrat/ + # Django app: council + cp -r ${./council} $out/share/fragdenrat/council # Django manage helper install -Dm755 ${./manage.py} $out/bin/fragdenrat-manage # Templates and static assets diff --git a/fragdenrat/urls.py b/fragdenrat/urls.py index de090f4..264b370 100644 --- a/fragdenrat/urls.py +++ b/fragdenrat/urls.py @@ -1,7 +1,10 @@ from django.contrib import admin from django.urls import path, include +from django.views.generic import TemplateView urlpatterns = [ path("admin/", admin.site.urls), + path("impressum", TemplateView.as_view(template_name="impressum.html"), name="impressum"), + path("datenschutz", TemplateView.as_view(template_name="datenschutz.html"), name="datenschutz"), path("", include("council.urls")), ] \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 2e3eaca..33758b5 100644 --- a/templates/base.html +++ b/templates/base.html @@ -39,6 +39,16 @@ {% block content %}{% endblock %} + + {% block extra_js %}{% endblock %} diff --git a/templates/council/member_detail.html b/templates/council/member_detail.html index 4d78d99..16b1645 100644 --- a/templates/council/member_detail.html +++ b/templates/council/member_detail.html @@ -1,11 +1,26 @@ {% extends "base.html" %} {% block title %}{{ member }} – Stadträt:in{% endblock %} {% block content %} -

{{ member.first_name }} {{ member.last_name }}

-

- {% if member.public_body %}in {{ member.public_body.name }}{% endif %} - {% if member.party %} • {{ member.party }} (Profil){% endif %} -

+
+
+

{{ member.first_name }} {{ member.last_name }}

+

+ {% if member.public_body %}in {{ member.public_body.name }}{% endif %} + {% if member.party %} • {{ member.party }} (Profil){% endif %} +

+
+
+ +
+
+ +{% if messages %} +
+ {% for message in messages %} +
{{ message }}
+ {% endfor %} +
+{% endif %}

Fragen an {{ member.first_name }}

    @@ -33,4 +48,47 @@
  • Keine Abstimmungen.
  • {% endfor %}
+ + + {% endblock %} \ No newline at end of file