Commit b6844ada authored by impfundev's avatar impfundev

feat: CRUD Book Loan

parent 4ee10367
from django import forms
class BookLoanForm(forms.Form):
loan_date = forms.DateTimeField(
widget=forms.DateTimeInput(
attrs={
"type": "datetime-local",
"class": "form-control",
}
)
)
due_date = forms.DateTimeField(
widget=forms.DateTimeInput(
attrs={
"type": "datetime-local",
"class": "form-control",
}
)
)
return_date = forms.DateTimeField(
widget=forms.DateTimeInput(
attrs={
"type": "datetime-local",
"class": "form-control",
}
)
)
notes = forms.CharField(
widget=forms.Textarea(
attrs={
"placeholder": "Note",
"class": "form-control",
}
),
)
<form
class="modal fade"
id="book_loan_modal_create"
tabindex="-1"
aria-labelledby="book_loan_modal_label"
aria-hidden="true"
action="/dashboard/book-loans/"
method="POST"
>
<div class="modal-dialog modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">Input Data</h1>
<button
type="button"
class="btn-close"
data-bs-dismiss="modal"
aria-label="Close"
></button>
</div>
<div class="modal-body d-flex flex-column gap-2">
{% csrf_token %}
<label for="book">Book:</label>
<select id="book" name="book" class="form-select">
{% for book in books %}
<option value="{{ book.id }}">{{ book.title }}</option>
{% endfor %}
</select>
<label for="member">Member:</label>
<select id="member" name="member" class="form-select">
{% for member in members %}
<option value="{{ member.id }}">{{ member.name }}</option>
{% endfor %}
</select>
{{ form }}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
Close
</button>
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</div>
</form>
{% for book_loan in book_loans %}
<form
class="modal fade"
id="book_loan_delete_modal_{{ book_loan.id }}"
tabindex="-1"
aria-labelledby="book_loan_delete_label"
aria-hidden="true"
action="/dashboard/book-loans/{{ book_loan.id }}/delete/"
method="POST"
>
{% csrf_token %}
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">
Are you sure want to delete this data</b>?
</h1>
<button
type="button"
class="btn-close"
data-bs-dismiss="modal"
aria-label="Close"
></button>
</div>
<div class="modal-body">
Once data is deleted, it cannot be restored.
<input type="hidden" name="id" id="almacen_id" />
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
Cancel
</button>
<button type="submit" class="btn btn-danger">Continue</button>
</div>
</div>
</div>
</form>
{% endfor %}
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr class="table-primary">
<th scope="col">Book</th>
<th scope="col">Member</th>
<th scope="col">Librarian</th>
<th scope="col">Loan Date</th>
<th scope="col">Due Date</th>
<th scope="col">Return Date</th>
<th scope="col">Created At</th>
<th scope="col">Updated At</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
{% if book_loans %} {% for loan in book_loans %}
<tr>
<td>{{ loan.book.title }}</td>
<td>{{ loan.member.name }}</td>
<td>{{ loan.librarians.name }}</td>
<td>{{ loan.loan_date }}</td>
<td>{{ loan.due_date }}</td>
<td>{{ loan.return_date }}</td>
<td>{{ loan.created_at }}</td>
<td>{{ loan.updated_at }}</td>
<td class="d-flex gap-2 py-4">
<a
class="btn btn-success"
href="/dashboard/book-loans/{{ loan.id }}/update/"
>
<i class="bi bi-pencil-square"></i>
</a>
<button
class="btn btn-danger"
data-bs-toggle="modal"
data-bs-target="#book_loan_delete_modal_{{ loan.id }}"
>
<i class="bi bi-trash3-fill"></i>
</button>
</td>
</tr>
{% endfor %} {% else %}
<tr class="w-100">
<td></td>
<td></td>
<td></td>
<td></td>
<td>
<p>Data Empty</p>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
{% endif %}
</tbody>
</table>
</div>
{% extends "layout.html" %} {% block dashboard %}
<div style="max-width: 80vw" class="w-100 p-4">
<div class="d-flex flex-column gap-2 mb-4">
<form
id="book_loan_update_modal_{{ loan.id }}"
action="/dashboard/book-loans/{{ loan.id }}/update/"
method="POST"
>
{% csrf_token %}
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header justify-content-between">
<h1 class="fs-4">Input Data</h1>
<div class="d-flex gap-2 my-2">
<a href="/dashboard/book-loans/" class="btn btn-secondary">
Cancel
</a>
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
<div class="modal-body">
<label for="book">Book</label>
<select id="book" name="book" class="form-select">
{% for book in books %}
<option value="{{ book.id }}">{{ book.title }}</option>
{% endfor %}
</select>
<label for="member">Member</label>
<select id="member" name="member" class="form-select">
{% for member in members %}
<option value="{{ member.id }}">{{ member.name }}</option>
{% endfor %}
</select>
{{ form.as_p }}
</div>
</div>
</div>
</form>
</div>
</div>
{% endblock dashboard %}
{% extends "layout.html" %} {% block dashboard %}
<div class="w-100 p-4">
{% include "book_loan_delete_form.html" %}
<div class="d-flex flex-column gap-2 mb-4">
<button
type="button"
class="btn btn-primary"
data-bs-toggle="modal"
data-bs-target="#book_loan_modal_create"
>
<i class="bi bi-plus-circle"></i> Add Book Loan
</button>
{% include "book_loan_create_form.html" %}
</div>
{% include "book_loan_table_data.html" %}
</div>
{% endblock dashboard %}
from django.urls import path
from book_loans.views import index, update, delete
urlpatterns = [
path("", index, name="book_loan_lists"),
path("<id>/update/", update, name="update_book"),
path("<id>/delete/", delete, name="delete_book_loan"),
]
from django.shortcuts import render
import jwt
from django.conf import settings
from datetime import datetime
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 book_loans.forms import BookLoanForm
# Create your views here.
def index(request):
latest_book_loan_list = BookLoans.objects.order_by("created_at")[:10]
books = Book.objects.all()
member = Members.objects.all()
context = {
"book_loans": latest_book_loan_list,
"form": BookLoanForm(),
"books": books,
"members": member,
}
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"]
note = form.data["note"]
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,
return_date=return_date,
notes=note,
librarians_id=librarians_id,
)
return render(request, "loans.html", context)
def update(request, id):
latest_book_loan_list = BookLoans.objects.order_by("created_at")[:10]
loan = get_object_or_404(BookLoans, id=id)
books = Book.objects.all()
member = Members.objects.all()
context = {
"book_loans": latest_book_loan_list,
"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"]
if form.is_valid:
loan.update(
book_id=book_id,
member_id=member_id,
librarians_id=librarians_id,
loan_date=form.data["loan_date"],
due_date=form.data["due_date"],
return_date=form.data["return_date"],
notes=form.data["notes"],
updated_at=datetime.now(),
)
return HttpResponseRedirect("/dashboard/book-loans")
context["form"] = form
return render(request, "book_loan_update_form.html", context)
def delete(request, id):
context = {}
book_loan = get_object_or_404(BookLoans, id=id)
if request.method == "POST":
book_loan.delete()
return HttpResponseRedirect("/dashboard/book-loans")
return render(request, "loans.html", context)
......@@ -5,5 +5,6 @@ urlpatterns = [
path("", index, name="dashboard"),
path("books/", include("books.urls")),
path("members/", include("members.urls")),
path("book-loans/", include("book_loans.urls")),
path("librarians/", include("librarians.urls")),
]
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