Commit f577528d authored by impfundev's avatar impfundev

feat: category master

parent 7004514f
from django.contrib import admin
# Register your models here.
from django.apps import AppConfig
class CategoriesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'categories'
from django import forms
from categories.models import Category
class CategoryForm(forms.ModelForm):
class Meta:
model = Category
fields = ["name", "description"]
widgets = {
"name": forms.TextInput(
attrs={
"placeholder": "Title",
"class": "form-control",
}
),
"description": forms.Textarea(
attrs={
"placeholder": "Description",
"class": "form-control",
}
),
}
# Generated by Django 5.0.6 on 2024-07-09 11:54
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Category',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('description', models.CharField(blank=True, max_length=255, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
options={
'db_table': 'categories',
},
),
]
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
description = models.CharField(max_length=255, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Meta:
db_table = "categories"
{% extends "layout.html" %} {% block dashboard %}
<div style="max-width: 80vw" class="w-100 p-4">
<div class="d-flex gap-2 pb-4">
{% include "order_form.html" %}
<a type="button" class="btn btn-primary" href="/dashboard/categories/add">
<i class="bi bi-plus-circle"></i> Add Category
</a>
{% include "search_form.html" %}
</div>
{% include "categories_table_data.html" %}
</div>
{% endblock dashboard %}
<table class="table table-hover">
<thead>
<tr class="table-primary">
<th scope="col">Name</th>
<th scope="col">Description</th>
<th scope="col">Created At</th>
<th scope="col">Updated At</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
{% if object_list %} {% for category in object_list %}
<tr>
<td>{{ category.name }}</td>
<td>{{ category.description }}</td>
<td>{{ category.created_at }}</td>
<td>{{ category.updated_at }}</td>
<td class="d-flex gap-2">
<a class="btn btn-success" href="/dashboard/books/{{ book.id }}/">
<i class="bi bi-pencil-square"></i>
</a>
<a class="btn btn-danger" href="/dashboard/books/{{ book.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" %}
from django.urls import path
from categories.views import (
CategoryListView,
CategoryCreateView,
CategoryUpdateView,
CategoryDeleteView,
)
urlpatterns = [
path("", CategoryListView.as_view(), name="category_list"),
path("add/", CategoryCreateView.as_view(), name="category_update"),
path("<int:pk>/", CategoryUpdateView.as_view(), name="category_update"),
path("<int:pk>/delete/", CategoryDeleteView.as_view(), name="category_delete"),
]
from django.db.models import Q
from django.views import generic
from categories.models import Category
from categories.forms import CategoryForm
class CategoryListView(generic.ListView):
model = Category
template_name = "categories.html"
paginate_by = 5
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(name__icontains=keyword) | Q(description__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 CategoryCreateView(generic.edit.CreateView):
model = Category
form_class = CategoryForm
success_url = "/dashboard/categories/"
template_name = "form/create_form.html"
class CategoryUpdateView(generic.edit.UpdateView):
model = Category
form_class = CategoryForm
success_url = "/dashboard/categories/"
template_name = "form/update_form.html"
class CategoryDeleteView(generic.edit.DeleteView):
model = Category
success_url = "/dashboard/categories/"
template_name = "form/delete_form.html"
...@@ -54,6 +54,7 @@ INSTALLED_APPS = [ ...@@ -54,6 +54,7 @@ INSTALLED_APPS = [
# local # local
"api.apps.ApiConfig", "api.apps.ApiConfig",
"books.apps.BooksConfig", "books.apps.BooksConfig",
"categories.apps.CategoriesConfig",
"members.apps.MembersConfig", "members.apps.MembersConfig",
"book_loans.apps.BookLoansConfig", "book_loans.apps.BookLoansConfig",
"librarians.apps.LibrariansConfig", "librarians.apps.LibrariansConfig",
......
...@@ -19,6 +19,11 @@ ...@@ -19,6 +19,11 @@
class="btn {% if request.path == '/dashboard/books/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100" class="btn {% if request.path == '/dashboard/books/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100"
><i class="bi bi-book-half"></i> Books</a ><i class="bi bi-book-half"></i> Books</a
> >
<a
href="/dashboard/categories"
class="btn {% if request.path == '/dashboard/categories/' %}btn-primary{% else %}btn-outline-primary border-white text-white{% endif %} text-start w-100"
><i class="bi bi-tags-fill"></i> Categories</a
>
<a <a
href="/dashboard/members" href="/dashboard/members"
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"
......
...@@ -4,6 +4,7 @@ from dashboards.views import DashboardView, UpcomingLoanView, OverduedLoanView ...@@ -4,6 +4,7 @@ from dashboards.views import DashboardView, UpcomingLoanView, OverduedLoanView
urlpatterns = [ urlpatterns = [
path("", DashboardView.as_view(), name="dashboard"), path("", DashboardView.as_view(), name="dashboard"),
path("books/", include("books.urls")), path("books/", include("books.urls")),
path("categories/", include("categories.urls")),
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")),
......
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