Increase max_length on NewsItem.slug. Autogenerate a slug containing the date and slugified title, taking in account of duplicates.

This commit is contained in:
Víðir Valberg Guðmundsson 2016-06-10 19:56:58 +02:00
parent 85d6499667
commit 8b76c4a31a
2 changed files with 47 additions and 1 deletions

View file

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-10 17:43
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('news', '0003_newsitem_slug'),
]
operations = [
migrations.AlterField(
model_name='newsitem',
name='slug',
field=models.SlugField(max_length=255),
),
]

View file

@ -1,6 +1,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models from django.db import models
from django.utils.text import slugify
from utils.models import CreatedUpdatedModel from utils.models import CreatedUpdatedModel
from news.managers import NewsItemQuerySet from news.managers import NewsItemQuerySet
@ -14,9 +15,34 @@ class NewsItem(CreatedUpdatedModel):
content = models.TextField() content = models.TextField()
public = models.BooleanField(default=False) public = models.BooleanField(default=False)
published_at = models.DateTimeField() published_at = models.DateTimeField()
slug = models.SlugField() slug = models.SlugField(max_length=255, blank=True)
def __str__(self): def __str__(self):
return self.title return self.title
def save(self, **kwargs):
if (
not self.pk or
not self.slug or
NewsItem.objects.filter(slug=self.slug).count() > 1
):
published_at_string = self.published_at.strftime('%Y-%m-%d')
base_slug = slugify(self.title)
slug = '{}-{}'.format(published_at_string, base_slug)
incrementer = 1
# We have to make sure that the slug won't clash with current slugs
while NewsItem.objects.filter(slug=slug).exists():
if incrementer == 1:
slug = '{}-1'.format(slug)
else:
slug = '{}-{}'.format(
'-'.join(slug.split('-')[:-1]),
incrementer
)
incrementer += 1
self.slug = slug
super(NewsItem, self).save(**kwargs)
objects = NewsItemQuerySet.as_manager() objects = NewsItemQuerySet.as_manager()