Commit 25dbefd5 authored by impfundev's avatar impfundev

feat: upcoming loans and overdue loans page

parent 47b23a36
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<tr> <tr>
<td>{{ loan.book.title }}</td> <td>{{ loan.book.title }}</td>
<td>{{ loan.member.name }}</td> <td>{{ loan.member.name }}</td>
<td>{{ loan.librarians.name }}</td> <td>{{ loan.librarian.name }}</td>
<td>{{ loan.loan_date }}</td> <td>{{ loan.loan_date }}</td>
<td>{{ loan.due_date }}</td> <td>{{ loan.due_date }}</td>
<td>{{ loan.return_date }}</td> <td>{{ loan.return_date }}</td>
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
<a <a
href="/dashboard" href="/dashboard"
class="btn {% if request.path == '/dashboard/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100" class="btn {% if request.path == '/dashboard/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100"
><i class="bi bi-bar-chart-line-fill"></i> Reports</a ><i class="bi bi-columns-gap"></i> Dashboard</a
> >
<a <a
href="/dashboard/books" href="/dashboard/books"
...@@ -24,15 +24,25 @@ ...@@ -24,15 +24,25 @@
class="btn {% if request.path == '/dashboard/members/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100" class="btn {% if request.path == '/dashboard/members/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100"
><i class="bi bi-person-vcard"></i> Members</a ><i class="bi bi-person-vcard"></i> Members</a
> >
<a
href="/dashboard/librarians"
class="btn {% if request.path == '/dashboard/librarians/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100"
><i class="bi bi-person-fill-lock"></i> Librarian</a
>
<a <a
href="/dashboard/book-loans" href="/dashboard/book-loans"
class="btn {% if request.path == '/dashboard/book-loans/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100" class="btn {% if request.path == '/dashboard/book-loans/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100"
><i class="bi bi-calendar-week"></i> Book Loans</a ><i class="bi bi-calendar-week"></i> Book Loans</a
> >
<a <a
href="/dashboard/librarians" href="/dashboard/upcoming-loans/"
class="btn {% if request.path == '/dashboard/librarians/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100" class="btn {% if request.path == '/dashboard/upcoming-loans/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100"
><i class="bi bi-person-fill-lock"></i> Librarian</a ><i class="bi bi-calendar2-event"></i> Upcoming Loans</a
>
<a
href="/dashboard/overdued-loans/"
class="btn {% if request.path == '/dashboard/overdued-loans/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100"
><i class="bi bi-calendar2-x"></i> Overdued Loans</a
> >
</div> </div>
</div> </div>
......
from django.urls import path, include from django.urls import path, include
from dashboards.views import index from dashboards.views import index, UpcomingLoanView, OverduedLoanView
urlpatterns = [ urlpatterns = [
path("", index, name="dashboard"), path("", index, name="dashboard"),
...@@ -7,4 +7,6 @@ urlpatterns = [ ...@@ -7,4 +7,6 @@ urlpatterns = [
path("members/", include("members.urls")), path("members/", include("members.urls")),
path("book-loans/", include("book_loans.urls")), path("book-loans/", include("book_loans.urls")),
path("librarians/", include("librarians.urls")), path("librarians/", include("librarians.urls")),
path("upcoming-loans/", UpcomingLoanView.as_view(), name="upcoming_loans"),
path("overdued-loans/", OverduedLoanView.as_view(), name="overdued_loans"),
] ]
from datetime import datetime, timedelta from django.db.models import Q
from django.views.generic import ListView
from django.shortcuts import render from django.shortcuts import render
from datetime import datetime, timedelta
from librarians.models import LoginHistory from librarians.models import LoginHistory
from members.models import Members from members.models import Members
from book_loans.models import Book, BookLoans from book_loans.models import Book, BookLoans
class OverduedLoanView(ListView):
model = BookLoans
template_name = "loans.html"
paginate_by = 5
def get_queryset(self):
queryset = super().get_queryset()
keyword = self.request.GET.get("q")
order = self.request.GET.get("o")
now = datetime.now()
queryset = queryset.filter(due_date__lte=now, return_date=None).order_by(
"-updated_at"
)
if keyword:
queryset = queryset.filter(
Q(book__title__icontains=keyword)
| Q(member__name__icontains=keyword)
| Q(librarian__name__icontains=keyword)
).order_by("-created_at")
if order:
if order == "new":
queryset = queryset.order_by("-created_at")
elif order == "old":
queryset = queryset.order_by("created_at")
return queryset
class UpcomingLoanView(ListView):
model = BookLoans
template_name = "loans.html"
paginate_by = 5
def get_queryset(self):
queryset = super().get_queryset()
keyword = self.request.GET.get("q")
order = self.request.GET.get("o")
now = datetime.now()
due_date_treshold = now.today() + timedelta(days=3)
queryset = (
queryset.filter(due_date__lte=due_date_treshold, return_date=None)
.filter(due_date__gte=now.today())
.order_by("-updated_at")
)
if keyword:
queryset = queryset.filter(
Q(book__title__icontains=keyword)
| Q(member__name__icontains=keyword)
| Q(librarian__name__icontains=keyword)
).order_by("-created_at")
if order:
if order == "new":
queryset = queryset.order_by("-created_at")
elif order == "old":
queryset = queryset.order_by("created_at")
return queryset
def home(request): def home(request):
return render(request, "homepage.html") return render(request, "homepage.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