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
50ec5484
Commit
50ec5484
authored
Aug 05, 2024
by
Ilham Maulana
💻
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: shift book loans endpoint to not use drf
parent
b07c63d8
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
62 additions
and
125 deletions
+62
-125
serializers.py
api/loans/serializers.py
+0
-37
views.py
api/loans/views.py
+58
-70
urls.py
api/urls.py
+4
-18
No files found.
api/loans/serializers.py
deleted
100644 → 0
View file @
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__"
api/loans/views.py
View file @
50ec5484
import
jwt
from
django.utils
import
timezone
from
django.utils
import
timezone
from
rest_framework
import
viewsets
from
django.http
import
JsonResponse
from
rest_framework.response
import
Response
from
django.views.decorators.csrf
import
csrf_exempt
from
rest_framework.filters
import
SearchFilter
from
django_filters.rest_framework
import
DjangoFilterBackend
from
.serializers
import
BookLoan
,
BookLoanSerializer
from
loans.models
import
BookLoan
from
..auth.permissions
import
IsNotStaffUser
,
IsStaffUser
class
BookLoanViewSet
(
viewsets
.
ModelViewSet
):
@
csrf_exempt
permission_classes
=
[
IsStaffUser
]
def
bookLoanView
(
request
):
queryset
=
BookLoan
.
objects
.
all
()
.
order_by
(
"loan_date"
)
header_authorization
=
request
.
headers
.
get
(
"Authorization"
)
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"
)
)
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
):
try
:
permission_classes
=
[
IsNotStaffUser
]
token
=
header_authorization
.
split
(
" "
)[
1
]
queryset
=
BookLoan
.
objects
.
all
()
jwt
.
decode
(
token
,
key
=
"secret"
,
algorithms
=
[
"HS256"
])
serializer_class
=
BookLoanSerializer
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
):
if
overdue
:
member_id
=
self
.
kwargs
.
get
(
"member_id"
)
loans
=
loans
.
filter
(
due_date__lte
=
now
,
return_date
=
None
)
.
order_by
(
"loan_date"
)
now
=
timezone
.
now
()
data
=
[]
due_date_treshold
=
now
+
timezone
.
timedelta
(
days
=
3
)
for
loan_item
in
loans
:
near_outstanding
=
self
.
request
.
query_params
.
get
(
"near_outstanding"
)
remaining_loan_time
=
(
overdue
=
self
.
request
.
query_params
.
get
(
"overdue"
)
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
JsonResponse
(
data
,
safe
=
False
,
status
=
200
)
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"
)
)
if
overdue
:
except
jwt
.
exceptions
.
InvalidTokenError
:
return
(
return
JsonResponse
({
"message"
:
"Unauthorized"
},
status
=
401
)
BookLoan
.
objects
.
filter
(
member
=
member_id
)
.
filter
(
due_date__lte
=
now
,
return_date
=
None
)
.
order_by
(
"loan_date"
)
)
return
BookLoan
.
objects
.
filter
(
member
=
member_id
)
.
order_by
(
"loan_date"
)
return
JsonResponse
({
"message"
:
"Invalid request method"
},
status
=
405
)
api/urls.py
View file @
50ec5484
from
django.urls
import
path
,
include
from
django.urls
import
path
from
rest_framework
import
routers
from
.auth.views
import
(
from
.auth.views
import
(
registerUserView
,
registerUserView
,
...
@@ -15,24 +14,9 @@ from .auth.views import (
...
@@ -15,24 +14,9 @@ from .auth.views import (
)
)
from
.book.views
import
bookView
,
categoryView
from
.book.views
import
bookView
,
categoryView
from
.loans.views
import
(
from
.loans.views
import
bookLoanView
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"
)
urlpatterns
=
[
urlpatterns
=
[
path
(
""
,
include
(
router
.
urls
)),
# auth
# auth
path
(
"user"
,
getUserDetail
,
name
=
"user_detail"
),
path
(
"user"
,
getUserDetail
,
name
=
"user_detail"
),
path
(
"user/loans"
,
memberLoanView
,
name
=
"user_loans"
),
path
(
"user/loans"
,
memberLoanView
,
name
=
"user_loans"
),
...
@@ -52,4 +36,6 @@ urlpatterns = [
...
@@ -52,4 +36,6 @@ urlpatterns = [
path
(
"books"
,
bookView
,
name
=
"books"
),
path
(
"books"
,
bookView
,
name
=
"books"
),
# categories
# categories
path
(
"categories"
,
categoryView
,
name
=
"categories"
),
path
(
"categories"
,
categoryView
,
name
=
"categories"
),
# book loans
path
(
"book-loans"
,
bookLoanView
,
name
=
"book_loans"
),
]
]
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