From e3d283f463c6e82b61a7a64741ce4453f20befcd Mon Sep 17 00:00:00 2001 From: Jonas Heinrich Date: Fri, 19 Sep 2025 14:50:42 +0200 Subject: [PATCH] style front page updates, support FOIRequests --- froide_govplan/admin.py | 11 + ...r_categorizedgovernmentplan_id_and_more.py | 43 ++++ froide_govplan/migrations/0016_foirequest.py | 30 +++ .../migrations/0017_foirequest_url.py | 18 ++ froide_govplan/models.py | 38 ++-- .../templates/froide_govplan/detail.html | 2 +- .../froide_govplan/plugins/updates.html | 194 ++++++++++-------- 7 files changed, 239 insertions(+), 97 deletions(-) create mode 100644 froide_govplan/migrations/0015_alter_categorizedgovernmentplan_id_and_more.py create mode 100644 froide_govplan/migrations/0016_foirequest.py create mode 100644 froide_govplan/migrations/0017_foirequest_url.py diff --git a/froide_govplan/admin.py b/froide_govplan/admin.py index 3e3f951..10aae4f 100644 --- a/froide_govplan/admin.py +++ b/froide_govplan/admin.py @@ -22,6 +22,7 @@ from .models import ( GovernmentPlanFollower, GovernmentPlanSection, GovernmentPlanUpdate, + FOIRequest, ) User = auth.get_user_model() @@ -345,12 +346,22 @@ class GovernmentPlanSectionAdmin(SortableAdminMixin, admin.ModelAdmin): ) +class FOIRequestAdmin(admin.ModelAdmin): + list_display = ("title", "government_plan", "url", "created_at") + list_filter = ("government_plan",) + search_fields = ("title", "government_plan__title") + date_hierarchy = "created_at" + + admin.site.register(Government, GovernmentAdmin) admin.site.register(GovernmentPlan, GovernmentPlanAdmin) admin.site.register(GovernmentPlanUpdate, GovernmentPlanUpdateAdmin) admin.site.register(GovernmentPlanSection, GovernmentPlanSectionAdmin) admin.site.register(GovernmentPlanFollower, FollowerAdmin) +admin.site.register(FOIRequest, FOIRequestAdmin) + govplan_admin_site = GovPlanAdminSite(name="govplanadmin") +govplan_admin_site.register(FOIRequest, FOIRequestAdmin) govplan_admin_site.register(GovernmentPlan, GovernmentPlanAdmin) govplan_admin_site.register(GovernmentPlanUpdate, GovernmentPlanUpdateAdmin) diff --git a/froide_govplan/migrations/0015_alter_categorizedgovernmentplan_id_and_more.py b/froide_govplan/migrations/0015_alter_categorizedgovernmentplan_id_and_more.py new file mode 100644 index 0000000..8af508c --- /dev/null +++ b/froide_govplan/migrations/0015_alter_categorizedgovernmentplan_id_and_more.py @@ -0,0 +1,43 @@ +# Generated by Django 5.1.12 on 2025-09-18 20:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('froide_govplan', '0014_remove_governmentplansection_content_placeholder'), + ] + + operations = [ + migrations.AlterField( + model_name='categorizedgovernmentplan', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='government', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='governmentplan', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='governmentplanfollower', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='governmentplansection', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='governmentplanupdate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + ] diff --git a/froide_govplan/migrations/0016_foirequest.py b/froide_govplan/migrations/0016_foirequest.py new file mode 100644 index 0000000..729782d --- /dev/null +++ b/froide_govplan/migrations/0016_foirequest.py @@ -0,0 +1,30 @@ +# Generated by Django 5.1.12 on 2025-09-19 12:36 + +import django.db.models.deletion +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('froide_govplan', '0015_alter_categorizedgovernmentplan_id_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='FOIRequest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=1024, verbose_name='title')), + ('created_at', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created at')), + ('government_plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='foi_requests', to='froide_govplan.governmentplan', verbose_name='government plan')), + ], + options={ + 'verbose_name': 'FOI request', + 'verbose_name_plural': 'FOI requests', + 'ordering': ('-created_at',), + 'get_latest_by': 'created_at', + }, + ), + ] diff --git a/froide_govplan/migrations/0017_foirequest_url.py b/froide_govplan/migrations/0017_foirequest_url.py new file mode 100644 index 0000000..5a77424 --- /dev/null +++ b/froide_govplan/migrations/0017_foirequest_url.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.12 on 2025-09-19 12:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('froide_govplan', '0016_foirequest'), + ] + + operations = [ + migrations.AddField( + model_name='foirequest', + name='url', + field=models.CharField(blank=True, max_length=1024, verbose_name='URL'), + ), + ] diff --git a/froide_govplan/models.py b/froide_govplan/models.py index 14043e5..63ca94f 100644 --- a/froide_govplan/models.py +++ b/froide_govplan/models.py @@ -321,23 +321,29 @@ class GovernmentPlan(models.Model): return "govplan:plan@{}".format(self.pk) def get_related_foirequests(self): - if FoiRequest is None: - return [] - if not self.responsible_publicbody: - return [] - if hasattr(self, "_related_foirequests"): - return self._related_foirequests + return FOIRequest.objects.filter(government_plan=self).order_by('-created_at') - self._related_foirequests = ( - FoiRequest.objects.filter( - visibility=FoiRequest.VISIBILITY.VISIBLE_TO_PUBLIC, - public_body=self.responsible_publicbody, - ) - .filter(tags__name=conf.GOVPLAN_NAME) - .filter(reference=self.get_foirequest_reference()) - .order_by("-created_at") - ) - return self._related_foirequests + + +class FOIRequest(models.Model): + title = models.CharField(max_length=1024, verbose_name=_("title")) + government_plan = models.ForeignKey( + 'GovernmentPlan', + on_delete=models.CASCADE, + related_name='foi_requests', + verbose_name=_("government plan"), + ) + url = models.CharField(max_length=1024, blank=True, verbose_name=_("URL")) + created_at = models.DateTimeField(default=timezone.now, verbose_name=_("created at")) + + class Meta: + ordering = ("-created_at",) + get_latest_by = "created_at" + verbose_name = _("FOI request") + verbose_name_plural = _("FOI requests") + + def __str__(self): + return f"{self.title} - {self.government_plan.title}" class GovernmentPlanUpdate(models.Model): diff --git a/froide_govplan/templates/froide_govplan/detail.html b/froide_govplan/templates/froide_govplan/detail.html index 7ac6306..44ede06 100644 --- a/froide_govplan/templates/froide_govplan/detail.html +++ b/froide_govplan/templates/froide_govplan/detail.html @@ -83,7 +83,7 @@ {% with foirequest=object.get_recent_foirequest %}
Anfrage
- {% include "foirequest/snippets/request_item_mini.html" with object=foirequest %} + Aktuell laufende Anfrage vom {{ foirequest.created_at|date:"d.m.Y" }}
{% endwith %} {% endif %} diff --git a/froide_govplan/templates/froide_govplan/plugins/updates.html b/froide_govplan/templates/froide_govplan/plugins/updates.html index cbe123f..3e2f8dc 100644 --- a/froide_govplan/templates/froide_govplan/plugins/updates.html +++ b/froide_govplan/templates/froide_govplan/plugins/updates.html @@ -3,6 +3,7 @@ @@ -17,100 +49,102 @@
-
-

Aktuelles

-

- Hier finden Sie aktuelle Artikel und Links zu Blogs zu den Fortschritten der Stadtverwaltung Karlsruhe. -

-
+
+

Aktuelles

+

+ Hier finden Sie aktuelle Artikel und Links zu Blogs zu den Fortschritten der Stadtverwaltung Karlsruhe. +

+
-