Compare commits
10 commits
71c54a21c0
...
e5acfdf19d
| Author | SHA1 | Date | |
|---|---|---|---|
| e5acfdf19d | |||
| ee3800104f | |||
| e3d283f463 | |||
| c56689893b | |||
| af31ea1abb | |||
| fcc2eab88c | |||
| 0f49a4c85c | |||
| ef7a6d3b11 | |||
| 0638b243bd | |||
| 48518f130f |
6
flake.lock
generated
|
|
@ -2,11 +2,11 @@
|
|||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1748162331,
|
||||
"narHash": "sha256-rqc2RKYTxP3tbjA+PB3VMRQNnjesrT0pEofXQTrMsS8=",
|
||||
"lastModified": 1758070117,
|
||||
"narHash": "sha256-uLwwHFCZnT1c3N3biVe/0hCkag2GSrf9+M56+Okf+WY=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "7c43f080a7f28b2774f3b3f43234ca11661bf334",
|
||||
"rev": "e9b7f2ff62b35f711568b1f0866243c7c302028d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
|
|||
154
flake.nix
|
|
@ -3,83 +3,97 @@
|
|||
|
||||
inputs.nixpkgs.url = "nixpkgs/nixos-25.05";
|
||||
|
||||
outputs = { self, nixpkgs, ... }@inputs:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
||||
start =
|
||||
pkgs.writeShellScriptBin "start" ''
|
||||
set -e
|
||||
export NIXPKGS_ALLOW_INSECURE=1
|
||||
export QEMU_NET_OPTS="hostfwd=tcp::8080-:80"
|
||||
${pkgs.nixos-shell}/bin/nixos-shell --flake .
|
||||
'';
|
||||
in {
|
||||
nixosConfigurations.vm = nixpkgs.lib.nixosSystem {
|
||||
system = "x86_64-linux";
|
||||
specialArgs.inputs = inputs;
|
||||
pkgs = import nixpkgs {
|
||||
overlays = [
|
||||
(self: super: {
|
||||
froide-govplan = super.froide-govplan.overrideAttrs (oldAttrs: rec {
|
||||
src = ./.;
|
||||
postInstall = oldAttrs.postInstall + ''
|
||||
rm -r $out/${pkgs.python3.sitePackages}/froide_govplan/templates
|
||||
ln -sf /var/lib/froide-govplan/templates $out/${pkgs.python3.sitePackages}/froide_govplan/templates
|
||||
cp -r froide_govplan/static $out/${pkgs.python3.sitePackages}/froide_govplan/
|
||||
'';
|
||||
});
|
||||
|
||||
pythonPackagesExtensions = super.pythonPackagesExtensions ++ [
|
||||
(
|
||||
python-final: python-prev: {
|
||||
moto = python-prev.moto.overridePythonAttrs (oldAttrs: { doCheck = false; });
|
||||
}
|
||||
)
|
||||
];
|
||||
|
||||
outputs =
|
||||
{ self, nixpkgs, ... }@inputs:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
||||
start = pkgs.writeShellScriptBin "start" ''
|
||||
set -e
|
||||
export NIXPKGS_ALLOW_INSECURE=1
|
||||
export QEMU_NET_OPTS="hostfwd=tcp::8080-:80"
|
||||
${pkgs.nixos-shell}/bin/nixos-shell --flake .
|
||||
'';
|
||||
in
|
||||
{
|
||||
nixosConfigurations.vm = nixpkgs.lib.nixosSystem {
|
||||
system = "x86_64-linux";
|
||||
specialArgs.inputs = inputs;
|
||||
pkgs = import nixpkgs {
|
||||
overlays = [
|
||||
(self: super: {
|
||||
froide-govplan = super.froide-govplan.overrideAttrs (oldAttrs: rec {
|
||||
src = ./.;
|
||||
postInstall = oldAttrs.postInstall + ''
|
||||
rm -r $out/${pkgs.python3.sitePackages}/froide_govplan/templates
|
||||
ln -sf /var/lib/froide-govplan/templates $out/${pkgs.python3.sitePackages}/froide_govplan/templates
|
||||
cp -r froide_govplan/static $out/${pkgs.python3.sitePackages}/froide_govplan/
|
||||
'';
|
||||
});
|
||||
|
||||
pythonPackagesExtensions = super.pythonPackagesExtensions ++ [
|
||||
(python-final: python-prev: {
|
||||
moto = python-prev.moto.overridePythonAttrs (oldAttrs: {
|
||||
doCheck = false;
|
||||
});
|
||||
})
|
||||
];
|
||||
|
||||
})
|
||||
];
|
||||
};
|
||||
modules = [
|
||||
(
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
|
||||
virtualisation = {
|
||||
memorySize = 8000;
|
||||
diskSize = 4096;
|
||||
cores = 4;
|
||||
};
|
||||
|
||||
disabledModules = [ "services/web-apps/froide-govplan.nix" ];
|
||||
|
||||
imports = [ ./froide-govplan.nix ];
|
||||
|
||||
services.froide-govplan = {
|
||||
enable = true;
|
||||
package = pkgs.froide-govplan;
|
||||
settings = {
|
||||
DEBUG = lib.mkForce true;
|
||||
CSRF_TRUSTED_ORIGINS = [ "http://localhost:8080" ];
|
||||
};
|
||||
};
|
||||
|
||||
nixos-shell.mounts.extraMounts = {
|
||||
"/var/lib/froide-govplan/templates" = {
|
||||
target = /home/onny/projects/verwaltungstracker/froide_govplan/templates;
|
||||
cache = "none";
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "25.05";
|
||||
services.getty.autologinUser = "root";
|
||||
}
|
||||
)
|
||||
];
|
||||
};
|
||||
modules = [
|
||||
({ lib, config, pkgs, ... }: {
|
||||
|
||||
virtualisation = {
|
||||
memorySize = 8000;
|
||||
diskSize = 4096;
|
||||
cores = 4;
|
||||
};
|
||||
devShells.x86_64-linux.default = pkgs.mkShell {
|
||||
packages = [pkgs.python3Packages.mastodon-py ] ++ pkgs.froide-govplan.dependencies;
|
||||
shellHook = ''
|
||||
export GDAL_LIBRARY_PATH="${pkgs.gdal}/lib/libgdal.so"
|
||||
export GEOS_LIBRARY_PATH="${pkgs.geos}/lib/libgeos_c.so"
|
||||
'';
|
||||
};
|
||||
|
||||
disabledModules = [ "services/web-apps/froide-govplan.nix" ];
|
||||
packages = { inherit start; };
|
||||
defaultPackage.x86_64-linux = start;
|
||||
|
||||
imports = [ ./froide-govplan.nix ];
|
||||
|
||||
services.froide-govplan = {
|
||||
enable = true;
|
||||
package = pkgs.froide-govplan;
|
||||
settings = {
|
||||
DEBUG = lib.mkForce true;
|
||||
CSRF_TRUSTED_ORIGINS = [ "http://localhost:8080" ];
|
||||
};
|
||||
};
|
||||
|
||||
nixos-shell.mounts.extraMounts = {
|
||||
"/var/lib/froide-govplan/templates" = {
|
||||
target = /home/onny/projects/froide-govplan/froide_govplan/templates;
|
||||
cache = "none";
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "25.05";
|
||||
services.getty.autologinUser = "root";
|
||||
})
|
||||
];
|
||||
};
|
||||
|
||||
packages = { inherit start; };
|
||||
defaultPackage.x86_64-linux = start;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
),
|
||||
]
|
||||
30
froide_govplan/migrations/0016_foirequest.py
Normal file
|
|
@ -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',
|
||||
},
|
||||
),
|
||||
]
|
||||
18
froide_govplan/migrations/0017_foirequest_url.py
Normal file
|
|
@ -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'),
|
||||
),
|
||||
]
|
||||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ def send_mastodon_toot_update(sender, instance, created, **kwargs):
|
|||
f"{instance.title}: {strip_html_tags(instance.content)}\n\n"
|
||||
f"🔗 Primärquelle: {instance.url}\n"
|
||||
f"📋 Verwaltungstracker-Eintrag: {instance.plan.get_absolute_domain_url()}\n\n"
|
||||
f"#karlsruhe"
|
||||
f"#karlsruhe #kommunalpolitik"
|
||||
))
|
||||
|
||||
@receiver(post_save, sender=GovernmentPlan)
|
||||
|
|
@ -37,5 +37,5 @@ def send_mastodon_toot_plan(sender, instance, created, **kwargs):
|
|||
f"📢 Neues Verwaltungsvorhaben '{instance.title}' wurde aufgenommen.\n\n"
|
||||
f"🔗 Primärquelle: {instance.reference}\n"
|
||||
f"📋 Verwaltungstracker-Eintrag: {instance.get_absolute_domain_url()}\n\n"
|
||||
f"#karlsruhe"
|
||||
f"#karlsruhe #kommunalpolitik"
|
||||
))
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 403 KiB |
|
|
@ -1,32 +1,58 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="640.000000pt" height="640.000000pt" viewBox="0 0 640.000000 640.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
<metadata>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.0"
|
||||
width="451.27914pt"
|
||||
height="368.35001pt"
|
||||
viewBox="0 0 451.27914 368.35001"
|
||||
preserveAspectRatio="xMidYMid"
|
||||
id="svg3"
|
||||
sodipodi:docname="logo.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs3" />
|
||||
<sodipodi:namedview
|
||||
id="namedview3"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="pt">
|
||||
<inkscape:page
|
||||
x="9.9261674e-24"
|
||||
y="0"
|
||||
width="451.27914"
|
||||
height="368.35001"
|
||||
id="page2"
|
||||
margin="0"
|
||||
bleed="0" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata1">
|
||||
Created by potrace 1.16, written by Peter Selinger 2001-2019
|
||||
</metadata>
|
||||
<g transform="translate(0.000000,640.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M990 5042 c0 -10 668 -1325 1170 -2302 103 -201 249 -486 325 -635
|
||||
76 -148 192 -377 259 -507 l121 -238 132 0 132 0 44 83 c25 45 109 208 187
|
||||
362 78 154 176 344 216 421 41 78 74 144 74 146 0 3 -60 8 -132 11 -140 5
|
||||
-238 28 -371 83 -327 137 -587 446 -678 805 -27 108 -37 337 -19 447 16 98 53
|
||||
227 84 292 l25 51 -247 489 -247 489 -538 3 c-295 2 -537 2 -537 0z"/>
|
||||
<path d="M3850 4880 c-44 -88 -80 -162 -80 -165 0 -3 15 -5 33 -5 117 0 387
|
||||
-109 517 -209 66 -50 205 -189 251 -250 l26 -35 210 412 210 412 -544 0 -543
|
||||
0 -80 -160z"/>
|
||||
<path d="M3431 4609 c-74 -13 -218 -62 -293 -100 -273 -138 -477 -392 -557
|
||||
-692 -149 -557 191 -1143 755 -1304 92 -26 112 -28 274 -28 161 0 183 3 275
|
||||
29 100 28 241 88 293 124 l27 20 92 -87 c91 -86 92 -88 81 -117 -6 -17 -8 -43
|
||||
-4 -59 11 -42 724 -757 783 -785 62 -29 136 -27 202 6 101 51 148 159 117 268
|
||||
-16 53 -31 72 -210 259 -304 316 -528 535 -557 542 -15 4 -40 5 -55 3 -23 -2
|
||||
-35 4 -58 32 -16 19 -56 63 -89 96 l-59 62 45 63 c243 344 254 817 26 1187
|
||||
-99 161 -283 324 -457 404 -141 64 -222 81 -407 84 -93 1 -194 -2 -224 -7z
|
||||
m397 -325 c251 -72 427 -242 515 -498 28 -84 31 -102 31 -226 1 -157 -13 -221
|
||||
-74 -345 -48 -96 -107 -170 -198 -247 -144 -123 -292 -177 -488 -178 -208 0
|
||||
-389 75 -539 225 -151 151 -220 321 -219 535 1 126 17 203 64 306 88 194 271
|
||||
359 475 429 111 38 297 37 433 -1z"/>
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.1,0,0,-0.1,-98.999998,504.35001)"
|
||||
fill="#000000"
|
||||
stroke="none"
|
||||
id="g3"
|
||||
style="fill:#d0d9e3;fill-opacity:1">
|
||||
<path
|
||||
d="m 990,5042 c 0,-10 668,-1325 1170,-2302 103,-201 249,-486 325,-635 76,-148 192,-377 259,-507 l 121,-238 h 132 132 l 44,83 c 25,45 109,208 187,362 78,154 176,344 216,421 41,78 74,144 74,146 0,3 -60,8 -132,11 -140,5 -238,28 -371,83 -327,137 -587,446 -678,805 -27,108 -37,337 -19,447 16,98 53,227 84,292 l 25,51 -247,489 -247,489 -538,3 c -295,2 -537,2 -537,0 z"
|
||||
id="path1"
|
||||
style="fill:#d0d9e3;fill-opacity:1" />
|
||||
<path
|
||||
d="m 3850,4880 c -44,-88 -80,-162 -80,-165 0,-3 15,-5 33,-5 117,0 387,-109 517,-209 66,-50 205,-189 251,-250 l 26,-35 210,412 210,412 h -544 -543 z"
|
||||
id="path2"
|
||||
style="fill:#d0d9e3;fill-opacity:1" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:#4a80ff;fill-opacity:1;stroke-width:1.31147"
|
||||
d="m 420.75275,343.52243 c -5.83526,-3.27992 -38.20704,-34.29898 -60.6912,-58.15509 -18.32936,-19.44779 -18.66159,-19.90538 -17.89077,-24.64048 0.75445,-4.63459 0.4203,-5.1655 -8.48064,-13.47439 l -9.26605,-8.64971 -8.08422,4.37936 c -4.44632,2.40865 -13.69079,6.22615 -20.54324,8.48333 -11.64385,3.83545 -13.70321,4.10411 -31.47541,4.10612 -16.03493,0.002 -20.45572,-0.45525 -28.19672,-2.91535 -34.55542,-10.98177 -61.0916,-37.22892 -72.29559,-71.50814 -5.01411,-15.34098 -5.86127,-38.98887 -1.95148,-54.47477 8.83875,-35.0086 33.57583,-63.63031 65.45743,-75.73667 16.83735,-6.39362 22.44591,-7.25054 42.74279,-6.53051 21.53188,0.76383 32.39378,3.72546 48.04886,13.10112 33.64963,20.15238 52.73208,54.05633 52.61243,93.47689 -0.0667,21.99484 -5.27874,39.30116 -17.49127,58.07966 l -5.36118,8.24358 3.10362,3.5597 c 11.58805,13.29087 14.88298,16.01869 19.34884,16.01869 3.92632,0 6.35204,1.81475 19.72143,14.75411 28.38275,27.46981 57.01756,57.94523 59.45682,63.27868 2.84789,6.22689 2.21997,13.50841 -1.71378,19.87334 -5.52588,8.94105 -18.96147,13.27735 -27.05067,8.73053 z M 291.20646,222.45529 c 23.50199,-8.99012 42.36666,-29.68019 48.48736,-53.17908 2.65483,-10.19261 2.60885,-30.84152 -0.0891,-40.02125 -6.0326,-20.52564 -21.24475,-39.20765 -38.70794,-47.53713 -14.36143,-6.85003 -19.72884,-7.99455 -37.23127,-7.93899 -12.91542,0.041 -17.03816,0.55674 -22.98934,2.87589 -22.21155,8.65575 -41.00234,28.03218 -48.55388,50.06712 -4.17982,12.19644 -4.3082,33.68436 -0.27848,46.61183 7.37511,23.65959 30.14817,45.08605 54.4737,51.2526 10.87176,2.756 35.12306,1.60473 44.88898,-2.13099 z"
|
||||
id="path4" />
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 180 KiB |
|
|
@ -1 +0,0 @@
|
|||
<svg viewBox="0 0 216.41 232.01" xmlns="http://www.w3.org/2000/svg"><path d="M107.85822 0C78.20448.2425 49.67197 3.45428 33.04465 11.0905c0 0-32.9769 14.75141-32.9769 65.08244 0 11.52456-.22401 25.31035.141 39.91645 1.19749 49.21822 9.02412 97.73333 54.53223 109.78008 20.98196 5.54994 38.99677 6.71242 53.51099 5.90618 26.30597-1.4531 41.08081-9.38427 41.08081-9.38427l-.87186-19.0873s-18.79668 5.92494-39.91833 5.20307c-20.9229-.7125-43.00735-2.25935-46.39169-27.9372-.31312-2.25935-.47062-4.6687-.47062-7.19992 0 0 20.53947 5.02494 46.57169 6.20618 15.9092.73124 30.84342-.92812 45.99326-2.73747 29.06219-3.46871 54.3838-21.38415 57.56189-37.74335 5.01557-25.78097 4.60307-62.92245 4.60307-62.92245 0-50.33103-32.9809-65.08243-32.9809-65.08243C166.79822 3.45428 138.25165.2425 108.58947 0h-.73125zM74.29608 39.3249c12.35518 0 21.71227 4.74932 27.89033 14.24797l6.02806 10.0827 6.00931-10.0827c6.18744-9.49865 15.53421-14.24798 27.8997-14.24798 10.67802 0 19.2748 3.75465 25.8466 11.07832 6.36556 7.32274 9.54365 17.21888 9.54365 29.67344v60.9406h-24.14037v-59.15c0-12.46862-5.24994-18.79574-15.74045-18.79574-11.6155 0-17.42794 7.50649-17.42794 22.35164v32.37247H96.20522V85.42315c0-14.84515-5.81337-22.35164-17.41575-22.35164-10.49426 0-15.73952 6.32806-15.73952 18.79574v59.15H38.90584v-60.9406c0-12.45456 3.16965-22.3507 9.5399-29.67344 6.56899-7.32273 15.1714-11.07832 25.85034-11.07832z" fill="#abbac9"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
|
@ -7,6 +7,29 @@
|
|||
{% endblock meta %}
|
||||
{% block app_body %}
|
||||
|
||||
<h1>Hello World!</h1>
|
||||
<h1 class="col-md-8">Für eine transparente Kommunalverwaltung!</h1>
|
||||
|
||||
<p class="col-md-8">
|
||||
Mit unserem Projekt VerwaltungsTracker.de möchten wir Transparenz
|
||||
in die Vorhaben der Kommunalverwaltungen bringen.
|
||||
Für Karlsruhe haben wir über 60 überprüfbare Projekte identifiziert
|
||||
die wir für eine gerechte sozial-ökologische Zukunft unserer Stadt
|
||||
für sinnvoll erachten.
|
||||
</p>
|
||||
|
||||
<p class="col-md-8">
|
||||
In verschiedenen Kategorien sammeln wir die Vorhaben, verlinken
|
||||
die Quellen aus der Lokalpresse oder Gemeinderatsdokumenten und
|
||||
listen chronologisch aktuelle Entwicklungen auf der jeweiligen
|
||||
Unterseite.
|
||||
</p>
|
||||
|
||||
<p class="col-md-8">
|
||||
Du hast ein wichtiges Vorhaben, welches hierher gehört? Dann
|
||||
schicke uns eine Mail an <a href="mailto:onny@project-insanity.org">
|
||||
onny@project-insanity.org</a>. Zu einem Vorhaben gibt es eine neue
|
||||
Entwicklung? Dann nutze das Formular auf der Vorhaben-Seite zum Melden
|
||||
neuer Entwicklungen.
|
||||
</p>
|
||||
|
||||
{% endblock app_body %}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,12 @@
|
|||
{% load static %}
|
||||
{% block body %}
|
||||
|
||||
<style>
|
||||
#govplan-searchresult-275111 .card-body {
|
||||
padding: 1rem !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
|
||||
<symbol id="check2" viewBox="0 0 16 16">
|
||||
<path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z" />
|
||||
|
|
@ -71,7 +77,7 @@
|
|||
<div class="col-lg-10 mx-auto p-4 py-md-5">
|
||||
<header class="d-flex align-items-center pb-3 mb-5 border-bottom">
|
||||
<a href="/" class="d-flex align-items-center text-body-emphasis text-decoration-none text-reset">
|
||||
<img src="{% static 'froide_govplan/images/apple-touch-icon.png' %}" class="bi me-2" height="50">
|
||||
<img src="{% static 'froide_govplan/images/logo.svg' %}" class="bi me-2" height="50">
|
||||
<span class="fs-4">VerwaltungsTracker</span>
|
||||
</a>
|
||||
<div style="margin-left: auto; max-width: 350px;" class="search">
|
||||
|
|
@ -135,7 +141,7 @@
|
|||
<div class="mt-4">
|
||||
{% include "froide_govplan/plugins/progress_row.html" with object_list=plans %}
|
||||
<p class="small text-body-secondary mt-3 no-hyphens">
|
||||
<span class="text-nowrap me-1"><i class="fa fa-circle text-light"></i> nicht begonnen</span>
|
||||
<span class="text-nowrap me-1"><i class="fa fa-circle" style="color: #d4d8da;"></i> nicht begonnen</span>
|
||||
<span class="text-nowrap me-1"><i class="fa fa-circle text-primary"></i> begonnen</span>
|
||||
<span class="text-nowrap me-1"><i class="fa fa-circle text-warning"></i> teilweise umgesetzt</span>
|
||||
<span class="text-nowrap me-1"><i class="fa fa-circle text-success"></i> umgesetzt</span>
|
||||
|
|
@ -176,7 +182,7 @@
|
|||
<p>
|
||||
<a class="btn btn-primary" href="mailto:onny@project-insanity.org?subject=Verwaltungstracker">
|
||||
<i class="fa fa-envelope"> </i>
|
||||
onny@project-insanity.org
|
||||
<span class="small">onny@project-insanity.org</span>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -193,16 +199,20 @@
|
|||
<div class="row g-4">
|
||||
<div class="col-12 col-md-6 col-lg-8">
|
||||
<a href="/" class="d-flex align-items-center text-body-emphasis text-decoration-none text-reset mb-3">
|
||||
<img src="{% static 'froide_govplan/images/apple-touch-icon.png' %}" class="bi me-2" height="35">
|
||||
<img src="{% static 'froide_govplan/images/logo.svg' %}" class="bi me-2" height="35">
|
||||
<span class="fs-6">VerwaltungsTracker</span>
|
||||
</a>
|
||||
<p style="max-width: 300px;">
|
||||
Folge uns auf Mastodon für neue Entwicklungen in Verwaltungsvorhaben:
|
||||
</p>
|
||||
<div class="mt-3 mb-4">
|
||||
<a href="https://social.project-insanity.org/@verwaltungstracker" target="_blank" class="inline-flex items-center px-3 py-2 text-sm font-medium bg-gray-700 shadow-sm rounded-md text-gray-50 hover:bg-gray-600 focus:outline-none focus:ring-2 focus:ring-gray-500">
|
||||
<img src="{% static 'froide_govplan/images/mastodon-footer.svg' %}" widith="20" height="20" class="me-2">
|
||||
@verwaltungstracker
|
||||
<a href="https://social.project-insanity.org/@verwaltungstracker" target="_blank"
|
||||
<button type="button" class="btn btn-secondary">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-mastodon me-1" viewBox="0 0 16 16">
|
||||
<path d="M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764q.662.757.661 2.046z"></path>
|
||||
</svg>
|
||||
<span class="small" style="vertical-align: text-bottom;">@verwaltungstracker</span>
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -83,7 +83,20 @@
|
|||
{% with foirequest=object.get_recent_foirequest %}
|
||||
<dt>Anfrage</dt>
|
||||
<dd>
|
||||
{% include "foirequest/snippets/request_item_mini.html" with object=foirequest %}
|
||||
<div class="mb-0 d-flex flex-column">
|
||||
<div class="flex-grow-1">
|
||||
<span class="mt-0 mb-1">
|
||||
<a href="{{ foirequest.url }}" target="_blank" class="text-decoration-none">
|
||||
{{ foirequest.title|default:"Aktuell laufende Anfrage" }}
|
||||
</a>
|
||||
<br>
|
||||
<small class="text-gray-700">
|
||||
gestartet am {{ foirequest.created_at|date:"d.m.Y" }},
|
||||
vor {{ foirequest.created_at|timesince }}
|
||||
</small>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</dd>
|
||||
{% endwith %}
|
||||
{% endif %}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<div class="flex-grow-1 ms-2">
|
||||
<div class="progress" {% if "progress-lg" in instance.extra_classes %}style="height: 1.5rem;"{% endif %}>
|
||||
{% for section in progress.sections %}
|
||||
<div class="progress-bar bg-{{ section.css_class }}" role="progressbar" style="width: {{ section.css_percentage }}%;" aria-valuenow="{{ section.css_percentage }}" aria-valuemin="0" aria-valuemax="100" aria-label="{{ section.percentage }}% {{ section.label }}" title="{{ section.percentage }}% {{ section.label }}" data-bs-toggle="tooltip" data-placement="top">
|
||||
<div class="progress-bar {% if section.css_class == 'light' %}bg-dark bg-opacity-10{% else %}bg-{{ section.css_class }}{% endif %}" role="progressbar" style="width: {{ section.css_percentage }}%;" aria-valuenow="{{ section.css_percentage }}" aria-valuemin="0" aria-valuemax="100" aria-label="{{ section.percentage }}% {{ section.label }}" title="{{ section.percentage }}% {{ section.label }}" data-bs-toggle="tooltip" data-placement="top">
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
<div class="col-sm-10">
|
||||
<div class="progress" {% if "progress-lg" in instance.extra_classes %}style="height: 1.5rem;"{% endif %}>
|
||||
{% for section in progress.sections %}
|
||||
<div class="progress-bar bg-{{ section.css_class }}" role="progressbar" style="width: {{ section.css_percentage }}%;" aria-valuenow="{{ section.css_percentage }}" aria-valuemin="0" aria-valuemax="100" aria-label="{{ section.percentage }}% {{ section.label }}" title="{{ section.percentage }}% {{ section.label }}" data-bs-toggle="tooltip" data-placement="top">
|
||||
<div class="progress-bar {% if section.css_class == 'light' %}bg-dark bg-opacity-10{% else %}bg-{{ section.css_class }}{% endif %}" role="progressbar" style="width: {{ section.css_percentage }}%;" aria-valuenow="{{ section.css_percentage }}" aria-valuemin="0" aria-valuemax="100" aria-label="{{ section.percentage }}% {{ section.label }}" title="{{ section.percentage }}% {{ section.label }}" data-bs-toggle="tooltip" data-placement="top">
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -113,10 +113,10 @@
|
|||
<div class="col-md-5 d-flex align-items-center justify-content-center order-1 order-md-2 mb-4">
|
||||
<img src="{% static 'froide_govplan/images/teaser_image_1.webp' %}" height="250px">
|
||||
</div>
|
||||
<div class="col-md-7 order-2 order-md-1">
|
||||
<h2 class="featurette-heading fw-normal lh-1">We’re watching you! <span class="text-body-secondary">Karlsruhe.</span></h2>
|
||||
<div class="col-md-7 order-2 order-md-1 mb-4">
|
||||
<h2 class="featurette-heading fw-normal lh-1 mb-4">We’re watching you! <span class="text-body-secondary">Karlsruhe.</span></h2>
|
||||
<p class="lead">
|
||||
Wir haben die Verwaltungsvorhaben der Stadt Karlsruhe genau unter die Lupe genommen und rund 250 überprüfbare Projekte identifiziert, die die Stadtverwaltung plant: Es geht um Klimaschutz und Digitalisierung, um Vorhaben im Bereich Wohnen und Mobilität, um moderne Verwaltungsprozesse und Maßnahmen zur Gleichstellung.
|
||||
Wir haben die Verwaltungsvorhaben der Stadt Karlsruhe genau unter die Lupe genommen und rund 60 überprüfbare Projekte identifiziert, die die Stadtverwaltung plant: Es geht um Klimaschutz und Digitalisierung, um Vorhaben im Bereich Wohnen und Mobilität, um moderne Verwaltungsprozesse und Maßnahmen zur Gleichstellung.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,100 +1,148 @@
|
|||
{% load markup %}
|
||||
|
||||
<style>
|
||||
.govplan-update .card-body div.tight-margin {
|
||||
flex-grow: 1;
|
||||
overflow: hidden; /* make sure content doesn’t spill */
|
||||
}
|
||||
|
||||
.govplan-update .card-header h3 {
|
||||
min-height: 2.4em;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
}
|
||||
|
||||
#myCarousel .card {
|
||||
height: 380px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
#myCarousel .card-body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Multiline ellipsis for content */
|
||||
#myCarousel .tight-margin {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#myCarousel .tight-margin p,
|
||||
#myCarousel .tight-margin div {
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 3; /* number of lines to show */
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
#myCarousel .badge {
|
||||
font-weight: 400;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Update tiles on start page -->
|
||||
{% if request.path == '/' %}
|
||||
|
||||
<div class="py-5 bg-body-tertiary">
|
||||
|
||||
<div class="mb-4">
|
||||
<h1 class="text-body-emphasis">Aktuelles</h1>
|
||||
<p class="fs-5 col-md-8">
|
||||
Hier finden Sie aktuelle Artikel und Links zu Blogs zu den Fortschritten der Stadtverwaltung Karlsruhe.
|
||||
</p>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<h1 class="text-body-emphasis">Aktuelles</h1>
|
||||
<p class="fs-5 col-md-8">
|
||||
Hier finden Sie aktuelle Artikel und Links zu Blogs zu den Fortschritten der Stadtverwaltung Karlsruhe.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="myCarousel" class="carousel slide" data-bs-ride="carousel">
|
||||
<div class="carousel-inner w-100">
|
||||
|
||||
{% for update in updates %}
|
||||
<div class="carousel-item {% if forloop.first %}active{% endif %}">
|
||||
<div class="card col-md-4">
|
||||
<a href="{{ update.get_absolute_url }}" class="text-body text-decoration-none">
|
||||
<div class="card-header p-4 tight-margin text-start">
|
||||
{% if show_context %}
|
||||
<span class="badge text-bg-light text-decoration-none me-2 mb-2">
|
||||
{{ update.plan.get_section }}
|
||||
</span>
|
||||
{% endif %}
|
||||
|
||||
{% if show_context %}
|
||||
<h3 class="h5 mt-0 ellipsis">{{ update.plan }}</h3>
|
||||
{% else %}
|
||||
<h3 class="h4 mt-0 ellipsis">{{ update.title }}</h3>
|
||||
{% endif %}
|
||||
|
||||
<div class="small">
|
||||
<time datetime="{{ update.timestamp|date:'c' }}">{{ update.timestamp|date:"DATE_FORMAT" }}</time>
|
||||
|
||||
{% if update.user or update.organization %}
|
||||
<span>
|
||||
von {{ update.user.get_full_name }}{% if update.user and update.organization %},{% endif %}
|
||||
{{ update.organization.name }}
|
||||
</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</a>
|
||||
<div class="card-body tight-margin text-start p-4 d-flex flex-column">
|
||||
|
||||
{% if update.content or show_context %}
|
||||
<div class="tight-margin">
|
||||
{% if show_context %}
|
||||
<h4 class="h5">{{ update.title }}</h4>
|
||||
{% endif %}
|
||||
|
||||
{% with update.content|markdown as content %}
|
||||
<div id="myCarousel" class="carousel slide" data-bs-ride="carousel">
|
||||
<div class="carousel-inner w-100">
|
||||
|
||||
{% for update in updates %}
|
||||
<div class="carousel-item {% if forloop.first %}active{% endif %}">
|
||||
<div class="card col-md-4">
|
||||
<a href="{{ update.get_absolute_url }}" class="text-body text-decoration-none">
|
||||
<div class="card-header p-4 tight-margin text-start">
|
||||
{% if show_context %}
|
||||
{{ content|truncatewords_html:15 }}
|
||||
<h3 class="h5 mt-0 ellipsis">{{ update.plan }}</h3>
|
||||
{% else %}
|
||||
{{ content }}
|
||||
<h3 class="h4 mt-0 ellipsis">{{ update.title }}</h3>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if update.url or update.foirequest or show_context %}
|
||||
<div class="{% if update.content %}box-card-links{% else %}d-flex mt-auto{% endif %} mt-auto">
|
||||
{% if show_context %}
|
||||
<a href="{{ update.get_absolute_url }}" class="action-link">→ zum Vorhaben</a>
|
||||
{% else %}
|
||||
{% if update.url %}
|
||||
<a href="{{ update.url }}" class="action-link me-3" target="_blank" rel="noopener">→ mehr auf {{ update.get_url_domain }} lesen…</a>
|
||||
{% endif %}
|
||||
|
||||
{% if update.foirequest %}
|
||||
<a href="{{ update.foirequest.get_absolute_url }}" class="action-link">→ zur Anfrage</a>
|
||||
<div class="small">
|
||||
<time datetime="{{ update.timestamp|date:'c' }}">{{ update.timestamp|date:"DATE_FORMAT" }}</time>
|
||||
{% if update.user or update.organization %}
|
||||
<span>
|
||||
von {{ update.user.get_full_name }}{% if update.user and update.organization %},{% endif %}
|
||||
{{ update.organization.name }}
|
||||
</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
<div class="card-body tight-margin text-start p-4 d-flex flex-column">
|
||||
|
||||
{% if update.content or show_context %}
|
||||
<div class="tight-margin flex-grow-1">
|
||||
{% if show_context %}
|
||||
<h4 class="h5">{{ update.title }}</h4>
|
||||
{% endif %}
|
||||
{% with update.content|markdown as content %}
|
||||
{% if show_context %}
|
||||
{{ content|truncatewords_html:15 }}
|
||||
{% else %}
|
||||
{{ content }}
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if update.url or update.foirequest or show_context %}
|
||||
<div class="{% if update.content %}box-card-links{% else %}d-flex mt-auto{% endif %} mt-auto">
|
||||
{% if show_context %}
|
||||
<a href="{{ update.get_absolute_url }}" class="action-link">→ zum Vorhaben</a>
|
||||
{% else %}
|
||||
{% if update.url %}
|
||||
<a href="{{ update.url }}" class="action-link me-3" target="_blank" rel="noopener">
|
||||
→ mehr auf {{ update.get_url_domain }} lesen…
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if update.foirequest %}
|
||||
<a href="{{ update.foirequest.get_absolute_url }}" class="action-link">→ zur Anfrage</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if show_context %}
|
||||
<div class="d-md-flex mt-2 align-items-center mt-3">
|
||||
<ul class="list-unstyled d-flex m-0">
|
||||
{% for cat in update.plan.categories.all %}
|
||||
<li>
|
||||
<span class="badge bg-secondary text-decoration-none me-2 mb-2">
|
||||
#{{ cat.name }}
|
||||
</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
<button class="carousel-control-prev" type="button" data-bs-target="#myCarousel" data-bs-slide="prev">
|
||||
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Previous</span>
|
||||
</button>
|
||||
<button class="carousel-control-next" type="button" data-bs-target="#myCarousel" data-bs-slide="next">
|
||||
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Next</span>
|
||||
</button>
|
||||
</div>
|
||||
<button class="carousel-control-prev" type="button" data-bs-target="#myCarousel" data-bs-slide="prev">
|
||||
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Previous</span>
|
||||
</button>
|
||||
<button class="carousel-control-next" type="button" data-bs-target="#myCarousel" data-bs-slide="next">
|
||||
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Next</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{% else %}
|
||||
|
|
@ -106,7 +154,7 @@
|
|||
</p>
|
||||
</div>
|
||||
|
||||
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 g-3">
|
||||
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 g-3 govplan-update">
|
||||
{% for update in updates %}
|
||||
<div class="col">
|
||||
<div class="card mb-4 rounded-3 shadow-sm">
|
||||
|
|
@ -119,9 +167,17 @@
|
|||
{% endif %}
|
||||
|
||||
{% if show_context %}
|
||||
<h3 class="h5 mt-0 ellipsis">{{ update.plan }}</h3>
|
||||
<h3 class="h5 mt-0">
|
||||
<span class="title-text ellipsis">
|
||||
{{ update.plan }}
|
||||
</span>
|
||||
</h3>
|
||||
{% else %}
|
||||
<h3 class="h4 mt-0 ellipsis">{{ update.title }}</h3>
|
||||
<h3 class="h4 mt-0">
|
||||
<span class="title-text ellipsis">
|
||||
{{ update.title }}
|
||||
</span>
|
||||
</h3>
|
||||
{% endif %}
|
||||
|
||||
<div class="small">
|
||||
|
|
|
|||
|
|
@ -8,13 +8,13 @@
|
|||
{{ object.title }} - VerwaltungsTracker
|
||||
{% endblock title %}
|
||||
{% block metaDescription %}
|
||||
Hier finden Sie alle Vorhaben aus dem Bereich „{{ section }}“, welche die Stadtverwaltung festgelegt hat. Auf den jeweiligen Detailseiten erhalten Sie mehr Informationen, können Neuigkeiten abonnieren oder Änderungen einreichen.
|
||||
Hier finden Sie alle Vorhaben aus dem Bereich „{{ object.title }}“, welche die Stadtverwaltung festgelegt hat. Auf den jeweiligen Detailseiten erhalten Sie mehr Informationen, können Neuigkeiten abonnieren oder Änderungen einreichen.
|
||||
{% endblock %}
|
||||
{% block ogTitle %}
|
||||
{{ object.title }} - VerwaltungsTracker
|
||||
{% endblock ogTitle %}
|
||||
{% block ogDescription %}
|
||||
Hier finden Sie alle Vorhaben aus dem Bereich „{{ section }}“, welche die Stadtverwaltung festgelegt hat. Auf den jeweiligen Detailseiten erhalten Sie mehr Informationen, können Neuigkeiten abonnieren oder Änderungen einreichen.
|
||||
Hier finden Sie alle Vorhaben aus dem Bereich „{{ object.title }}“, welche die Stadtverwaltung festgelegt hat. Auf den jeweiligen Detailseiten erhalten Sie mehr Informationen, können Neuigkeiten abonnieren oder Änderungen einreichen.
|
||||
{% endblock %}
|
||||
{% block meta %}
|
||||
{% include "snippets/meta.html" %}
|
||||
|
|
@ -40,7 +40,7 @@ Hier finden Sie alle Vorhaben aus dem Bereich „{{ section }}“, welche die St
|
|||
<div class="mt-5">
|
||||
{% include "froide_govplan/plugins/progress_row.html" with object_list=plans %}
|
||||
<p class="small text-body-secondary mt-3 no-hyphens">
|
||||
<span class="text-nowrap me-1"><i class="fa fa-circle text-light"></i> nicht begonnen</span>
|
||||
<span class="text-nowrap me-1"><i class="fa fa-circle" style="color: #d4d8da;"></i> nicht begonnen</span>
|
||||
<span class="text-nowrap me-1"><i class="fa fa-circle text-primary"></i> begonnen</span>
|
||||
<span class="text-nowrap me-1"><i class="fa fa-circle text-warning"></i> teilweise umgesetzt</span>
|
||||
<span class="text-nowrap me-1"><i class="fa fa-circle text-success"></i> umgesetzt</span>
|
||||
|
|
|
|||