Implement optional registration

This commit is contained in:
Sascha Ißbrücker 2019-12-24 13:31:55 +01:00
parent a1bfb2c711
commit 1896a8136e
12 changed files with 94 additions and 21 deletions

View File

@ -1,22 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true"> <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="db" uuid="b92a6ddc-c3eb-4f61-9408-7ee5d46a163b"> <data-source source="LOCAL" name="SQLite - db.sqlite3" uuid="c880bd6d-554c-484d-a5be-45581d9a9377">
<driver-ref>sqlite.xerial</driver-ref> <driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize> <synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver> <jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db.sqlite3</jdbc-url> <jdbc-url>jdbc:sqlite:$PROJECT_DIR$/data/db.sqlite3</jdbc-url>
<driver-properties>
<property name="enable_load_extension" value="true" />
</driver-properties>
<libraries>
<library>
<url>file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.25.1/sqlite-jdbc-3.25.1.jar</url>
</library>
<library>
<url>file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.25.1/license.txt</url>
</library>
</libraries>
</data-source> </data-source>
</component> </component>
</project> </project>

View File

@ -7,7 +7,7 @@
<component name="JavaScriptSettings"> <component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" /> <option name="languageLevel" value="ES6" />
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" project-jdk-name="Python 3.7 (.env)" project-jdk-type="Python SDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" default="false" project-jdk-name="Python 3.7 (linkding)" project-jdk-type="Python SDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>

View File

@ -1,4 +1,4 @@
.login-page { .auth-page {
> .columns { > .columns {
align-items: center; align-items: center;
justify-content: center; justify-content: center;

View File

@ -23,4 +23,4 @@ $alternative-color-dark: darken($alternative-color, 5%);
@import "shared"; @import "shared";
@import "bookmarks"; @import "bookmarks";
@import "settings"; @import "settings";
@import "login"; @import "auth";

View File

@ -0,0 +1,16 @@
{% extends 'bookmarks/layout.html' %}
{% load widget_tweaks %}
{% block title %}Registration complete{% endblock %}
{% block content %}
<div class="auth-page">
<div class="columns">
<section class="content-area column col-12">
<p>Registration complete. You can now use the application.</p>
</section>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,44 @@
{% extends 'bookmarks/layout.html' %}
{% load widget_tweaks %}
{% block title %}Registration{% endblock %}
{% block content %}
<div class="auth-page">
<div class="columns">
<section class="content-area column col-5 col-md-12">
<div class="content-area-header">
<h2>Register</h2>
</div>
<form method="post" action="{% url 'django_registration_register' %}">
{% csrf_token %}
<div class="form-group {% if form.errors.username %}has-error{% endif %}">
<label class="form-label" for="{{ form.username.id_for_label }}">Username</label>
{{ form.username|add_class:'form-input' }}
<div class="form-input-hint">{{ form.errors.username }}</div>
</div>
<div class="form-group {% if form.errors.email %}has-error{% endif %}">
<label class="form-label" for="{{ form.email.id_for_label }}">Email</label>
{{ form.email|add_class:'form-input' }}
<div class="form-input-hint">{{ form.errors.email }}</div>
</div>
<div class="form-group {% if form.errors.password1 %}has-error{% endif %}">
<label class="form-label" for="{{ form.password1.id_for_label }}">Password</label>
{{ form.password1|add_class:'form-input' }}
<div class="form-input-hint">{{ form.errors.password1 }}</div>
</div>
<div class="form-group {% if form.errors.password2 %}has-error{% endif %}">
<label class="form-label" for="{{ form.password2.id_for_label }}">Confirm Password</label>
{{ form.password2|add_class:'form-input' }}
<div class="form-input-hint">{{ form.errors.password2 }}</div>
</div>
<input type="submit" value="Register" class="btn btn-primary mt-2 col-md-12">
<input type="hidden" name="next" value="{{ next }}">
</form>
</section>
</div>
</div>
{% endblock %}

View File

@ -5,7 +5,7 @@
{% block content %} {% block content %}
<div class="login-page"> <div class="auth-page">
<div class="columns"> <div class="columns">
<section class="content-area column col-5 col-md-12"> <section class="content-area column col-5 col-md-12">
<div class="content-area-header"> <div class="content-area-header">
@ -23,12 +23,22 @@
{{ form.username|add_class:'form-input' }} {{ form.username|add_class:'form-input' }}
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label" for="{{ form.username.id_for_label }}">Password</label> <label class="form-label" for="{{ form.password.id_for_label }}">Password</label>
{{ form.password|add_class:'form-input' }} {{ form.password|add_class:'form-input' }}
</div> </div>
<input type="submit" value="Login" class="btn btn-primary mt-2 col-md-12"> <div class="columns mt-2">
<input type="hidden" name="next" value="{{ next }}"> <div class="column col-3">
<input type="submit" value="Login" class="btn btn-primary">
<input type="hidden" name="next" value="{{ next }}">
</div>
{% if allow_registration %}
<div class="column col-auto col-ml-auto">
<a href="{% url 'django_registration_register' %}" class="btn btn-link">Register</a>
</div>
{% endif %}
</div>
</form> </form>
</section> </section>
</div> </div>

View File

@ -6,6 +6,7 @@ django-appconf==1.0.3
django-compressor==2.3 django-compressor==2.3
django-generate-secret-key==1.0.2 django-generate-secret-key==1.0.2
django-picklefield==2.0 django-picklefield==2.0
django-registration==3.0.1
django-sass-processor==0.7.3 django-sass-processor==0.7.3
django-widget-tweaks==1.4.5 django-widget-tweaks==1.4.5
idna==2.8 idna==2.8

View File

@ -1,11 +1,13 @@
beautifulsoup4==4.7.1 beautifulsoup4==4.7.1
certifi==2019.6.16 certifi==2019.6.16
chardet==3.0.4 chardet==3.0.4
confusable-homoglyphs==3.2.0
Django==2.2.2 Django==2.2.2
django-appconf==1.0.3 django-appconf==1.0.3
django-compressor==2.3 django-compressor==2.3
django-generate-secret-key==1.0.2 django-generate-secret-key==1.0.2
django-picklefield==2.0 django-picklefield==2.0
django-registration==3.0.1
django-sass-processor==0.7.3 django-sass-processor==0.7.3
django-widget-tweaks==1.4.5 django-widget-tweaks==1.4.5
idna==2.8 idna==2.8

View File

@ -141,3 +141,6 @@ STATICFILES_FINDERS = [
STATICFILES_DIRS = [ STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'bookmarks', 'styles'), os.path.join(BASE_DIR, 'bookmarks', 'styles'),
] ]
# Registration switch
ALLOW_REGISTRATION = False

View File

@ -1 +1,3 @@
# Placeholder, can be mounted in a Docker container with a custom settings # Placeholder, can be mounted in a Docker container with a custom settings
# ALLOW_REGISTRATION = True

View File

@ -16,10 +16,16 @@ Including another URLconf
from django.contrib import admin from django.contrib import admin
from django.contrib.auth import views as auth_views from django.contrib.auth import views as auth_views
from django.urls import path, include from django.urls import path, include
from .settings import ALLOW_REGISTRATION
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('login/', auth_views.LoginView.as_view(redirect_authenticated_user=True), name='login'), path('login/', auth_views.LoginView.as_view(redirect_authenticated_user=True,
extra_context=dict(allow_registration=ALLOW_REGISTRATION)),
name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'), path('logout/', auth_views.LogoutView.as_view(), name='logout'),
path('', include('bookmarks.urls')), path('', include('bookmarks.urls')),
] ]
if ALLOW_REGISTRATION:
urlpatterns.append(path('', include('django_registration.backends.one_step.urls')))