From 699c51b3dadf180675889c18f779736f32c05a2b Mon Sep 17 00:00:00 2001
From: mlbonhomme <bonhomme@teklia.com>
Date: Wed, 6 Nov 2024 11:41:18 +0100
Subject: [PATCH] Make ModelVersion size field PositiveBigIntegerField

---
 .../0010_alter_modelversion_size.py           | 18 ++++++++
 arkindex/training/models.py                   |  2 +-
 arkindex/training/tests/test_model_api.py     | 46 +++++++++++++++++++
 3 files changed, 65 insertions(+), 1 deletion(-)
 create mode 100644 arkindex/training/migrations/0010_alter_modelversion_size.py

diff --git a/arkindex/training/migrations/0010_alter_modelversion_size.py b/arkindex/training/migrations/0010_alter_modelversion_size.py
new file mode 100644
index 0000000000..ce11bc782f
--- /dev/null
+++ b/arkindex/training/migrations/0010_alter_modelversion_size.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.0.8 on 2024-11-06 10:28
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("training", "0009_remove_metrics"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="modelversion",
+            name="size",
+            field=models.PositiveBigIntegerField(blank=True, help_text="file size in bytes", null=True),
+        ),
+    ]
diff --git a/arkindex/training/models.py b/arkindex/training/models.py
index 4df86f5ad1..1e08f99d9f 100644
--- a/arkindex/training/models.py
+++ b/arkindex/training/models.py
@@ -105,7 +105,7 @@ class ModelVersion(S3FileMixin, IndexableModel):
     )
 
     # Size of the archive
-    size = models.PositiveIntegerField(null=True, blank=True, help_text="file size in bytes")
+    size = models.PositiveBigIntegerField(null=True, blank=True, help_text="file size in bytes")
 
     # Store dictionary of parameters given by the ML developer
     configuration = models.JSONField(blank=True, default=dict)
diff --git a/arkindex/training/tests/test_model_api.py b/arkindex/training/tests/test_model_api.py
index 0c7afe0b71..114abe1b97 100644
--- a/arkindex/training/tests/test_model_api.py
+++ b/arkindex/training/tests/test_model_api.py
@@ -837,6 +837,52 @@ class TestModelAPI(FixtureAPITestCase):
             }
         )
 
+    @patch("arkindex.project.aws.s3.meta.client.generate_presigned_url")
+    def test_create_huge_model_version(self, s3_presigned_url_mock):
+        """
+        Creates a new model version that is very big
+        """
+        self.client.force_login(self.user1)
+        s3_presigned_url_mock.return_value = "http://s3/upload_put_url"
+        fake_now = timezone.now()
+        # To mock the creation date
+        with patch("django.utils.timezone.now") as mock_now:
+            mock_now.return_value = fake_now
+            with self.assertNumQueries(6):
+                response = self.client.post(
+                    reverse("api:model-versions", kwargs={"pk": str(self.model1.id)}),
+                    {
+                        "tag": "TAG",
+                        "size": 9223372036854775806,
+                        "hash": "d" * 32,
+                        "archive_hash": "e" * 32,
+                        "description": "description",
+                        "configuration": {"hello": "this is me"},
+                    },
+                )
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        data = response.json()
+        self.assertIn("id", data)
+        df = ModelVersion.objects.get(id=data["id"])
+
+        self.assertDictEqual(
+            data,
+            {
+                "id": str(df.id),
+                "model_id": str(self.model1.id),
+                "parent": None,
+                "description": "description",
+                "state": ModelVersionState.Created.value,
+                "configuration": {"hello": "this is me"},
+                "tag": "TAG",
+                "size": 9223372036854775806,
+                "hash": "d" * 32,
+                "created": fake_now.isoformat().replace("+00:00", "Z"),
+                "s3_url": None,
+                "s3_put_url": s3_presigned_url_mock.return_value
+            }
+        )
+
     def test_create_model_version_unique_tag_model(self):
         """
         Raises 400 when creating a model version that already exists, same model_id and tag
-- 
GitLab