From b9768a787a37f0e50135deaf2138f8cbec9b9de2 Mon Sep 17 00:00:00 2001 From: Huynh Thi Khanh Linh Date: Sun, 19 Jun 2022 23:04:32 +0700 Subject: [PATCH] :dizzy: change favorite into table --- ...vourite_alter_book_id_alter_category_id.py | 30 ++++++++++++++++++ books/models.py | 5 +++ books/urls.py | 3 ++ books/views.py | 26 +++++++++++++++ db.sqlite3 | Bin 253952 -> 262144 bytes favourite/apps.py | 6 ---- favourite/context_processors.py | 6 ---- favourite/favourite.py | 28 ---------------- favourite/migrations/__init__.py | 0 favourite/models.py | 3 -- favourite/urls.py | 11 ------- favourite/views.py | 28 ---------------- library/settings.py | 5 +-- .../templatetags}/__init__.py | 0 library/templatetags/tags.py | 8 +++++ library/urls.py | 1 - templates/library/base.html | 17 ++++------ templates/library/books/detail.html | 2 +- templates/library/favourite/favourite.html | 4 +-- 19 files changed, 84 insertions(+), 99 deletions(-) create mode 100644 books/migrations/0004_book_favourite_alter_book_id_alter_category_id.py delete mode 100644 favourite/apps.py delete mode 100644 favourite/context_processors.py delete mode 100644 favourite/favourite.py delete mode 100644 favourite/migrations/__init__.py delete mode 100644 favourite/models.py delete mode 100644 favourite/urls.py delete mode 100644 favourite/views.py rename {favourite => library/templatetags}/__init__.py (100%) create mode 100644 library/templatetags/tags.py diff --git a/books/migrations/0004_book_favourite_alter_book_id_alter_category_id.py b/books/migrations/0004_book_favourite_alter_book_id_alter_category_id.py new file mode 100644 index 0000000..2db6d40 --- /dev/null +++ b/books/migrations/0004_book_favourite_alter_book_id_alter_category_id.py @@ -0,0 +1,30 @@ +# Generated by Django 4.0.3 on 2022-06-19 08:21 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('books', '0003_auto_20220617_0900'), + ] + + operations = [ + migrations.AddField( + model_name='book', + name='favourite', + field=models.ManyToManyField(blank=True, related_name='favourite_books', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='book', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='category', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + ] diff --git a/books/models.py b/books/models.py index 5176bf0..3bb52ec 100644 --- a/books/models.py +++ b/books/models.py @@ -24,6 +24,11 @@ class Book(models.Model): image_url = models.URLField(blank=True, default='https://hips.hearstapps.com/hmg-prod/images/old-books-arranged-on-shelf-royalty-free-image-1572384534.jpg?crop=0.668xw:1.00xh;0,0&resize=2048:*') slug = models.SlugField(max_length=255, unique=True) quantity = models.IntegerField(default=1) + favourite = models.ManyToManyField( + 'auth.User', + related_name='favourite_books', + blank=True + ) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) diff --git a/books/urls.py b/books/urls.py index a625f87..27af7cc 100644 --- a/books/urls.py +++ b/books/urls.py @@ -9,4 +9,7 @@ path('books/search', views.book_searching, name='book_search'), path('book//', views.book_detail, name='book_detail'), path('category//', views.book_filter_by_category, name='book_filter_by_category'), + path('favourite/', views.favourite_all, name='favourite_all'), + path('favourite/add/', views.favourite_add, name='favourite_add'), + path('favourite/delete/', views.favourite_delete, name='favourite_delete'), ] diff --git a/books/views.py b/books/views.py index 2b07e06..e8bbc4d 100644 --- a/books/views.py +++ b/books/views.py @@ -1,3 +1,4 @@ +from django.http import JsonResponse from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required from .models import Category, Book @@ -36,3 +37,28 @@ def book_searching(req): } return render(req, 'library/books/index.html', context) + + +def favourite_all(request): + books = request.user.favourite_books.all() + return render(request, 'library/favourite/favourite.html', {'books': books}) + + +def favourite_add(request): + if request.POST.get('action') == 'post': + book_id = int(request.POST.get('book_id')) + book = get_object_or_404(Book, id=book_id) + book.favourite.add(request.user) + favourite_quantity = request.user.favourite_books.all().count() + response = JsonResponse({'favourite_quantity': favourite_quantity}) + return response + + +def favourite_delete(request): + if request.POST.get('action') == 'post': + book_id = int(request.POST.get('book_id')) + book = get_object_or_404(Book, id=book_id) + book.favourite.remove(request.user) + favourite_quantity = request.user.favourite_books.all().count() + response = JsonResponse({'favourite_quantity': favourite_quantity}) + return response diff --git a/db.sqlite3 b/db.sqlite3 index e55b180391df0e858c0485968ee90bc44653e1f8..31220c4638cd5514c03451ea4e8270fe679fa87c 100644 GIT binary patch delta 3904 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 diff --git a/favourite/apps.py b/favourite/apps.py deleted file mode 100644 index 908e281..0000000 --- a/favourite/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class FavouriteConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'favourite' diff --git a/favourite/context_processors.py b/favourite/context_processors.py deleted file mode 100644 index 129b8bd..0000000 --- a/favourite/context_processors.py +++ /dev/null @@ -1,6 +0,0 @@ -from .favourite import Favourite - -def favourite(request): - return { - 'favourite': Favourite(request) - } diff --git a/favourite/favourite.py b/favourite/favourite.py deleted file mode 100644 index b102629..0000000 --- a/favourite/favourite.py +++ /dev/null @@ -1,28 +0,0 @@ -class Favourite: - def __init__(self, request): - self.session = request.session - favourite = self.session.get('skey') - if 'skey' not in request.session: - favourite = self.session['skey'] = {} - self.favourite = favourite - - def save(self): - self.session.modified = True - - def add(self, book): - book_id = book.id - - if book_id not in self.favourite: - self.favourite[book_id] = {'id': book_id, 'get_absolute_url': book.get_absolute_url(), 'title': book.title, 'author': book.author, 'description': book.description, 'image_url': book.image_url} - - self.save() - - def delete(self, book_id): - book_id = str(book_id) - - if book_id in self.favourite: - del self.favourite[book_id] - self.save() - - def __len__(self): - return len(self.favourite) diff --git a/favourite/migrations/__init__.py b/favourite/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/favourite/models.py b/favourite/models.py deleted file mode 100644 index 71a8362..0000000 --- a/favourite/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/favourite/urls.py b/favourite/urls.py deleted file mode 100644 index b9ae800..0000000 --- a/favourite/urls.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.urls import path - -from . import views - -app_name = 'favourite' - -urlpatterns = [ - path('', views.book_favourite, name='book_favourite'), - path('add/', views.favourite_add, name='favourite_add'), - path('delete/', views.favourite_delete, name='favourite_delete'), -] diff --git a/favourite/views.py b/favourite/views.py deleted file mode 100644 index f35a969..0000000 --- a/favourite/views.py +++ /dev/null @@ -1,28 +0,0 @@ -from django.http import JsonResponse -from django.shortcuts import get_object_or_404, render -from books.models import Book -from .favourite import Favourite - -# Create your views here. - -def book_favourite(request): - return render(request, 'library/favourite/favourite.html') - -def favourite_add(request): - favourite = Favourite(request) - if request.POST.get('action') == 'post': - book_id = int(request.POST.get('book_id')) - book = get_object_or_404(Book, id=book_id) - favourite.add(book=book) - favourite_quantity = favourite.__len__() - response = JsonResponse({'favourite_quantity': favourite_quantity}) - return response - -def favourite_delete(request): - favourite = Favourite(request) - if request.POST.get('action') == 'post': - book_id = int(request.POST.get('book_id')) - favourite.delete(book_id=book_id) - favourite_quantity = favourite.__len__() - response = JsonResponse({'favourite_quantity': favourite_quantity}) - return response diff --git a/library/settings.py b/library/settings.py index d7284b3..77ca6b9 100644 --- a/library/settings.py +++ b/library/settings.py @@ -39,7 +39,6 @@ 'django.contrib.messages', 'django.contrib.staticfiles', 'books', - 'favourite', 'user_auth', ] @@ -67,8 +66,10 @@ 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'books.context_processors.categories', - 'favourite.context_processors.favourite', ], + 'libraries': { + 'tags': 'library.templatetags.tags', + } }, }, ] diff --git a/favourite/__init__.py b/library/templatetags/__init__.py similarity index 100% rename from favourite/__init__.py rename to library/templatetags/__init__.py diff --git a/library/templatetags/tags.py b/library/templatetags/tags.py new file mode 100644 index 0000000..1a68829 --- /dev/null +++ b/library/templatetags/tags.py @@ -0,0 +1,8 @@ +from django import template + +register = template.Library() + + +@register.simple_tag +def favourite_quantity(request): + return request.user.favourite_books.all().count() diff --git a/library/urls.py b/library/urls.py index af1f3c1..6fbec84 100644 --- a/library/urls.py +++ b/library/urls.py @@ -23,7 +23,6 @@ urlpatterns = [ path('admin/', admin.site.urls), path('', include('books.urls', namespace='books')), - path('favourite/', include('favourite.urls', namespace='favourite')), path('auth/', include('user_auth.urls', namespace='user_auth')), path('favicon.ico', RedirectView.as_view(url=staticfiles_storage.url('images/favicon.ico'))), ] diff --git a/templates/library/base.html b/templates/library/base.html index 756a0a1..f9b4a91 100644 --- a/templates/library/base.html +++ b/templates/library/base.html @@ -1,4 +1,5 @@ {% load static %} +{% load tags %} @@ -48,18 +49,12 @@