diff --git a/readthedocs/projects/migrations/0030_change-max-length-project-slug.py b/readthedocs/projects/migrations/0030_change-max-length-project-slug.py new file mode 100644 index 00000000000..a166a50fca6 --- /dev/null +++ b/readthedocs/projects/migrations/0030_change-max-length-project-slug.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2018-11-01 20:55 +from __future__ import unicode_literals + +from django.db import migrations, models +from django.db.models.functions import Length + + +def forwards_func(apps, schema_editor): + max_length = 63 + Project = apps.get_model('projects', 'Project') + projects_invalid_slug = ( + Project + .objects + .annotate(slug_length=Length('slug')) + .filter(slug_length__gt=max_length) + ) + for project in projects_invalid_slug: + project.slug = project.slug[:max_length] + project.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0029_add_additional_languages'), + ] + + operations = [ + migrations.RunPython(forwards_func), + migrations.AlterField( + model_name='project', + name='slug', + field=models.SlugField(max_length=63, unique=True, verbose_name='Slug'), + ), + ] diff --git a/readthedocs/projects/models.py b/readthedocs/projects/models.py index 9d5c3855f35..ca96ae1de3b 100644 --- a/readthedocs/projects/models.py +++ b/readthedocs/projects/models.py @@ -81,7 +81,8 @@ class Project(models.Model): users = models.ManyToManyField(User, verbose_name=_('User'), related_name='projects') name = models.CharField(_('Name'), max_length=255) - slug = models.SlugField(_('Slug'), max_length=255, unique=True) + # A DNS label can contain up to 63 characters. + slug = models.SlugField(_('Slug'), max_length=63, unique=True) description = models.TextField(_('Description'), blank=True, help_text=_('The reStructuredText ' 'description of the project'))