Pre-configure registration & browser reload

This commit is contained in:
Gabriel Augendre 2022-12-16 22:13:09 +01:00
parent 8a015f1cef
commit 28006feeb0
11 changed files with 114 additions and 4 deletions

View file

@ -3,6 +3,10 @@
"project_slug": "{{ cookiecutter.project_name.lower()|replace(' ', '_')|replace('-', '_')|replace('.', '_')|trim() }}", "project_slug": "{{ cookiecutter.project_name.lower()|replace(' ', '_')|replace('-', '_')|replace('.', '_')|trim() }}",
"python_version": "3.11.1", "python_version": "3.11.1",
"_copy_without_render": [ "_copy_without_render": [
"*.html" "*.html",
"*/activation*.txt"
],
"_extensions": [
"cookiecutter.extensions.RandomStringExtension"
] ]
} }

View file

@ -0,0 +1,8 @@
import django_registration.forms
from common.models import User
class RegistrationForm(django_registration.forms.RegistrationForm):
class Meta(django_registration.forms.RegistrationForm.Meta):
model = User

View file

@ -0,0 +1,7 @@
{% extends "common/base.html" %}
{% block content %}
<h1>Activation réussie</h1>
<p>Votre compte est désormais actif.</p>
<p><a href="{% url "login" %}" class="btn btn-primary">Se connecter</a></p>
{% endblock %}

View file

@ -0,0 +1,2 @@
Voici votre clé d'activation : https://{{ site.domain }}{% url "django_registration_activate" activation_key=activation_key %}
Elle est valable pendant {{ expiration_days }} jours.

View file

@ -0,0 +1 @@
[{{cookiecutter.project_name}}] Activation de compte

View file

@ -0,0 +1,8 @@
{% extends "common/base.html" %}
{% block content %}
<h1>Erreur d'activation</h1>
<p>
{{ activation_error }}
</p>
{% endblock %}

View file

@ -0,0 +1,6 @@
{% extends "common/base.html" %}
{% block content %}
<h1>Inscriptions fermées</h1>
<p>Les inscriptions sont désactivées.</p>
{% endblock %}

View file

@ -0,0 +1,6 @@
{% extends "common/base.html" %}
{% block content %}
<h1>Inscription réussie</h1>
<p>Un e-mail permettant d'activer votre compte vous a été envoyé.</p>
{% endblock %}

View file

@ -0,0 +1,10 @@
{% extends "common/base.html" %}
{% block content %}
<h1>Inscription</h1>
<form action="{% url "django_registration_register" %}" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="S'inscrire">
</form>
{% endblock %}

View file

@ -14,14 +14,19 @@ CONTRIB_DIR = PROJECT_ROOT / "contrib"
env = environ.Env( env = environ.Env(
DEBUG=(bool, False), DEBUG=(bool, False),
SECRET_KEY=str, SECRET_KEY=(str, "{{ random_ascii_string(50, punctuation=True) }}"),
ALLOWED_HOSTS=(list, []), ALLOWED_HOSTS=(list, []),
DEBUG_TOOLBAR=(bool, True), DEBUG_TOOLBAR=(bool, True),
STATIC_ROOT=(Path, BASE_DIR / "public" / "static"), STATIC_ROOT=(Path, BASE_DIR / "public" / "static"),
LOG_LEVEL=(str, "DEBUG"), LOG_LEVEL=(str, "DEBUG"),
LOG_FORMAT=(str, "default"), LOG_FORMAT=(str, "default"),
APP_DATA=(Path, PROJECT_ROOT / "data"), APP_DATA=(Path, PROJECT_ROOT / "data"),
DATABASE_URL=str, DATABASE_URL=(str, "sqlite:////app/db/db.sqlite3"),
REGISTRATION_OPEN=(bool, True),
MAILGUN_API_KEY=(str, ""),
MAILGUN_SENDER_DOMAIN=(str, ""),
MAILGUN_SENDER_ADDRESS=(str, ""),
CSRF_TRUSTED_ORIGINS=(list, ["http://localhost:8000"]),
) )
env_file = os.getenv("ENV_FILE", None) env_file = os.getenv("ENV_FILE", None)
@ -55,7 +60,9 @@ EXTERNAL_APPS = [
"django_cleanup.apps.CleanupConfig", # should be last: https://pypi.org/project/django-cleanup/ "django_cleanup.apps.CleanupConfig", # should be last: https://pypi.org/project/django-cleanup/
] ]
if DEBUG_TOOLBAR: if DEBUG_TOOLBAR:
EXTERNAL_APPS.append("debug_toolbar") EXTERNAL_APPS.insert(-2, "debug_toolbar")
if DEBUG:
EXTERNAL_APPS.insert(-2, "django_browser_reload")
CUSTOM_APPS = [ CUSTOM_APPS = [
"whitenoise.runserver_nostatic", # should be first "whitenoise.runserver_nostatic", # should be first
@ -77,6 +84,8 @@ MIDDLEWARE = [
] ]
if DEBUG_TOOLBAR: if DEBUG_TOOLBAR:
MIDDLEWARE.insert(0, "debug_toolbar.middleware.DebugToolbarMiddleware") MIDDLEWARE.insert(0, "debug_toolbar.middleware.DebugToolbarMiddleware")
if DEBUG:
MIDDLEWARE.append("django_browser_reload.middleware.BrowserReloadMiddleware")
ROOT_URLCONF = "{{cookiecutter.project_slug}}.urls" ROOT_URLCONF = "{{cookiecutter.project_slug}}.urls"
@ -204,3 +213,40 @@ LOGIN_URL = "/admin/login"
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
AUTH_USER_MODEL = "common.User" AUTH_USER_MODEL = "common.User"
ACCOUNT_ACTIVATION_DAYS = 2
REGISTRATION_OPEN = env("REGISTRATION_OPEN")
ANYMAIL = {
"MAILGUN_API_KEY": env("MAILGUN_API_KEY"),
"MAILGUN_SENDER_DOMAIN": env("MAILGUN_SENDER_DOMAIN"),
}
EMAIL_BACKEND = "anymail.backends.mailgun.EmailBackend"
DEFAULT_FROM_EMAIL = env("MAILGUN_SENDER_ADDRESS")
SERVER_EMAIL = env("MAILGUN_SENDER_ADDRESS")
if DEBUG:
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
APP = {
"build": {
"date": "latest-date",
"commit": "latest-commit",
"describe": "latest-describe",
}
}
try:
with open("/app/git/build-date") as f:
APP["build"]["date"] = f.read().strip()
except Exception: # noqa: S110
pass
try:
with open("/app/git/git-commit") as f:
APP["build"]["commit"] = f.read().strip()
except Exception: # noqa: S110
pass
try:
with open("/app/git/git-describe") as f:
APP["build"]["describe"] = f.read().strip()
except Exception: # noqa: S110
pass

View file

@ -18,11 +18,20 @@ from django.conf.urls.static import static
from django.contrib import admin from django.contrib import admin
from django.contrib.auth import logout from django.contrib.auth import logout
from django.urls import include, path from django.urls import include, path
from django_registration.backends.activation.views import RegistrationView
from common.forms import RegistrationForm
from common.views import hello_world from common.views import hello_world
urlpatterns = [ urlpatterns = [
path("logout/", logout, {"next_page": settings.LOGOUT_REDIRECT_URL}, name="logout"), path("logout/", logout, {"next_page": settings.LOGOUT_REDIRECT_URL}, name="logout"),
path(
"accounts/register/",
RegistrationView.as_view(form_class=RegistrationForm),
name="django_registration_register",
),
path("accounts/", include("django_registration.backends.activation.urls")),
path("accounts/", include("django.contrib.auth.urls")),
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
path("", hello_world, name="hello_world"), path("", hello_world, name="hello_world"),
] ]
@ -31,3 +40,6 @@ urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
if settings.DEBUG_TOOLBAR: if settings.DEBUG_TOOLBAR:
urlpatterns.insert(0, path("__debug__/", include("debug_toolbar.urls"))) urlpatterns.insert(0, path("__debug__/", include("debug_toolbar.urls")))
if settings.DEBUG:
urlpatterns.insert(0, path("__reload__/", include("django_browser_reload.urls")))