Commit 53cc14f6 authored by impfundev's avatar impfundev

fix: refactoring and add categories api

parent 03d0b7ba
from datetime import datetime
from django.contrib.auth import get_user_model
from rest_framework import serializers
from books.models import Book
from books.models import Book, Category
from members.models import Members
from book_loans.models import BookLoans
from librarians.models import Librarians
......@@ -10,49 +11,53 @@ from librarians.models import Librarians
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = ["url", "id", "username", "email", "password", "is_staff"]
fields = "__all__"
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = "__all__"
class BookSerializer(serializers.ModelSerializer):
category_detail = CategorySerializer(source="category", read_only=True)
class Meta:
model = Book
fields = [
"id",
"title",
"stock",
"description",
"cover_image",
"category",
"published_year",
"created_at",
"updated_at",
]
fields = "__all__"
class MemberSerializer(serializers.ModelSerializer):
class Meta:
model = Members
fields = ["id", "name", "email", "password", "created_at", "updated_at"]
fields = "__all__"
class LibrarianSerializer(serializers.ModelSerializer):
class Meta:
model = Librarians
fields = ["id", "name", "email", "password", "created_at", "updated_at"]
fields = "__all__"
class BookLoanSerializer(serializers.ModelSerializer):
book_detail = BookSerializer(source="book", read_only=True)
member_detail = MemberSerializer(source="member", read_only=True)
librarian_detail = LibrarianSerializer(source="librarian", read_only=True)
class Meta:
model = BookLoans
fields = "__all__"
class MemberLoanSerializer(BookLoanSerializer):
is_overdue = serializers.BooleanField(read_only=True)
def to_representation(self, instance):
data = super().to_representation(instance)
data["is_overdue"] = instance.due_date.date() < datetime.now().date()
return data
class Meta:
model = BookLoans
fields = [
"id",
"book",
"member",
"librarian",
"notes",
"loan_date",
"due_date",
"return_date",
"created_at",
"updated_at",
]
fields = ["book", "loan_date", "due_date", "is_overdue"]
......@@ -3,6 +3,7 @@ from rest_framework import routers
from api.views import (
UserViewSet,
BookViewSet,
CategoryViewSet,
MemberViewSet,
LibrarianViewSet,
BookLoanViewSet,
......@@ -14,11 +15,13 @@ from api.views import (
ChangePasswordAsMember,
OverduedBookLoanViewSet,
UpComingBookLoanViewSet,
MemberLoanViewSet,
)
router = routers.DefaultRouter()
router.register(r"users", UserViewSet, basename="users")
router.register(r"books", BookViewSet, basename="books")
router.register(r"categories", CategoryViewSet, basename="categories")
router.register(r"members", MemberViewSet, basename="members")
router.register(r"librarians", LibrarianViewSet, basename="librarians")
router.register(r"book-loans", BookLoanViewSet, basename="book_loans")
......@@ -29,6 +32,10 @@ router.register(
r"upcoming-loans", UpComingBookLoanViewSet, basename="book_loans_upcoming"
)
# extend endpoint member
router_member = routers.DefaultRouter()
router_member.register(r"loans", MemberLoanViewSet, basename="members_loans")
urlpatterns = [
path("", include(router.urls)),
path("login/librarian/", LoginAsLibrarian.as_view(), name="login_librarian"),
......@@ -53,4 +60,10 @@ urlpatterns = [
ChangePasswordAsMember.as_view(),
name="change_pw_member",
),
# extended
path(
"members/<int:member_id>/",
include(router_member.urls),
name="member_loans",
),
]
......@@ -14,12 +14,15 @@ from api.serializers import (
UserSerializer,
Book,
BookSerializer,
Category,
CategorySerializer,
Members,
MemberSerializer,
Librarians,
LibrarianSerializer,
BookLoans,
BookLoanSerializer,
MemberLoanSerializer,
)
from librarians.models import LoginHistory
......@@ -35,15 +38,37 @@ class BookViewSet(viewsets.ModelViewSet):
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend, SearchFilter]
filterset_fields = ["published_year", "category__name"]
search_fields = filterset_fields
search_fields = ["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 CategoryViewSet(viewsets.ModelViewSet):
queryset = Category.objects.all().order_by("created_at")
serializer_class = CategorySerializer
filter_backends = [DjangoFilterBackend, SearchFilter]
filterset_fields = ["created_at", "updated_at"]
search_fields = ["name", "description"]
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 MemberViewSet(viewsets.ModelViewSet):
queryset = Members.objects.all().order_by("created_at")
serializer_class = MemberSerializer
filter_backends = [DjangoFilterBackend, SearchFilter]
filterset_fields = ["name", "email"]
search_fields = filterset_fields
filterset_fields = ["created_at", "updated_at"]
search_fields = ["name", "email"]
class LibrarianViewSet(viewsets.ModelViewSet):
......@@ -51,19 +76,22 @@ class LibrarianViewSet(viewsets.ModelViewSet):
serializer_class = LibrarianSerializer
filter_backends = [DjangoFilterBackend, SearchFilter]
filterset_fields = ["name", "email"]
search_fields = filterset_fields
search_fields = ["name", "email"]
class BookLoanViewSet(viewsets.ModelViewSet):
queryset = BookLoans.objects.all().order_by("created_at")
serializer_class = BookLoanSerializer
filter_backends = [DjangoFilterBackend, SearchFilter]
filterset_fields = [
"loan_date",
"due_date",
"return_date",
]
search_fields = filterset_fields
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):
......@@ -86,6 +114,15 @@ class UpComingBookLoanViewSet(BookLoanViewSet):
)
class MemberLoanViewSet(BookLoanViewSet):
queryset = BookLoans.objects.all()
serializer_class = MemberLoanSerializer
def get_queryset(self):
member_id = self.kwargs.get("member_id")
return BookLoans.objects.filter(member__id=member_id).order_by("created_at")
class LoginAsLibrarian(views.APIView):
def post(self, request):
......@@ -152,6 +189,11 @@ class ChangePasswordAsLibrarian(views.APIView):
is_email_exists = librarian.exists()
new_password = data.get("new_password")
if request.data.email is None or request.data.password is None:
return Response(
{"message": "Email or Password is required fields, cannot be empty"}
)
if not is_email_exists:
return Response(
{"message": "Invalid Email, please enter valid email!"},
......
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