Skip to content

Commit

Permalink
Refactor role model
Browse files Browse the repository at this point in the history
Add unique constraint on name field and validate name field on save and clean methods

Signed-off-by: delano <[email protected]>
  • Loading branch information
delano committed Nov 4, 2023
1 parent bc66958 commit dc4d449
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 9 deletions.
17 changes: 17 additions & 0 deletions apps/api/afbcore/migrations/0002_alter_role_name.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.2.7 on 2023-11-04 00:59

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("afbcore", "0001_initial"),
]

operations = [
migrations.AlterField(
model_name="role",
name="name",
field=models.CharField(max_length=50, unique=True),
),
]
17 changes: 17 additions & 0 deletions apps/api/afbcore/migrations/0003_alter_role_level.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.2.7 on 2023-11-04 01:14

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("afbcore", "0002_alter_role_name"),
]

operations = [
migrations.AlterField(
model_name="role",
name="level",
field=models.PositiveSmallIntegerField(default=0),
),
]
18 changes: 16 additions & 2 deletions apps/api/afbcore/models/users/role.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.db import models
from ..base import BaseAbstractModel, BaseAbstractQuerySet, BaseAbstractModelManager
from django.core.exceptions import ValidationError


class RoleQuerySet(BaseAbstractQuerySet):
Expand All @@ -24,8 +25,21 @@ class Role(BaseAbstractModel):

objects = RoleManager.from_queryset(RoleQuerySet)()

name = models.CharField(max_length=50)
level = models.SmallIntegerField(default=0)
name = models.CharField(max_length=50, unique=True, blank=False, null=False)

level = models.PositiveSmallIntegerField(default=0)

def save(self, *args, **kwargs):
if not self.name:
raise ValueError("Name cannot be empty")
super().save(*args, **kwargs)

def clean(self):
if not self.name:
raise ValidationError("Name cannot be empty")

def __str__(self):
return self.name

def __str__(self):
return self.name
18 changes: 11 additions & 7 deletions apps/api/afbcore/tests/models/test_role.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.test import TestCase
from afbcore.models.users.role import Role
from django.db.utils import IntegrityError

"""
Run these tests with the following command:
Expand All @@ -21,7 +22,7 @@ def test_role_name_max_length(self):

def test_role_level_default_value(self):
role = Role.objects.get(id=self.role.id)
self.assertEqual(role.level, 1)
self.assertEqual(role.level, 90)

def test_role_str_method(self):
role = Role.objects.get(id=self.role.id)
Expand All @@ -32,12 +33,15 @@ def test_role_name_required(self):
Role.objects.create(level=1)

def test_role_level_range(self):
with self.assertRaises(ValueError):
Role.objects.create(name="Test Role", level=-1)

with self.assertRaises(ValueError):
Role.objects.create(name="Test Role", level=100)
Role.objects.create(name="Test Role 2", level=100)
with self.assertRaises(IntegrityError):
Role.objects.create(name="Test Role 1 ", level=-1)

def test_role_name_unique(self):
with self.assertRaises(Exception):
Role.objects.create(name="Test Role 3", level=2)
with self.assertRaises(IntegrityError):
Role.objects.create(name="Test Role 3", level=2)

def test_role_name_not_unique(self):
with self.assertRaises(IntegrityError):
Role.objects.create(name="Test Role", level=2)

0 comments on commit dc4d449

Please sign in to comment.