aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps/api/models
diff options
context:
space:
mode:
authorGravatar jchristgit <[email protected]>2024-05-23 22:49:34 +0200
committerGravatar GitHub <[email protected]>2024-05-23 21:49:34 +0100
commit089b7f4504c8d1316c5ad97f019735a090848582 (patch)
tree0364567ae31d79b6fd866a6f82cd89bfa4d2178e /pydis_site/apps/api/models
parentMerge pull request #1325 from python-discord/dependabot/pip/ruff-0.4.5 (diff)
Add alternate accounts to the user model
Introduce a way to store alternate accounts on the user, and add the `PATCH /bot/users/<id:str>/alts` endpoint, which allows updating the user's alt accounts to the alt accounts in the request..
Diffstat (limited to 'pydis_site/apps/api/models')
-rw-r--r--pydis_site/apps/api/models/__init__.py3
-rw-r--r--pydis_site/apps/api/models/bot/__init__.py2
-rw-r--r--pydis_site/apps/api/models/bot/user.py51
3 files changed, 53 insertions, 3 deletions
diff --git a/pydis_site/apps/api/models/__init__.py b/pydis_site/apps/api/models/__init__.py
index 5901c978..7ac463b1 100644
--- a/pydis_site/apps/api/models/__init__.py
+++ b/pydis_site/apps/api/models/__init__.py
@@ -19,5 +19,6 @@ from .bot import (
OffTopicChannelName,
Reminder,
Role,
- User
+ User,
+ UserAltRelationship
)
diff --git a/pydis_site/apps/api/models/bot/__init__.py b/pydis_site/apps/api/models/bot/__init__.py
index c07a3238..a17c70ff 100644
--- a/pydis_site/apps/api/models/bot/__init__.py
+++ b/pydis_site/apps/api/models/bot/__init__.py
@@ -16,4 +16,4 @@ from .off_topic_channel_name import OffTopicChannelName
from .offensive_message import OffensiveMessage
from .reminder import Reminder
from .role import Role
-from .user import User
+from .user import User, UserAltRelationship
diff --git a/pydis_site/apps/api/models/bot/user.py b/pydis_site/apps/api/models/bot/user.py
index 1cb10988..4d317b8e 100644
--- a/pydis_site/apps/api/models/bot/user.py
+++ b/pydis_site/apps/api/models/bot/user.py
@@ -4,7 +4,7 @@ from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
from pydis_site.apps.api.models.bot.role import Role
-from pydis_site.apps.api.models.mixins import ModelReprMixin
+from pydis_site.apps.api.models.mixins import ModelReprMixin, ModelTimestampMixin
def _validate_existing_role(value: int) -> None:
@@ -66,6 +66,13 @@ class User(ModelReprMixin, models.Model):
help_text="Whether this user is in our server.",
verbose_name="In Guild"
)
+ alts = models.ManyToManyField(
+ 'self',
+ through='UserAltRelationship',
+ through_fields=('source', 'target'),
+ help_text="Known alternate accounts of this user. Manually linked.",
+ verbose_name="Alternative accounts"
+ )
def __str__(self):
"""Returns the name and discriminator for the current user, for display purposes."""
@@ -91,3 +98,45 @@ class User(ModelReprMixin, models.Model):
For usability in read-only fields such as Django Admin.
"""
return str(self)
+
+
+class UserAltRelationship(ModelReprMixin, ModelTimestampMixin, models.Model):
+ """A relationship between a Discord user and its alts."""
+
+ source = models.ForeignKey(
+ User,
+ on_delete=models.CASCADE,
+ verbose_name="Source",
+ help_text="The source of this user to alternate account relationship",
+ )
+ target = models.ForeignKey(
+ User,
+ on_delete=models.CASCADE,
+ verbose_name="Target",
+ related_name='+',
+ help_text="The target of this user to alternate account relationship",
+ )
+ context = models.TextField(
+ help_text="The reason for why this account was associated as an alt.",
+ max_length=1900
+ )
+ actor = models.ForeignKey(
+ User,
+ on_delete=models.CASCADE,
+ related_name='+',
+ help_text="The moderator that associated these accounts together."
+ )
+
+ class Meta:
+ """Add constraints to prevent users from being an alt of themselves."""
+
+ constraints = [
+ models.UniqueConstraint(
+ name="%(app_label)s_%(class)s_unique_relationships",
+ fields=["source", "target"]
+ ),
+ models.CheckConstraint(
+ name="%(app_label)s_%(class)s_prevent_alt_to_self",
+ check=~models.Q(source=models.F("target")),
+ ),
+ ]