From 7ea017d7906ee12d45f95ec71469e7025bb630cd Mon Sep 17 00:00:00 2001 From: Raelon Masters Date: Sat, 18 Jul 2020 02:34:43 -0400 Subject: [PATCH] Began development of custom user action backend, and basic templating. --- src/frontend/settings.py | 4 +- src/frontend/urls.py | 28 +++++++++- src/interface/models.py | 48 +++++------------- .../static/admin/js/vendor/select2/i18n/el.js | 4 +- src/interface/static/img/inspectocat.jpg | Bin 0 -> 34542 bytes src/interface/templates/index.html | 16 +++--- src/interface/templates/login.html | 23 +++++++++ .../templates/registration/login.html | 22 ++++++++ src/interface/templates/signup.html | 26 ++++++++++ 9 files changed, 123 insertions(+), 48 deletions(-) create mode 100644 src/interface/static/img/inspectocat.jpg create mode 100644 src/interface/templates/login.html create mode 100644 src/interface/templates/registration/login.html create mode 100644 src/interface/templates/signup.html diff --git a/src/frontend/settings.py b/src/frontend/settings.py index b1ca483..ce8927f 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" MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", @@ -135,6 +135,6 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ - +LOGIN_REDIRECT_URL = 'home' STATIC_URL = "/static/" STATIC_ROOT = os.path.join(BASE_DIR, "interface/static/") diff --git a/src/frontend/urls.py b/src/frontend/urls.py index 379ece7..6369c3b 100755 --- a/src/frontend/urls.py +++ b/src/frontend/urls.py @@ -16,12 +16,13 @@ Including another URLconf 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 interface import views urlpatterns = [ path("admin/", admin.site.urls), path("", views.index, name="index"), - path("home", views.home, name="index"), + path("home", views.home, name="home"), path("sort/<_order>", views.index, name="index"), path("flip_sort/<_order>", views.flip_sort, name="index"), path("download/", views.download, name="download"), @@ -35,7 +36,30 @@ urlpatterns = [ path("search/", views.index, name="search"), path("search/", views.index, name="search"), path("search//<_set>", views.index, name="search"), - path("show_collection/<_collection>/<_colset>", views.show_collection, name="show_collection",), + path("show_collection/<_collection>/<_colset>", views.show_collection, name="show_collection"), + path("signup", views.signup, name="signup"), + path("login", views.userlogin, name="login"), + path('logout', views.userlogout, name='logout'), + path( + 'admin/password_reset/', + auth_views.PasswordResetView.as_view(), + name='admin_password_reset', + ), + path( + 'admin/password_reset/done/', + auth_views.PasswordResetDoneView.as_view(), + name='password_reset_done', + ), + path( + 'reset///', + auth_views.PasswordResetConfirmView.as_view(), + name='password_reset_confirm', + ), + path( + 'reset/done/', + auth_views.PasswordResetCompleteView.as_view(), + name='password_reset_complete', + ), ] if settings.DEBUG: import debug_toolbar diff --git a/src/interface/models.py b/src/interface/models.py index cdcd89b..04cc090 100755 --- a/src/interface/models.py +++ b/src/interface/models.py @@ -1,5 +1,7 @@ from django.contrib.postgres.search import SearchVector from django.db import models +from django.conf import settings +from django.contrib.auth.models import AbstractUser # Create your models here. @@ -40,12 +42,13 @@ class Books(models.Model): def generic_search(self, query): try: results = Books.objects.annotate( - search=SearchVector("title", "file_name", "author","tags"), + search=SearchVector("title", "file_name", "author", "tags"), ).filter(search=query) except Exception as e: raise return results + class Collections(models.Model): class Meta: db_table = "collections" @@ -69,6 +72,7 @@ class Collections(models.Model): raise return results + class Navigation(models.Model): """ pyShelfs Navigation Database class @@ -105,38 +109,6 @@ class Navigation(models.Model): raise return results -class Users(models.Model): - """ - pyShelfs User Database class - :param uname: User Name - :param fname: First Name - :param lname: Last Name - :param email: User Email Address - :param password: User Password - :param ulvl: User Level - """ - - class Meta: - db_table = "users" - - def __str__(self): - return self.title - - uname = models.CharField(max_length=255) - fname = models.CharField(max_length=255, null=True) - lname = models.CharField(max_length=255, null=True) - email = models.CharField(max_length=255, null=True, editable=True) - password = models.CharField(max_length=255, null=True) - ulvl = models.IntegerField(null=True) - - def generic_search(self, query): - try: - results = Users.objects.annotate( - search=SearchVector("uname", "email", "lname"), - ).filter(search=query) - except Exception as e: - raise - return results class Favorites(models.Model): """ @@ -152,7 +124,7 @@ class Favorites(models.Model): return self.title favorite = models.ManyToManyField(Books) - uname = models.ManyToManyField(Users) + uname = models.ManyToManyField(settings.AUTH_USER_MODEL) def generic_search(self, query): try: @@ -162,3 +134,11 @@ class Favorites(models.Model): except Exception as e: raise 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/admin/js/vendor/select2/i18n/el.js b/src/interface/static/admin/js/vendor/select2/i18n/el.js index 46503bc..1f68e52 100644 --- a/src/interface/static/admin/js/vendor/select2/i18n/el.js +++ b/src/interface/static/admin/js/vendor/select2/i18n/el.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ +dfqqyn*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ -(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),{define:e.define,require:e.require}})(); diff --git a/src/interface/static/img/inspectocat.jpg b/src/interface/static/img/inspectocat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc119acf5f17b7476ea8a2b513a752847b06d513 GIT binary patch literal 34542 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
B;t8i=G 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 BZDjxe literal 0 HcmV?d00001 diff --git a/src/interface/templates/index.html b/src/interface/templates/index.html index ffdf0c7..50eeccf 100755 --- a/src/interface/templates/index.html +++ b/src/interface/templates/index.html @@ -27,10 +27,10 @@
-
- - -
+
+ + +
@@ -44,9 +44,9 @@ -
- -
+
+ +
 sort @@ -88,7 +88,7 @@ {% elif book.description == None %}
  • - We were unable to find a description in this books metadata. + We were unable to find a description.
    Have some instead?
  • diff --git a/src/interface/templates/login.html b/src/interface/templates/login.html new file mode 100644 index 0000000..aec5102 --- /dev/null +++ b/src/interface/templates/login.html @@ -0,0 +1,23 @@ + + + + + + + +

    Login

    +
    + {% csrf_token %} + {% for field in form %} +
    + {{ field.errors }} + {{ field.label_tag }} {{ field }} + {% if field.help_text %} +

    {{ field.help_text|safe }}

    + {% endif %} +
    + {% endfor %} + +
    + + \ No newline at end of file diff --git a/src/interface/templates/registration/login.html b/src/interface/templates/registration/login.html new file mode 100644 index 0000000..ba8ae1e --- /dev/null +++ b/src/interface/templates/registration/login.html @@ -0,0 +1,22 @@ + + + + + + + +

    Login

    +
    + {% for field in form %} +
    + {{ field.errors }} + {{ field.label_tag }} {{ field }} + {% if field.help_text %} +

    {{ field.help_text|safe }}

    + {% endif %} +
    + {% endfor %} + +
    + + \ No newline at end of file diff --git a/src/interface/templates/signup.html b/src/interface/templates/signup.html new file mode 100644 index 0000000..726d50b --- /dev/null +++ b/src/interface/templates/signup.html @@ -0,0 +1,26 @@ + + + + + Title + + +

    Sign up

    +
    + {% csrf_token %} + {% for field in form %} +

    + {{ field.label_tag }}
    + {{ field }} + {% if field.help_text %} + {{ field.help_text }} + {% endif %} + {% for error in field.errors %} +

    {{ error }}

    + {% endfor %} +

    + {% endfor %} + +
    + + \ No newline at end of file