diff --git a/arkindex/documents/fixtures/data.json b/arkindex/documents/fixtures/data.json index 79e4794886cfdd6e2df5a80684a2fa0e194f55e6..39ecdde08e30cac77a39c6673e2d56d6db74108a 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 0000000000000000000000000000000000000000..70ac8072850cfd2c42ff0f06280efc75050979a6 --- /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 620b18df7b023e6ff480ee9baf26335f2189a6a6..1709dafc512116fbb5712c5875020411ef9242fa 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 52b088d1607342c4a6fb372184d8c329dbd78749..050d6dd1875db19ef5bb6c7c3ace64b9d58eee1b 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 e8a496d990ea0a34f27726af18c15bad5838c7cb..d1d4ba5bb5a22ca505d272dc92f4b65a98f87e15 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,