"""Custom database models & model fields."""
from typing import List
from django.db import models
from . import validators
[docs]class DiscordNameField(models.CharField):
"""A :class:`~django.db.models.CharField` for Discord usernames."""
default_validators = (validators.discord_name_validator,)
def __init__(self, *args, **kwargs):
kwargs['max_length'] = 37
super(DiscordNameField, self).__init__(*args, **kwargs)
[docs]class RedditField(models.CharField):
"""A :class:`~django.db.models.CharField` for Reddit names."""
default_validators = (validators.reddit_name_validator,)
def __init__(self, *args, **kwargs):
kwargs.setdefault('max_length', 21)
super(RedditField, self).__init__(*args, **kwargs)
[docs]class DiscordURLField(models.URLField):
"""A :class:`~django.db.models.CharField` for Discord server URLs."""
default_validators = (validators.discord_server_validator,)
class AliasManager(models.Manager):
"""A :class:`~django.db.models.Manager` for aliases."""
use_for_related_fields = True
def names(self) -> List[str]:
"""
Get the names of the aliases.
:return: The values of the ``alias`` field.
"""
return list(self.get_queryset().values_list('alias', flat=True))
[docs]class AliasField(models.CharField):
"""A :class:`~django.db.models.CharField` for aliases."""
def __init__(self, *args, **kwargs):
kwargs['blank'] = True
kwargs['unique'] = True
kwargs.setdefault('max_length', 100)
super(AliasField, self).__init__(*args, **kwargs)
[docs]class AliasKeyField(models.ForeignKey):
"""A :class:`~django.db.models.ForeignKey` for aliases."""
def __init__(self, *args, **kwargs):
kwargs['related_name'] = 'aliases'
kwargs['on_delete'] = models.CASCADE
super(AliasKeyField, self).__init__(*args, **kwargs)
[docs]class Alias(models.Model):
"""An abstract :class:`~django.db.models.Model` for aliases."""
alias: AliasField
objects = AliasManager()
[docs] def __str__(self) -> str:
"""Return the alias of the instance."""
return self.alias or ''
__all__ = [
'TwitterField', 'DiscordNameField', 'DiscordURLField',
'RedditField', 'AliasField', 'AliasKeyField', 'Alias'
]