Skip to content

Commit 4323ea6

Browse files
authored
Add dataset type field + add filters to admin interface (#9)
* Add dataset type field + add filters to admin interface * lint code
1 parent 37b9d37 commit 4323ea6

File tree

8 files changed

+111
-7
lines changed

8 files changed

+111
-7
lines changed

vbos/datasets/admin.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,20 @@ class RasterFileAdmin(admin.ModelAdmin):
3232

3333
@admin.register(RasterDataset)
3434
class RasterDatasetAdmin(admin.ModelAdmin):
35-
list_display = ["id", "cluster", "name", "created", "updated", "file"]
35+
list_display = ["id", "name", "cluster", "type", "updated", "file"]
36+
list_filter = ["cluster", "type"]
3637

3738

3839
@admin.register(VectorDataset)
3940
class VectorDatasetAdmin(admin.ModelAdmin):
40-
list_display = ["id", "cluster", "name", "created", "updated"]
41+
list_display = ["id", "name", "cluster", "type", "updated"]
42+
list_filter = ["cluster", "type"]
4143

4244

4345
@admin.register(VectorItem)
4446
class VectorItemAdmin(admin.GISModelAdmin):
4547
list_display = ["id", "dataset", "metadata"]
48+
list_filter = ["dataset"]
4649

4750
def get_urls(self):
4851
urls = super().get_urls()
@@ -117,12 +120,14 @@ def import_file(self, request):
117120

118121
@admin.register(TabularDataset)
119122
class TabularDatasetAdmin(admin.ModelAdmin):
120-
list_display = ["id", "cluster", "name", "created", "updated"]
123+
list_display = ["id", "name", "cluster", "type", "updated"]
124+
list_filter = ["cluster", "type"]
121125

122126

123127
@admin.register(TabularItem)
124128
class TabularItemAdmin(admin.GISModelAdmin):
125129
list_display = ["id", "dataset", "data"]
130+
list_filter = ["dataset"]
126131

127132
def get_urls(self):
128133
urls = super().get_urls()

vbos/datasets/filters.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
class DatasetFilter(FilterSet):
1414
name = CharFilter(field_name="name", lookup_expr="icontains")
1515
source = CharFilter(field_name="source", lookup_expr="icontains")
16+
type = CharFilter(field_name="type", lookup_expr="iexact")
1617
cluster = ModelChoiceFilter(
1718
field_name="cluster__name",
1819
to_field_name="name__iexact",
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# Generated by Django 5.2.5 on 2025-09-12 21:28
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("datasets", "0007_alter_rasterdataset_cluster_and_more"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="rasterdataset",
15+
name="type",
16+
field=models.CharField(
17+
choices=[
18+
("baseline", "Baseline"),
19+
("estimated_damage", "Estimated Damage"),
20+
(
21+
"aid_resources_needed",
22+
"Resources Needed to be Sent to Those Affected",
23+
),
24+
("estimate_financial_damage", "Estimate Financial Damage"),
25+
],
26+
default="baseline",
27+
max_length=55,
28+
),
29+
),
30+
migrations.AddField(
31+
model_name="tabulardataset",
32+
name="type",
33+
field=models.CharField(
34+
choices=[
35+
("baseline", "Baseline"),
36+
("estimated_damage", "Estimated Damage"),
37+
(
38+
"aid_resources_needed",
39+
"Resources Needed to be Sent to Those Affected",
40+
),
41+
("estimate_financial_damage", "Estimate Financial Damage"),
42+
],
43+
default="baseline",
44+
max_length=55,
45+
),
46+
),
47+
migrations.AddField(
48+
model_name="vectordataset",
49+
name="type",
50+
field=models.CharField(
51+
choices=[
52+
("baseline", "Baseline"),
53+
("estimated_damage", "Estimated Damage"),
54+
(
55+
"aid_resources_needed",
56+
"Resources Needed to be Sent to Those Affected",
57+
),
58+
("estimate_financial_damage", "Estimate Financial Damage"),
59+
],
60+
default="baseline",
61+
max_length=55,
62+
),
63+
),
64+
]

vbos/datasets/models.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
from django.contrib.gis.db import models
22
from django.conf import settings
3+
from django.utils.translation import gettext_lazy as _
34
from django.core.validators import FileExtensionValidator
45
from django.db.models.fields.files import default_storage
56
from django.db.models.signals import pre_delete
67
from django.dispatch import receiver
78

89
UPLOAD_TO = "staging/raster/" if settings.DEBUG else "production/raster/"
910

11+
TYPE_CHOICES = {
12+
"baseline": _("Baseline"),
13+
"estimated_damage": _("Estimated Damage"),
14+
"aid_resources_needed": _("Resources Needed to be Sent to Those Affected"),
15+
"estimate_financial_damage": _("Estimate Financial Damage"),
16+
}
17+
1018

1119
class Cluster(models.Model):
1220
name = models.CharField(max_length=100, unique=True)
@@ -57,6 +65,7 @@ class RasterDataset(models.Model):
5765
Cluster,
5866
on_delete=models.PROTECT,
5967
)
68+
type = models.CharField(max_length=55, choices=TYPE_CHOICES, default="baseline")
6069
source = models.CharField(max_length=155, blank=True, null=True)
6170
file = models.ForeignKey(RasterFile, on_delete=models.PROTECT)
6271

@@ -75,6 +84,7 @@ class VectorDataset(models.Model):
7584
Cluster,
7685
on_delete=models.PROTECT,
7786
)
87+
type = models.CharField(max_length=55, choices=TYPE_CHOICES, default="baseline")
7888
source = models.CharField(max_length=155, blank=True, null=True)
7989

8090
def __str__(self):
@@ -104,6 +114,7 @@ class TabularDataset(models.Model):
104114
Cluster,
105115
on_delete=models.PROTECT,
106116
)
117+
type = models.CharField(max_length=55, choices=TYPE_CHOICES, default="baseline")
107118
source = models.CharField(max_length=155, blank=True, null=True)
108119

109120
def __str__(self):

vbos/datasets/serializers.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,24 @@ class RasterDatasetSerializer(serializers.ModelSerializer):
2323

2424
class Meta:
2525
model = RasterDataset
26-
fields = ["id", "name", "created", "updated", "cluster", "source", "file"]
26+
fields = [
27+
"id",
28+
"name",
29+
"created",
30+
"updated",
31+
"cluster",
32+
"type",
33+
"source",
34+
"file",
35+
]
2736

2837

2938
class VectorDatasetSerializer(serializers.ModelSerializer):
3039
cluster = serializers.ReadOnlyField(source="cluster.name")
3140

3241
class Meta:
3342
model = VectorDataset
34-
fields = ["id", "name", "created", "updated", "cluster", "source"]
43+
fields = ["id", "name", "created", "updated", "cluster", "type", "source"]
3544

3645

3746
class VectorItemSerializer(GeoFeatureModelSerializer):
@@ -61,7 +70,7 @@ class TabularDatasetSerializer(serializers.ModelSerializer):
6170

6271
class Meta:
6372
model = TabularDataset
64-
fields = ["id", "name", "created", "updated", "cluster", "source"]
73+
fields = ["id", "name", "created", "updated", "cluster", "type", "source"]
6574

6675

6776
class TabularItemSerializer(serializers.ModelSerializer):

vbos/datasets/test/test_raster_views.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ def setUp(self):
2424
file=self.r_2,
2525
source="OSM",
2626
cluster=Cluster.objects.create(name="Administrative"),
27+
type="estimated_damage",
2728
)
2829
self.url = reverse("datasets:raster-list")
2930

@@ -37,6 +38,8 @@ def test_raster_datasets_list(self):
3738
assert req.data.get("results")[1]["cluster"] == "Administrative"
3839
assert req.data.get("results")[0]["source"] == "WMO"
3940
assert req.data.get("results")[1]["source"] == "OSM"
41+
assert req.data.get("results")[0]["type"] == "baseline"
42+
assert req.data.get("results")[1]["type"] == "estimated_damage"
4043

4144
def test_raster_datasets_list_filter(self):
4245
req = self.client.get(self.url, {"cluster": "transportation"})
@@ -50,6 +53,10 @@ def test_raster_datasets_list_filter(self):
5053
assert req.status_code == status.HTTP_200_OK
5154
assert req.data.get("count") == 1
5255

56+
req = self.client.get(self.url, {"type": "baseline"})
57+
assert req.status_code == status.HTTP_200_OK
58+
assert req.data.get("count") == 1
59+
5360
def test_raster_datasets_detail(self):
5461
url = reverse("datasets:raster-detail", args=[self.dataset_1.id])
5562
req = self.client.get(url)

vbos/datasets/test/test_tabular_views.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def setUp(self):
1818
name="Prices",
1919
cluster=Cluster.objects.create(name="Statistics"),
2020
source="Government",
21+
type="estimated_damage",
2122
)
2223
self.url = reverse("datasets:tabular-list")
2324

@@ -31,6 +32,8 @@ def test_tabular_datasets_list(self):
3132
assert req.data.get("results")[1]["source"] == "Government"
3233
assert req.data.get("results")[0]["cluster"] == "Administrative"
3334
assert req.data.get("results")[1]["cluster"] == "Statistics"
35+
assert req.data.get("results")[0]["type"] == "baseline"
36+
assert req.data.get("results")[1]["type"] == "estimated_damage"
3437

3538
def test_raster_datasets_list_filter(self):
3639
req = self.client.get(self.url, {"cluster": "transportation"})

vbos/datasets/test/test_vector_views.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ def setUp(self):
1414
source="OSM",
1515
)
1616
self.dataset_2 = VectorDataset.objects.create(
17-
name="Roads", cluster=Cluster.objects.create(name="Transportation")
17+
name="Roads",
18+
cluster=Cluster.objects.create(name="Transportation"),
19+
type="estimated_damage",
1820
)
1921
self.url = reverse("datasets:vector-list")
2022

@@ -24,6 +26,8 @@ def test_vector_datasets_list(self):
2426
assert req.data.get("count") == 2
2527
assert req.data.get("results")[0]["name"] == "Boundaries"
2628
assert req.data.get("results")[1]["name"] == "Roads"
29+
assert req.data.get("results")[0]["type"] == "baseline"
30+
assert req.data.get("results")[1]["type"] == "estimated_damage"
2731

2832
def test_vector_datasets_list_filter(self):
2933
req = self.client.get(self.url, {"cluster": "transportation"})

0 commit comments

Comments
 (0)