Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
L
library-app-django
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Ilham Maulana
library-app-django
Commits
53cc14f6
Commit
53cc14f6
authored
Jul 11, 2024
by
impfundev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: refactoring and add categories api
parent
03d0b7ba
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
97 additions
and
37 deletions
+97
-37
serializers.py
api/serializers.py
+32
-27
urls.py
api/urls.py
+13
-0
views.py
api/views.py
+52
-10
No files found.
api/serializers.py
View file @
53cc14f6
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"
]
api/urls.py
View file @
53cc14f6
...
...
@@ -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"
,
),
]
api/views.py
View file @
53cc14f6
...
...
@@ -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!"
},
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment