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 0000000..dc119ac Binary files /dev/null and b/src/interface/static/img/inspectocat.jpg differ 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