From f54b52cf6b1f67093fcc8d0e4ddafded7fe8822b Mon Sep 17 00:00:00 2001 From: MagerOK Date: Mon, 25 Sep 2023 16:43:57 +0200 Subject: [PATCH 1/3] feature: added view that shows all books info in json --- books/serializer.py | 11 +++++++++++ books/views.py | 12 +++++++++++- bookshelf/urls.py | 3 +++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 books/serializer.py diff --git a/books/serializer.py b/books/serializer.py new file mode 100644 index 0000000..6fbccba --- /dev/null +++ b/books/serializer.py @@ -0,0 +1,11 @@ +from books.models import Book + + +def serialize_book(book: Book) -> dict: + return { + "title": book.title, + "author_full_name": book.author_full_name, + "year_of_publishing": book.year_of_publishing, + "copies_printed": book.copies_printed, + "short_description": book.short_description, + } diff --git a/books/views.py b/books/views.py index 91ea44a..14380af 100644 --- a/books/views.py +++ b/books/views.py @@ -1,3 +1,13 @@ from django.shortcuts import render +from django.http import JsonResponse -# Create your views here. +from books.models import Book +from books.serializer import serialize_book + + +def get_all_books_json_view(request): + books = Book.objects.all() + if not books: + return JsonResponse(data={'data': {}, 'error': 'No books found'}, status=404) + books_json = [serialize_book(book) for book in books] + return JsonResponse(data={'data': books_json}) diff --git a/bookshelf/urls.py b/bookshelf/urls.py index dfc7362..907ef25 100644 --- a/bookshelf/urls.py +++ b/bookshelf/urls.py @@ -1,6 +1,9 @@ from django.contrib import admin from django.urls import path +from books.views import get_all_books_json_view + urlpatterns = [ path('admin/', admin.site.urls), + path('api/books/', get_all_books_json_view), ] From de0552127a2d39567f6aff87c99d6a1cecede51f Mon Sep 17 00:00:00 2001 From: MagerOK Date: Wed, 27 Sep 2023 17:40:50 +0200 Subject: [PATCH 2/3] refactor: added TypedDict for serializator --- books/serializer.py | 11 ++++++++++- books/views.py | 6 +++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/books/serializer.py b/books/serializer.py index 6fbccba..b2a2a61 100644 --- a/books/serializer.py +++ b/books/serializer.py @@ -1,7 +1,16 @@ +from typing import TypedDict + from books.models import Book -def serialize_book(book: Book) -> dict: +class SerializedBook(TypedDict): + title: str + author_full_name: str + year_of_publishing: int + copies_printed: int + short_description: str + +def serialize_book(book: Book) -> SerializedBook: return { "title": book.title, "author_full_name": book.author_full_name, diff --git a/books/views.py b/books/views.py index 14380af..c789c6c 100644 --- a/books/views.py +++ b/books/views.py @@ -1,13 +1,13 @@ from django.shortcuts import render -from django.http import JsonResponse +from django.http import HttpResponse, JsonResponse from books.models import Book from books.serializer import serialize_book -def get_all_books_json_view(request): +def get_all_books_json_view(request: HttpResponse) -> HttpResponse: books = Book.objects.all() if not books: - return JsonResponse(data={'data': {}, 'error': 'No books found'}, status=404) + return JsonResponse(data={'data': {}, 'error': 'No books found'}) books_json = [serialize_book(book) for book in books] return JsonResponse(data={'data': books_json}) From 34b7ae9a4f461430fd4b58b3a9f2d9bc4b073d1f Mon Sep 17 00:00:00 2001 From: MagerOK Date: Thu, 28 Sep 2023 11:04:44 +0200 Subject: [PATCH 3/3] refactor: changed to OOP and deleted useless code --- books/serializer.py | 10 +--------- books/types.py | 9 +++++++++ books/views.py | 12 ++++++------ bookshelf/urls.py | 4 ++-- 4 files changed, 18 insertions(+), 17 deletions(-) create mode 100644 books/types.py diff --git a/books/serializer.py b/books/serializer.py index b2a2a61..bec4902 100644 --- a/books/serializer.py +++ b/books/serializer.py @@ -1,15 +1,7 @@ -from typing import TypedDict - from books.models import Book +from books.types import SerializedBook -class SerializedBook(TypedDict): - title: str - author_full_name: str - year_of_publishing: int - copies_printed: int - short_description: str - def serialize_book(book: Book) -> SerializedBook: return { "title": book.title, diff --git a/books/types.py b/books/types.py new file mode 100644 index 0000000..76eaf10 --- /dev/null +++ b/books/types.py @@ -0,0 +1,9 @@ +from typing import TypedDict + + +class SerializedBook(TypedDict): + title: str + author_full_name: str + year_of_publishing: int + copies_printed: int + short_description: str diff --git a/books/views.py b/books/views.py index c789c6c..c9cf17e 100644 --- a/books/views.py +++ b/books/views.py @@ -1,13 +1,13 @@ from django.shortcuts import render from django.http import HttpResponse, JsonResponse +from django.views import View from books.models import Book from books.serializer import serialize_book -def get_all_books_json_view(request: HttpResponse) -> HttpResponse: - books = Book.objects.all() - if not books: - return JsonResponse(data={'data': {}, 'error': 'No books found'}) - books_json = [serialize_book(book) for book in books] - return JsonResponse(data={'data': books_json}) +class Get_All_Books_Json_View(View): + def get(self, request: HttpResponse) -> JsonResponse: + books = Book.objects.all() + books_json = [serialize_book(book) for book in books] + return JsonResponse(data={'data': books_json}) diff --git a/bookshelf/urls.py b/bookshelf/urls.py index 907ef25..6b8bc13 100644 --- a/bookshelf/urls.py +++ b/bookshelf/urls.py @@ -1,9 +1,9 @@ from django.contrib import admin from django.urls import path -from books.views import get_all_books_json_view +from books.views import Get_All_Books_Json_View urlpatterns = [ path('admin/', admin.site.urls), - path('api/books/', get_all_books_json_view), + path('api/books/', Get_All_Books_Json_View.as_view()), ]