src/notes/models/auth.py
author ymh <ymh.work@gmail.com>
Thu, 29 Jul 2021 16:46:20 +0200
changeset 207 c39d91bd16af
parent 142 56850f5c73f6
permissions -rw-r--r--
update dependencies and create new version

"""
auth module that defines irinotes' users and group
"""
from django.contrib.auth.models import AbstractUser, Group
from django.db import models
from django.utils.translation import ugettext_lazy as _


class User(AbstractUser):

    class Meta:
        verbose_name = _('User')
        verbose_name_plural = _('Users')


class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')

    # TODO:
    default_group = models.ForeignKey(
        Group,
        null=False,
        verbose_name=_("UserProfile|default_group"),
        on_delete=models.PROTECT)

    class Meta:
        verbose_name = _('UserProfile')
        verbose_name_plural = _('UserProfiles')


class GroupProfile(models.Model):
    group = models.OneToOneField(
        Group, unique=True, on_delete=models.CASCADE, related_name='profile')
    description = models.TextField(null=True, blank=True)
    # TODO: manage when user is deleted: put first user as owner. delete group if empty
    owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    # TODO: can not delete group when user is not deleted.
    # TODO: other users cannot set as owner
    # TODO: delete personal group when user is deleted
    # TODO: change group name when user change name
    # indicate that this group is a personal group.
    # used this instead of a boolean because it allows to easily enforce that a user has only one personal group
    owner_personal = models.OneToOneField(User, on_delete=models.CASCADE, null=True, related_name='personal_group')
    protocol = models.CharField(max_length=512, null=True, blank=True)

    @property
    def is_personal(self):
        return self.owner == self.owner_personal

    class Meta:
        verbose_name = _('GroupProfile')
        verbose_name_plural = _('GroupProfiles')