Commit 66e268c6 authored by Ilham Maulana's avatar Ilham Maulana 💻

feat: book app

parent a178eeb7
from django.urls import path, include
from rest_framework import routers
from .views import (
LibrarianViewSet,
LibrarianLoginView,
LibrarianLogoutView,
MemberViewSet,
MemberLoginView,
MemberLogoutView,
)
router = routers.DefaultRouter()
router.register(r"librarians", LibrarianViewSet, basename="librarians")
router.register(r"members", MemberViewSet, basename="members")
urlpatterns = [
path("", include(router.urls)),
path("librarians/auth/login", LibrarianLoginView.as_view(), name="librarian_login"),
path(
"librarians/auth/logout", LibrarianLogoutView.as_view(), name="librarian_logout"
),
path("members/auth/login", MemberLoginView.as_view(), name="member_login"),
path("members/auth/logout", MemberLogoutView.as_view(), name="member_logout"),
]
from rest_framework import serializers
from book.models import Book, Category
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = "__all__"
class BookSerializer(serializers.ModelSerializer):
category = Category
class Meta:
model = Book
fields = "__all__"
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.filters import SearchFilter
from django_filters.rest_framework import DjangoFilterBackend
from .serializers import Book, BookSerializer, Category, CategorySerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all().order_by("created_at")
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend, SearchFilter]
filterset_fields = ["category__name"]
search_fields = ["title"]
def get_queryset(self):
year = self.request.query_params.get("year")
queryset = self.queryset
if year is not None:
return queryset.filter(publish_date__year=year)
return queryset
def update(self, request, pk):
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
class CategoryViewSet(viewsets.ModelViewSet):
queryset = Category.objects.all().order_by("created_at")
serializer_class = CategorySerializer
filter_backends = [DjangoFilterBackend, SearchFilter]
filterset_fields = ["created_at", "updated_at"]
search_fields = ["name", "description"]
def update(self, request, pk):
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
from django.urls import path, include from django.urls import path, include
from rest_framework import routers
from .auth import urls as auth_urls from .auth.views import (
LibrarianViewSet,
LibrarianLoginView,
LibrarianLogoutView,
MemberViewSet,
MemberLoginView,
MemberLogoutView,
)
from .book.views import BookViewSet, CategoryViewSet
router = routers.DefaultRouter()
router.register(r"librarians", LibrarianViewSet, basename="librarians")
router.register(r"members", MemberViewSet, basename="members")
router.register(r"books", BookViewSet, basename="books")
router.register(r"categories", CategoryViewSet, basename="categories")
urlpatterns = [ urlpatterns = [
path("", include(auth_urls)), path("", include(router.urls)),
# auth
path("librarians/auth/login", LibrarianLoginView.as_view(), name="librarian_login"),
path(
"librarians/auth/logout", LibrarianLogoutView.as_view(), name="librarian_logout"
),
path("members/auth/login", MemberLoginView.as_view(), name="member_login"),
path("members/auth/logout", MemberLogoutView.as_view(), name="member_logout"),
] ]
from django.contrib import admin
# Register your models here.
from django.apps import AppConfig
class BookConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'book'
This diff is collapsed.
# Generated by Django 5.0.7 on 2024-07-14 08:03
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Book',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=150)),
('author', models.CharField(max_length=50)),
('publish_date', models.DateTimeField()),
('rating', models.IntegerField(default=0, validators=[django.core.validators.MaxValueValidator(5), django.core.validators.MinValueValidator(0)])),
('description', models.CharField(blank=True, max_length=255, null=True)),
('cover_image', models.ImageField(blank=True, null=True, upload_to='uploads')),
],
),
]
# Generated by Django 5.0.7 on 2024-07-14 08:07
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('book', '0001_initial'),
]
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=50)),
],
),
migrations.AddField(
model_name='book',
name='category',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='book.category'),
),
]
# Generated by Django 5.0.7 on 2024-07-14 08:20
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('book', '0002_category_book_category'),
]
operations = [
migrations.AddField(
model_name='book',
name='created_at',
field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2024, 7, 14, 8, 20, 49, 836837, tzinfo=datetime.timezone.utc)),
preserve_default=False,
),
migrations.AddField(
model_name='book',
name='updated_at',
field=models.DateTimeField(auto_now=True),
),
migrations.AddField(
model_name='category',
name='created_at',
field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2024, 7, 14, 8, 20, 56, 124674, tzinfo=datetime.timezone.utc)),
preserve_default=False,
),
migrations.AddField(
model_name='category',
name='updated_at',
field=models.DateTimeField(auto_now=True),
),
]
# Generated by Django 5.0.7 on 2024-07-14 08:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('book', '0003_book_created_at_book_updated_at_category_created_at_and_more'),
]
operations = [
migrations.AddField(
model_name='book',
name='isbn',
field=models.CharField(default='xxxxxxxxx-x', max_length=15),
),
]
# Generated by Django 5.0.7 on 2024-07-14 08:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("book", "0004_book_isbn"),
]
operations = [
migrations.RemoveField(
model_name="book",
name="category",
),
migrations.AddField(
model_name="book",
name="category",
field=models.ManyToManyField(to="book.category"),
),
]
from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator
class Category(models.Model):
name = models.CharField(max_length=50)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=150)
author = models.CharField(max_length=50)
publish_date = models.DateTimeField()
rating = models.IntegerField(
default=0, validators=[MaxValueValidator(5), MinValueValidator(0)]
)
isbn = models.CharField(max_length=15, default="xxxxxxxxx-x")
description = models.CharField(max_length=255, blank=True, null=True)
cover_image = models.ImageField(upload_to="uploads", blank=True, null=True)
category = models.ManyToManyField(Category)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
from django.test import TestCase
# Create your tests here.
from django.shortcuts import render
# Create your views here.
...@@ -39,6 +39,7 @@ INSTALLED_APPS = [ ...@@ -39,6 +39,7 @@ INSTALLED_APPS = [
"django.contrib.staticfiles", "django.contrib.staticfiles",
# local # local
"users.apps.UsersConfig", "users.apps.UsersConfig",
"book.apps.BookConfig",
# 3rd party # 3rd party
"rest_framework", "rest_framework",
"django_filters", "django_filters",
......
...@@ -12,6 +12,9 @@ class Librarian(models.Model): ...@@ -12,6 +12,9 @@ class Librarian(models.Model):
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True) updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.user.username
class Member(models.Model): class Member(models.Model):
user = models.OneToOneField( user = models.OneToOneField(
...@@ -21,6 +24,9 @@ class Member(models.Model): ...@@ -21,6 +24,9 @@ class Member(models.Model):
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True) updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.user.username
class LibrarianLoginHistory(models.Model): class LibrarianLoginHistory(models.Model):
librarian = models.OneToOneField( librarian = models.OneToOneField(
......
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