Skip to content

Commit 700a538

Browse files
authored
Merge pull request #175 from PotLock/testnet
feat: implement filters
2 parents c5b9d24 + 09d4594 commit 700a538

File tree

1 file changed

+33
-17
lines changed

1 file changed

+33
-17
lines changed

campaigns/api.py

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import requests
2+
from django.utils import timezone
3+
from django.db.models import Q, F, FloatField
4+
from django.db.models.functions import Cast
25
from django.conf import settings
36
from django.utils.decorators import method_decorator
47
from django.views.decorators.cache import cache_page
@@ -56,10 +59,11 @@ class CampaignsAPI(APIView, CustomSizePageNumberPagination):
5659
type=str,
5760
),
5861
OpenApiParameter(
59-
name="active",
62+
name="status",
6063
description="Filter by active campaigns (true/false)",
6164
required=False,
62-
type=bool,
65+
type=str,
66+
enum=["active", "upcoming", "ended", "unfufilled"],
6367
),
6468
],
6569
responses={
@@ -94,25 +98,37 @@ def get(self, request: Request, *args, **kwargs):
9498

9599
token = request.query_params.get('token')
96100
if token:
97-
if token.lower() == 'near':
98-
queryset = queryset.filter(token__isnull=True)
99-
else:
100-
queryset = queryset.filter(token__account__id=token)
101+
queryset = queryset.filter(token__account__id=token.lower())
101102

102-
active = request.query_params.get('active')
103-
if active is not None:
104-
from django.utils import timezone
105-
from django.db import models
103+
status = request.query_params.get('status')
104+
if status:
106105
now = timezone.now()
107-
if active.lower() == 'true':
106+
status = status.lower()
107+
queryset = queryset.annotate(
108+
cast_net_raised=Cast('net_raised_amount', FloatField()),
109+
cast_max_amount=Cast('max_amount', FloatField()),
110+
cast_target=Cast('target_amount', FloatField())
111+
)
112+
if status == 'upcoming':
113+
queryset = queryset.filter(start_at__gt=now)
114+
elif status == 'active':
108115
queryset = queryset.filter(
109-
start_at__lte=now,
110-
end_at__gte=now
111-
)
112-
else:
116+
start_at__lte=now
117+
).filter(
118+
Q(end_at__isnull=True) | Q(end_at__gt=now)
119+
).filter(
120+
Q(max_amount__isnull=True) | Q(cast_net_raised__lt=F('cast_max_amount'))
121+
)
122+
elif status == 'ended':
113123
queryset = queryset.filter(
114-
models.Q(start_at__gt=now) | models.Q(end_at__lt=now)
115-
)
124+
Q(end_at__isnull=False, end_at__lte=now) |
125+
Q(max_amount__isnull=False, cast_net_raised__gte=F('cast_max_amount'))
126+
)
127+
elif status == 'unfufilled':
128+
queryset = queryset.filter(
129+
Q(end_at__isnull=False, end_at__lte=now),
130+
cast_net_raised__lt=F('cast_target')
131+
)
116132

117133
# Paginate results
118134
page = self.paginate_queryset(queryset, request)

0 commit comments

Comments
 (0)