From aac1cdb1183a87f5d40a9809fbd12f25422a7ba4 Mon Sep 17 00:00:00 2001 From: Jonas Heinrich Date: Thu, 21 Aug 2025 09:45:11 +0200 Subject: [PATCH] create subpages --- council/__pycache__/admin.cpython-312.pyc | Bin 2016 -> 2344 bytes council/admin.py | 11 +++- council/migrations/0002_vote.py | 31 ++++++++++ .../__pycache__/0002_vote.cpython-312.pyc | Bin 0 -> 1763 bytes db.sqlite3 | Bin 192512 -> 217088 bytes templates/council/member_detail.html | 36 +++++++++++ templates/council/parties.html | 2 +- templates/council/party_detail.html | 51 ++++++++++++++++ templates/council/public_body_detail.html | 56 ++++++++++++++++++ 9 files changed, 184 insertions(+), 3 deletions(-) create mode 100644 council/migrations/0002_vote.py create mode 100644 council/migrations/__pycache__/0002_vote.cpython-312.pyc create mode 100644 templates/council/member_detail.html create mode 100644 templates/council/party_detail.html create mode 100644 templates/council/public_body_detail.html diff --git a/council/__pycache__/admin.cpython-312.pyc b/council/__pycache__/admin.cpython-312.pyc index 15d193058714d7ac89168eacb36832f4bfb1888f..2492790b21147a0ef74e500c6dc24d8daae1bc40 100644 GIT binary patch delta 891 zcmaFBze0%jG%qg~0|NuYg|o{tu21BZWYS=osG-G?%Mr!F$iT!fu|aHNjyR*pnWh?4>3C^PecRZrdn7vKjANThPCW(3*Dz`(@d&XB^_ z!jQtB%9sVVLQ0@gKvVD~NLrKe7HeWkZf4#~kZMh~$%0I}Y`0j#@=H=D+c70G@=jjF zG?k5qfq|ijXR*Was#ub3oio$!!4e~q@<$MvdqMi%=|n*P1Yg-kRm}4 zAp|0XL4+uX5CailBP2j9DKIhlEwd!VT&cC((_GD`|sBZ1a>sc-8IYE)&2#Om`<|2>-ia>#KizOwoBvq3M z%qcPe8O;Qiy~Ul9TAW;zSpbd%toG=G>;VxVU%`XH7!(YepkUB}1p`P8v!ABm-#bJ}1pHiBW zYFA{&z`y`XZ^dGa3=AKb85tSxGAP_G3HGcz!WeFO=EqZ0t9$+}^njoDG%qg~0|Ns?`mtph+!J{vnJzF+)X?H!WME=QWy}(o7^gXLqwvIcg6v#S zflV+0Ziv8SHb#huIHSPiC@5Qyofj&*4kjYSSIMWz{}N=ECgUyE#FX63yqAm&3=EpA zlQWrgC(mI@X5^W~Je7@`fq|ijd-7~%6*e&llb20$@;zov7aj%%hFd&|Nl8ViWtoX3 znfZBsnyf|qAVmToLJ&jx0l3-%8H;W|1T*=A2Y?hN3vsl;5gJcvy zPGKsN1+nEA7#RFkvSBm&7I#i&aY=kyW==_JQ4uzKWI!f>2#`yPL2hbccp&W7;B!Mr ztHJw*h<>AQ5!h8AHOUMN43kCJ3@7)o>glRMoS+KwCQDL&N~K?sBFHc_kEnpeR3^V< zm4kRhWil^YoSr&JGh>ksgwg={0IO~-kZ!HXGuh;Lz^(xC{WSR}m$REq-o!5M3l4s8 zSb^ME1hx#MrU=y)w>WHa^HWN5QtgTi85kHq5n23-fq~%zGb1D8T?U2w4E9$U>?cce OT<7}8#LOrM_A&r+(S6eZ diff --git a/council/admin.py b/council/admin.py index 10bf80a..d71d784 100644 --- a/council/admin.py +++ b/council/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import PublicBody, Party, Member, Question, Answer +from .models import PublicBody, Party, Member, Question, Answer, Vote @admin.register(PublicBody) @@ -33,4 +33,11 @@ class QuestionAdmin(admin.ModelAdmin): class AnswerAdmin(admin.ModelAdmin): list_display = ("question", "answered_by", "created_at") list_filter = ("answered_by",) - search_fields = ("body",) \ No newline at end of file + search_fields = ("body",) + + +@admin.register(Vote) +class VoteAdmin(admin.ModelAdmin): + list_display = ("title", "public_body", "date") + list_filter = ("public_body", "date") + search_fields = ("title", "description") \ No newline at end of file diff --git a/council/migrations/0002_vote.py b/council/migrations/0002_vote.py new file mode 100644 index 0000000..3cc8655 --- /dev/null +++ b/council/migrations/0002_vote.py @@ -0,0 +1,31 @@ +# Generated by Django 4.2.23 on 2025-08-21 07:44 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('council', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Vote', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255)), + ('description', models.TextField(blank=True)), + ('date', models.DateField(blank=True, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('members', models.ManyToManyField(blank=True, related_name='votes', to='council.member')), + ('public_body', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='votes', to='council.publicbody')), + ], + options={ + 'verbose_name': 'Abstimmung', + 'verbose_name_plural': 'Abstimmungen', + 'ordering': ['-date', '-created_at'], + }, + ), + ] diff --git a/council/migrations/__pycache__/0002_vote.cpython-312.pyc b/council/migrations/__pycache__/0002_vote.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbef1955b41dedcbf47f5e16b8eba58a03a1a1b7 GIT binary patch literal 1763 zcmX@j%ge>Uz`)>qZdt}676yjLAPx+(LK&ak7#J9)Go&!2Fy=7iGDb1xGDR^lg7{21 z%uy^%4DJjm%qGC5WTRbc-uDGrcIWBr`v+_!e7k zeoAUiv0pMs4u<)mjL(M{LAIwdL@}l?L@}i>rZYw{GclyHV6!WQDFr0Qmc<9vjYOre zq_Cv0rm(GHU(Es$PGd^pU}8vR%MyU_k;xR!HC(G1AtGr^DcoRnLJ&SOnZmM$2T2_- zSe*#63J4oy`x?I0Ob}igQwl#=r5J>dOs24`5kN9g5UfrDSp|fh!jdACBD_Wf7QSgr zDWYJtQV@A$GLha=?sWDPi4@5csTApS zrWBbu%xh#}a_NjwLX~ow^0zpBVNtHhbc;PXzcep7Gv^kMfq{Wxd}dx|NoHcsEtatS zlGIyFnJFP|x0pO#G+A!(B$k%s$0rx1CYGe8+~O`M%FInHs*KN0t-QrqoLZEbn3GwR zdW)wlwJ0gSI5j>mF*o%VYe{BFPU_453=9mKjJLRQ6D#6#QuESFGH!9Fq!uR^Wfp)E zo+jfh)})-oyzE;nDTyVinoLEYc)P`tSDKS^iwkOFd}4_vBh(Rj`Q`D6DJi$ub5nDZ zQj3ajv6khRq!w54LH(i!5!Ymf7{pVQngen)#7#^k`M0P3BuH;ILv#%S_ElDZa&?4-S-KKTY9V z9PwZ`$H(8|ijU9DPbtkwjgP;@6CYn#nwSI91>&Wo7Nq8-q~;}OrWO~0^7t)oXK*a} zf^u^aD39IZamq}0EG@}*1KDwl(>Wut2+9mettf#qT@p)DAxvHnGbA$?%H{V>%&QE^ z2aynYF1P%m)Xele@6^g$Y$;iZdFlDLm{O8%aezZCGe7SZyR&1kv!jdaEw226RA~9K zlHoHb<^HnM&&bbB)z8n%tJE(j%FjwoE-BVeD@sgHNzE%tEYXL?hd!cY(l;fD z^n$q7gtF`6S{KE&cCegKxeyh9A+P9)c<}{+k{f~&7o@ais9l%Rx+tZ!A^D1w)dd0T z8-j8d6bu%yT~{!;s9><6HD`!jm(;u{skwn=hshO5hYJFZHw0xb z$Q#cnyDo2hQQr7~$Q60F3j*#p1f?#>7|n3IE@O02#%PDg3HJ*T8CPU7F9>9TjW+}t zZ+KC`aEIG|&z+vvZG0};_*}OMy=W79-6r;;P3(o7;tvcAm5jbjUlCfhAeNF3>< zB!LqMBuz-d1@$21z8)<0ii}`-i_AeRuu+zv48UOnNriSrHVh05pkldLo`Hek12ZEd i<99X&M$Ov{3SZbH7}+LpT^CTfD4_C{L4uJD>=pnd4AyD@ literal 0 HcmV?d00001 diff --git a/db.sqlite3 b/db.sqlite3 index 1ac72c93d22d0b72d35644fff6b379fc284282cf..7ed9b0fb4fd16300a1bc2bc6aea3928bfeebc035 100644 GIT binary patch delta 1558 zcmZp8z}>KbcY?H_E&~IDDFXs{Pt-AH)ZLgci=P)HEGo^*z`!8F^?EY9fI1V`>y3@O zxeWD1SQ(_{9h37*^O7@j3=9m6;>+?&QjH9ZOmz(`bd3xZ49u-eOsovd^o%S`EzK-9 z%Sh*mFd9tm*7soKnS4cGTTz6Ifq{XCUyOnO9sg;aJ+Jgq#%Jc&Gk8yjD8JM*(J z$}=L|YaqzNsLY7$HhqW)#9FZVdVDO5vWy`6z+BzUQ(_8=nGN`!PG-Ll$-(!X?<3!9 zzNZ@-YxyKtnHd>*48Wv5nA8K4x|{#rV^3t}XFR^0-GT7{FjEqd%PdGE$$Y=>M zSuya3@*U#+#;eW4%&p7S#`%eJFNXm8UAA>>nQSVouB=?lc}!LeRvR06n6~$HGnKGx zUzf%h7AeESFUr9Gmj5RIDgHhD^ZC2@i}@4z{rD~U)%Zm>Hh$$3=CF_rx*dkotiHdR)2)(0#TnBABd88aEC@W=9Pnb?>U(HP{+E?#QN z*uSTt?A) zY*K`bQ&RBvQ&7UDQ%ONX36xsnGgFjw6qF#&193DPMV;8iLsc0YZBcxo307TDnv|27 z9G{e*QVDXqxru?1fvKq>vJFPl+L^@k@Ttah)%3;=CJ~D!Cr5U1Q&Ywk^^(M-oK$2( zq2X1GP0Vom!9FH2Zm^9Ie@y3hXEb902~5xGVbX-K{(CX1O;7A$iq~jzcVHJ+Rb^}m z#IOh1d;_q#5X}PajHc81dzj>>FG^>W3o4O_K9Vg+K)? zBqc%&D>eZ+%N48?Dgu#4(udzsV6B-cN}61o86W)DUv_}WVABQ`h0QDv{@4Qm@A&rq delta 353 zcmZozz}xVEdxEr}CIbV5J_7={PSi1G)ZCabi=P)HEGo{+z`!8PEi;*2Kz(E5JFd+# z(s?3`I+MHgJs7zsU(wf=7v^GMVBqFgXW)Owf13Xm|6cwD{ObJv{7L*J{8s$k8yh+K zC#&1vW!B+Lo6PPIxv`Orb90*KJT_(>o+*>r10pvzn(%C%5>rsjti$(rGW&(djg52p zHvhfHp2*C{d}2Gh1LFb4jT0D|wx4ijw2{%`Wm(I>vX(!T?-1`dUTq#`Ze6Z6&QF|s zIRx16vaMs~V$Nf-VmQIi$zZjyv7Tl7aYsf*rtRy}7{el^xcSu>_}}v1UkuLy?j9~FPGyd%>|fbq*!Hlg wvZ}K_V41M7F@t6Mgchb=MkWS^?ec9*xvbl*k{C-^7`ZkxKKQS{>;RJi07PhGfB*mh diff --git a/templates/council/member_detail.html b/templates/council/member_detail.html new file mode 100644 index 0000000..4d78d99 --- /dev/null +++ b/templates/council/member_detail.html @@ -0,0 +1,36 @@ +{% 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 %} +

+ +

Fragen an {{ member.first_name }}

+
    + {% for q in questions %} +
  • + {{ q.title }} +
    {{ q.created_at|date:'d.m.Y H:i' }}
    +
  • + {% empty %} +
  • Keine Fragen.
  • + {% endfor %} +
+ +

Abstimmungen (Beteiligung)

+
    + {% for v in votes %} +
  • + + {{ v.title }} + {% if v.date %}({{ v.date|date:'d.m.Y' }}){% endif %} + + {{ v.public_body.name }} +
  • + {% empty %} +
  • Keine Abstimmungen.
  • + {% endfor %} +
+{% endblock %} \ No newline at end of file diff --git a/templates/council/parties.html b/templates/council/parties.html index 26e08c9..6f9ea0f 100644 --- a/templates/council/parties.html +++ b/templates/council/parties.html @@ -11,7 +11,7 @@ {% if p.abbreviation %}({{ p.abbreviation }}){% endif %} - {% if p.color %}   {% endif %} + {% if p.color %}   {% endif %} {% empty %}
  • Keine Einträge.
  • diff --git a/templates/council/party_detail.html b/templates/council/party_detail.html new file mode 100644 index 0000000..975b1ac --- /dev/null +++ b/templates/council/party_detail.html @@ -0,0 +1,51 @@ +{% extends "base.html" %} +{% block title %}{{ party.name }} – Partei{% endblock %} +{% block content %} +

    {{ party.name }}

    +{% if party.abbreviation %}

    Kurz: {{ party.abbreviation }}

    {% endif %} + +

    Gemeinden

    +
      + {% for g in public_bodies %} +
    • + {{ g.name }} +
    • + {% empty %} +
    • Keine Gemeinden.
    • + {% endfor %} +
    + +

    Stadträt:innen

    +
    + + + + + + + + + {% for m in members %} + + + + + {% empty %} + + {% endfor %} + +
    NameGemeinde
    {{ m.first_name }} {{ m.last_name }}{% if m.public_body %}{{ m.public_body.name }}{% else %}–{% endif %}
    Keine Mitglieder.
    +
    + +

    Fragen

    +
      + {% for q in questions %} +
    • + {{ q.title }} +
      an {{ q.member }} • {{ q.created_at|date:'d.m.Y H:i' }}
      +
    • + {% empty %} +
    • Keine Fragen.
    • + {% endfor %} +
    +{% endblock %} \ No newline at end of file diff --git a/templates/council/public_body_detail.html b/templates/council/public_body_detail.html new file mode 100644 index 0000000..e88f372 --- /dev/null +++ b/templates/council/public_body_detail.html @@ -0,0 +1,56 @@ +{% extends "base.html" %} +{% block title %}{{ body.name }} – Gemeinde{% endblock %} +{% block content %} +

    {{ body.name }}

    +{% if body.website %}

    Webseite

    {% endif %} +{% if body.description %}

    {{ body.description }}

    {% endif %} + +

    Parteien in {{ body.name }}

    +
      + {% for p in parties %} +
    • + {{ p.name }} + {% if p.color %}   {% endif %} +
    • + {% empty %} +
    • Keine Parteien.
    • + {% endfor %} +
    + +

    Stadträt:innen

    +
    + + + + + + + + + {% for m in members %} + + + + + {% empty %} + + {% endfor %} + +
    NamePartei
    {{ m.first_name }} {{ m.last_name }}{% if m.party %}{{ m.party }}{% else %}–{% endif %}
    Keine Mitglieder.
    +
    + +

    Abstimmungen

    +
      + {% for v in votes %} +
    • + + {{ v.title }} + {% if v.date %}({{ v.date|date:'d.m.Y' }}){% endif %} + + {{ v.members.count }} Beteiligte +
    • + {% empty %} +
    • Keine Abstimmungen.
    • + {% endfor %} +
    +{% endblock %} \ No newline at end of file