Skip to content
Snippets Groups Projects
Commit 498df470 authored by Chris Li's avatar Chris Li
Browse files

Add new feature: search advanced date by year, month and day

parent bbf55456
No related branches found
No related tags found
No related merge requests found
......@@ -36,9 +36,9 @@ class BillSumPriceListView(generics.ListAPIView):
for i in range(1,12):
qs = BillSearchQuerySet(Bill).searchCategories(query=i, user=user)
if item == 'today':
qs = qs.searchToday(user=user)
qs = qs.searchByDay(user=user)
elif item == 'month':
qs = qs.searchThisMonth(user=user)
qs = qs.searchByMonth(user=user)
total_price = qs.aggregate(Sum('price'))
data[categorieModel[i]] = total_price['price__sum']
return response.Response(data)
......
......@@ -3,6 +3,9 @@ from core.models.bill import Bill, BillSearchQuerySet
from core.serializers.bill import BillSerializer
from rest_framework import permissions, authentication
from datetime import date, datetime
class SearchBillListView(generics.ListAPIView):
queryset = Bill.objects.all()
serializer_class = BillSerializer
......@@ -10,27 +13,31 @@ class SearchBillListView(generics.ListAPIView):
# item = categories -----> keyword = 1/2/3/4/5 ..
# price -----> keyword = price
# date -----> keyword = month / day
# date -----> keyword = month / day / year -----> date: yyyy/mm/dd
# title -----> keyword = title
def get_queryset(self, *args, **kwargs):
print(self.request.query_params)
qs = BillSearchQuerySet(Bill)
item = self.request.GET.get("item")
item = self.request.query_params.get("item")
result = Bill.objects.none()
user = None
if self.request.user.is_authenticated:
user = self.request.user
keyword = self.request.GET.get("keyword")
user = self.request.user
keyword = self.request.query_params.get("keyword")
if item == "categories":
result = qs.searchCategories(keyword, user=user)
elif item == "price":
result = qs.searchPrice(keyword, user=user)
elif item == "date":
if keyword == "month":
result = qs.searchThisMonth(user=user)
elif keyword == "today":
result = qs.searchToday(user=user)
anchor_date = self.request.query_params.get("date", None)
anchor_date = date.today() if anchor_date is None else datetime.strptime(anchor_date, '%Y-%m-%d')
if keyword == "year":
result = qs.searchByYear(user=user, anchor_date=anchor_date)
elif keyword == "month":
result = qs.searchByMonth(user=user, anchor_date=anchor_date)
elif keyword == "day":
result = qs.searchByDay(user=user, anchor_date=anchor_date)
elif item == "title":
result = qs.searchTitle(keyword, user=user)
return result
\ No newline at end of file
......@@ -6,7 +6,6 @@ from core.models.utils import UUIDModel
import datetime
from datetime import date
from dateutil.relativedelta import relativedelta
# pip install python-dateutil
class BillSearchQuerySet(models.QuerySet):
......@@ -24,24 +23,31 @@ class BillSearchQuerySet(models.QuerySet):
qs = self.filter(user=user).filter(lookup)
return qs
def searchThisMonth(self, user=None):
end_date = date.today()
start_date = end_date + relativedelta(months=-1)
def searchByYear(self, user=None, anchor_date=date.today()):
start_date = anchor_date + relativedelta(month=1) + relativedelta(day=1)
end_date = start_date + relativedelta(years=1) + relativedelta(seconds=-1)
lookup = Q(date__range = [start_date, end_date])
qs = self.filter(lookup)
if user is not None:
qs = self.filter(user=user).filter(lookup)
return qs
def searchToday(self, user=None):
end_date = date.today()
start_date = end_date + relativedelta(days=-1)
def searchByMonth(self, user=None, anchor_date=date.today()):
start_date = anchor_date + relativedelta(day=1)
end_date = start_date + relativedelta(months=1) + relativedelta(seconds=-1)
lookup = Q(date__range = [start_date, end_date])
qs = self.filter(lookup)
if user is not None:
qs = self.filter(user=user).filter(lookup)
return qs
def searchByDay(self, user=None, anchor_date=date.today()):
lookup = Q(date = anchor_date)
qs = self.filter(lookup)
if user is not None:
qs = self.filter(user=user).filter(lookup)
return qs
class BillManager(models.Manager):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment