Add a signup form

This commit is contained in:
Michael Herrmann
2021-12-14 12:06:18 +01:00
parent 4c33e981e0
commit f939abe766
4 changed files with 152 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
{% extends "admin/base_site.html" %}
{% load i18n static suit_tags %}
{% load url from suit_compat %}
{% block bodyclass %}login{% endblock %}
{% block nav-global %}{% endblock %}
{% block content_title %}{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block header %}{% endblock %}
{% block content-left %}{% endblock %}
{% block container %}
{% block content %}
{% if form.errors and not form.non_field_errors %}
<p class="errornote alert alert-error">
{% blocktrans count counter=form.errors.items|length %}
Please correct the error below.
{% plural %}
Please correct the errors below.
{% endblocktrans %}
</p>
{% endif %}
{% if form.non_field_errors %}
{% for error in form.non_field_errors %}
<p class="errornote alert alert-error">
{{ error }}
</p>
{% endfor %}
{% endif %}
<div id="content-main">
<h1><i class="icon-lock icon-white"></i> Sign up</h1>
<form action="{{ app_path }}" method="post">
{% csrf_token %}
<div class="form-row control-group{% if form.email.errors %} error{% endif %}">
<label for="id_email" class="control-label required">
{{ form.email.label }}:
</label>
{{ form.email }}
{% if form.email.errors %}
<div class="help-block">{{ form.email.errors }}</div>
{% endif %}
</div>
<div class="form-row control-group{% if form.password1.errors %} error{% endif %}">
<label for="id_password" class="control-label required">
{{ form.password1.label }}
</label>
{{ form.password1 }}
{% if form.password1.errors %}
<div class="help-block">{{ form.password1.errors }}</div>
{% endif %}
</div>
<div class="form-row control-group{% if form.password2.errors %} error{% endif %}">
<label for="id_password" class="control-label required">
{{ form.password2.label }}</label>
{{ form.password2 }}
{% if form.password2.errors %}
<div class="help-block">{{ form.password2.errors }}</div>
{% endif %}
</div>
<div class="submit-row">
<input type="submit" value="Sign up" class="btn btn-info"/>
</div>
</form>
<script type="text/javascript">
document.getElementById('id_email').focus()
</script>
</div>
{% endblock %}
{% endblock %}
+9
View File
@@ -0,0 +1,9 @@
from django.urls import path
from tenants.views import signup
app_name = 'tenants'
urlpatterns = [
path('signup/', signup, name='signup')
]
+62
View File
@@ -0,0 +1,62 @@
from django.contrib.auth import login
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User, Permission, Group
from django.db import transaction, IntegrityError
from django.shortcuts import render, redirect
from django.urls import reverse
from tenants.models import Tenant
from winget.models import Package, Version, Installer
def signup(request):
if request.method == 'POST':
form = SignupForm(request.POST)
if form.is_valid():
try:
tenant = form.save()
except UserAlreadyExists:
form.add_error(
'email', 'A user with this email already exists.'
)
else:
login(request, tenant.user)
return redirect(reverse('admin:winget_package_changelist'))
else:
form = SignupForm()
return render(request, 'tenants/signup.html', {'form': form})
class SignupForm(UserCreationForm):
class Meta:
model = User
fields = ('email',)
@transaction.atomic
def save(self, commit=True):
assert commit, 'commit=False is not implemented.'
user = super().save(commit=False)
user.username = user.email
user.is_staff = True
try:
user.save()
tenant = Tenant.objects.create(user=user)
except IntegrityError:
raise UserAlreadyExists()
user.groups.add(_get_or_create_tenants_group())
return tenant
def _get_or_create_tenants_group():
group, created = Group.objects.get_or_create(name='Tenants')
if created:
for model in (Package, Version, Installer):
for action in ('view', 'add', 'change', 'delete'):
codename = f'{action}_{model._meta.model_name}'
permission = Permission.objects.get(codename=codename)
group.permissions.add(permission)
return group
class UserAlreadyExists(IntegrityError):
pass
+1
View File
@@ -6,6 +6,7 @@ from django.urls import include, path
urlpatterns = [
path('api/', include('winget.urls')),
path('admin/', admin.site.urls),
path('', include('tenants.urls'))
]
if settings.DEBUG: