Skip to content

Commit fb3b8d2

Browse files
committed
Remove file from RasterDataset model and add filename_id
1 parent a476cd6 commit fb3b8d2

File tree

6 files changed

+48
-34
lines changed

6 files changed

+48
-34
lines changed

vbos/datasets/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class RasterFileAdmin(admin.ModelAdmin):
3737

3838
@admin.register(RasterDataset)
3939
class RasterDatasetAdmin(admin.ModelAdmin):
40-
list_display = ["id", "name", "cluster", "type", "updated", "file"]
40+
list_display = ["id", "name", "cluster", "type", "updated", "filename_id"]
4141
list_filter = ["cluster", "type"]
4242

4343

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 5.2.5 on 2025-11-14 19:32
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("datasets", "0018_auto_20251114_0018"),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name="rasterdataset",
15+
name="file",
16+
),
17+
migrations.AddField(
18+
model_name="rasterdataset",
19+
name="filename_id",
20+
field=models.CharField(
21+
blank=True,
22+
help_text="The filename id that will be used to compose the raster file path. The pattern will be /media//{filename_id}_{year}.vrt",
23+
max_length=50,
24+
),
25+
),
26+
]

vbos/datasets/models.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from django.contrib.gis.db import models
21
from django.conf import settings
3-
from django.utils.translation import gettext_lazy as _
2+
from django.contrib.gis.db import models
43
from django.core.validators import FileExtensionValidator
54
from django.db.models.fields.files import default_storage
65
from django.db.models.signals import pre_delete
76
from django.dispatch import receiver
7+
from django.utils.translation import gettext_lazy as _
88

99
UPLOAD_TO = "staging/raster/" if settings.DEBUG else "production/raster/"
1010

@@ -91,7 +91,13 @@ class RasterDataset(models.Model):
9191
)
9292
type = models.CharField(max_length=55, choices=TYPE_CHOICES, default="baseline")
9393
source = models.CharField(max_length=155, blank=True, null=True)
94-
file = models.ForeignKey(RasterFile, on_delete=models.PROTECT)
94+
filename_id = models.CharField(
95+
max_length=50,
96+
blank=True,
97+
help_text="The filename id that will be used to compose the raster file path. The pattern will be {}/{}_{}.vrt".format(
98+
settings.MEDIA_URL, "{filename_id}", "{year}"
99+
),
100+
)
95101

96102
def __str__(self):
97103
return f"{self.name} - {self.cluster} / {self.type}"

vbos/datasets/serializers.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ class Meta:
3434

3535

3636
class RasterDatasetSerializer(serializers.ModelSerializer):
37-
file = serializers.ReadOnlyField(source="file.file.url")
3837
cluster = serializers.ReadOnlyField(source="cluster.name")
3938

4039
class Meta:
@@ -48,7 +47,7 @@ class Meta:
4847
"cluster",
4948
"type",
5049
"source",
51-
"file",
50+
"filename_id",
5251
]
5352

5453

vbos/datasets/test/test_models.py

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
from django.db.models.deletion import ProtectedError
1+
from django.core.exceptions import ValidationError
2+
from django.core.files.uploadedfile import SimpleUploadedFile
23
from django.db.utils import IntegrityError
34
from django.test import TestCase
4-
from django.core.files.uploadedfile import SimpleUploadedFile
5-
from django.core.exceptions import ValidationError
65

76
from vbos.datasets.models import (
87
Cluster,
@@ -25,14 +24,10 @@ def setUp(self):
2524
self.dataset = RasterDataset.objects.create(
2625
name="Rainfall",
2726
cluster=Cluster.objects.create(name="Environment"),
28-
file=self.r_1,
27+
filename_id="rainfall",
2928
)
3029

3130
def test_deletion(self):
32-
# RasterFile can't be deleted if it's associates with a dataset
33-
with self.assertRaises(ProtectedError):
34-
self.r_1.delete()
35-
3631
# name should be unique
3732
raster = RasterFile(name="Rainfall COG 2", file="raster/coastline.tiff")
3833
with self.assertRaises(ValidationError):
@@ -43,15 +38,9 @@ def test_deletion(self):
4338
with self.assertRaises(ValidationError):
4439
raster.full_clean()
4540

46-
# modify dataset
47-
self.dataset.file = self.r_2
48-
self.dataset.save()
4941
# delete file
5042
self.r_1.delete()
5143
self.assertEqual(RasterFile.objects.count(), 1)
52-
# delete dataset
53-
self.dataset.delete()
54-
self.assertEqual(RasterDataset.objects.count(), 0)
5544
# delete remaining file
5645
self.r_2.delete()
5746
self.assertEqual(RasterFile.objects.count(), 0)
@@ -75,28 +64,28 @@ def test_unique_name_type_cluster(self):
7564
name="Population",
7665
cluster=self.cluster,
7766
source="Government",
78-
file=r_2,
67+
filename_id="population_baseline",
7968
)
8069
RasterDataset.objects.create(
8170
name="Population",
8271
cluster=self.cluster,
8372
source="Government",
84-
file=r_2,
73+
filename_id="population_damage",
8574
type="estimated_damage",
8675
)
8776
RasterDataset.objects.create(
8877
name="Population",
8978
cluster=Cluster.objects.create(name="Education"),
9079
source="Government",
91-
file=r_2,
80+
filename_id="population_education_damage",
9281
type="estimated_damage",
9382
)
9483
with self.assertRaises(IntegrityError):
9584
RasterDataset.objects.create(
9685
name="Population",
9786
cluster=self.cluster,
9887
source="Government",
99-
file=r_2,
88+
filename_id="population_baseline",
10089
)
10190

10291

vbos/datasets/test/test_raster_views.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,22 @@
1+
from django.urls import reverse
12
from rest_framework import status
23
from rest_framework.test import APITestCase
3-
from django.urls import reverse
44

55
from ..models import Cluster, RasterDataset, RasterFile
66

77

88
class TestRasterDatasetListDetailViews(APITestCase):
99
def setUp(self):
10-
self.r_1 = RasterFile.objects.create(
11-
name="Rainfall COG", file="raster/rainfall.tiff"
12-
)
13-
self.r_2 = RasterFile.objects.create(
14-
name="Coastline COG", file="raster/coastline.tiff"
15-
)
1610
self.dataset_1 = RasterDataset.objects.create(
1711
name="Rainfall",
1812
description="Rainfall data since 2020",
1913
cluster=Cluster.objects.create(name="Environment"),
20-
file=self.r_1,
14+
filename_id="rainfall",
2115
source="WMO",
2216
)
2317
self.dataset_2 = RasterDataset.objects.create(
2418
name="Coastline changes",
25-
file=self.r_2,
19+
filename_id="population_baseline",
2620
source="OSM",
2721
cluster=Cluster.objects.create(name="Administrative"),
2822
type="estimated_damage",
@@ -64,7 +58,7 @@ def test_raster_datasets_detail(self):
6458
req = self.client.get(url)
6559
assert req.status_code == status.HTTP_200_OK
6660
assert req.data.get("name") == "Rainfall"
67-
assert req.data.get("file") == "/media/raster/rainfall.tiff"
61+
assert req.data.get("filename_id") == "rainfall"
6862
assert req.data.get("created")
6963
assert req.data.get("updated")
7064
assert req.data.get("source") == "WMO"

0 commit comments

Comments
 (0)