diff options
author | 2020-06-05 12:52:13 +0100 | |
---|---|---|
committer | 2020-06-05 12:52:13 +0100 | |
commit | 386bae54dfa3b674522315ad44e9d56f0db89588 (patch) | |
tree | 052f45522f809b7dd2ff38a0ce004a3229214868 /pydis_site/apps/api/models | |
parent | Update navbar for Code Jam 7 (diff) | |
parent | Remove very generous newline in role validator (diff) |
Merge pull request #357 from python-discord/joseph/change-roles-field-to-postgres-array
Change roles field on user model to Postgres array
Diffstat (limited to 'pydis_site/apps/api/models')
-rw-r--r-- | pydis_site/apps/api/models/bot/user.py | 29 |
1 files changed, 24 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..bff4d642 100644 --- a/pydis_site/apps/api/models/bot/user.py +++ b/pydis_site/apps/api/models/bot/user.py @@ -1,3 +1,5 @@ +from django.contrib.postgres.fields import ArrayField +from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models @@ -5,6 +7,14 @@ 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 +41,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 +70,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) |