Skip to content

Commit

Permalink
[API]: Filtering based on dates
Browse files Browse the repository at this point in the history
Fixes #170 for GMN, GLD, GMW
  • Loading branch information
StevenHosper committed Feb 5, 2025
1 parent d986475 commit 2dad7a8
Show file tree
Hide file tree
Showing 8 changed files with 149 additions and 5 deletions.
21 changes: 21 additions & 0 deletions api/mixins.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from typing import Any

import django_filters
from django.db.models import QuerySet
from django.http import HttpRequest, HttpResponse
from rest_framework.reverse import reverse
Expand Down Expand Up @@ -64,3 +65,23 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.required = True


class DateTimeFilterMixin:
created__gt = django_filters.DateTimeFilter(field_name="created", lookup_expr="gt")
created__gte = django_filters.DateTimeFilter(
field_name="created", lookup_expr="gte"
)
created__lt = django_filters.DateTimeFilter(field_name="created", lookup_expr="lt")
created__lte = django_filters.DateTimeFilter(
field_name="created", lookup_expr="lte"
)

updated__gt = django_filters.DateTimeFilter(field_name="updated", lookup_expr="gt")
updated__gte = django_filters.DateTimeFilter(
field_name="updated", lookup_expr="gte"
)
updated__lt = django_filters.DateTimeFilter(field_name="updated", lookup_expr="lt")
updated__lte = django_filters.DateTimeFilter(
field_name="updated", lookup_expr="lte"
)
51 changes: 50 additions & 1 deletion gld/filters.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,58 @@
import datetime

from django_filters import DateFilter
from django_filters import rest_framework as filters

from api.mixins import DateTimeFilterMixin

from . import models as gld_models


class GldFilter(filters.FilterSet):
class DateTimeStringFilter(filters.Filter):
def filter(self, qs, value):
if value in (None, ""):
return qs
try:
# Ensure the value is in the correct format
datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%SZ")
return qs.filter(**{self.field_name: value})
except ValueError:
return qs.none()


class GldFilter(filters.FilterSet, DateTimeFilterMixin):
research_first_date__gt = DateFilter(
field_name="research_first_date", lookup_expr="gt"
)
research_first_date__gte = DateFilter(
field_name="research_first_date", lookup_expr="gte"
)
research_first_date__lt = DateFilter(
field_name="research_first_date", lookup_expr="lt"
)
research_first_date__lte = DateFilter(
field_name="research_first_date", lookup_expr="lte"
)

class Meta:
model = gld_models.GLD
exclude = ["linked_gmns"]


class ObservationFilter(filters.FilterSet, DateTimeFilterMixin):
begin_position__gt = DateFilter(field_name="begin_position", lookup_expr="gt")
begin_position__gte = DateFilter(field_name="begin_position", lookup_expr="gte")
begin_position__lt = DateFilter(field_name="begin_position", lookup_expr="lt")
begin_position__lte = DateFilter(field_name="begin_position", lookup_expr="lte")

class Meta:
model = gld_models.Observation
fields = "__all__"


class MeasurementTvpFilter(filters.FilterSet, DateTimeFilterMixin):
time = DateTimeStringFilter(field_name="time")

class Meta:
model = gld_models.MeasurementTvp
fields = "__all__"
14 changes: 14 additions & 0 deletions gld/models.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,21 @@
import datetime
import uuid

from django.db import models
from django.db.models import JSONField, Manager
from django_filters import rest_framework as filters


class DateTimeStringFilter(filters.Filter):
def filter(self, qs, value):
if value in (None, ""):
return qs
try:
# Ensure the value is in the correct format
datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%SZ")
return qs.filter(**{self.field_name: value})
except ValueError:
return qs.none()


class GLD(models.Model):
Expand Down
1 change: 1 addition & 0 deletions gld/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class ObservationListView(mixins.UserOrganizationMixin, generics.ListAPIView):
queryset = gld_models.Observation.objects.all().order_by("-created")

filter_backends = [DjangoFilterBackend]
filterset_class = filters.ObservationFilter
filterset_fields = "__all__"


Expand Down
44 changes: 44 additions & 0 deletions gmn/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from django_filters import DateFilter
from django_filters import rest_framework as filters

from api.mixins import DateTimeFilterMixin

from .models import GMN, Measuringpoint


class GmnFilter(filters.FilterSet, DateTimeFilterMixin):
start_date_monitoring__gt = DateFilter(
field_name="start_date_monitoring", lookup_expr="gt"
)
start_date_monitoring__gte = DateFilter(
field_name="start_date_monitoring", lookup_expr="gte"
)
start_date_monitoring__lt = DateFilter(
field_name="start_date_monitoring", lookup_expr="lt"
)
start_date_monitoring__lte = DateFilter(
field_name="start_date_monitoring", lookup_expr="lte"
)

class Meta:
model = GMN
fields = "__all__"


class MeasuringPointFilter(filters.FilterSet, DateTimeFilterMixin):
measuringpoint_start_date__gt = DateFilter(
field_name="measuringpoint_start_date", lookup_expr="gt"
)
measuringpoint_start_date__gte = DateFilter(
field_name="measuringpoint_start_date", lookup_expr="gte"
)
measuringpoint_start_date__lt = DateFilter(
field_name="measuringpoint_start_date", lookup_expr="lt"
)
measuringpoint_start_date__lte = DateFilter(
field_name="measuringpoint_start_date", lookup_expr="lte"
)

class Meta:
model = Measuringpoint
fields = "__all__"
4 changes: 3 additions & 1 deletion gmn/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@

from api import mixins

from . import filters, serializers
from . import models as gmn_models
from . import serializers


class GMNListView(mixins.UserOrganizationMixin, generics.ListAPIView):
serializer_class = serializers.GMNSerializer
queryset = gmn_models.GMN.objects.all().order_by("-created")

filter_backends = [DjangoFilterBackend]
filterset_class = filters.GmnFilter
filterset_fields = "__all__"


Expand All @@ -26,6 +27,7 @@ class MeasuringpointListView(mixins.UserOrganizationMixin, generics.ListAPIView)
queryset = gmn_models.Measuringpoint.objects.all().order_by("-created")

filter_backends = [DjangoFilterBackend]
filterset_class = filters.MeasuringPointFilter
filterset_fields = "__all__"


Expand Down
18 changes: 15 additions & 3 deletions gmw/filters.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
from django_filters import DateFilter
from django_filters import rest_framework as filters

from api.mixins import DateTimeFilterMixin
from gmn.models import Measuringpoint

from .models import Event, MonitoringTube
from .models import GMW, Event, MonitoringTube


class MonitoringTubeFilter(filters.FilterSet):
class GmwFilter(filters.FilterSet, DateTimeFilterMixin):
class Meta:
model = GMW
fields = "__all__"


class MonitoringTubeFilter(filters.FilterSet, DateTimeFilterMixin):
gmn_bro_id = filters.CharFilter(method="filter_by_gmn_bro_id")
gmw_bro_id = filters.CharFilter(method="filter_by_gmw_bro_id")

Expand All @@ -22,8 +30,12 @@ def filter_by_gmw_bro_id(self, queryset, name, value) -> any:
return queryset.filter(gmw__bro_id=value)


class EventFilter(filters.FilterSet):
class EventFilter(filters.FilterSet, DateTimeFilterMixin):
gmw_bro_id = filters.CharFilter(method="filter_by_gmw_bro_id")
event_date__gt = DateFilter(field_name="event_date", lookup_expr="gt")
event_date__gte = DateFilter(field_name="event_date", lookup_expr="gte")
event_date__lt = DateFilter(field_name="event_date", lookup_expr="lt")
event_date__lte = DateFilter(field_name="event_date", lookup_expr="lte")

class Meta:
model = Event
Expand Down
1 change: 1 addition & 0 deletions gmw/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class GMWListView(mixins.UserOrganizationMixin, generics.ListAPIView):
queryset = gmw_models.GMW.objects.all().order_by("-created")

filter_backends = [DjangoFilterBackend]
filterset_class = filters.GmwFilter
filterset_fields = "__all__"


Expand Down

0 comments on commit 2dad7a8

Please sign in to comment.