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