Commit ffa82600 authored by impfundev's avatar impfundev

fix: shifting book loan from function base view to class based view

parent 5b686a9e
......@@ -5,8 +5,31 @@ from book_loans.models import BookLoans
class BookLoanForm(forms.ModelForm):
class Meta:
model = BookLoans
fields = ["loan_date", "due_date", "return_date", "notes"]
fields = [
"book",
"member",
"librarian",
"loan_date",
"due_date",
"return_date",
"notes",
]
widgets = {
"book": forms.Select(
attrs={
"class": "form-control",
}
),
"member": forms.Select(
attrs={
"class": "form-control",
}
),
"librarian": forms.Select(
attrs={
"class": "form-control",
}
),
"loan_date": forms.DateTimeInput(
attrs={
"type": "datetime-local",
......
# Generated by Django 5.0.6 on 2024-07-09 07:15
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('book_loans', '0005_alter_bookloans_book_alter_bookloans_librarians_and_more'),
]
operations = [
migrations.RenameField(
model_name='bookloans',
old_name='librarians',
new_name='librarian',
),
]
from django.urls import path
from book_loans.views import index, update, delete
from django.views.decorators.cache import cache_page
from book_loans.views import (
BookLoanListView,
BookLoanCreateView,
BookLoanUpdateView,
BookLoanDeleteView,
)
urlpatterns = [
path("", index, name="book_loan_lists"),
path("<id>/update/", update, name="update_book"),
path("<id>/delete/", delete, name="delete_book_loan"),
path("", BookLoanListView.as_view(), name="book_loan_lists"),
path("add/", BookLoanCreateView.as_view(), name="add_book_loan"),
path("<int:pk>/", BookLoanUpdateView.as_view(), name="update_book_loan"),
path("<int:pk>/delete/", BookLoanDeleteView.as_view(), name="delete_book_loan"),
]
import jwt
from django.conf import settings
from datetime import datetime
from django.db.models import Q
from django.http import HttpResponseRedirect
from django.shortcuts import render, get_object_or_404
from book_loans.models import Book, BookLoans
from members.models import Members
from django.views import generic
from book_loans.models import BookLoans
from book_loans.forms import BookLoanForm
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
def index(request):
book_loan_lists = BookLoans.objects.all()
books = Book.objects.all()
member = Members.objects.all()
context = {
"book_loans": book_loan_lists,
"form": BookLoanForm(),
"books": books,
"members": member,
}
default_page = 1
page = request.GET.get("page", default_page)
items_per_page = 5
paginator = Paginator(book_loan_lists, items_per_page)
try:
page_obj = paginator.page(page)
context["page_obj"] = page_obj
context["book_loans"] = page_obj
except PageNotAnInteger:
page_obj = paginator.page(default_page)
context["page_obj"] = page_obj
context["book_loans"] = page_obj
except EmptyPage:
page_obj = paginator.page(paginator.num_pages)
context["page_obj"] = page_obj
context["book_loans"] = page_obj
if request.method == "POST":
form = BookLoanForm(request.POST)
if form.is_valid:
book_id = request.POST["book"]
member_id = request.POST["member"]
loan_date = form.data["loan_date"]
due_date = form.data["due_date"]
return_date = form.data["return_date"] or None
notes = form.data["notes"]
class BookLoanListView(generic.ListView):
model = BookLoans
template_name = "loans.html"
paginate_by = 5
book = books.get(id=book_id)
new_stock = book.stock - 1
books.filter(id=book_id).update(stock=new_stock)
def get_queryset(self):
queryset = super().get_queryset()
keyword = self.request.GET.get("q")
order = self.request.GET.get("o")
auth_session = request.session.get("auth_session", None)
decoded = jwt.decode(
auth_session, settings.JWT_SECRET, algorithms=["HS256"]
)
librarians_id = decoded["librarian_id"]
BookLoans.objects.create(
book_id=book_id,
member_id=member_id,
loan_date=loan_date,
due_date=due_date,
notes=notes,
librarians_id=librarians_id,
return_date=return_date,
)
if request.method == "GET":
keyword = request.GET.get("q")
order = request.GET.get("o")
if keyword is not None:
filtered_book_list = BookLoans.objects.filter(
Q(member__name__icontains=keyword) | Q(book__title__icontains=keyword)
if keyword:
queryset = queryset.filter(
Q(book__title__icontains=keyword)
| Q(member__name__icontains=keyword)
| Q(librarian__name__icontains=keyword)
).order_by("-created_at")
context["book_loans"] = filtered_book_list
if order == "new":
context["book_loans"] = BookLoans.objects.all().order_by("-created_at")
elif order == "old":
context["book_loans"] = BookLoans.objects.all().order_by("created_at")
return render(request, "loans.html", context)
def update(request, id):
book_loans = BookLoans.objects.order_by("created_at")
loan = get_object_or_404(BookLoans, id=id)
books = Book.objects.all()
member = Members.objects.all()
context = {
"book_loans": book_loans,
"loan": loan,
"books": books,
"members": member,
}
initial_dict = {
"loan_date": loan.loan_date,
"due_date": loan.due_date,
"return_date": loan.return_date,
"notes": loan.notes,
}
form = BookLoanForm(request.POST or None, initial=initial_dict)
if request.method == "POST":
book_id = request.POST["book"]
member_id = request.POST["member"]
loan = BookLoans.objects.filter(id=id)
auth_session = request.session.get("auth_session", None)
decoded = jwt.decode(auth_session, settings.JWT_SECRET, algorithms=["HS256"])
librarians_id = decoded["librarian_id"]
context["initial_book_id"] = book_id
if form.is_valid:
loan_date = form.data["loan_date"]
due_date = form.data["due_date"]
return_date = form.data["return_date"] or None
notes = form.data["notes"]
loan.update(
book_id=book_id,
member_id=member_id,
librarians_id=librarians_id,
loan_date=loan_date,
due_date=due_date,
return_date=return_date,
notes=notes,
updated_at=datetime.now(),
)
updated_loan = BookLoans.objects.get(id=id)
book = Book.objects.get(id=book_id)
new_stock = book.stock + 1
if updated_loan.return_date is not None and book.stock < new_stock:
Book.objects.filter(id=book_id).update(stock_in=new_stock)
return HttpResponseRedirect("/dashboard/book-loans")
context["form"] = form
return render(request, "book_loan_update_form.html", context)
if order:
if order == "new":
queryset = queryset.order_by("-created_at")
elif order == "old":
queryset = queryset.order_by("created_at")
def delete(request, id):
context = {}
book_loan = get_object_or_404(BookLoans, id=id)
return queryset.order_by("-updated_at")
if request.method == "POST":
books = Book.objects.all()
book_id = request.POST["book_id"]
book = Book.objects.get(id=book_id)
new_stock = book.stock + 1
class BookLoanCreateView(generic.edit.CreateView):
model = BookLoans
form_class = BookLoanForm
success_url = "/dashboard/book-loans/"
template_name = "form/create_form.html"
if book_loan.return_date is None:
books.filter(id=book_id).update(stock=new_stock)
book_loan.delete()
class BookLoanUpdateView(generic.edit.UpdateView):
model = BookLoans
form_class = BookLoanForm
success_url = "/dashboard/book-loans"
template_name = "form/update_form.html"
return HttpResponseRedirect("/dashboard/book-loans")
return render(request, "loans.html", context)
class BookLoanDeleteView(generic.edit.DeleteView):
model = BookLoans
success_url = "/dashboard/book-loans"
template_name = "form/delete_form.html"
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