mirror of
https://github.com/omaha-consulting/winget.pro.git
synced 2026-10-24 12:52:26 +00:00
Add a signup form
This commit is contained in:
@@ -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 %}
|
||||
@@ -0,0 +1,9 @@
|
||||
from django.urls import path
|
||||
|
||||
from tenants.views import signup
|
||||
|
||||
app_name = 'tenants'
|
||||
|
||||
urlpatterns = [
|
||||
path('signup/', signup, name='signup')
|
||||
]
|
||||
@@ -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
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user