Source code for MangAdventure.models

"""Custom database models & model fields."""

from typing import List

from django.db import models

from . import validators


[docs]class TwitterField(models.CharField): """A :class:`~django.db.models.CharField` for Twitter usernames.""" default_validators = (validators.twitter_name_validator,) def __init__(self, *args, **kwargs): kwargs['max_length'] = 15 super(TwitterField, self).__init__(*args, **kwargs)
[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] class Meta: abstract = True verbose_name = 'alias' verbose_name_plural = 'aliases'
[docs] def __str__(self) -> str: """Return the alias of the instance.""" return self.alias or ''
__all__ = [ 'TwitterField', 'DiscordNameField', 'DiscordURLField', 'RedditField', 'AliasField', 'AliasKeyField', 'Alias' ]