From bac5437e7e614889b355fbbb98ff94366dfadd49 Mon Sep 17 00:00:00 2001 From: Miguel Astor Date: Wed, 23 Aug 2023 17:45:39 -0400 Subject: [PATCH] Added basic user authentication. --- NibasaViewer/settings.py | 4 +++ NibasaViewer/urls.py | 8 +++++ README.md | 6 +++- viewer/static/css/styles.css | 10 +++++- viewer/static/imgs/boot.png | Bin 0 -> 13268 bytes viewer/templates/gallery_view.html | 14 ++++++-- viewer/templates/registration/login.html | 42 +++++++++++++++++++++++ viewer/views.py | 24 ++++++++----- 8 files changed, 95 insertions(+), 13 deletions(-) create mode 100755 viewer/static/imgs/boot.png create mode 100644 viewer/templates/registration/login.html diff --git a/NibasaViewer/settings.py b/NibasaViewer/settings.py index 2c58bb8..38b732d 100644 --- a/NibasaViewer/settings.py +++ b/NibasaViewer/settings.py @@ -104,6 +104,10 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] +# Authentication. +LOGIN_REDIRECT_URL = '/gallery/' +LOGOUT_REDIRECT_URL = 'login' +LOGIN_URL = 'login' # Internationalization # https://docs.djangoproject.com/en/4.2/topics/i18n/ diff --git a/NibasaViewer/urls.py b/NibasaViewer/urls.py index 170fee0..273adc5 100644 --- a/NibasaViewer/urls.py +++ b/NibasaViewer/urls.py @@ -21,6 +21,9 @@ from django.conf.urls.static import static from django.urls import (path, include) +from django.contrib.auth import views + +# Project imports. from viewer.views import index ########################################################################################### @@ -31,8 +34,13 @@ urlpatterns = [ # Index. path('', index, name = 'home'), + # Auth views. + path("login/", views.LoginView.as_view(), name = 'login'), + path("logout/", views.LogoutView.as_view(), name = 'logout'), + # Add invoices app urls. path('gallery/', include('viewer.urls')), + ] + static(settings.STATIC_URL, document_root = settings.STATIC_ROOT)\ + static('imgs/', document_root = settings.GALLERY_ROOT)\ + static('thumbs/', document_root = settings.THUMBNAILS_ROOT) diff --git a/README.md b/README.md index 2f5a4f3..29e206a 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,8 @@ A basic pure HTML+CSS gallery viewer in the vein of [PiGallery 2](https://bpatri ## User authentication. -Currently there is no authentication at all because I don't need it. This is meant to be installed in a server with HTTP basic auth enabled if needed. +To login a user should be manually created by running the following commands in the Django shell, substituting the user's name, email and password as needed: + + from django.contrib.auth.models import User + user = User.objects.create_user('', '', '') + user.save() diff --git a/viewer/static/css/styles.css b/viewer/static/css/styles.css index a29f24a..afbc60c 100644 --- a/viewer/static/css/styles.css +++ b/viewer/static/css/styles.css @@ -44,6 +44,10 @@ body { width: 100%; } +.pd { + padding: 10%; +} + /**************************************************************************** * Content. * ****************************************************************************/ @@ -83,7 +87,7 @@ body { margin-left: 2em; } -.search-btn { +.clear-btn { border: none; background-color: #00000000; } @@ -92,6 +96,10 @@ body { height: 2.5em; } +.float-right { + float: right; +} + /**************************************************************************** * Grid. * ****************************************************************************/ diff --git a/viewer/static/imgs/boot.png b/viewer/static/imgs/boot.png new file mode 100755 index 0000000000000000000000000000000000000000..d32bd983362cda5dab764ff9d98e1de34653f0e2 GIT binary patch literal 13268 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 KFIq0F|MNdmMpD)Q literal 0 HcmV?d00001 diff --git a/viewer/templates/gallery_view.html b/viewer/templates/gallery_view.html index 649714e..a7f1dbe 100644 --- a/viewer/templates/gallery_view.html +++ b/viewer/templates/gallery_view.html @@ -43,11 +43,21 @@ {% if num_pages > 1 %} -
+
{% for page in pages %}{{page}}{% if not forloop.last %} {% endif %}{% endfor %}
{% endif %} + + + +
+ {% csrf_token %} + +
+ @@ -70,7 +80,7 @@ - diff --git a/viewer/templates/registration/login.html b/viewer/templates/registration/login.html new file mode 100644 index 0000000..0232546 --- /dev/null +++ b/viewer/templates/registration/login.html @@ -0,0 +1,42 @@ +{% load static %} + + + + + + NibasaViewer login + + + + + +
+
+ {% csrf_token %} + + + + + + + + + + +
+ {{ form.username.label_tag }} + + {{ form.username }} +
+ {{ form.password.label_tag }} + + {{ form.password }} +
+ + + +
+
+ + + diff --git a/viewer/views.py b/viewer/views.py index 32e72b5..2f4e19b 100644 --- a/viewer/views.py +++ b/viewer/views.py @@ -6,11 +6,15 @@ from math import ceil import filetype # Django imports. -from django.http import HttpResponseNotFound -from django.conf import settings -from django.utils.http import urlencode -from django.shortcuts import (render, - redirect) +from django.http import HttpResponseNotFound +from django.conf import settings +from django.utils.http import urlencode +from django.contrib.auth.decorators import login_required +from django.contrib.auth import (authenticate, + login, + logout) +from django.shortcuts import (render, + redirect) # Project imports. from .utils import make_thumbnail @@ -24,12 +28,9 @@ ROWS_PER_PAGE = 4 IMAGES_PER_PAGE = CELLS_PER_ROW * ROWS_PER_PAGE ########################################################################################### -# View functions. # +# Helper functions. # ########################################################################################### -def index(request): - return redirect('gallery_view_root') - def do_recursive_search(start_path, query): """ Gets all images and sub-directories inside the start_path whose name matches the given query, @@ -56,6 +57,11 @@ def do_recursive_search(start_path, query): # View functions. # ########################################################################################### +@login_required +def index(request): + return redirect('gallery_view_root') + +@login_required def gallery_view(request, path = None): """ Shows a list of subdirectories and image files inside the given path.