diff options
| -rw-r--r-- | api/migrations/0032_botsetting.py | 23 | ||||
| -rw-r--r-- | api/models.py | 15 | ||||
| -rw-r--r-- | api/tests/test_models.py | 16 | ||||
| -rw-r--r-- | api/validators.py | 9 | 
4 files changed, 54 insertions, 9 deletions
| diff --git a/api/migrations/0032_botsetting.py b/api/migrations/0032_botsetting.py new file mode 100644 index 00000000..4ad1323e --- /dev/null +++ b/api/migrations/0032_botsetting.py @@ -0,0 +1,23 @@ +# Generated by Django 2.1.5 on 2019-02-07 19:03 + +import api.models +import django.contrib.postgres.fields.jsonb +from django.db import migrations, models + + +class Migration(migrations.Migration): + +    dependencies = [ +        ('api', '0031_nomination'), +    ] + +    operations = [ +        migrations.CreateModel( +            name='BotSetting', +            fields=[ +                ('name', models.CharField(max_length=50, primary_key=True, serialize=False)), +                ('data', django.contrib.postgres.fields.jsonb.JSONField(help_text='The actual settings of this setting.')), +            ], +            bases=(api.models.ModelReprMixin, models.Model), +        ), +    ] diff --git a/api/models.py b/api/models.py index fa68f31c..86c99f86 100644 --- a/api/models.py +++ b/api/models.py @@ -5,7 +5,7 @@ from django.core.validators import MaxValueValidator, MinValueValidator, RegexVa  from django.db import models  from django.utils import timezone -from .validators import validate_tag_embed +from .validators import validate_bot_setting_name, validate_tag_embed  class ModelReprMixin: @@ -27,6 +27,19 @@ class ModelReprMixin:          return f'<{self.__class__.__name__}({attributes})>' +class BotSetting(ModelReprMixin, models.Model): +    """A configuration entry for the bot.""" + +    name = models.CharField( +        primary_key=True, +        max_length=50, +        validators=(validate_bot_setting_name,) +    ) +    data = pgfields.JSONField( +        help_text="The actual settings of this setting." +    ) + +  class DocumentationLink(ModelReprMixin, models.Model):      """A documentation link used by the `!docs` command of the bot.""" diff --git a/api/tests/test_models.py b/api/tests/test_models.py index a958419d..43d1eb41 100644 --- a/api/tests/test_models.py +++ b/api/tests/test_models.py @@ -3,14 +3,14 @@ from datetime import datetime as dt, timezone  from django.test import SimpleTestCase  from ..models import ( -    DeletedMessage, DocumentationLink, -    Infraction, Message, -    MessageDeletionContext, ModelReprMixin, -    OffTopicChannelName, Reminder, -    Role, SnakeFact, -    SnakeIdiom, SnakeName, -    SpecialSnake, Tag, -    User +    BotSetting, DeletedMessage, +    DocumentationLink, Infraction, +    Message, MessageDeletionContext, +    ModelReprMixin, OffTopicChannelName, +    Reminder, Role, +    SnakeFact, SnakeIdiom, +    SnakeName, SpecialSnake, +    Tag, User  ) diff --git a/api/validators.py b/api/validators.py index 7673c3fe..35bbfab4 100644 --- a/api/validators.py +++ b/api/validators.py @@ -153,3 +153,12 @@ def validate_tag_embed(embed):          if field_name in field_validators:              for validator in field_validators[field_name]:                  validator(value) + + +def validate_bot_setting_name(name): +    KNOWN_SETTINGS = ( +        'defcon', +    ) + +    if name not in KNOWN_SETTINGS: +        raise ValidationError(f"`{name}` is not a known setting name.") | 
