models.py 4.53 KB
Newer Older
Skia's avatar
Skia committed
1
from django.db import models
Skia's avatar
Skia committed
2 3 4 5
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, UserManager
from django.utils.translation import ugettext_lazy as _
from django.core import validators
from django.utils import timezone
6
from datetime import datetime
Skia's avatar
Skia committed
7

Skia's avatar
Skia committed
8 9 10
class User(AbstractBaseUser, PermissionsMixin):
    """
    Defines the base user class, useable in every app
Skia's avatar
Skia committed
11

Skia's avatar
Skia committed
12 13 14
    This is almost the same as the auth module AbstractUser since it inherits from it,
    but some fields are required, and the username is generated automatically with the
    name of the user (see generate_username()).
Skia's avatar
Skia committed
15

16
    Added field: nick_name, date_of_birth
Skia's avatar
Skia committed
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
    Required fields: email, first_name, last_name, date_of_birth
    """
    username = models.CharField(
        _('username'),
        max_length=254,
        unique=True,
        help_text=_('Required. 254 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[
            validators.RegexValidator(
                r'^[\w.@+-]+$',
                _('Enter a valid username. This value may contain only '
                  'letters, numbers ' 'and @/./+/-/_ characters.')
            ),
        ],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    first_name = models.CharField(_('first name'), max_length=30)
    last_name = models.CharField(_('last name'), max_length=30)
    email = models.EmailField(_('email address'), unique=True)
Skia's avatar
Skia committed
38
    date_of_birth = models.DateTimeField(_('date of birth'))
Skia's avatar
Skia committed
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
    nick_name = models.CharField(max_length=30, blank=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    USERNAME_FIELD = 'username'
Skia's avatar
Skia committed
58
    REQUIRED_FIELDS = ['email', 'first_name', 'last_name', 'date_of_birth']
Skia's avatar
Skia committed
59 60 61 62

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
Skia's avatar
Skia committed
63 64

    def __str__(self):
Skia's avatar
Skia committed
65 66 67 68 69 70 71 72 73 74 75 76 77
        return self.username

    def get_full_name(self):
        """
        Returns the first_name plus the last_name, with a space in between.
        """
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        "Returns the short name for the user."
        return self.first_name

Skia's avatar
Skia committed
78 79 80 81 82 83 84 85 86
    def get_display_name(self):
        """
        Returns the display name of the user.
        A nickname if possible, otherwise, the full name
        """
        if self.nick_name != "":
            return self.nick_name
        return self.get_full_name()

Skia's avatar
Skia committed
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
    def email_user(self, subject, message, from_email=None, **kwargs):
        """
        Sends an email to this User.
        """
        send_mail(subject, message, from_email, [self.email], **kwargs)

    def generate_username(self):
        """
        Generates a unique username based on the first and last names.
        For example: Guy Carlier gives gcarlier, and gcarlier1 if the first one exists
        Returns the generated username
        """
        user_name = str(self.first_name[0]+self.last_name).lower()
        un_set = [u.username for u in User.objects.all()]
        if user_name in un_set:
            i = 1
            while user_name+str(i) in un_set:
                i += 1
            user_name += str(i)
        self.username = user_name
        return user_name
Skia's avatar
Skia committed
108

Skia's avatar
Skia committed
109

Skia's avatar
Skia committed
110
class Page(models.Model):
Skia's avatar
Skia committed
111
    full_name = models.CharField(_('page full name'), max_length=30, blank=False, primary_key=True)
Skia's avatar
Skia committed
112
    name = models.CharField(_('page name'), max_length=30, blank=False)
Skia's avatar
Skia committed
113
    title = models.CharField(_("page title"), max_length=255, blank=True)
Skia's avatar
Skia committed
114 115 116
    content = models.TextField(_("page content"), blank=True)
    revision = models.PositiveIntegerField(_("current revision"), default=1)
    is_locked = models.BooleanField(_("page mutex"), default=False)
Skia's avatar
Skia committed
117
    parent = models.ForeignKey('self', related_name="children", null=True, blank=True, on_delete=models.SET_NULL)
Skia's avatar
Skia committed
118

Skia's avatar
Skia committed
119 120 121 122 123 124 125
    class Meta:
        permissions = (
            ("can_edit", "Can edit the page"),
            ("can_view", "Can view the page"),
        )

    def __str__(self):
Skia's avatar
Skia committed
126
        return self.full_name
Skia's avatar
Skia committed
127 128

    def get_display_name(self):
Skia's avatar
Skia committed
129
        return self.full_name
Skia's avatar
Skia committed
130