feat: Add trust bridge and user activation

This commit is contained in:
aldrin 2021-08-02 14:25:58 +02:00
parent 74afc805dc
commit 0f1cd98a80
8 changed files with 78 additions and 52 deletions

View file

@ -1,5 +1,6 @@
from django.contrib import admin
from userausfall.models import User
from userausfall.models import User, TrustBridge
admin.site.register(TrustBridge)
admin.site.register(User)

View file

@ -0,0 +1,29 @@
# Generated by Django 2.2.20 on 2021-08-02 11:31
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('userausfall', '0009_auto_20210802_0745'),
]
operations = [
migrations.RemoveField(
model_name='user',
name='confidant',
),
migrations.RemoveField(
model_name='user',
name='confidant_unconfirmed',
),
migrations.RemoveField(
model_name='user',
name='email',
),
migrations.RemoveField(
model_name='user',
name='email_unconfirmed',
),
]

View file

@ -0,0 +1,23 @@
# Generated by Django 2.2.20 on 2021-08-02 11:41
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('userausfall', '0010_auto_20210802_1131'),
]
operations = [
migrations.CreateModel(
name='TrustBridge',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('is_trusted', models.BooleanField(default=False)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='trust_bridge', to=settings.AUTH_USER_MODEL)),
],
),
]

View file

@ -66,28 +66,16 @@ class User(AbstractBaseUser, PermissionsMixin):
unique=True,
blank=True,
)
email = models.EmailField(_("email address"), blank=True)
email_unconfirmed = models.EmailField(_("email address"), blank=True)
is_staff = models.BooleanField(
_("staff status"),
default=False,
help_text=_("Designates whether the user can log into this admin site."),
)
date_joined = models.DateTimeField(_("date joined"), default=timezone.now)
confidant = models.ForeignKey(
"User", on_delete=models.SET_NULL, null=True, blank=True, related_name="confidants"
)
confidant_unconfirmed = models.ForeignKey(
"User",
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="unconfirmed_confidants",
)
objects = UserManager()
EMAIL_FIELD = "email"
# EMAIL_FIELD = "email"
USERNAME_FIELD = "username"
REQUIRED_FIELDS = []
@ -95,13 +83,6 @@ class User(AbstractBaseUser, PermissionsMixin):
verbose_name = _("user")
verbose_name_plural = _("users")
@property
def confidant_email(self):
if self.confidant is not None:
return self.confidant.email
else:
return None
def clean(self):
super().clean()
self.email = self.__class__.objects.normalize_email(self.email)
@ -114,10 +95,13 @@ class User(AbstractBaseUser, PermissionsMixin):
"""Create the LDAP account which corresponds to this user."""
if not self.username:
raise MissingUserAttribute("User is missing a username.")
if not self.confidant:
raise MissingUserAttribute("User is missing a confirmed confidant.")
if not self.check_password(raw_password):
raise PasswordMismatch(
"The given password does not match the user's password."
)
return ldap.create_account(self.username, raw_password)
class TrustBridge(models.Model):
user = models.OneToOneField("User", on_delete=models.CASCADE, related_name="trust_bridge")
is_trusted = models.BooleanField(default=False)

View file

@ -14,13 +14,13 @@ class ConfidantConfirmationView(ConfirmationView):
class UserViewSet(viewsets.ModelViewSet):
permission_classes = [UserPermission]
# permission_classes = [UserPermission]
queryset = User.objects.all()
@action(detail=True, methods=["post"])
@action(detail=False, methods=["post"])
def activate(self, request, pk=None):
"""Create the corresponding LDAP account."""
user: User = self.get_object()
user: User = request.user # self.get_object()
serializer = UserActivationSerializer(data=request.data)
if serializer.is_valid():
try:

View file

@ -2,10 +2,10 @@ from django.db.models.signals import post_save
from django.dispatch import receiver
from userausfall.models import User
from userausfall.confirmations import ConfidantConfirmation
@receiver(post_save, sender=User)
def user_saved(sender, instance: User, **kwargs):
if instance.confidant_unconfirmed is not None:
ConfidantConfirmation(instance.confidant_unconfirmed, instance).send_request()
# if instance.confidant_unconfirmed is not None:
# ConfidantConfirmation(instance.confidant_unconfirmed, instance).send_request()
pass