diff --git a/src/frontend/settings.py b/src/frontend/settings.py index ce8927f..ef4e3e5 100755 --- a/src/frontend/settings.py +++ b/src/frontend/settings.py @@ -52,7 +52,7 @@ INSTALLED_APPS = [ "interface.templatetags", "debug_toolbar", ] -AUTH_USER_MODEL = "interface.CustomUser" +AUTH_USER_MODEL = "interface.User" MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", diff --git a/src/frontend/urls.py b/src/frontend/urls.py index 6369c3b..63acad0 100755 --- a/src/frontend/urls.py +++ b/src/frontend/urls.py @@ -17,6 +17,8 @@ from django.conf import settings from django.contrib import admin from django.urls import include, path, re_path from django.contrib.auth import views as auth_views +from django.contrib.auth.models import User +from django.shortcuts import HttpResponse from interface import views urlpatterns = [ @@ -26,7 +28,6 @@ urlpatterns = [ path("sort/<_order>", views.index, name="index"), path("flip_sort/<_order>", views.flip_sort, name="index"), path("download/", views.download, name="download"), - path("favorite/", views.favorite, name="favorite"), path("share/", views.share, name="share"), path("share/", views.info, name="info"), path("prev_page/", views.prev_page, name="prev_page"), @@ -40,6 +41,7 @@ urlpatterns = [ path("signup", views.signup, name="signup"), path("login", views.userlogin, name="login"), path('logout', views.userlogout, name='logout'), + path('favorite/', views.favorite, name='favorite'), path( 'admin/password_reset/', auth_views.PasswordResetView.as_view(), diff --git a/src/interface/admin.py b/src/interface/admin.py index 9a9db2e..96c61be 100755 --- a/src/interface/admin.py +++ b/src/interface/admin.py @@ -1,12 +1,12 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin -from .models import Books, Collections, Favorites, Navigation, CustomUser +from .models import Books, Collections, Favorites, Navigation, User from .forms import CustomUserCreationForm, CustomUserChangeForm class CustomUserAdmin(UserAdmin): - model = CustomUser + model = User add_form = CustomUserCreationForm form = CustomUserChangeForm list_display = ["email", "username", "facebook", "twitter", "sponsorid", "matrixid"] @@ -27,4 +27,4 @@ admin.site.register(Books) admin.site.register(Collections) admin.site.register(Favorites) admin.site.register(Navigation) -admin.site.register(CustomUser, CustomUserAdmin) +admin.site.register(User, CustomUserAdmin) diff --git a/src/interface/forms.py b/src/interface/forms.py index 1807b14..b345393 100644 --- a/src/interface/forms.py +++ b/src/interface/forms.py @@ -1,23 +1,23 @@ from django import forms from django.contrib.auth.forms import UserCreationForm, UserChangeForm, AuthenticationForm -from .models import CustomUser +from .models import User class CustomUserCreationForm(UserCreationForm): class Meta: - model = CustomUser + model = User fields = ("username", "email", "facebook", "twitter", "sponsorid", "matrixid") class CustomUserChangeForm(UserChangeForm): class Meta: - model = CustomUser + model = User fields = ("username", "email", "facebook", "twitter", "sponsorid", "matrixid") class CustomUserLoginForm(AuthenticationForm): class Meta: - Model = CustomUser + Model = User fields = ("username", "password") @@ -27,11 +27,11 @@ class SignUpForm(CustomUserCreationForm): matrixid = forms.CharField(max_length=30, required=False, help_text='Optional.') class Meta: - model = CustomUser + model = User fields = ("username", "email", "matrixid") class UserLoginForm(CustomUserLoginForm): class Meta: - model = CustomUser + model = User diff --git a/src/interface/models.py b/src/interface/models.py index 04cc090..a6e6c67 100755 --- a/src/interface/models.py +++ b/src/interface/models.py @@ -1,7 +1,8 @@ from django.contrib.postgres.search import SearchVector from django.db import models from django.conf import settings -from django.contrib.auth.models import AbstractUser +from django.contrib.auth.models import AbstractUser, User +from django.contrib.auth import get_user_model # Create your models here. @@ -110,25 +111,38 @@ class Navigation(models.Model): return results +class User(AbstractUser): + facebook = models.CharField(max_length=255, null=True) + twitter = models.CharField(max_length=255, null=True) + ulvl = models.IntegerField(default=1) + sponsorid = models.IntegerField(null=True) + matrixid = models.CharField(max_length=255, null=True) + + def __str__(self): + return self.username + + class Favorites(models.Model): """ - pyShelfs User Database class - :param uname: User Name - :param fname: First Name + Favorites Database class + :param book: book foreign key + :param user: user foreign key """ class Meta: db_table = "favorites" def __str__(self): - return self.title - - favorite = models.ManyToManyField(Books) - uname = models.ManyToManyField(settings.AUTH_USER_MODEL) - + return self.book + + book = models.ForeignKey(Books, on_delete=models.CASCADE) + user = models.ForeignKey( + User, + on_delete=models.CASCADE + ) def generic_search(self, query): try: - results = Favorites.objects.annotate(search=SearchVector("uname"),).filter( + results = Favorites.objects.annotate(search=SearchVector("user"),).filter( search=query ) except Exception as e: @@ -136,9 +150,3 @@ class Favorites(models.Model): return results -class CustomUser(AbstractUser): - facebook = models.CharField(max_length=255, null=True) - twitter = models.CharField(max_length=255, null=True) - ulvl = models.IntegerField(default=1) - sponsorid = models.IntegerField(null=True) - matrixid = models.CharField(max_length=255, null=True) diff --git a/src/interface/static/css/main.css b/src/interface/static/css/main.css index 1c954a2..a60fd50 100644 --- a/src/interface/static/css/main.css +++ b/src/interface/static/css/main.css @@ -541,6 +541,10 @@ a.book_link { padding: 5px 10px 5px 10px; } +.favorite { + color: #a7ff00 !important; +} + .controls { cursor: pointer; } diff --git a/src/interface/static/css/main.scss b/src/interface/static/css/main.scss index 053fa94..0aa1b1d 100755 --- a/src/interface/static/css/main.scss +++ b/src/interface/static/css/main.scss @@ -552,6 +552,9 @@ a.book_link { font-size: x-large; padding: 5px 10px 5px 10px; } +.favorite{ + color: #a7ff00 !important; +} .controls{ cursor: pointer; } diff --git a/src/interface/static/js/pyshelf_ux.js b/src/interface/static/js/pyshelf_ux.js index 8493489..604057f 100755 --- a/src/interface/static/js/pyshelf_ux.js +++ b/src/interface/static/js/pyshelf_ux.js @@ -74,6 +74,9 @@ $(document).ready(function(){ $('#btn_login').on('click', function(){ $('#hdr_nav_login').toggle(); }); + $('.favorite_action').on('click', function(){ + $(this).toggleClass('favorite'); + }); $('#sortlist').change(function () { var optionSelected = $(this).find("option:selected"); var valueSelected = optionSelected.val(); @@ -101,3 +104,4 @@ function resize_search(win_width){ $('.search_string').val("Search"); } } + diff --git a/src/interface/templates/index.html b/src/interface/templates/index.html index d6a983c..108ea25 100755 --- a/src/interface/templates/index.html +++ b/src/interface/templates/index.html @@ -39,9 +39,9 @@ @@ -97,8 +97,12 @@ {% endif %}
  • Tags: {{ book.tags }}
  • - - + + {% if book.is_favorite %} + + {% else %} + + {% endif %} diff --git a/src/interface/views.py b/src/interface/views.py index 19405e0..a920cc4 100755 --- a/src/interface/views.py +++ b/src/interface/views.py @@ -8,10 +8,13 @@ from django.http import JsonResponse from django.shortcuts import HttpResponse, render, redirect # render_to_response from django.utils.text import slugify from django.contrib.auth import login, authenticate, logout +from django.contrib import auth from django.contrib.auth.models import User +from django.conf import settings +from django.contrib.auth import get_user_model import json from .forms import SignUpForm, UserLoginForm -from .models import Books, Collections, Navigation, Favorites +from .models import Books, Collections, Navigation, Favorites, User config = Config(Path("../")) @@ -53,6 +56,7 @@ def userlogin(request): user = authenticate(request, username=username, password=password) if user is not None: login(request, user) + user.save() return redirect('home') form = UserLoginForm() return render(request, 'login.html', {'form': form}) @@ -63,8 +67,8 @@ def userlogout(request): return redirect('home') -def home(request, query=None, _set=1, _limit=None, _order='title'): - """ +def home(request, query=None, _set=1, _limit=None, _order='title'): + """ Reset Search Queries & Return Home """ _payload = payload(request, query, _set, _limit, _order, reset='1') @@ -148,7 +152,7 @@ def prev_page(request, bookset, query=None, _limit=None, _order='title'): ) -def book_set(_order, _limit=None, _set=1, _flip=False): +def book_set(request, _order, _limit=None, _set=1, _flip=False): """ Get books results by set # """ @@ -160,7 +164,16 @@ def book_set(_order, _limit=None, _set=1, _flip=False): books = Books.objects.all().order_by(_order).reverse()[_set_min:_set_max] else: books = Books.objects.all().order_by(_order)[_set_min:_set_max] - return books + try: + favorites = Favorites.objects.filter(user=request.user) + for book in books: + for favorite in favorites: + if book == favorite.book: + book.is_favorite = True + break + return books + except Exception as e: + return books def collection(_collection, _set, _limit=None): @@ -203,7 +216,7 @@ def download(request, pk): """ Download book by primary key """ - _book = Books.objects.all().filter(pk=pk)[0] + _book = Books.objects.get(pk=pk) _fn = hr_name(_book) response = HttpResponse( open(os.path.abspath(_book.file_name), "rb"), content_type="application/zip" @@ -216,8 +229,14 @@ def favorite(request, pk): """ Add book to favorites bu primary key """ - _book = Books.objects.all().filter(pk=pk)[0] - print(Favorite(book=_book, uname=User)) + _d = Favorites.objects.filter(user=request.user, book=Books.objects.get(pk=pk)) + if len(_d) == 1: + _d.delete() + return HttpResponse(status=204) + _f = Favorites(book=Books.objects.get(pk=pk)) + _f.user = request.user + _f.save() + return HttpResponse(status=204) def share(request, pk): @@ -328,8 +347,8 @@ def payload(request, query, _set, _limit, _order, **kwargs): _set_min = _set_max - _limit _now_showing = "%s-%s"%(_set_min, _set_max) if request.session['ascending']: - _r = book_set(_order, _limit, _set) - else: _r = book_set(_order, _limit, _set, True) + _r = book_set(request, _order, _limit, _set) + else: _r = book_set(request, _order, _limit, _set, True) _r_len, _search = None, None except KeyError: _set = int(_set) @@ -366,8 +385,8 @@ def payload(request, query, _set, _limit, _order, **kwargs): _results.count() except KeyError: if request.session['ascending']: - _r = book_set(_order, _limit, _set) - else: _r = book_set(_order, _limit, _set, True) + _r = book_set(request, _order, _limit, _set) + else: _r = book_set(request, _order, _limit, _set, True) _r_len, _search = None, None _bookstats, _collectionstats, _collectionobject = \