Skip to content

Instantly share code, notes, and snippets.

@linevych
Created July 9, 2016 21:02
Show Gist options
  • Save linevych/58081d889fb22d1dbdf811fb62c8cd2b to your computer and use it in GitHub Desktop.
Save linevych/58081d889fb22d1dbdf811fb62c8cd2b to your computer and use it in GitHub Desktop.
Custom User model for Dmytro
# -*- coding: utf-8 -*-
# В Python 3 кодування писати не має змісту.
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import AbstractUser
USER = 0
OWNER = 1
SELLER = 2
user_type_choice = (
(USER, 'User'),
(OWNER, 'Owner'),
(SELLER, 'Seller'),
)
class User(AbstractUser):
"""
Custom user model.
Трохи підкорегуав твій клас.
1. Таке форматування значно краще читається.
2. Старайся ставити verbose_name, це значно спростить читання коду.
3. Корисутйся translation utils. Це не складно, але якщо тобі доведеться
перекладати проект, це зекономить купу часу.
4. Додав методи, щоб отримувати роль.
Приклад:
code-block:: python
if request.user.is_owner():
# Do some stuff.
Виглядає значно читабельгіше як на мене.
Взагалі якщо seller/owner це не тільки ролі, а й профілі з різним набором полів
то варто наслідуватись від цієї моделі і створити окремі моделі Owner(User) та Seller(User).
Тоді буде простіше вносити зміни і мігрувати кожну окрему модель.
В якості AUTH_USER_MODEL для всього буде ця модель.
"""
role = models.CharField(
verbose_name=_('Роль'),
max_length=100,
choices=user_type_choice,
default=USER
)
idn = models.CharField(
verbose_name=_('Ідентифікаційний код'),
max_length=10,
blank=True,
default=None,
null=True
)
mobile = models.CharField(
verbose_name=_('Номер мобільного'),
max_length=15,
blank=True,
default=None,
null=True
)
parent = models.ForeignKey(
'self',
verbose_name=_('Батьківський(?) користувач'),
help_text=_('Незрозумів що і для чого це'),
null=True,
blank=True
)
tariff = models.IntegerField(
verbose_name=_('Тариф'),
default=None,
null=True,
blank=True
)
def _user_role_is(self, role):
"""
Check if current user role matches to given.
@:param role: user role.
@:type role: int.
@:rtype bool.
@:return True if user matches given role. Else returns false.
"""
if self.role == role:
return True
else:
return False
def is_owner(self):
"""
Check if user role is owner.
"""
return self._user_role_is(OWNER)
def is_seller(self):
"""
Check if user role is seller.
"""
return self._user_role_is(SELLER)
class Meta(AbstractUser.Meta):
swappable = 'AUTH_USER_MODEL'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment