feat(api): rename user model fields (#1902)

This commit is contained in:
Jonas L 2022-06-21 23:43:03 +02:00 committed by GitHub
parent 28c4989d44
commit dc426f0aa5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 204 additions and 142 deletions

View file

@ -1,7 +1,7 @@
from .auth import LoginAttempt, Session, UserToken
from .country import Country
from .preference import Preference, StreamSetting
from .role import ADMIN, DJ, GUEST, PROGRAM_MANAGER, USER_TYPES
from .role import Role
from .service import ServiceRegister
from .user import User, UserManager
from .worker import CeleryTask, ThirdPartyTrackReference

View file

@ -1,11 +1,8 @@
GUEST = "G"
DJ = "H"
PROGRAM_MANAGER = "P"
ADMIN = "A"
from django.db import models
USER_TYPES = {
GUEST: "Guest",
DJ: "DJ",
PROGRAM_MANAGER: "Program Manager",
ADMIN: "Admin",
}
class Role(models.TextChoices):
GUEST = "G", "Guest"
EDITOR = "H", "Editor"
MANAGER = "P", "Manager"
ADMIN = "A", "Admin"

View file

@ -4,18 +4,14 @@ from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, Permis
from django.db import models
from ...permission_constants import GROUPS
from .role import ADMIN, USER_TYPES
USER_TYPE_CHOICES = ()
for item in USER_TYPES.items():
USER_TYPE_CHOICES = USER_TYPE_CHOICES + (item,)
from .role import Role
class UserManager(BaseUserManager):
def create_user(self, username, type, email, first_name, last_name, password):
def create_user(self, role, username, password, email, first_name, last_name):
user = self.model(
role=role,
username=username,
type=type,
email=email,
first_name=first_name,
last_name=last_name,
@ -24,33 +20,75 @@ class UserManager(BaseUserManager):
user.save(using=self._db)
return user
def create_superuser(self, username, email, first_name, last_name, password):
user = self.create_user(username, "A", email, first_name, last_name, password)
return user
def create_superuser(self, username, password, email, first_name, last_name):
return self.create_user(
Role.ADMIN,
username,
password,
email,
first_name,
last_name,
)
def get_by_natural_key(self, username):
return self.get(username=username)
class User(AbstractBaseUser):
role = models.CharField(
db_column="type",
max_length=1,
choices=Role.choices,
)
username = models.CharField(db_column="login", unique=True, max_length=255)
password = models.CharField(
db_column="pass", max_length=255
) # Field renamed because it was a Python reserved word.
type = models.CharField(max_length=1, choices=USER_TYPE_CHOICES)
password = models.CharField(db_column="pass", max_length=255)
email = models.CharField(max_length=1024, blank=True, null=True)
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
last_login = models.DateTimeField(db_column="lastlogin", blank=True, null=True)
lastfail = models.DateTimeField(blank=True, null=True)
skype_contact = models.CharField(max_length=1024, blank=True, null=True)
jabber_contact = models.CharField(max_length=1024, blank=True, null=True)
email = models.CharField(max_length=1024, blank=True, null=True)
cell_phone = models.CharField(max_length=1024, blank=True, null=True)
login_attempts = models.IntegerField(blank=True, null=True)
login_attempts = models.IntegerField(
db_column="login_attempts",
blank=True,
null=True,
)
last_login = models.DateTimeField(
db_column="lastlogin",
blank=True,
null=True,
)
last_failed_login = models.DateTimeField(
db_column="lastfail",
blank=True,
null=True,
)
skype = models.CharField(
db_column="skype_contact",
max_length=1024,
blank=True,
null=True,
)
jabber = models.CharField(
db_column="jabber_contact",
max_length=1024,
blank=True,
null=True,
)
phone = models.CharField(
db_column="cell_phone",
max_length=1024,
blank=True,
null=True,
)
class Meta:
managed = False
db_table = "cc_subjs"
USERNAME_FIELD = "username"
EMAIL_FIELD = "email"
REQUIRED_FIELDS = ["type", "email", "first_name", "last_name"]
REQUIRED_FIELDS = ["role", "email", "first_name", "last_name"]
objects = UserManager()
def get_full_name(self):
@ -66,7 +104,7 @@ class User(AbstractBaseUser):
self.password = hashlib.md5(raw_password.encode()).hexdigest()
def is_staff(self):
return self.type == ADMIN
return self.role == Role.ADMIN
def check_password(self, raw_password):
if self.has_usable_password():
@ -81,7 +119,7 @@ class User(AbstractBaseUser):
# django.contrib.auth.models.PermissionMixin.
def is_superuser(self):
return self.type == ADMIN
return self.role == Role.ADMIN
def get_user_permissions(self, obj=None):
"""
@ -90,7 +128,7 @@ class User(AbstractBaseUser):
return []
def get_group_permissions(self, obj=None):
permissions = GROUPS[self.type]
permissions = GROUPS[self.role]
if obj:
obj_name = obj.__class__.__name__.lower()
permissions = [perm for perm in permissions if obj_name in perm]
@ -120,7 +158,3 @@ class User(AbstractBaseUser):
for permission in perm_list:
result = result and self.has_perm(permission, obj)
return result
class Meta:
managed = False
db_table = "cc_subjs"

View file

@ -7,14 +7,15 @@ class UserSerializer(serializers.HyperlinkedModelSerializer):
model = get_user_model()
fields = [
"item_url",
"role",
"username",
"type",
"email",
"first_name",
"last_name",
"lastfail",
"skype_contact",
"jabber_contact",
"email",
"cell_phone",
"login_attempts",
"last_login",
"last_failed_login",
"skype",
"jabber",
"phone",
]

View file

@ -1,16 +1,16 @@
from rest_framework.test import APITestCase
from ....permission_constants import GROUPS
from ...models import DJ, GUEST, User
from ...models import Role, User
class TestUserManager(APITestCase):
def test_create_user(self):
user = User.objects.create_user(
"test",
email="test@example.com",
role=Role.EDITOR,
username="test",
password="test",
type=DJ,
email="test@example.com",
first_name="test",
last_name="user",
)
@ -19,27 +19,29 @@ class TestUserManager(APITestCase):
def test_create_superuser(self):
user = User.objects.create_superuser(
"test",
email="test@example.com",
username="test",
password="test",
email="test@example.com",
first_name="test",
last_name="user",
)
db_user = User.objects.get(pk=user.pk)
self.assertEqual(db_user.username, user.username)
self.assertEqual(db_user.role, Role.ADMIN)
class TestUser(APITestCase):
def test_guest_get_group_perms(self):
user = User.objects.create_user(
"test",
email="test@example.com",
role=Role.GUEST,
username="test",
password="test",
type=GUEST,
email="test@example.com",
first_name="test",
last_name="user",
)
permissions = user.get_group_permissions()
# APIRoot permission hardcoded in the check as it isn't a Permission object
str_perms = [p.codename for p in permissions] + ["view_apiroot"]
self.assertCountEqual(str_perms, GROUPS[GUEST])
self.assertCountEqual(str_perms, GROUPS[Role.GUEST.value])