From 18002103b2aa60cec620447af8bafc143ffd46fa Mon Sep 17 00:00:00 2001 From: Stefan Wehrmeyer Date: Fri, 3 Feb 2023 15:42:17 +0100 Subject: [PATCH] Make foirequest connection optional on setup --- froide_govplan/admin.py | 4 +- froide_govplan/migrations/0001_initial.py | 54 +- .../migrations/0003_auto_20220228_1051.py | 531 +++++++++--------- froide_govplan/models.py | 24 +- 4 files changed, 334 insertions(+), 279 deletions(-) diff --git a/froide_govplan/admin.py b/froide_govplan/admin.py index cb4c923..afb97d7 100644 --- a/froide_govplan/admin.py +++ b/froide_govplan/admin.py @@ -242,7 +242,9 @@ class GovernmentPlanAdmin(admin.ModelAdmin): class GovernmentPlanUpdateAdmin(admin.ModelAdmin): form = GovernmentPlanUpdateForm save_on_top = True - raw_id_fields = ("user", "foirequest") + raw_id_fields = ["user"] + ( + ["foirequest"] if conf.GOVPLAN_ENABLE_FOIREQUEST else [] + ) date_hierarchy = "timestamp" search_fields = ("title", "content") list_display = ( diff --git a/froide_govplan/migrations/0001_initial.py b/froide_govplan/migrations/0001_initial.py index aa4c7c5..970de4b 100644 --- a/froide_govplan/migrations/0001_initial.py +++ b/froide_govplan/migrations/0001_initial.py @@ -8,19 +8,31 @@ from django.db import migrations, models import filer.fields.image import taggit.managers +from .. import conf + class Migration(migrations.Migration): initial = True - dependencies = [ - ("publicbody", "0039_publicbody_alternative_emails"), - ("auth", "0012_alter_user_first_name_max_length"), - ("foirequest", "0054_alter_foirequest_options"), - migrations.swappable_dependency(settings.FILER_IMAGE_MODEL), - ("organization", "0001_initial"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] + dependencies = ( + [ + ("publicbody", "0039_publicbody_alternative_emails"), + ("auth", "0012_alter_user_first_name_max_length"), + ] + + ( + [ + ("foirequest", "0054_alter_foirequest_options"), + ] + if conf.GOVPLAN_ENABLE_FOIREQUEST + else [] + ) + + [ + migrations.swappable_dependency(settings.FILER_IMAGE_MODEL), + ("organization", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + ) operations = [ migrations.CreateModel( @@ -217,15 +229,23 @@ class Migration(migrations.Migration): ), ), ("public", models.BooleanField(default=False)), - ( - "foirequest", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="foirequest.foirequest", - ), - ), + ] + + ( + [ + ( + "foirequest", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="foirequest.foirequest", + ), + ) + ] + if conf.GOVPLAN_ENABLE_FOIREQUEST + else [] + ) + + [ ( "organization", models.ForeignKey( diff --git a/froide_govplan/migrations/0003_auto_20220228_1051.py b/froide_govplan/migrations/0003_auto_20220228_1051.py index 2696dce..dd49139 100644 --- a/froide_govplan/migrations/0003_auto_20220228_1051.py +++ b/froide_govplan/migrations/0003_auto_20220228_1051.py @@ -5,6 +5,8 @@ import django.utils.timezone from django.conf import settings from django.db import migrations, models +from .. import conf + class Migration(migrations.Migration): @@ -13,273 +15,296 @@ class Migration(migrations.Migration): ("publicbody", "0039_publicbody_alternative_emails"), ("organization", "0001_initial"), ("auth", "0012_alter_user_first_name_max_length"), - ("foirequest", "0054_alter_foirequest_options"), ("froide_govplan", "0002_auto_20220215_2113"), - ] + ] + ( + [("foirequest", "0054_alter_foirequest_options")] + if conf.GOVPLAN_ENABLE_FOIREQUEST + else [] + ) - operations = [ - migrations.AddField( - model_name="governmentplan", - name="due_date", - field=models.DateField(blank=True, null=True, verbose_name="due date"), - ), - migrations.AddField( - model_name="governmentplan", - name="measure", - field=models.CharField(blank=True, max_length=255, verbose_name="measure"), - ), - migrations.AddField( - model_name="governmentplan", - name="quote", - field=models.TextField(blank=True, verbose_name="quote"), - ), - migrations.AlterField( - model_name="government", - name="description", - field=models.TextField(blank=True, verbose_name="description"), - ), - migrations.AlterField( - model_name="government", - name="end_date", - field=models.DateField(blank=True, null=True, verbose_name="end date"), - ), - migrations.AlterField( - model_name="government", - name="jurisdiction", - field=models.ForeignKey( - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="publicbody.jurisdiction", - verbose_name="jurisdiction", + operations = ( + [ + migrations.AddField( + model_name="governmentplan", + name="due_date", + field=models.DateField(blank=True, null=True, verbose_name="due date"), ), - ), - migrations.AlterField( - model_name="government", - name="name", - field=models.CharField(max_length=255, verbose_name="name"), - ), - migrations.AlterField( - model_name="government", - name="planning_document", - field=models.URLField(blank=True, verbose_name="planning document"), - ), - migrations.AlterField( - model_name="government", - name="public", - field=models.BooleanField(default=False, verbose_name="is public?"), - ), - migrations.AlterField( - model_name="government", - name="slug", - field=models.SlugField(max_length=255, unique=True, verbose_name="slug"), - ), - migrations.AlterField( - model_name="government", - name="start_date", - field=models.DateField(blank=True, null=True, verbose_name="start date"), - ), - migrations.AlterField( - model_name="governmentplan", - name="description", - field=models.TextField(blank=True, verbose_name="description"), - ), - migrations.AlterField( - model_name="governmentplan", - name="government", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="froide_govplan.government", - verbose_name="government", + migrations.AddField( + model_name="governmentplan", + name="measure", + field=models.CharField( + blank=True, max_length=255, verbose_name="measure" + ), ), - ), - migrations.AlterField( - model_name="governmentplan", - name="group", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="auth.group", - verbose_name="group", + migrations.AddField( + model_name="governmentplan", + name="quote", + field=models.TextField(blank=True, verbose_name="quote"), ), - ), - migrations.AlterField( - model_name="governmentplan", - name="organization", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="organization.organization", - verbose_name="organization", + migrations.AlterField( + model_name="government", + name="description", + field=models.TextField(blank=True, verbose_name="description"), ), - ), - migrations.AlterField( - model_name="governmentplan", - name="public", - field=models.BooleanField(default=False, verbose_name="is public?"), - ), - migrations.AlterField( - model_name="governmentplan", - name="rating", - field=models.IntegerField( - blank=True, - choices=[ - (1, "terrible"), - (2, "bad"), - (3, "OK"), - (4, "good"), - (5, "excellent"), - ], - null=True, - verbose_name="rating", + migrations.AlterField( + model_name="government", + name="end_date", + field=models.DateField(blank=True, null=True, verbose_name="end date"), ), - ), - migrations.AlterField( - model_name="governmentplan", - name="reference", - field=models.CharField( - blank=True, max_length=255, verbose_name="reference" + migrations.AlterField( + model_name="government", + name="jurisdiction", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="publicbody.jurisdiction", + verbose_name="jurisdiction", + ), ), - ), - migrations.AlterField( - model_name="governmentplan", - name="responsible_publicbody", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="publicbody.publicbody", - verbose_name="responsible public body", + migrations.AlterField( + model_name="government", + name="name", + field=models.CharField(max_length=255, verbose_name="name"), ), - ), - migrations.AlterField( - model_name="governmentplan", - name="slug", - field=models.SlugField(max_length=255, unique=True, verbose_name="slug"), - ), - migrations.AlterField( - model_name="governmentplan", - name="status", - field=models.CharField( - choices=[ - ("not_started", "not started"), - ("started", "started"), - ("partially_implemented", "partially implemented"), - ("implemented", "implemented"), - ("deferred", "deferred"), - ], - default="not_started", - max_length=25, - verbose_name="status", + migrations.AlterField( + model_name="government", + name="planning_document", + field=models.URLField(blank=True, verbose_name="planning document"), ), - ), - migrations.AlterField( - model_name="governmentplan", - name="title", - field=models.CharField(max_length=255, verbose_name="title"), - ), - migrations.AlterField( - model_name="governmentplanupdate", - name="content", - field=models.TextField(blank=True, verbose_name="content"), - ), - migrations.AlterField( - model_name="governmentplanupdate", - name="foirequest", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="foirequest.foirequest", - verbose_name="FOI request", + migrations.AlterField( + model_name="government", + name="public", + field=models.BooleanField(default=False, verbose_name="is public?"), ), - ), - migrations.AlterField( - model_name="governmentplanupdate", - name="organization", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="organization.organization", - verbose_name="organization", + migrations.AlterField( + model_name="government", + name="slug", + field=models.SlugField( + max_length=255, unique=True, verbose_name="slug" + ), ), - ), - migrations.AlterField( - model_name="governmentplanupdate", - name="plan", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="updates", - to="froide_govplan.governmentplan", - verbose_name="plan", + migrations.AlterField( + model_name="government", + name="start_date", + field=models.DateField( + blank=True, null=True, verbose_name="start date" + ), ), - ), - migrations.AlterField( - model_name="governmentplanupdate", - name="public", - field=models.BooleanField(default=False, verbose_name="is public?"), - ), - migrations.AlterField( - model_name="governmentplanupdate", - name="rating", - field=models.IntegerField( - blank=True, - choices=[ - (1, "terrible"), - (2, "bad"), - (3, "OK"), - (4, "good"), - (5, "excellent"), - ], - null=True, - verbose_name="rating", + migrations.AlterField( + model_name="governmentplan", + name="description", + field=models.TextField(blank=True, verbose_name="description"), ), - ), - migrations.AlterField( - model_name="governmentplanupdate", - name="status", - field=models.CharField( - blank=True, - choices=[ - ("not_started", "not started"), - ("started", "started"), - ("partially_implemented", "partially implemented"), - ("implemented", "implemented"), - ("deferred", "deferred"), - ], - default="", - max_length=25, - verbose_name="status", + migrations.AlterField( + model_name="governmentplan", + name="government", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="froide_govplan.government", + verbose_name="government", + ), ), - ), - migrations.AlterField( - model_name="governmentplanupdate", - name="timestamp", - field=models.DateTimeField( - default=django.utils.timezone.now, verbose_name="timestamp" + migrations.AlterField( + model_name="governmentplan", + name="group", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="auth.group", + verbose_name="group", + ), ), - ), - migrations.AlterField( - model_name="governmentplanupdate", - name="title", - field=models.CharField(blank=True, max_length=1024, verbose_name="title"), - ), - migrations.AlterField( - model_name="governmentplanupdate", - name="url", - field=models.URLField(blank=True, verbose_name="URL"), - ), - migrations.AlterField( - model_name="governmentplanupdate", - name="user", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="user", + migrations.AlterField( + model_name="governmentplan", + name="organization", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="organization.organization", + verbose_name="organization", + ), ), - ), - ] + migrations.AlterField( + model_name="governmentplan", + name="public", + field=models.BooleanField(default=False, verbose_name="is public?"), + ), + migrations.AlterField( + model_name="governmentplan", + name="rating", + field=models.IntegerField( + blank=True, + choices=[ + (1, "terrible"), + (2, "bad"), + (3, "OK"), + (4, "good"), + (5, "excellent"), + ], + null=True, + verbose_name="rating", + ), + ), + migrations.AlterField( + model_name="governmentplan", + name="reference", + field=models.CharField( + blank=True, max_length=255, verbose_name="reference" + ), + ), + migrations.AlterField( + model_name="governmentplan", + name="responsible_publicbody", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="publicbody.publicbody", + verbose_name="responsible public body", + ), + ), + migrations.AlterField( + model_name="governmentplan", + name="slug", + field=models.SlugField( + max_length=255, unique=True, verbose_name="slug" + ), + ), + migrations.AlterField( + model_name="governmentplan", + name="status", + field=models.CharField( + choices=[ + ("not_started", "not started"), + ("started", "started"), + ("partially_implemented", "partially implemented"), + ("implemented", "implemented"), + ("deferred", "deferred"), + ], + default="not_started", + max_length=25, + verbose_name="status", + ), + ), + migrations.AlterField( + model_name="governmentplan", + name="title", + field=models.CharField(max_length=255, verbose_name="title"), + ), + migrations.AlterField( + model_name="governmentplanupdate", + name="content", + field=models.TextField(blank=True, verbose_name="content"), + ), + ] + + ( + [ + migrations.AlterField( + model_name="governmentplanupdate", + name="foirequest", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="foirequest.foirequest", + verbose_name="FOI request", + ), + ), + ] + if conf.GOVPLAN_ENABLE_FOIREQUEST + else [] + ) + + [ + migrations.AlterField( + model_name="governmentplanupdate", + name="organization", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="organization.organization", + verbose_name="organization", + ), + ), + migrations.AlterField( + model_name="governmentplanupdate", + name="plan", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="updates", + to="froide_govplan.governmentplan", + verbose_name="plan", + ), + ), + migrations.AlterField( + model_name="governmentplanupdate", + name="public", + field=models.BooleanField(default=False, verbose_name="is public?"), + ), + migrations.AlterField( + model_name="governmentplanupdate", + name="rating", + field=models.IntegerField( + blank=True, + choices=[ + (1, "terrible"), + (2, "bad"), + (3, "OK"), + (4, "good"), + (5, "excellent"), + ], + null=True, + verbose_name="rating", + ), + ), + migrations.AlterField( + model_name="governmentplanupdate", + name="status", + field=models.CharField( + blank=True, + choices=[ + ("not_started", "not started"), + ("started", "started"), + ("partially_implemented", "partially implemented"), + ("implemented", "implemented"), + ("deferred", "deferred"), + ], + default="", + max_length=25, + verbose_name="status", + ), + ), + migrations.AlterField( + model_name="governmentplanupdate", + name="timestamp", + field=models.DateTimeField( + default=django.utils.timezone.now, verbose_name="timestamp" + ), + ), + migrations.AlterField( + model_name="governmentplanupdate", + name="title", + field=models.CharField( + blank=True, max_length=1024, verbose_name="title" + ), + ), + migrations.AlterField( + model_name="governmentplanupdate", + name="url", + field=models.URLField(blank=True, verbose_name="URL"), + ), + migrations.AlterField( + model_name="governmentplanupdate", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), + ), + ] + ) diff --git a/froide_govplan/models.py b/froide_govplan/models.py index 4f8522b..6f97da4 100644 --- a/froide_govplan/models.py +++ b/froide_govplan/models.py @@ -15,7 +15,6 @@ from filer.fields.image import FilerImageField from taggit.managers import TaggableManager from taggit.models import TaggedItemBase -from froide.foirequest.models import FoiRequest from froide.follow.models import Follower from froide.georegion.models import GeoRegion from froide.organization.models import Organization @@ -32,6 +31,12 @@ except ImportError: PlaceholderField = None +if conf.GOVPLAN_ENABLE_FOIREQUEST: + from froide.foirequest.models import FoiRequest +else: + FoiRequest = None + + class PlanStatus(models.TextChoices): NOT_STARTED = ("not_started", _("not started")) STARTED = ("started", _("started")) @@ -308,6 +313,8 @@ 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"): @@ -363,13 +370,14 @@ class GovernmentPlanUpdate(models.Model): ) public = models.BooleanField(default=False, verbose_name=_("is public?")) - foirequest = models.ForeignKey( - FoiRequest, - null=True, - blank=True, - on_delete=models.SET_NULL, - verbose_name=_("FOI request"), - ) + if FoiRequest: + foirequest = models.ForeignKey( + FoiRequest, + null=True, + blank=True, + on_delete=models.SET_NULL, + verbose_name=_("FOI request"), + ) class Meta: ordering = ("-timestamp",)