Commit 50ec5484 authored by Ilham Maulana's avatar Ilham Maulana 💻

fix: shift book loans endpoint to not use drf

parent b07c63d8
from django.utils import timezone
from rest_framework import serializers
from loans.models import BookLoan
from ..book.serializers import BookSerializer
from ..auth.serializers import MemberSerializer
class BookLoanSerializer(serializers.ModelSerializer):
book_detail = BookSerializer(source="book", read_only=True)
member_detail = MemberSerializer(source="member", read_only=True)
remaining_loan_time = serializers.DateTimeField(read_only=True)
def to_representation(self, instance):
data = super().to_representation(instance)
now = timezone.now()
remaining_loan_time = instance.due_date - now
days = remaining_loan_time.days
hours, remainder = divmod(remaining_loan_time.seconds, 3600)
minutes = remainder // 60
time_string = ""
if days > 0:
time_string += f"{days} days"
if hours > 0:
time_string += f" {hours} hrs"
if minutes > 0:
time_string += f" {minutes} mins"
data["remaining_loan_time"] = time_string + " days left"
data["is_overdue"] = instance.due_date < timezone.now()
return data
class Meta:
model = BookLoan
fields = "__all__"
import jwt
from django.utils import timezone from django.utils import timezone
from rest_framework import viewsets from django.http import JsonResponse
from rest_framework.response import Response from django.views.decorators.csrf import csrf_exempt
from rest_framework.filters import SearchFilter
from django_filters.rest_framework import DjangoFilterBackend
from .serializers import BookLoan, BookLoanSerializer from loans.models import BookLoan
from ..auth.permissions import IsNotStaffUser, IsStaffUser
class BookLoanViewSet(viewsets.ModelViewSet): @csrf_exempt
permission_classes = [IsStaffUser] def bookLoanView(request):
queryset = BookLoan.objects.all().order_by("loan_date") header_authorization = request.headers.get("Authorization")
serializer_class = BookLoanSerializer
filter_backends = [DjangoFilterBackend, SearchFilter]
filterset_fields = ["loan_date", "due_date", "return_date"]
search_fields = [
"member__user__username",
"member__user__email",
"member__user__first_name",
"member__user__last_name",
"book__title",
]
def update(self, request, pk):
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
class OverduedBookLoanViewSet(BookLoanViewSet):
now = timezone.now()
queryset = (
BookLoan.objects.all()
.filter(due_date__lte=now, return_date=None)
.order_by("loan_date")
)
class UpComingBookLoanViewSet(BookLoanViewSet):
now = timezone.now()
due_date_treshold = now + timezone.timedelta(days=3)
queryset = (
BookLoan.objects.all()
.filter(due_date__lte=due_date_treshold, return_date=None)
.filter(due_date__gte=now)
.order_by("loan_date")
)
if request.method == "GET":
now = timezone.now()
due_date_treshold = now + timezone.timedelta(days=3)
loans = BookLoan.objects.all().order_by("loan_date")
near_outstanding = request.GET.get("near_outstanding")
overdue = request.GET.get("overdue")
class MemberLoanViewSet(BookLoanViewSet): try:
permission_classes = [IsNotStaffUser] token = header_authorization.split(" ")[1]
queryset = BookLoan.objects.all() jwt.decode(token, key="secret", algorithms=["HS256"])
serializer_class = BookLoanSerializer if near_outstanding:
loans = (
loans.filter(due_date__lte=due_date_treshold, return_date=None)
.filter(due_date__gte=now)
.order_by("loan_date")
)
def get_queryset(self): if overdue:
member_id = self.kwargs.get("member_id") loans = loans.filter(due_date__lte=now, return_date=None).order_by(
"loan_date"
)
now = timezone.now() data = []
due_date_treshold = now + timezone.timedelta(days=3) for loan_item in loans:
near_outstanding = self.request.query_params.get("near_outstanding") remaining_loan_time = (
overdue = self.request.query_params.get("overdue") str(loan_item.due_date.day - now.day) + " days left"
)
is_overdue = loan_item.due_date < now
loan_obj = {
"book": {
"id": loan_item.book.id,
"title": loan_item.book.title,
"author": loan_item.book.author,
"description": loan_item.book.description,
"cover_image": loan_item.book.cover_image.url,
},
"user": {
"id": loan_item.member.user.id,
"username": loan_item.member.user.username,
"email": loan_item.member.user.email,
"first_name": loan_item.member.user.first_name,
"last_name": loan_item.member.user.last_name,
"is_staff": loan_item.member.user.is_staff,
},
"remaining_loan_time": remaining_loan_time,
"is_overdue": is_overdue,
"loan_date": loan_item.loan_date,
"due_date": loan_item.due_date,
}
data.append(loan_obj)
if near_outstanding: return JsonResponse(data, safe=False, status=200)
return (
BookLoan.objects.filter(member=member_id)
.filter(due_date__lte=due_date_treshold, return_date=None)
.filter(due_date__gte=now)
.order_by("loan_date")
)
if overdue: except jwt.exceptions.InvalidTokenError:
return ( return JsonResponse({"message": "Unauthorized"}, status=401)
BookLoan.objects.filter(member=member_id)
.filter(due_date__lte=now, return_date=None)
.order_by("loan_date")
)
return BookLoan.objects.filter(member=member_id).order_by("loan_date") return JsonResponse({"message": "Invalid request method"}, status=405)
from django.urls import path, include from django.urls import path
from rest_framework import routers
from .auth.views import ( from .auth.views import (
registerUserView, registerUserView,
...@@ -15,24 +14,9 @@ from .auth.views import ( ...@@ -15,24 +14,9 @@ from .auth.views import (
) )
from .book.views import bookView, categoryView from .book.views import bookView, categoryView
from .loans.views import ( from .loans.views import bookLoanView
BookLoanViewSet,
OverduedBookLoanViewSet,
UpComingBookLoanViewSet,
)
router = routers.DefaultRouter()
router.register(r"book-loans", BookLoanViewSet, basename="book_loans")
router.register(
r"overdued-loans", OverduedBookLoanViewSet, basename="book_loans_overdued"
)
router.register(
r"upcoming-loans", UpComingBookLoanViewSet, basename="book_loans_upcoming"
)
urlpatterns = [ urlpatterns = [
path("", include(router.urls)),
# auth # auth
path("user", getUserDetail, name="user_detail"), path("user", getUserDetail, name="user_detail"),
path("user/loans", memberLoanView, name="user_loans"), path("user/loans", memberLoanView, name="user_loans"),
...@@ -52,4 +36,6 @@ urlpatterns = [ ...@@ -52,4 +36,6 @@ urlpatterns = [
path("books", bookView, name="books"), path("books", bookView, name="books"),
# categories # categories
path("categories", categoryView, name="categories"), path("categories", categoryView, name="categories"),
# book loans
path("book-loans", bookLoanView, name="book_loans"),
] ]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment