aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pydis_site/apps/api/migrations/0069_documentationlink_packagename_validator.py19
-rw-r--r--pydis_site/apps/api/models/bot/documentation_link.py9
-rw-r--r--pydis_site/apps/api/tests/test_documentation_links.py11
3 files changed, 39 insertions, 0 deletions
diff --git a/pydis_site/apps/api/migrations/0069_documentationlink_packagename_validator.py b/pydis_site/apps/api/migrations/0069_documentationlink_packagename_validator.py
new file mode 100644
index 00000000..4234e633
--- /dev/null
+++ b/pydis_site/apps/api/migrations/0069_documentationlink_packagename_validator.py
@@ -0,0 +1,19 @@
+# Generated by Django 3.0.11 on 2021-03-14 23:22
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0068_split_nomination_tables'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='documentationlink',
+ name='package',
+ field=models.CharField(help_text='The Python package name that this documentation link belongs to.', max_length=50, primary_key=True, serialize=False, validators=[django.core.validators.RegexValidator(message='Package names can only consist of lowercase a-z letters, digits, and underscores.', regex='^[a-z0-9_]+$')]),
+ ),
+ ]
diff --git a/pydis_site/apps/api/models/bot/documentation_link.py b/pydis_site/apps/api/models/bot/documentation_link.py
index 2a0ce751..529d26d1 100644
--- a/pydis_site/apps/api/models/bot/documentation_link.py
+++ b/pydis_site/apps/api/models/bot/documentation_link.py
@@ -1,7 +1,15 @@
+from django.core.validators import RegexValidator
from django.db import models
from pydis_site.apps.api.models.mixins import ModelReprMixin
+package_name_validator = (
+ RegexValidator(
+ regex=r"^[a-z0-9_]+$",
+ message="Package names can only consist of lowercase a-z letters, digits, and underscores."
+ ),
+)
+
class DocumentationLink(ModelReprMixin, models.Model):
"""A documentation link used by the `!docs` command of the bot."""
@@ -9,6 +17,7 @@ class DocumentationLink(ModelReprMixin, models.Model):
package = models.CharField(
primary_key=True,
max_length=50,
+ validators=package_name_validator,
help_text="The Python package name that this documentation link belongs to."
)
base_url = models.URLField(
diff --git a/pydis_site/apps/api/tests/test_documentation_links.py b/pydis_site/apps/api/tests/test_documentation_links.py
index e560a2fd..72e5cadb 100644
--- a/pydis_site/apps/api/tests/test_documentation_links.py
+++ b/pydis_site/apps/api/tests/test_documentation_links.py
@@ -108,6 +108,17 @@ class DetailLookupDocumentationLinkAPITests(APISubdomainTestCase):
self.assertEqual(response.status_code, 400)
+ def test_create_invalid_package_name_returns_400(self):
+ test_cases = ("InvalidPackage", "invalid package", "i\u0150valid")
+ for case in test_cases:
+ with self.subTest(package_name=case):
+ body = self.doc_json.copy()
+ body['package'] = case
+ url = reverse('bot:documentationlink-list', host='api')
+ response = self.client.post(url, data=body)
+
+ self.assertEqual(response.status_code, 400)
+
class DocumentationLinkCreationTests(APISubdomainTestCase):
def setUp(self):