Skip to content
Snippets Groups Projects
Commit 774060e0 authored by Yirou Qiu's avatar Yirou Qiu
Browse files

Merge branch 'yrq/feature/bill-api'

parents 60f0b589 7aa9c490
No related branches found
No related tags found
1 merge request!8Yrq/feature/bill sum price
...@@ -8,11 +8,11 @@ from rest_framework import permissions, authentication ...@@ -8,11 +8,11 @@ from rest_framework import permissions, authentication
class BillListCreate(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): class BillListCreate(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
queryset = Bill.objects.all() queryset = Bill.objects.all()
serializer_class = BillSerializer serializer_class = BillSerializer
authentication_classes = [ # authentication_classes = [
authentication.SessionAuthentication, # authentication.SessionAuthentication,
authentication.TokenAuthentication # authentication.TokenAuthentication
] # ]
# permission_classes = (permissions.IsAuthenticated,) permission_classes = (permissions.IsAuthenticated,)
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs) return self.list(request, *args, **kwargs)
...@@ -28,7 +28,7 @@ class BillListCreate(mixins.ListModelMixin, mixins.CreateModelMixin, generics.Ge ...@@ -28,7 +28,7 @@ class BillListCreate(mixins.ListModelMixin, mixins.CreateModelMixin, generics.Ge
default_user = self.request.user default_user = self.request.user
if not default_user: if not default_user:
default_user = None default_user = None
# serializer.is_valid() serializer.is_valid()
serializer.save(user = default_user) serializer.save(user = default_user)
def get_queryset(self, *args, **kwargs): def get_queryset(self, *args, **kwargs):
...@@ -50,11 +50,11 @@ class BillDetail(mixins.RetrieveModelMixin, ...@@ -50,11 +50,11 @@ class BillDetail(mixins.RetrieveModelMixin,
generics.GenericAPIView): generics.GenericAPIView):
queryset = Bill.objects.all() queryset = Bill.objects.all()
serializer_class = BillSerializer serializer_class = BillSerializer
authentication_classes = [ # authentication_classes = [
authentication.SessionAuthentication, # authentication.SessionAuthentication,
authentication.TokenAuthentication # authentication.TokenAuthentication
] # ]
# permission_classes = (permissions.IsAuthenticated,) permission_classes = (permissions.IsAuthenticated,)
lookup_field = "pk" lookup_field = "pk"
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
...@@ -65,5 +65,19 @@ class BillDetail(mixins.RetrieveModelMixin, ...@@ -65,5 +65,19 @@ class BillDetail(mixins.RetrieveModelMixin,
def delete(self, request, *args, **kwargs): def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs) return self.destroy(request, *args, **kwargs)
def perform_create(self, serializer):
default_user = self.request.user
if not default_user:
default_user = None
serializer.save(user = default_user)
def get_queryset(self, *args, **kwargs):
qs =super().get_queryset(*args, **kwargs)
request = self.request
user = request.user
if not user.is_authenticated:
return Bill.objects.none()
return qs.filter(user = user)
bill_detail_api = BillDetail.as_view() bill_detail_api = BillDetail.as_view()
from rest_framework import generics
from core.models.bill import Bill, BillSearchQuerySet
from core.serializers.bill import BillSerializer
from rest_framework import authentication
class SearchBillListView(generics.ListAPIView):
queryset = Bill.objects.all()
serializer_class = BillSerializer
authentication_classes = [
authentication.SessionAuthentication,
authentication.TokenAuthentication
]
# item = categories -----> keyword = 1/2/3/4/5 ..
# price -----> keyword = price
# date -----> keyword = month / day
# title -----> keyword = title
def get_queryset(self, *args, **kwargs):
qs = BillSearchQuerySet(Bill)
item = self.request.GET.get("item")
result = Bill.objects.none()
user = None
if self.request.user.is_authenticated:
user = self.request.user
keyword = self.request.GET.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)
elif item == "title":
result = qs.searchTitle(keyword, user=user)
print(result)
return result
\ No newline at end of file
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db.models import Q
from core.models.utils import UUIDModel from core.models.utils import UUIDModel
import datetime import datetime
from datetime import date
from dateutil.relativedelta import relativedelta
# pip install python-dateutil
class BillSearchQuerySet(models.QuerySet):
def searchCategories(self, query, user=None):
lookup = Q(categories = query)
qs = self.filter(lookup)
if user is not None:
qs = self.filter(user=user).filter(lookup)
return qs
def searchPrice(self, query, user=None):
lookup = Q(price=query)
qs = self.filter(lookup)
if user is not None:
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)
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)
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 searchTitle(self, keyword, user=None):
lookup = Q(title__contains = keyword)
qs = self.filter(lookup)
if user is not None:
qs = self.filter(user=user).filter(lookup)
return qs
# def categorieAmount(self, date, categories, user=None):
# if date == "day":
# qs = self.searchCategories(categories, user=user).searchToday(user=user)
# elif date == "month":
# qs = self.searchCategories(categories, user=user).searchThisMonth(user=user)
class BillManager(models.Manager):
def get_queryset(self, *args, **kwargs):
return BillSearchQuerySet(self.model, using = self._db)
class Bill(UUIDModel): class Bill(UUIDModel):
user = models.ForeignKey(User, default=1, null=True, on_delete=models.SET_NULL) user = models.ForeignKey(User, default=1, null=True, on_delete=models.SET_NULL)
......
...@@ -7,6 +7,7 @@ from core.api.password import ChangePasswordView ...@@ -7,6 +7,7 @@ from core.api.password import ChangePasswordView
from core.api.profile import ProfileViewSet from core.api.profile import ProfileViewSet
from core.api.coupon import CouponViewSet from core.api.coupon import CouponViewSet
from core.api.bill import * from core.api.bill import *
from core.api.billSearch import SearchBillListView
router = routers.DefaultRouter() router = routers.DefaultRouter()
...@@ -32,7 +33,10 @@ urlpatterns += [ ...@@ -32,7 +33,10 @@ urlpatterns += [
# bill # bill
path('api/bill/', bill_list_create_api, name="bill-list"), path('api/bill/', bill_list_create_api, name="bill-list"),
path('api/bill/<uuid:pk>/', bill_detail_api, name="bill-detail") path('api/bill/<uuid:pk>/', bill_detail_api, name="bill-detail"),
# bill search
path('api/bill/search/', SearchBillListView.as_view(), name="bill-search")
] ]
......
...@@ -8,3 +8,4 @@ djangorestframework==3.14.0 ...@@ -8,3 +8,4 @@ djangorestframework==3.14.0
knox==0.1.14 knox==0.1.14
PyJWT==2.6.0 PyJWT==2.6.0
requests==2.28.2 requests==2.28.2
python-dateutil
\ No newline at end of file
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