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 rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.filters import SearchFilter
from django_filters.rest_framework import DjangoFilterBackend
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .serializers import BookLoan, BookLoanSerializer
from ..auth.permissions import IsNotStaffUser, IsStaffUser
from loans.models import BookLoan
class BookLoanViewSet(viewsets.ModelViewSet):
permission_classes = [IsStaffUser]
queryset = BookLoan.objects.all().order_by("loan_date")
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")
)
@csrf_exempt
def bookLoanView(request):
header_authorization = request.headers.get("Authorization")
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):
permission_classes = [IsNotStaffUser]
queryset = BookLoan.objects.all()
serializer_class = BookLoanSerializer
try:
token = header_authorization.split(" ")[1]
jwt.decode(token, key="secret", algorithms=["HS256"])
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):
member_id = self.kwargs.get("member_id")
if overdue:
loans = loans.filter(due_date__lte=now, return_date=None).order_by(
"loan_date"
)
now = timezone.now()
due_date_treshold = now + timezone.timedelta(days=3)
near_outstanding = self.request.query_params.get("near_outstanding")
overdue = self.request.query_params.get("overdue")
data = []
for loan_item in loans:
remaining_loan_time = (
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 (
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")
)
return JsonResponse(data, safe=False, status=200)
if overdue:
return (
BookLoan.objects.filter(member=member_id)
.filter(due_date__lte=now, return_date=None)
.order_by("loan_date")
)
except jwt.exceptions.InvalidTokenError:
return JsonResponse({"message": "Unauthorized"}, status=401)
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 rest_framework import routers
from django.urls import path
from .auth.views import (
registerUserView,
......@@ -15,24 +14,9 @@ from .auth.views import (
)
from .book.views import bookView, categoryView
from .loans.views import (
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"
)
from .loans.views import bookLoanView
urlpatterns = [
path("", include(router.urls)),
# auth
path("user", getUserDetail, name="user_detail"),
path("user/loans", memberLoanView, name="user_loans"),
......@@ -52,4 +36,6 @@ urlpatterns = [
path("books", bookView, name="books"),
# 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