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 %}
-
-
- {% 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)
]