diff --git a/core/api/billPriceSum.py b/core/api/billPriceSum.py index 7a5d83fe7bb299e4eac8de28ae98ec1b26392e36..388c1290ba0920d311ce1d581423574b391f50cc 100644 --- a/core/api/billPriceSum.py +++ b/core/api/billPriceSum.py @@ -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) diff --git a/core/api/billSearch.py b/core/api/billSearch.py index 75207375917863d689c003d47c3858c6356c9c35..4d8fb76945468ddc8165e1deac710f1b44c75635 100644 --- a/core/api/billSearch.py +++ b/core/api/billSearch.py @@ -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 diff --git a/core/models/bill.py b/core/models/bill.py index 3579d86ea0e99741a88a0a9b838f354ab1b5d0a0..6d1d28db18adf373e418063c6d34f195e15e0b20 100644 --- a/core/models/bill.py +++ b/core/models/bill.py @@ -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):