Skip to content

Commit

Permalink
Merge b43eb70 into 2237710
Browse files Browse the repository at this point in the history
  • Loading branch information
fabiocaccamo committed Apr 6, 2017
2 parents 2237710 + b43eb70 commit 45403c4
Show file tree
Hide file tree
Showing 5 changed files with 133 additions and 18 deletions.
60 changes: 45 additions & 15 deletions autoslug/fields.py
Expand Up @@ -20,15 +20,24 @@
except ImportError:
introspector = lambda self: [], {}

try:
from modeltranslation import utils as modeltranslation_utils
except ImportError:
modeltranslation_utils = None

# this app
from autoslug.settings import slugify, autoslug_modeltranslation_enable
from autoslug import utils

# modeltranslation
modeltranslation_installed = 'modeltranslation' in settings.INSTALLED_APPS

if modeltranslation_installed:
try:
from modeltranslation import utils as modeltranslation_utils
except ImportError:
modeltranslation_utils = None
else:
modeltranslation_utils = None

#modeltranslation_active = autoslug_modeltranslation_enable and modeltranslation_installed and modeltranslation_utils


__all__ = ['AutoSlugField']

SLUG_INDEX_SEPARATOR = '-' # the "-" in "foo-2"
Expand Down Expand Up @@ -296,9 +305,7 @@ def pre_save(self, instance, add):
setattr(instance, self.name, slug)

# modeltranslation support
if 'modeltranslation' in settings.INSTALLED_APPS \
and not hasattr(self.populate_from, '__call__') \
and autoslug_modeltranslation_enable:
if modeltranslation_enable() and not hasattr(self.populate_from, '__call__'):
post_save.connect(modeltranslation_update_slugs, sender=type(instance))

return slug
Expand All @@ -314,13 +321,31 @@ def south_field_triple(self):
return ('autoslug.fields.AutoSlugField', args, kwargs)


def modeltranslation_enable():

#return autoslug_modeltranslation_enable and modeltranslation_installed and modeltranslation_utils

if not autoslug_modeltranslation_enable:
# this happens if settings.AUTOSLUG_MODELTRANSLATION_ENABLE = False
return False

if not modeltranslation_installed:
# this happens if 'modeltranslation' is not listed in settings.INSTALLED_APPS
return False

if not modeltranslation_utils:
# this happens if 'modeltranslation' is listed in settings.INSTALLED_APPS
# but the import of its utils module failed due some package structure changes
return False

return True

def modeltranslation_update_slugs(sender, **kwargs):
# https://bitbucket.org/neithere/django-autoslug/pull-request/11/modeltranslation-support-fix-issue-19/
# https://github.com/neithere/django-autoslug/issues/25
# http://django-modeltranslation.readthedocs.org
#
# TODO: tests
#
if not modeltranslation_utils:

if not modeltranslation_enable():
return

instance = kwargs['instance']
Expand All @@ -346,10 +371,15 @@ def modeltranslation_update_slugs(sender, **kwargs):
continue

populate_from_value = getattr(instance, populate_from_localized)
field_value = getattr(instance, field_name_localized)
field_value_localized = getattr(instance, field_name_localized)

if not populate_from_value:
continue

if not field_value or field.always_update:
if not field_value_localized or field.always_update:
slug = field.slugify(populate_from_value)
slugs[field_name_localized] = slug
setattr(instance, field_name_localized, slug)

sender.objects.filter(pk=instance.pk).update(**slugs)
if len(slugs):
sender.objects.filter(pk=instance.pk).update(**slugs)
7 changes: 7 additions & 0 deletions autoslug/tests/models.py
Expand Up @@ -147,6 +147,13 @@ class ModeltranslationOne(Model):
description = CharField(max_length=255)
slug = AutoSlugField(populate_from='title', always_update=True, unique=True)

class ModeltranslationWithoutSlug(Model):
title = CharField(max_length=255)
slug = AutoSlugField(populate_from='title', always_update=True, unique=True)

class ModeltranslationWithSlug(Model):
title = CharField(max_length=255)
slug = AutoSlugField(populate_from='title', always_update=True, unique=True)

class NonDeletedObjects(Manager):
def get_queryset(self):
Expand Down
56 changes: 56 additions & 0 deletions autoslug/tests/tests.py
Expand Up @@ -17,6 +17,7 @@
# django
from django.db import IntegrityError
from django.test import TestCase
from django.utils import translation

# this package
from .models import *
Expand Down Expand Up @@ -259,3 +260,58 @@ def test_regression_33(self):
"""
a = ModeltranslationOne(title='hello', description='foo')
a.save()

def test_modeltranslation_without_slug_translation_and_single_populate_from(self):
translation.activate('en')
a = ModeltranslationWithoutSlug(title='English Title')
a.save()
translation.activate('ru')
self.assertEqual(a.slug, u'english-title')
translation.activate('en')
self.assertEqual(a.slug, u'english-title')

def test_modeltranslation_without_slug_translation_and_multiple_populate_from(self):
translation.activate('en')
a = ModeltranslationWithoutSlug(title_en='English Title', title_ru='Russian Title')
a.save()
translation.activate('ru')
self.assertEqual(a.slug, u'english-title')
translation.activate('en')
self.assertEqual(a.slug, u'english-title')

def test_modeltranslation_with_slug_translation_and_single_populate_from(self):
translation.activate('en')
a = ModeltranslationWithSlug(title='Initial Title')
a.save()
self.assertEqual(a.slug, 'initial-title')
self.assertEqual(a.slug_en, 'initial-title')
self.assertEqual(a.slug_ru, 'initial-title')
translation.activate('ru')
self.assertEqual(a.slug, 'initial-title')
self.assertEqual(a.slug_en, 'initial-title')
self.assertEqual(a.slug_ru, 'initial-title')
a.title = 'Russian Title'
a.save()
self.assertEqual(a.slug, 'russian-title') #active language value
self.assertEqual(a.slug_en, 'initial-title')
self.assertEqual(a.slug_ru, 'russian-title') #fallback to default language
translation.activate('en')
a.title = 'English Title'
a.save()
self.assertEqual(a.slug, 'english-title')
self.assertEqual(a.slug_en, 'english-title')
self.assertEqual(a.slug_ru, 'russian-title') #fallback to default language

def test_modeltranslation_with_slug_translation_and_multiple_populate_from(self):
translation.activate('en')
a = ModeltranslationWithSlug(title_en='English Title', title_ru='Russian Title')
a.save()
translation.activate('ru')
self.assertEqual(a.slug, 'russian-title')
self.assertEqual(a.slug_en, 'english-title')
self.assertEqual(a.slug_ru, 'russian-title')
translation.activate('en')
self.assertEqual(a.slug, 'english-title')
self.assertEqual(a.slug_en, 'english-title')
self.assertEqual(a.slug_ru, 'russian-title')

20 changes: 18 additions & 2 deletions autoslug/tests/translations.py
@@ -1,11 +1,27 @@
from modeltranslation.translator import translator, TranslationOptions
from .models import ModeltranslationOne
from .models import ModeltranslationOne, ModeltranslationWithoutSlug, ModeltranslationWithSlug


class ModeltranslationOneTranslation(TranslationOptions):
fields = ('title', 'description')
fields = ('title', 'description', )


translator.register(ModeltranslationOne,
ModeltranslationOneTranslation)


class ModeltranslationWithoutSlugTranslation(TranslationOptions):
fields = ('title', )


translator.register(ModeltranslationWithoutSlug,
ModeltranslationWithoutSlugTranslation)


class ModeltranslationWithSlugTranslation(TranslationOptions):
fields = ('title', 'slug', )


translator.register(ModeltranslationWithSlug,
ModeltranslationWithSlugTranslation)

8 changes: 7 additions & 1 deletion run_tests.py
Expand Up @@ -13,21 +13,27 @@
gettext = lambda s: s
conf = dict(
LANGUAGES = (
('ru', gettext('Russian')),
('en', gettext('English')),
('ru', gettext('Russian')),
),
LANGUAGE_CODE = 'en',
USE_I18N = True,
USE_TZ = False,
INSTALLED_APPS = [
'modeltranslation',
'autoslug'
],
MODELTRANSLATION_TRANSLATION_FILES = (
'autoslug.tests.translations',
),
DATABASES = dict(
default = dict(
ENGINE='django.db.backends.sqlite3',
NAME=':memory:',
),
),
AUTOSLUG_SLUGIFY_FUNCTION = 'django.template.defaultfilters.slugify',
AUTOSLUG_MODELTRANSLATION_ENABLE = True,
)


Expand Down

0 comments on commit 45403c4

Please sign in to comment.