Commit 8a89be20 authored by Ilham Maulana's avatar Ilham Maulana 💻

feat: loan api

parent 66e268c6
from rest_framework import serializers
from loans.models import BookLoan
class BookLoanSerializer(serializers.ModelSerializer):
class Meta:
model = BookLoan
fields = "__all__"
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 .serializers import BookLoan, BookLoanSerializer
class BookLoanViewSet(viewsets.ModelViewSet):
queryset = BookLoan.objects.all().order_by("loan_date")
serializer_class = BookLoanSerializer
filter_backends = [DjangoFilterBackend, SearchFilter]
filterset_fields = ["loan_date", "due_date", "return_date", "member__id"]
search_fields = ["book__title", "member__name"]
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")
)
...@@ -10,12 +10,25 @@ from .auth.views import ( ...@@ -10,12 +10,25 @@ from .auth.views import (
MemberLogoutView, MemberLogoutView,
) )
from .book.views import BookViewSet, CategoryViewSet from .book.views import BookViewSet, CategoryViewSet
from .loans.views import (
BookLoanViewSet,
OverduedBookLoanViewSet,
UpComingBookLoanViewSet,
)
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r"librarians", LibrarianViewSet, basename="librarians") router.register(r"librarians", LibrarianViewSet, basename="librarians")
router.register(r"members", MemberViewSet, basename="members") router.register(r"members", MemberViewSet, basename="members")
router.register(r"books", BookViewSet, basename="books") router.register(r"books", BookViewSet, basename="books")
router.register(r"categories", CategoryViewSet, basename="categories") router.register(r"categories", CategoryViewSet, basename="categories")
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)), path("", include(router.urls)),
......
...@@ -40,6 +40,7 @@ INSTALLED_APPS = [ ...@@ -40,6 +40,7 @@ INSTALLED_APPS = [
# local # local
"users.apps.UsersConfig", "users.apps.UsersConfig",
"book.apps.BookConfig", "book.apps.BookConfig",
"loans.apps.LoansConfig",
# 3rd party # 3rd party
"rest_framework", "rest_framework",
"django_filters", "django_filters",
...@@ -127,7 +128,7 @@ AUTH_PASSWORD_VALIDATORS = [ ...@@ -127,7 +128,7 @@ AUTH_PASSWORD_VALIDATORS = [
LANGUAGE_CODE = "en-us" LANGUAGE_CODE = "en-us"
TIME_ZONE = "UTC" TIME_ZONE = "Asia/Jakarta"
USE_I18N = True USE_I18N = True
......
from django.contrib import admin
# Register your models here.
from django.apps import AppConfig
class LoansConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'loans'
# Generated by Django 5.0.7 on 2024-07-14 12:04
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('book', '0005_remove_book_category_book_category'),
('users', '0002_initial'),
]
operations = [
migrations.CreateModel(
name='BookLoan',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('loan_date', models.DateTimeField(auto_now_add=True)),
('due_date', models.DateTimeField()),
('return_date', models.DateTimeField(blank=True, null=True)),
('book', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='book.book')),
('member', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='users.member')),
],
),
]
from django.db import models
from book.models import Book
from users.models import Member
class BookLoan(models.Model):
book = models.OneToOneField(Book, on_delete=models.CASCADE)
member = models.OneToOneField(Member, on_delete=models.CASCADE)
loan_date = models.DateTimeField(auto_now_add=True)
due_date = models.DateTimeField()
return_date = models.DateTimeField(blank=True, null=True)
from django.test import TestCase
from django.shortcuts import render
# Create your views here.
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