Commit 33a94841 authored by Ilham Maulana's avatar Ilham Maulana 💻

fix: refactor users member and librarian frontend

parent fd77496a
...@@ -3,9 +3,8 @@ ...@@ -3,9 +3,8 @@
<tr class="table-primary"> <tr class="table-primary">
<th scope="col">Title</th> <th scope="col">Title</th>
<th scope="col">Category</th> <th scope="col">Category</th>
<th scope="col">Stock</th>
<th scope="col">Description</th> <th scope="col">Description</th>
<th scope="col">Year</th> <th scope="col">Published Date</th>
<th scope="col">Created At</th> <th scope="col">Created At</th>
<th scope="col">Updated At</th> <th scope="col">Updated At</th>
<th scope="col"></th> <th scope="col"></th>
...@@ -16,9 +15,8 @@ ...@@ -16,9 +15,8 @@
<tr> <tr>
<td><a href="/dashboard/books/{{ book.id }}/">{{ book.title }}</a></td> <td><a href="/dashboard/books/{{ book.id }}/">{{ book.title }}</a></td>
<td>{{ book.category.name }}</td> <td>{{ book.category.name }}</td>
<td>{{ book.stock }}</td>
<td>{{ book.description }}</td> <td>{{ book.description }}</td>
<td>{{ book.published_year }}</td> <td>{{ book.publish_date }}</td>
<td>{{ book.created_at }}</td> <td>{{ book.created_at }}</td>
<td>{{ book.updated_at }}</td> <td>{{ book.updated_at }}</td>
<td> <td>
......
...@@ -17,6 +17,8 @@ Including another URLconf ...@@ -17,6 +17,8 @@ Including another URLconf
from django.contrib import admin from django.contrib import admin
from django.urls import path, include from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [ urlpatterns = [
# local # local
...@@ -27,3 +29,6 @@ urlpatterns = [ ...@@ -27,3 +29,6 @@ urlpatterns = [
# 3rd party # 3rd party
path("api-auth/", include("rest_framework.urls"), name="api_auth"), path("api-auth/", include("rest_framework.urls"), name="api_auth"),
] ]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
from django.urls import path, include from django.urls import path, include
from users.views import (
LibrarianListView,
LibrarianCreateView,
LibrarianDeleteView,
LibrarianUpdateView,
MemberListView,
MemberCreateView,
MemberDeleteView,
MemberUpdateView,
)
from dashboard.views import DashboardView from dashboard.views import DashboardView
urlpatterns = [ urlpatterns = [
path("", DashboardView.as_view(), name="dashboard"), path("", DashboardView.as_view(), name="dashboard"),
path("books/", include("book.urls")), path("books/", include("book.urls")),
# librarians
path("librarians/", LibrarianListView.as_view(), name="librarian_lists"),
path("librarians/add/", LibrarianCreateView.as_view(), name="create_librarian"),
path(
"librarians/<int:pk>/", LibrarianUpdateView.as_view(), name="update_librarian"
),
path(
"librarians/<int:pk>/delete/",
LibrarianDeleteView.as_view(),
name="delete_librarian",
),
# members
path("members/", MemberListView.as_view(), name="member_lists"),
path("members/add/", MemberCreateView.as_view(), name="create_member"),
path("members/<int:pk>/", MemberUpdateView.as_view(), name="update_member"),
path("members/<int:pk>/delete/", MemberDeleteView.as_view(), name="delete_member"),
# path("categories/", include("categories.urls")), # path("categories/", include("categories.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("upcoming-loans/", UpcomingLoanView.as_view(), name="upcoming_loans"), # path("upcoming-loans/", UpcomingLoanView.as_view(), name="upcoming_loans"),
# path("overdued-loans/", OverduedLoanView.as_view(), name="overdued_loans"), # path("overdued-loans/", OverduedLoanView.as_view(), name="overdued_loans"),
] ]
from django import forms
from users.models import User
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ["username", "email", "password", "first_name", "last_name"]
widgets = {
"username": forms.TextInput(
attrs={
"placeholder": "Username",
"class": "form-control",
}
),
"email": forms.EmailInput(
attrs={
"placeholder": "Email",
"class": "form-control",
}
),
"password": forms.PasswordInput(
attrs={
"placeholder": "Password",
"class": "form-control",
}
),
"first_name": forms.TextInput(
attrs={
"placeholder": "Firts Name",
"class": "form-control",
}
),
"last_name": forms.TextInput(
attrs={
"placeholder": "Last Name",
"class": "form-control",
}
),
}
def __init__(self, *args, **kwargs):
super(UserForm, self).__init__(*args, **kwargs)
self.fields["password"].required = False
# Generated by Django 5.0.7 on 2024-07-15 08:46
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0002_initial'),
]
operations = [
migrations.AlterField(
model_name='librarianloginhistory',
name='librarian',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='users.librarian'),
),
]
...@@ -28,6 +28,6 @@ class Member(models.Model): ...@@ -28,6 +28,6 @@ class Member(models.Model):
class LibrarianLoginHistory(models.Model): class LibrarianLoginHistory(models.Model):
librarian = models.OneToOneField( librarian = models.OneToOneField(
Librarian, blank=True, null=True, on_delete=models.DO_NOTHING Librarian, blank=True, null=True, on_delete=models.CASCADE
) )
date = models.DateTimeField(auto_now_add=True) date = models.DateTimeField(auto_now_add=True)
{% extends "layout.html" %} {% block dashboard %}
<div style="max-width: 80vw" class="w-100 p-4">
<div class="d-flex gap-2 mb-4">
{% include "order_form.html" %}
<a type="button" class="btn btn-primary" href="/dashboard/librarians/add/">
<i class="bi bi-plus-circle"></i> Add Librarian
</a>
{% include "search_form.html" %}
</div>
{% include "librarians/librarians_table_data.html" %}
</div>
{% endblock dashboard %}
<table class="table table-hover">
<thead>
<tr class="table-primary">
<th scope="col">Username</th>
<th scope="col">Email</th>
<th scope="col">Created At</th>
<th scope="col">Updated At</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
{% if object_list %} {% for librarian in object_list %}
<tr>
<td>{{ librarian.user.username }}</td>
<td>{{ librarian.user.email }}</td>
<td>{{ librarian.created_at }}</td>
<td>{{ librarian.updated_at }}</td>
<td class="d-flex gap-2">
<a
class="btn btn-success"
href="/dashboard/librarians/{{ librarian.id }}/"
>
<i class="bi bi-pencil-square"></i>
</a>
<a
class="btn btn-danger"
href="/dashboard/librarians/{{ librarian.id }}/delete/"
>
<i class="bi bi-trash3-fill"></i>
</a>
</td>
</tr>
{% endfor %} {% else %}
<tr class="w-100">
<td></td>
<td></td>
<td>
<p>Data Empty</p>
</td>
<td></td>
<td></td>
</tr>
{% endif %}
</tbody>
</table>
{% include "pagination.html" %}
{% extends "layout.html" %} {% block dashboard %}
<div style="max-width: 80vw" class="w-100 p-4">
<div class="d-flex gap-2 mb-4">
{% include "order_form.html" %}
<a type="button" class="btn btn-primary" href="/dashboard/members/add/">
<i class="bi bi-plus-circle"></i> Add Member
</a>
{% include "search_form.html" %}
</div>
{% include "members/members_table_data.html" %}
</div>
{% endblock dashboard %}
<table class="table table-hover">
<thead>
<tr class="table-primary">
<th scope="col">Username</th>
<th scope="col">Email</th>
<th scope="col">Created At</th>
<th scope="col">Updated At</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
{% if object_list %} {% for member in object_list %}
<tr class="text-truncate">
<td>{{ member.user.username }}</td>
<td>{{ member.user.email }}</td>
<td>{{ member.created_at }}</td>
<td>{{ member.updated_at }}</td>
<td class="d-flex gap-2">
<a class="btn btn-success" href="/dashboard/members/{{ member.id }}/">
<i class="bi bi-pencil-square"></i>
</a>
<a
class="btn btn-danger"
href="/dashboard/members/{{ member.id }}/delete/"
>
<i class="bi bi-trash3-fill"></i>
</a>
</td>
</tr>
{% endfor %} {% else %}
<tr class="w-100">
<td></td>
<td></td>
<td></td>
<td>
<p>Data Empty</p>
</td>
<td></td>
<td></td>
</tr>
{% endif %}
</tbody>
</table>
{% include "pagination.html" %}
from django.shortcuts import render from django.db.models import Q
from django.views import generic
# Create your views here. from users.models import Librarian, Member
from users.forms import UserForm, User
class UserListView(generic.ListView):
def get_queryset(self):
queryset = super().get_queryset()
keyword = self.request.GET.get("q")
order = self.request.GET.get("o")
if keyword:
queryset = queryset.filter(
Q(user__name__icontains=keyword) | Q(user__email__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.order_by("-updated_at")
class UserCreateView(generic.FormView):
form_class = UserForm
template_name = "form/create_form.html"
def post(self, request, *args, **kwargs):
form = self.get_form()
if form.is_valid():
formData = form.cleaned_data.copy()
user = self.model.objects.create_user(**formData, is_staff=True)
return user
else:
return None
class UserUpdateView(generic.FormView):
form_class = UserForm
template_name = "form/update_form.html"
def get(self, request, *args, **kwargs):
obj = self.model.objects.get(pk=kwargs["pk"])
self.initial = {
"username": obj.user.username,
"email": obj.user.email,
"password": obj.user.password,
}
return super().get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
obj = self.model.objects.get(pk=kwargs["pk"])
form = self.get_form()
if form.is_valid():
formData = form.cleaned_data.copy()
User.objects.filter(pk=obj.user.id).update(**formData)
return self.form_valid(form)
else:
return self.form_invalid(form)
class UserDeleteView(generic.edit.DeleteView):
template_name = "form/delete_form.html"
def form_valid(self, form):
user_pk = self.get_object().user.id
User.objects.get(pk=user_pk).delete()
return super().form_valid(form)
class LibrarianListView(UserListView):
model = Librarian
template_name = "librarians/librarians.html"
paginate_by = 5
class LibrarianCreateView(UserCreateView):
model = User
success_url = "/dashboard/librarians/"
def post(self, request, *args, **kwargs):
form = self.get_form()
if form.is_valid():
user = super().post(request)
Librarian.objects.create(user=user)
return self.form_valid(form)
else:
return self.form_invalid(form)
class LibrarianUpdateView(UserUpdateView):
model = Librarian
success_url = "/dashboard/librarians"
class LibrarianDeleteView(UserDeleteView):
model = Librarian
success_url = "/dashboard/librarians"
class MemberListView(UserListView):
model = Member
template_name = "members/members.html"
paginate_by = 5
class MemberCreateView(UserCreateView):
model = User
success_url = "/dashboard/members/"
def post(self, request, *args, **kwargs):
form = self.get_form()
if form.is_valid():
user = super().post(request)
Member.objects.create(user=user)
return self.form_valid(form)
else:
return self.form_invalid(form)
class MemberUpdateView(UserUpdateView):
model = Member
success_url = "/dashboard/members"
class MemberDeleteView(UserDeleteView):
model = Member
success_url = "/dashboard/members"
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