From e8faa4e249cb4b94bbf2930e864259d513dc49b6 Mon Sep 17 00:00:00 2001 From: Michael Herrmann Date: Tue, 21 Dec 2021 17:18:55 +0100 Subject: [PATCH] Remove /signup --- tenants/apps.py | 24 ++++++++ tenants/templates/tenants/signup.html | 82 --------------------------- tenants/urls.py | 9 --- tenants/views.py | 62 -------------------- wpr/urls.py | 1 - 5 files changed, 24 insertions(+), 154 deletions(-) delete mode 100644 tenants/templates/tenants/signup.html delete mode 100644 tenants/urls.py delete mode 100644 tenants/views.py diff --git a/tenants/apps.py b/tenants/apps.py index 71c4b9b..2a5fe6f 100644 --- a/tenants/apps.py +++ b/tenants/apps.py @@ -4,3 +4,27 @@ from django.apps import AppConfig class TenantsConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'tenants' + + def ready(self): + super().ready() + _ensure_tenants_group_exists() + + +def _ensure_tenants_group_exists(): + """ + Make sure the "Tenants" group exists so users can be assigned to it. + Normally, we would want to do this in a migration. Unfortunately, Django + cannot currently (easily) assign permissions in a migration [1]. + The `ready()` method above seems like a reasonable place to do it instead. + """ + # We cannot import the following at the module level because Django has not + # been initialized yet: + from django.contrib.auth.models import Group, Permission + from winget.models import Package, Version, Installer + 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) diff --git a/tenants/templates/tenants/signup.html b/tenants/templates/tenants/signup.html deleted file mode 100644 index 4c9f06d..0000000 --- a/tenants/templates/tenants/signup.html +++ /dev/null @@ -1,82 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static suit_tags %} -{% load url from suit_compat %} - -{% block title %}Sign up | {{ 'ADMIN_NAME'|suit_conf }}{% endblock %} - -{% 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 %} -

- {% blocktrans count counter=form.errors.items|length %} - Please correct the error below. - {% plural %} - Please correct the errors below. - {% endblocktrans %} -

- {% endif %} - - {% if form.non_field_errors %} - {% for error in form.non_field_errors %} -

- {{ error }} -

- {% endfor %} - {% endif %} - -
-

Sign up

- -
- {% csrf_token %} -
- - {{ form.email }} - {% if form.email.errors %} -
{{ form.email.errors }}
- {% endif %} -
-
- - {{ form.password1 }} - {% if form.password1.errors %} -
{{ form.password1.errors }}
- {% endif %} -
-
- - {{ form.password2 }} - {% if form.password2.errors %} -
{{ form.password2.errors }}
- {% endif %} -
-
- -
-
- - -
- {% endblock %} -{% endblock %} \ No newline at end of file diff --git a/tenants/urls.py b/tenants/urls.py deleted file mode 100644 index 9aa5438..0000000 --- a/tenants/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from tenants.views import signup - -app_name = 'tenants' - -urlpatterns = [ - path('signup/', signup, name='signup') -] diff --git a/tenants/views.py b/tenants/views.py deleted file mode 100644 index d6fbd41..0000000 --- a/tenants/views.py +++ /dev/null @@ -1,62 +0,0 @@ -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:index')) - 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 diff --git a/wpr/urls.py b/wpr/urls.py index a3a7fa5..fa5916c 100644 --- a/wpr/urls.py +++ b/wpr/urls.py @@ -5,7 +5,6 @@ from django.urls import include, path urlpatterns = [ path('', include('winget.urls')), - path('', include('tenants.urls')), path('admin/', admin.site.urls) ]