4 Commits
v2.9 ... v2.9.2

Author SHA1 Message Date
Swen Kooij
b9a4d3be2c Bump version number to 2.9.2 2017-02-16 10:20:09 +02:00
Swen Kooij
6d7a937eac Don't regenerate slug if not needed 2017-02-16 10:13:10 +02:00
Swen Kooij
2e9b83e49b Bump version to 2.9.1 2017-02-16 09:36:34 +02:00
Swen Kooij
679dcafef6 Pop kwargs after calling super constructor 2017-02-16 09:36:26 +02:00
3 changed files with 49 additions and 8 deletions

View File

@@ -1,3 +1,5 @@
from datetime import datetime
from django.conf import settings from django.conf import settings
from django.utils.text import slugify from django.utils.text import slugify
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
@@ -7,8 +9,6 @@ from ..mixins import AtomicSlugRetryMixin
from ..localized_value import LocalizedValue from ..localized_value import LocalizedValue
from .localized_autoslug_field import LocalizedAutoSlugField from .localized_autoslug_field import LocalizedAutoSlugField
from datetime import datetime
class LocalizedUniqueSlugField(LocalizedAutoSlugField): class LocalizedUniqueSlugField(LocalizedAutoSlugField):
"""Automatically provides slugs for a localized """Automatically provides slugs for a localized
@@ -30,14 +30,13 @@ class LocalizedUniqueSlugField(LocalizedAutoSlugField):
kwargs['uniqueness'] = kwargs.pop('uniqueness', get_language_codes()) kwargs['uniqueness'] = kwargs.pop('uniqueness', get_language_codes())
self.include_time = kwargs.pop('include_time', False)
super(LocalizedUniqueSlugField, self).__init__( super(LocalizedUniqueSlugField, self).__init__(
*args, *args,
**kwargs **kwargs
) )
self.populate_from = kwargs.pop('populate_from') self.populate_from = kwargs.pop('populate_from')
self.include_time = kwargs.pop('include_time', False)
def deconstruct(self): def deconstruct(self):
"""Deconstructs the field into something the database """Deconstructs the field into something the database
@@ -85,11 +84,25 @@ class LocalizedUniqueSlugField(LocalizedAutoSlugField):
continue continue
slug = slugify(value, allow_unicode=True) slug = slugify(value, allow_unicode=True)
# verify whether it's needed to re-generate a slug,
# if not, re-use the same slug
if instance.pk is not None:
current_slug = getattr(instance, self.name).get(lang_code)
if current_slug is not None:
stripped_slug = current_slug[0:current_slug.rfind('-')]
if slug == stripped_slug:
slugs.set(lang_code, current_slug)
continue
if self.include_time: if self.include_time:
slug += '-%d' % datetime.now().microsecond slug += '-%d' % datetime.now().microsecond
if instance.retries > 0: if instance.retries > 0:
slug += '-%d' % instance.retries # do not add another - if we already added time
if not self.include_time:
slug += '-'
slug += '%d' % instance.retries
slugs.set(lang_code, slug) slugs.set(lang_code, slug)

View File

@@ -7,7 +7,7 @@ with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme:
setup( setup(
name='django-localized-fields', name='django-localized-fields',
version='2.9', version='2.9.2',
packages=find_packages(), packages=find_packages(),
include_package_data=True, include_package_data=True,
license='MIT License', license='MIT License',

View File

@@ -1,11 +1,12 @@
import copy
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.test import TestCase from django.test import TestCase
from django.db.utils import IntegrityError from django.db.utils import IntegrityError
from django.utils.text import slugify
from localized_fields import (LocalizedField, LocalizedAutoSlugField, from localized_fields import (LocalizedField, LocalizedAutoSlugField,
LocalizedUniqueSlugField) LocalizedUniqueSlugField)
from django.utils.text import slugify
from .fake_model import get_fake_model from .fake_model import get_fake_model
@@ -83,6 +84,33 @@ class LocalizedSlugFieldTestCase(TestCase):
assert obj.slug.en.startswith('%s-' % title) assert obj.slug.en.startswith('%s-' % title)
@classmethod
def test_uniue_slug_no_change(cls):
"""Tests whether slugs are not re-generated if not needed."""
NoChangeSlugModel = get_fake_model(
'NoChangeSlugModel',
{
'title': LocalizedField(),
'slug': LocalizedUniqueSlugField(populate_from='title', include_time=True)
}
)
title = 'myuniquetitle'
obj = NoChangeSlugModel()
obj.title.en = title
obj.title.nl = title
obj.save()
old_slug_en = copy.deepcopy(obj.slug.en)
old_slug_nl = copy.deepcopy(obj.slug.nl)
obj.title.nl += 'beer'
obj.save()
assert old_slug_en == obj.slug.en
assert old_slug_nl != obj.slug.nl
def test_unique_slug_unique_max_retries(self): def test_unique_slug_unique_max_retries(self):
"""Tests whether the unique slug implementation doesn't """Tests whether the unique slug implementation doesn't
try to find a slug forever and gives up after a while.""" try to find a slug forever and gives up after a while."""