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): ...@@ -36,9 +36,9 @@ class BillSumPriceListView(generics.ListAPIView):
for i in range(1,12): for i in range(1,12):
qs = BillSearchQuerySet(Bill).searchCategories(query=i, user=user) qs = BillSearchQuerySet(Bill).searchCategories(query=i, user=user)
if item == 'today': if item == 'today':
qs = qs.searchToday(user=user) qs = qs.searchByDay(user=user)
elif item == 'month': elif item == 'month':
qs = qs.searchThisMonth(user=user) qs = qs.searchByMonth(user=user)
total_price = qs.aggregate(Sum('price')) total_price = qs.aggregate(Sum('price'))
data[categorieModel[i]] = total_price['price__sum'] data[categorieModel[i]] = total_price['price__sum']
return response.Response(data) return response.Response(data)
......
...@@ -3,6 +3,9 @@ from core.models.bill import Bill, BillSearchQuerySet ...@@ -3,6 +3,9 @@ from core.models.bill import Bill, BillSearchQuerySet
from core.serializers.bill import BillSerializer from core.serializers.bill import BillSerializer
from rest_framework import permissions, authentication from rest_framework import permissions, authentication
from datetime import date, datetime
class SearchBillListView(generics.ListAPIView): class SearchBillListView(generics.ListAPIView):
queryset = Bill.objects.all() queryset = Bill.objects.all()
serializer_class = BillSerializer serializer_class = BillSerializer
...@@ -10,27 +13,31 @@ class SearchBillListView(generics.ListAPIView): ...@@ -10,27 +13,31 @@ class SearchBillListView(generics.ListAPIView):
# item = categories -----> keyword = 1/2/3/4/5 .. # item = categories -----> keyword = 1/2/3/4/5 ..
# price -----> keyword = price # price -----> keyword = price
# date -----> keyword = month / day # date -----> keyword = month / day / year -----> date: yyyy/mm/dd
# title -----> keyword = title # title -----> keyword = title
def get_queryset(self, *args, **kwargs): def get_queryset(self, *args, **kwargs):
print(self.request.query_params)
qs = BillSearchQuerySet(Bill) qs = BillSearchQuerySet(Bill)
item = self.request.GET.get("item") item = self.request.query_params.get("item")
result = Bill.objects.none() result = Bill.objects.none()
user = None user = None
if self.request.user.is_authenticated: if self.request.user.is_authenticated:
user = self.request.user user = self.request.user
keyword = self.request.GET.get("keyword") keyword = self.request.query_params.get("keyword")
if item == "categories": if item == "categories":
result = qs.searchCategories(keyword, user=user) result = qs.searchCategories(keyword, user=user)
elif item == "price": elif item == "price":
result = qs.searchPrice(keyword, user=user) result = qs.searchPrice(keyword, user=user)
elif item == "date": elif item == "date":
if keyword == "month": anchor_date = self.request.query_params.get("date", None)
result = qs.searchThisMonth(user=user) anchor_date = date.today() if anchor_date is None else datetime.strptime(anchor_date, '%Y-%m-%d')
elif keyword == "today": if keyword == "year":
result = qs.searchToday(user=user) 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": elif item == "title":
result = qs.searchTitle(keyword, user=user) result = qs.searchTitle(keyword, user=user)
return result return result
\ No newline at end of file
...@@ -6,7 +6,6 @@ from core.models.utils import UUIDModel ...@@ -6,7 +6,6 @@ from core.models.utils import UUIDModel
import datetime import datetime
from datetime import date from datetime import date
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
# pip install python-dateutil
class BillSearchQuerySet(models.QuerySet): class BillSearchQuerySet(models.QuerySet):
...@@ -24,24 +23,31 @@ class BillSearchQuerySet(models.QuerySet): ...@@ -24,24 +23,31 @@ class BillSearchQuerySet(models.QuerySet):
qs = self.filter(user=user).filter(lookup) qs = self.filter(user=user).filter(lookup)
return qs return qs
def searchThisMonth(self, user=None): def searchByYear(self, user=None, anchor_date=date.today()):
end_date = date.today() start_date = anchor_date + relativedelta(month=1) + relativedelta(day=1)
start_date = end_date + relativedelta(months=-1) end_date = start_date + relativedelta(years=1) + relativedelta(seconds=-1)
lookup = Q(date__range = [start_date, end_date]) lookup = Q(date__range = [start_date, end_date])
qs = self.filter(lookup) qs = self.filter(lookup)
if user is not None: if user is not None:
qs = self.filter(user=user).filter(lookup) qs = self.filter(user=user).filter(lookup)
return qs return qs
def searchToday(self, user=None): def searchByMonth(self, user=None, anchor_date=date.today()):
end_date = date.today() start_date = anchor_date + relativedelta(day=1)
start_date = end_date + relativedelta(days=-1) end_date = start_date + relativedelta(months=1) + relativedelta(seconds=-1)
lookup = Q(date__range = [start_date, end_date]) lookup = Q(date__range = [start_date, end_date])
qs = self.filter(lookup) qs = self.filter(lookup)
if user is not None: if user is not None:
qs = self.filter(user=user).filter(lookup) qs = self.filter(user=user).filter(lookup)
return qs 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): 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