diff options
| -rw-r--r-- | pydis_site/apps/api/models/bot/user.py | 31 | 
1 files changed, 26 insertions, 5 deletions
| diff --git a/pydis_site/apps/api/models/bot/user.py b/pydis_site/apps/api/models/bot/user.py index 65e8751e..cc4e7873 100644 --- a/pydis_site/apps/api/models/bot/user.py +++ b/pydis_site/apps/api/models/bot/user.py @@ -1,10 +1,22 @@ +from django.contrib.postgres.fields import ArrayField  from django.core.validators import MaxValueValidator, MinValueValidator +from django.core.exceptions import ValidationError  from django.db import models  from pydis_site.apps.api.models.bot.role import Role  from pydis_site.apps.api.models.utils import ModelReprMixin +def _validate_existing_role(value: int) -> None: +    """Validate that a role exists when given in to the user model.""" +    role = Role.objects.filter(id=value) + +    if not role: +        raise ValidationError( +            f"Role with ID {value} does not exist" +        ) + +  class User(ModelReprMixin, models.Model):      """A Discord user.""" @@ -31,9 +43,18 @@ class User(ModelReprMixin, models.Model):          ),          help_text="The discriminator of this user, taken from Discord."      ) -    roles = models.ManyToManyField( -        Role, -        help_text="Any roles this user has on our server." +    roles = ArrayField( +        models.BigIntegerField( +            validators=( +                MinValueValidator( +                    limit_value=0, +                    message="Role IDs cannot be negative." +                ), +                _validate_existing_role +            ) +        ), +        default=list, +        help_text="IDs of roles the user has on the server"      )      in_guild = models.BooleanField(          default=True, @@ -51,7 +72,7 @@ class User(ModelReprMixin, models.Model):          This will fall back to the Developers role if the user does not have any roles.          """ -        roles = self.roles.all() +        roles = Role.objects.filter(id__in=self.roles)          if not roles:              return Role.objects.get(name="Developers") -        return max(self.roles.all()) +        return max(roles) | 
