Adds account registration form.

This commit is contained in:
Johnny 2018-10-04 20:21:02 +00:00
parent 95cf405ab4
commit cc26e12e9f
6 changed files with 115 additions and 3 deletions

View file

@ -0,0 +1,13 @@
from django import forms
from django.conf import settings
from django.contrib.auth.forms import UserCreationForm, UsernameField
from evennia.utils import class_from_module
class AccountCreationForm(UserCreationForm):
class Meta:
model = class_from_module(settings.BASE_ACCOUNT_TYPECLASS)
fields = ("username", "email")
field_classes = {'username': UsernameField}
email = forms.EmailField(help_text="A valid email address. Optional; used for password resets.", required=False)

View file

@ -51,7 +51,7 @@ folder and edit it to add/remove links to the menu.
<a class="nav-link" href="{% url 'login' %}">Log In</a>
</li>
<li>
<a class="nav-link" href="{% url 'to_be_implemented' %}">Register</a>
<a class="nav-link" href="{% url 'register' %}">Register</a>
</li>
{% endif %}
{% endblock %}

View file

@ -40,7 +40,7 @@ Login
<hr />
<div class="row">
<div class="col-lg-6 col-sm-12 text-center small"><a href="{% url 'password_reset' %}">Forgot Password?</a></div>
<div class="col-lg-6 col-sm-12 text-center small"><a href="{% url 'register' %}">Sign Up</a></div>
<div class="col-lg-6 col-sm-12 text-center small"><a href="{% url 'register' %}">Create Account</a></div>
</div>
<hr />

View file

@ -0,0 +1,56 @@
{% extends "base.html" %}
{% block titleblock %}
Register
{% endblock %}
{% block body %}
{% load addclass %}
<div class="container main-content mt-4" id="main-copy">
<div class="row">
<div class="col-lg-5 offset-lg-3 col-sm-12">
<div class="card mt-3">
<div class="card-body">
<h1 class="card-title">Register</h1>
<hr />
{% if user.is_authenticated %}
<div class="alert alert-info" role="alert">You are already registered!</div>
{% else %}
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<div class="alert alert-danger" role="alert">{{ error }}</div>
{% endfor %}
{% endfor %}
{% endif %}
{% endif %}
{% if not user.is_authenticated %}
<form method="post" action="?">
{% csrf_token %}
{% for field in form %}
<div class="form-field my-3">
{{ field.label_tag }}
{{ field | addclass:"form-control" }}
{% if field.help_text %}
<small class="form-text text-muted">{{ field.help_text|safe }}</small>
{% endif %}
</div>
{% endfor %}
<hr />
<div class="form-group">
<input class="form-control btn btn-outline-secondary" type="submit" value="Register" />
<input type="hidden" name="next" value="{{ next }}" />
</div>
</form>
{% endif %}
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -13,7 +13,8 @@ urlpatterns = [
url(r'^tbi/', website_views.to_be_implemented, name='to_be_implemented'),
# User Authentication (makes login/logout url names available)
url(r'^authenticate/', include('django.contrib.auth.urls')),
url(r'^auth/', include('django.contrib.auth.urls')),
url(r'^auth/register', website_views.AccountCreationView.as_view(), name="register"),
# Django original admin page. Make this URL is always available, whether
# we've chosen to use Evennia's custom admin or not.

View file

@ -7,14 +7,19 @@ templates on the fly.
"""
from django.contrib.admin.sites import site
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import authenticate
from django.contrib.admin.views.decorators import staff_member_required
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse, reverse_lazy
from django.views.generic import View, DetailView, ListView, FormView
from evennia import SESSION_HANDLER
from evennia.objects.models import ObjectDB
from evennia.accounts.models import AccountDB
from evennia.utils import logger
from evennia.web.website.forms import AccountCreationForm
from django.contrib.auth import login
@ -134,3 +139,40 @@ def admin_wrapper(request):
Wrapper that allows us to properly use the base Django admin site, if needed.
"""
return staff_member_required(site.index)(request)
class AccountCreationView(FormView):
form_class = AccountCreationForm
template_name = 'website/registration/register.html'
success_url = reverse_lazy('login')
def form_valid(self, form):
# Check to make sure basics validated
valid = super(AccountCreationView, self).form_valid(form)
if not valid: return self.form_invalid(form)
username = form.cleaned_data['username']
password = form.cleaned_data['password1']
email = form.cleaned_data.get('email', '')
# Create a fake session object to intercept calls to the terminal
from mock import Mock
session = self.request
session.address = self.request.META.get('REMOTE_ADDR', '')
session.msg = Mock()
# Create account
from evennia.commands.default.unloggedin import _create_account
permissions = settings.PERMISSION_ACCOUNT_DEFAULT
account = _create_account(session, username, password, permissions)
# If unsuccessful, get messages passed to session.msg
if not account:
[messages.error(self.request, call) for call in session.msg.call_args_list]
return self.form_invalid(form)
# Append email address if given
account.email = email
account.save()
messages.success(self.request, "Your account '%s' was successfully created! You may log in using it now." % account.name)
return HttpResponseRedirect(self.success_url)