Skip to content

Commit c3ed5ae

Browse files
authored
Merge pull request #211 from Mosquito-Alert/api_reports_filters
Added is_deleted, is_last_version in reports endpoint.
2 parents 5d8c87f + 4583293 commit c3ed5ae

File tree

3 files changed

+71
-2
lines changed

3 files changed

+71
-2
lines changed

tigaserver_app/managers.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from django.db import models
2+
3+
class ReportQuerySet(models.QuerySet):
4+
5+
def __version_subquery(self):
6+
# NOTE: need to force using "objects" (default manager)
7+
return self.model._default_manager.filter(
8+
user=models.OuterRef('user'),
9+
report_id=models.OuterRef('report_id'),
10+
type=models.OuterRef('type')
11+
)
12+
13+
def __latest_version_subquery(self):
14+
return self.__version_subquery().order_by('-version_number', '-server_upload_time')
15+
16+
def last_version_of_each(self, state: bool=True):
17+
return self.filter(
18+
models.Q(
19+
pk__in=models.Subquery(
20+
self.__latest_version_subquery().values('pk')[:1]
21+
),
22+
_negated=not state
23+
)
24+
)
25+
26+
def deleted(self, state: bool = True):
27+
return self.annotate(
28+
has_negative_version=models.Exists(
29+
self.__version_subquery().filter(version_number=-1).values('pk')
30+
)
31+
).filter(
32+
has_negative_version=state
33+
)
34+
35+
36+
ReportManager = models.Manager.from_queryset(ReportQuerySet)

tigaserver_app/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import tigaserver_project.settings as conf
3333
from tigacrafting.messaging import send_message_android, send_message_ios
3434

35-
35+
from .managers import ReportManager
3636
from .mixins import TimeZoneModelMixin
3737

3838
logger_report_geolocation = logging.getLogger('mosquitoalert.location.report_location')
@@ -630,6 +630,7 @@ class Report(TimeZoneModelMixin, models.Model):
630630
)
631631

632632
# Object Manager
633+
objects = ReportManager()
633634

634635
# Custom Properties
635636
@property

tigaserver_app/views.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,10 +283,42 @@ class ReportViewSet(ReadWriteOnlyModelViewSet):
283283
* report_id: The 4-digit report ID.
284284
* type: The report type (adult, site, or mission).
285285
"""
286-
queryset = Report.objects.all()
286+
queryset = Report.objects.all().prefetch_related("responses")
287287
serializer_class = ReportSerializer
288288
filter_fields = ('user', 'version_number', 'report_id', 'type')
289289

290+
def get_queryset(self):
291+
queryset = super().get_queryset()
292+
293+
# Get the filters from the request
294+
is_deleted = self.request.query_params.get('is_deleted', None)
295+
is_last_version = self.request.query_params.get('is_last_version', None)
296+
297+
# Apply additional filters if provided
298+
if is_deleted is not None:
299+
if is_deleted.lower() not in ['true', 'false']:
300+
raise ParseError("Invalid value for 'is_deleted'. It should be 'true', 'false', or not provided.")
301+
302+
if is_deleted.lower() == 'true':
303+
# Filter queryset to include only deleted records
304+
queryset = queryset.deleted(state=True)
305+
elif is_deleted.lower() == 'false':
306+
# Filter queryset to exclude deleted records
307+
queryset = queryset.deleted(state=False)
308+
309+
if is_last_version is not None:
310+
if is_last_version.lower() not in ['true', 'false']:
311+
raise ParseError("Invalid value for 'is_last_version'. It should be 'true', 'false', or not provided.")
312+
313+
if is_last_version.lower() == 'true':
314+
# Filter queryset to include only deleted records
315+
queryset = queryset.last_version_of_each(state=True)
316+
elif is_last_version.lower() == 'false':
317+
# Filter queryset to exclude deleted records
318+
queryset = queryset.last_version_of_each(state=False)
319+
320+
return queryset
321+
290322

291323
# For production version, substitute WriteOnlyModelViewSet
292324
class PhotoViewSet(ReadWriteOnlyModelViewSet):

0 commit comments

Comments
 (0)