From 8b76c4a31a0ea277728cbe68a50382fbb0d5a9cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=AD=C3=B0ir=20Valberg=20Gu=C3=B0mundsson?= Date: Fri, 10 Jun 2016 19:56:58 +0200 Subject: [PATCH] Increase max_length on NewsItem.slug. Autogenerate a slug containing the date and slugified title, taking in account of duplicates. --- news/migrations/0004_auto_20160610_1743.py | 20 ++++++++++++++++ news/models.py | 28 +++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 news/migrations/0004_auto_20160610_1743.py diff --git a/news/migrations/0004_auto_20160610_1743.py b/news/migrations/0004_auto_20160610_1743.py new file mode 100644 index 00000000..48ec0768 --- /dev/null +++ b/news/migrations/0004_auto_20160610_1743.py @@ -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), + ), + ] diff --git a/news/models.py b/news/models.py index 2e4b7d9e..508a1e3e 100644 --- a/news/models.py +++ b/news/models.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals from django.db import models +from django.utils.text import slugify from utils.models import CreatedUpdatedModel from news.managers import NewsItemQuerySet @@ -14,9 +15,34 @@ class NewsItem(CreatedUpdatedModel): content = models.TextField() public = models.BooleanField(default=False) published_at = models.DateTimeField() - slug = models.SlugField() + slug = models.SlugField(max_length=255, blank=True) def __str__(self): 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()