Skip to content

Commit 1a5ae32

Browse files
committed
update query to explicitly handle 'combined' parameter
1 parent 888c53b commit 1a5ae32

File tree

1 file changed

+21
-21
lines changed

1 file changed

+21
-21
lines changed

environmental_justice/views.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from django.db.models import Q
21
from django_filters.rest_framework import DjangoFilterBackend
32
from rest_framework import viewsets
3+
from rest_framework.exceptions import ValidationError
44

55
from .models import EnvironmentalJusticeRow
66
from .serializers import EnvironmentalJusticeRowSerializer
@@ -17,31 +17,27 @@ class EnvironmentalJusticeRowViewSet(viewsets.ModelViewSet):
1717
serializer_class = EnvironmentalJusticeRowSerializer
1818
http_method_names = ["get"]
1919
filter_backends = [DjangoFilterBackend]
20-
filterset_fields = ["data_source"]
20+
filterset_fields = []
2121

2222
def get_combined_queryset(self):
2323
"""
2424
Returns combined data where:
2525
1. All spreadsheet data is included
2626
2. ML production data is included only if there's no spreadsheet data with matching dataset
27+
Records are sorted by dataset name and then data_source (ensuring spreadsheet comes before ml_production)
2728
"""
28-
# First, get all unique datasets that exist in spreadsheet
29-
spreadsheet_datasets = (
30-
EnvironmentalJusticeRow.objects.filter(data_source=EnvironmentalJusticeRow.DataSourceChoices.SPREADSHEET)
31-
.values_list("dataset", flat=True)
32-
.distinct()
29+
# Get spreadsheet data
30+
spreadsheet_data = EnvironmentalJusticeRow.objects.filter(
31+
data_source=EnvironmentalJusticeRow.DataSourceChoices.SPREADSHEET
3332
)
3433

35-
# Build query to get:
36-
# 1. ALL spreadsheet records
37-
# 2. ML production records where dataset isn't in spreadsheet
38-
combined_query = Q(data_source=EnvironmentalJusticeRow.DataSourceChoices.SPREADSHEET) | Q(
39-
data_source=EnvironmentalJusticeRow.DataSourceChoices.ML_PRODUCTION, dataset__not_in=spreadsheet_datasets
40-
)
34+
# Get ML production data excluding datasets that exist in spreadsheet
35+
ml_production_data = EnvironmentalJusticeRow.objects.filter(
36+
data_source=EnvironmentalJusticeRow.DataSourceChoices.ML_PRODUCTION
37+
).exclude(dataset__in=spreadsheet_data.values_list("dataset", flat=True))
4138

42-
return EnvironmentalJusticeRow.objects.filter(combined_query).order_by(
43-
"dataset"
44-
) # Optional: orders results by dataset name
39+
# Combine the querysets and sort
40+
return spreadsheet_data.union(ml_production_data).order_by("dataset", "data_source")
4541

4642
def get_queryset(self):
4743
"""
@@ -52,9 +48,13 @@ def get_queryset(self):
5248
"""
5349
data_source = self.request.query_params.get("data_source", "combined")
5450

55-
# straightfoward case: return data for specific source
56-
if data_source in EnvironmentalJusticeRow.DataSourceChoices.values:
57-
return super().get_queryset().filter(data_source=data_source)
51+
# Handle the 'combined' case or no parameter case
52+
if not data_source or data_source == "combined":
53+
return self.get_combined_queryset()
54+
55+
# Validate specific data source
56+
if data_source not in EnvironmentalJusticeRow.DataSourceChoices.values:
57+
valid_choices = list(EnvironmentalJusticeRow.DataSourceChoices.values) + ["combined"]
58+
raise ValidationError(f"Invalid data_source. Valid choices are: {', '.join(valid_choices)}")
5859

59-
# Handle 'combined' or no filter case
60-
return self.get_combined_queryset()
60+
return super().get_queryset().filter(data_source=data_source).order_by("dataset")

0 commit comments

Comments
 (0)