stages/identification: add more templates
This commit is contained in:
		@ -1,10 +1,10 @@
 | 
				
			|||||||
"""passbook multi-stage authentication engine"""
 | 
					"""passbook multi-stage authentication engine"""
 | 
				
			||||||
from datetime import timedelta
 | 
					from datetime import timedelta
 | 
				
			||||||
from urllib.parse import quote
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from django.contrib import messages
 | 
					from django.contrib import messages
 | 
				
			||||||
from django.http import HttpRequest
 | 
					from django.http import HttpRequest
 | 
				
			||||||
from django.shortcuts import reverse
 | 
					from django.shortcuts import reverse
 | 
				
			||||||
 | 
					from django.utils.http import urlencode
 | 
				
			||||||
from django.utils.timezone import now
 | 
					from django.utils.timezone import now
 | 
				
			||||||
from django.utils.translation import gettext as _
 | 
					from django.utils.translation import gettext as _
 | 
				
			||||||
from structlog import get_logger
 | 
					from structlog import get_logger
 | 
				
			||||||
@ -23,6 +23,15 @@ class EmailStageView(AuthenticationStage):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    template_name = "stages/email/waiting_message.html"
 | 
					    template_name = "stages/email/waiting_message.html"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_full_url(self, **kwargs) -> str:
 | 
				
			||||||
 | 
					        """Get full URL to be used in template"""
 | 
				
			||||||
 | 
					        base_url = reverse(
 | 
				
			||||||
 | 
					            "passbook_flows:flow-executor",
 | 
				
			||||||
 | 
					            kwargs={"flow_slug": self.executor.flow.slug},
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        relative_url = f"{base_url}?{urlencode(kwargs)}"
 | 
				
			||||||
 | 
					        return self.request.build_absolute_uri(relative_url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get(self, request, *args, **kwargs):
 | 
					    def get(self, request, *args, **kwargs):
 | 
				
			||||||
        # TODO: Form to make sure email is only sent once
 | 
					        # TODO: Form to make sure email is only sent once
 | 
				
			||||||
        pending_user = self.executor.plan.context[PLAN_CONTEXT_PENDING_USER]
 | 
					        pending_user = self.executor.plan.context[PLAN_CONTEXT_PENDING_USER]
 | 
				
			||||||
@ -37,14 +46,7 @@ class EmailStageView(AuthenticationStage):
 | 
				
			|||||||
            template_name="stages/email/for_email/password_reset.html",
 | 
					            template_name="stages/email/for_email/password_reset.html",
 | 
				
			||||||
            to=[pending_user.email],
 | 
					            to=[pending_user.email],
 | 
				
			||||||
            template_context={
 | 
					            template_context={
 | 
				
			||||||
                "url": self.request.build_absolute_uri(
 | 
					                "url": self.get_full_url(token=nonce.pk.hex),
 | 
				
			||||||
                    reverse(
 | 
					 | 
				
			||||||
                        "passbook_flows:flow-executor",
 | 
					 | 
				
			||||||
                        kwargs={"flow_slug": self.executor.flow.slug},
 | 
					 | 
				
			||||||
                    )
 | 
					 | 
				
			||||||
                    + "?token="
 | 
					 | 
				
			||||||
                    + quote(nonce.uuid.hex)
 | 
					 | 
				
			||||||
                ),
 | 
					 | 
				
			||||||
                "user": pending_user,
 | 
					                "user": pending_user,
 | 
				
			||||||
                "expires": nonce.expires,
 | 
					                "expires": nonce.expires,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,6 @@ from django.utils.html import strip_tags
 | 
				
			|||||||
class TemplateEmailMessage(EmailMultiAlternatives):
 | 
					class TemplateEmailMessage(EmailMultiAlternatives):
 | 
				
			||||||
    """Wrapper around EmailMultiAlternatives with integrated template rendering"""
 | 
					    """Wrapper around EmailMultiAlternatives with integrated template rendering"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # pylint: disable=too-many-arguments
 | 
					 | 
				
			||||||
    def __init__(self, template_name=None, template_context=None, **kwargs):
 | 
					    def __init__(self, template_name=None, template_context=None, **kwargs):
 | 
				
			||||||
        html_content = render_to_string(template_name, template_context)
 | 
					        html_content = render_to_string(template_name, template_context)
 | 
				
			||||||
        if "body" not in kwargs:
 | 
					        if "body" not in kwargs:
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					# Generated by Django 3.0.5 on 2020-05-10 16:48
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.db import migrations, models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Migration(migrations.Migration):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dependencies = [
 | 
				
			||||||
 | 
					        ("passbook_stages_identification", "0003_auto_20200509_2025"),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    operations = [
 | 
				
			||||||
 | 
					        migrations.AlterField(
 | 
				
			||||||
 | 
					            model_name="identificationstage",
 | 
				
			||||||
 | 
					            name="template",
 | 
				
			||||||
 | 
					            field=models.TextField(
 | 
				
			||||||
 | 
					                choices=[
 | 
				
			||||||
 | 
					                    ("stages/identification/login.html", "Default Login"),
 | 
				
			||||||
 | 
					                    ("stages/identification/recovery.html", "Default Recovery"),
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
@ -16,7 +16,8 @@ class UserFields(models.TextChoices):
 | 
				
			|||||||
class Templates(models.TextChoices):
 | 
					class Templates(models.TextChoices):
 | 
				
			||||||
    """Templates to be used for the stage"""
 | 
					    """Templates to be used for the stage"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DEFAULT_LOGIN = "login/form.html"
 | 
					    DEFAULT_LOGIN = "stages/identification/login.html"
 | 
				
			||||||
 | 
					    DEFAULT_RECOVERY = "stages/identification/recovery.html"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class IdentificationStage(Stage):
 | 
					class IdentificationStage(Stage):
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{% extends 'login/form.html' %}
 | 
				
			||||||
@ -0,0 +1,68 @@
 | 
				
			|||||||
 | 
					{% extends 'base/skeleton.html' %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% load static %}
 | 
				
			||||||
 | 
					{% load i18n %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block body %}
 | 
				
			||||||
 | 
					<div class="pf-c-background-image">
 | 
				
			||||||
 | 
					    <svg xmlns="http://www.w3.org/2000/svg" class="pf-c-background-image__filter" width="0" height="0">
 | 
				
			||||||
 | 
					        <filter id="image_overlay">
 | 
				
			||||||
 | 
					            <feColorMatrix type="matrix" values="1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0"></feColorMatrix>
 | 
				
			||||||
 | 
					            <feComponentTransfer color-interpolation-filters="sRGB" result="duotone">
 | 
				
			||||||
 | 
					                <feFuncR type="table" tableValues="0.086274509803922 0.43921568627451"></feFuncR>
 | 
				
			||||||
 | 
					                <feFuncG type="table" tableValues="0.086274509803922 0.43921568627451"></feFuncG>
 | 
				
			||||||
 | 
					                <feFuncB type="table" tableValues="0.086274509803922 0.43921568627451"></feFuncB>
 | 
				
			||||||
 | 
					                <feFuncA type="table" tableValues="0 1"></feFuncA>
 | 
				
			||||||
 | 
					            </feComponentTransfer>
 | 
				
			||||||
 | 
					        </filter>
 | 
				
			||||||
 | 
					    </svg>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					{% include 'partials/messages.html' %}
 | 
				
			||||||
 | 
					<div class="pf-c-login">
 | 
				
			||||||
 | 
					    <div class="pf-c-login__container">
 | 
				
			||||||
 | 
					        <header class="pf-c-login__header">
 | 
				
			||||||
 | 
					            <img class="pf-c-brand" src="{% static 'passbook/logo.svg' %}" style="height: 60px;"
 | 
				
			||||||
 | 
					                alt="passbook icon" />
 | 
				
			||||||
 | 
					            <img class="pf-c-brand" src="{% static 'passbook/brand.svg' %}" style="height: 60px;"
 | 
				
			||||||
 | 
					                alt="passbook branding" />
 | 
				
			||||||
 | 
					        </header>
 | 
				
			||||||
 | 
					        <main class="pf-c-login__main">
 | 
				
			||||||
 | 
					            <header class="pf-c-login__main-header">
 | 
				
			||||||
 | 
					                <h1 class="pf-c-title pf-m-3xl">
 | 
				
			||||||
 | 
					                    {% trans 'Trouble Logging In?' %}
 | 
				
			||||||
 | 
					                </h1>
 | 
				
			||||||
 | 
					            </header>
 | 
				
			||||||
 | 
					            <div class="pf-c-login__main-body">
 | 
				
			||||||
 | 
					                {% block card %}
 | 
				
			||||||
 | 
					                <form method="POST" class="pf-c-form">
 | 
				
			||||||
 | 
					                    {% block above_form %}
 | 
				
			||||||
 | 
					                    {% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    {% include 'partials/form.html' %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    {% block beneath_form %}
 | 
				
			||||||
 | 
					                    {% endblock %}
 | 
				
			||||||
 | 
					                    <div class="pf-c-form__group pf-m-action">
 | 
				
			||||||
 | 
					                        <button class="pf-c-button pf-m-primary pf-m-block" type="submit">{% trans primary_action %}</button>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                </form>
 | 
				
			||||||
 | 
					                {% endblock %}
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <footer class="pf-c-login__main-footer">
 | 
				
			||||||
 | 
					                {% if config.login.subtext %}
 | 
				
			||||||
 | 
					                <p>{{ config.login.subtext }}</p>
 | 
				
			||||||
 | 
					                {% endif %}
 | 
				
			||||||
 | 
					            </footer>
 | 
				
			||||||
 | 
					        </main>
 | 
				
			||||||
 | 
					        <footer class="pf-c-login__footer">
 | 
				
			||||||
 | 
					            <p></p>
 | 
				
			||||||
 | 
					            <ul class="pf-c-list pf-m-inline">
 | 
				
			||||||
 | 
					                <li>
 | 
				
			||||||
 | 
					                    <a href="https://beryju.github.io/passbook/">{% trans 'Documentation' %}</a>
 | 
				
			||||||
 | 
					                </li>
 | 
				
			||||||
 | 
					                <!-- TODO: load config.passbook.footer.links -->
 | 
				
			||||||
 | 
					            </ul>
 | 
				
			||||||
 | 
					        </footer>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user