From 7c4a3f383394d8906911d6ca2ce7077fa4133732 Mon Sep 17 00:00:00 2001 From: Erwan Rouchet <rouchet@teklia.com> Date: Thu, 20 Oct 2022 07:15:03 +0000 Subject: [PATCH] Rename ImageServer.s3_read_only_bucket --- arkindex/documents/fixtures/data.json | 2 +- .../0010_rename_imageserver_readonly.py | 47 +++++++++++++++++++ arkindex/images/models.py | 17 ++++++- arkindex/images/serializers.py | 2 +- arkindex/images/tests/test_image_api.py | 2 +- 5 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 arkindex/images/migrations/0010_rename_imageserver_readonly.py diff --git a/arkindex/documents/fixtures/data.json b/arkindex/documents/fixtures/data.json index 79e4794886..39ecdde08e 100644 --- a/arkindex/documents/fixtures/data.json +++ b/arkindex/documents/fixtures/data.json @@ -1437,7 +1437,7 @@ "max_height": null, "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "read_only": false + "s3_read_only_bucket": false } }, { diff --git a/arkindex/images/migrations/0010_rename_imageserver_readonly.py b/arkindex/images/migrations/0010_rename_imageserver_readonly.py new file mode 100644 index 0000000000..70ac807285 --- /dev/null +++ b/arkindex/images/migrations/0010_rename_imageserver_readonly.py @@ -0,0 +1,47 @@ +# Generated by Django 4.0.7 on 2022-10-14 13:27 + +from django.db import migrations, models + + +def disable_read_only_without_bucket(apps, schema_editor): + """ + Turn off s3_read_only_bucket on servers without S3 buckets + to ensure that the new check constraint is respected. + """ + ImageServer = apps.get_model('images', 'ImageServer') + ImageServer.objects.filter(s3_bucket__isnull=True).update(s3_read_only_bucket=False) + + +class Migration(migrations.Migration): + + dependencies = [ + ('images', '0009_remove_imageserver_validated'), + ] + + operations = [ + migrations.RenameField( + model_name='imageserver', + old_name='read_only', + new_name='s3_read_only_bucket', + ), + migrations.AlterField( + model_name='imageserver', + name='s3_read_only_bucket', + field=models.BooleanField( + default=False, + help_text='Disable the extra image checks that are normally made for servers with S3 buckets.', + ), + ), + migrations.RunPython( + disable_read_only_without_bucket, + reverse_code=migrations.RunPython.noop, + elidable=True, + ), + migrations.AddConstraint( + model_name='imageserver', + constraint=models.CheckConstraint( + check=models.Q(s3_read_only_bucket=False) | models.Q(s3_bucket__isnull=False), + name='s3_read_only_bucket_requires_s3_bucket' + ), + ), + ] diff --git a/arkindex/images/models.py b/arkindex/images/models.py index 620b18df7b..1709dafc51 100644 --- a/arkindex/images/models.py +++ b/arkindex/images/models.py @@ -29,17 +29,32 @@ class ImageServer(models.Model): """ display_name = models.CharField(max_length=250) url = StripSlashURLField(unique=True) + s3_bucket = models.SlugField(max_length=63, blank=True, null=True, db_index=False) s3_region = models.SlugField(max_length=63, blank=True, null=True, db_index=False) + s3_read_only_bucket = models.BooleanField( + help_text='Disable the extra image checks that are normally made for servers with S3 buckets.', + default=False, + ) + max_width = models.PositiveIntegerField(blank=True, null=True) max_height = models.PositiveIntegerField(blank=True, null=True) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) - read_only = models.BooleanField(default=False) objects = ImageServerManager() + class Meta: + # Enabling s3_read_only_bucket makes no sense when there is no s3_bucket, + # so we force it to be disabled if there is None to avoid any confusions. + constraints = [ + models.CheckConstraint( + check=models.Q(s3_read_only_bucket=False) | models.Q(s3_bucket__isnull=False), + name='s3_read_only_bucket_requires_s3_bucket' + ) + ] + def __str__(self): return self.display_name diff --git a/arkindex/images/serializers.py b/arkindex/images/serializers.py index 52b088d160..050d6dd187 100644 --- a/arkindex/images/serializers.py +++ b/arkindex/images/serializers.py @@ -62,7 +62,7 @@ class ImageSerializer(serializers.ModelSerializer): elif value == S3FileStatus.Checked: # Perform image validation if we are updating an existing image to Checked try: - if self.instance.server.s3_bucket and not self.instance.server.read_only: + if self.instance.server.s3_bucket and not self.instance.server.s3_read_only_bucket: self.instance.check_hash(raise_exc=True, save=False) self.instance.perform_check(raise_exc=True) except (AssertionError, ValueError, RequestException) as e: diff --git a/arkindex/images/tests/test_image_api.py b/arkindex/images/tests/test_image_api.py index e8a496d990..d1d4ba5bb5 100644 --- a/arkindex/images/tests/test_image_api.py +++ b/arkindex/images/tests/test_image_api.py @@ -266,7 +266,7 @@ class TestImageApi(FixtureAPITestCase): server=ImageServer.objects.create( display_name='S3 test', s3_bucket='s3_blanket', - read_only=True, + s3_read_only_bucket=True, url='http://some.server/', ), width=1000, -- GitLab