Added basic user authentication.
This commit is contained in:
@@ -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/
|
||||
|
@@ -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)
|
||||
|
@@ -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('<USERNAME>', '<EMAIL>', '<PASSWORD>')
|
||||
user.save()
|
||||
|
@@ -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. *
|
||||
****************************************************************************/
|
||||
|
BIN
viewer/static/imgs/boot.png
Executable file
BIN
viewer/static/imgs/boot.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
@@ -43,11 +43,21 @@
|
||||
<!-- Page links. -->
|
||||
{% if num_pages > 1 %}
|
||||
<td>
|
||||
<div class="mauto">
|
||||
<div class="mauto mr-2">
|
||||
{% for page in pages %}<a href="./?page={{page}}{%if search %}&{{search}}{% endif %}">{{page}}</a>{% if not forloop.last %}<span> </span>{% endif %}{% endfor %}
|
||||
</div>
|
||||
</td>
|
||||
{% endif %}
|
||||
|
||||
<!-- Logout button. -->
|
||||
<td>
|
||||
<form method="post" action="{% url 'logout' %}">
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="clear-btn">
|
||||
<img src="{% static 'imgs/boot.png' %}" class="small-nav-icon">
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -70,7 +80,7 @@
|
||||
|
||||
<!-- Search submit. -->
|
||||
<td>
|
||||
<button type="submit" class="search-btn">
|
||||
<button type="submit" class="clear-btn">
|
||||
<img src="{% static 'imgs/find.png' %}" class="small-nav-icon">
|
||||
</button>
|
||||
</td>
|
||||
|
42
viewer/templates/registration/login.html
Normal file
42
viewer/templates/registration/login.html
Normal file
@@ -0,0 +1,42 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, height=device-height" />
|
||||
<title>
|
||||
NibasaViewer login
|
||||
</title>
|
||||
<link href="{% static 'css/styles.css' %}" rel="stylesheet">
|
||||
</head>
|
||||
|
||||
<body class="background">
|
||||
<div class="fc mauto pd">
|
||||
<form method="post" action="{% url 'login' %}" class="fc">
|
||||
{% csrf_token %}
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
{{ form.username.label_tag }}
|
||||
</td>
|
||||
<td>
|
||||
{{ form.username }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
{{ form.password.label_tag }}
|
||||
</td>
|
||||
<td>
|
||||
{{ form.password }}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<input type="submit" value="login" class="float-right">
|
||||
<input type="hidden" name="next" value="{{ next }}">
|
||||
</form>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -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.
|
||||
|
Reference in New Issue
Block a user