Adds tag slugurl_trans and drop attempts to patch slugurl

- set_language context manager renamed to use_language
- updated docs about tags
This commit is contained in:
Dario Marcelino 2017-12-22 21:58:25 +00:00
parent 4bcd6086e0
commit 2ab997dab5
6 changed files with 55 additions and 39 deletions

View file

@ -11,4 +11,17 @@ Use this template tag to get the url of the current page in another language. Th
.. code-block:: django
{% load wagtail_modeltranslation %}
{% change_lang 'pt' %}
slugurl_trans
===========
Use this template tag as a replacement for `slugurl`.
.. code-block:: django
{% load wagtail_modeltranslation %}
{% slugurl_trans 'default_lang_slug' %}
{# or #}
{% slugurl_trans 'pt_lang_slug' 'pt' %}

View file

@ -19,6 +19,3 @@ class ModeltranslationConfig(AppConfig):
from .patch_wagtailadmin import patch_wagtail_models
patch_wagtail_models()
from .patch_wagtailcore import patch_wagtail_tags
patch_wagtail_tags()

View file

@ -2,12 +2,12 @@ from django.utils.translation import activate
from modeltranslation.utils import get_language
class set_language:
class use_language:
"""
Context manager to safely change language momentarily
Usage:
with set_language('en'):
with use_language('en'):
en_url = obj.get_absolute_url()
"""
def __init__(self, lang):

View file

@ -1,26 +0,0 @@
from wagtail.wagtailcore.models import Page
from wagtail.wagtailcore.templatetags import wagtailcore_tags
from modeltranslation.settings import DEFAULT_LANGUAGE
from .contextlib import set_language
# decorate MigrationAutodetector.changes so we can silently remove wagtailcore changes
def slugurl_decorator(func):
def wrapper(context, slug):
with set_language(DEFAULT_LANGUAGE):
page = Page.objects.filter(slug=slug).first()
if page:
return page.relative_url(context['request'].site)
else:
# default to original function
return func(context, slug)
return wrapper
def patch_wagtail_tags():
# decorate slugurl tag so `{% slugurl 'default_lang_slug' %}` always works with original slug
wagtailcore_tags.slugurl = slugurl_decorator(wagtailcore_tags.slugurl)

View file

@ -5,8 +5,15 @@ import re
from django import template
from django.core.urlresolvers import resolve
from django.utils.translation import activate, get_language
from six import iteritems
from wagtail.wagtailcore.models import Page
from modeltranslation.settings import DEFAULT_LANGUAGE
from wagtail_modeltranslation.contextlib import use_language
register = template.Library()
@ -43,3 +50,24 @@ def change_lang(context, lang=None, *args, **kwargs):
return translated_url
return ''
# Alternative to slugurl which uses chosen or default language for language
@register.simple_tag(takes_context=True)
def slugurl_trans(context, slug, language=None):
"""
Examples:
{% slugurl_trans 'default_lang_slug' %}
{% slugurl_trans 'de_lang_slug' 'de' %}
Returns the URL for the page that has the given slug.
"""
language = language or DEFAULT_LANGUAGE
with use_language(language):
page = Page.objects.filter(slug=slug).first()
if page:
return page.relative_url(context['request'].site)
else:
return None

View file

@ -70,9 +70,8 @@ class WagtailModeltranslationTransactionTestBase(TransactionTestCase):
# Reload the patching class to update the imported translator
# in order to include the newly registered models
from wagtail_modeltranslation import patch_wagtailadmin, patch_wagtailcore
from wagtail_modeltranslation import patch_wagtailadmin
imp.reload(patch_wagtailadmin)
imp.reload(patch_wagtailcore)
# 3. Reset test models (because autodiscover have already run, those models
# have translation fields, but for languages previously defined. We want
@ -355,8 +354,11 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase):
self.assertRaises(ValidationError, child2.clean)
def test_slugurl(self):
from wagtail.wagtailcore.templatetags.wagtailcore_tags import slugurl
def test_slugurl_trans(self):
"""
Assert tag slugurl_trans is immune to user's current language
"""
from wagtail_modeltranslation.templatetags.wagtail_modeltranslation import slugurl_trans
site_pages = {
'model': models.TestRootPage,
'kwargs': {'title': 'root slugurl', },
@ -374,13 +376,15 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase):
setattr(request_mock, 'site', site)
context = {'request': request_mock}
self.assertEqual(slugurl(context, 'root-slugurl'), '/de/')
self.assertEqual(slugurl(context, 'child-slugurl'), '/de/child-slugurl/')
self.assertEqual(slugurl_trans(context, 'root-slugurl'), '/de/')
self.assertEqual(slugurl_trans(context, 'child-slugurl'), '/de/child-slugurl/')
self.assertEqual(slugurl_trans(context, 'child-slugurl-en', 'en'), '/de/child-slugurl/')
trans_real.activate('en')
self.assertEqual(slugurl(context, 'root-slugurl'), '/en/')
self.assertEqual(slugurl(context, 'child-slugurl'), '/en/child-slugurl-en/')
self.assertEqual(slugurl_trans(context, 'root-slugurl'), '/en/')
self.assertEqual(slugurl_trans(context, 'child-slugurl'), '/en/child-slugurl-en/')
self.assertEqual(slugurl_trans(context, 'child-slugurl-en', 'en'), '/en/child-slugurl-en/')
def test_original_slug_update(self):
from wagtail.wagtailcore.models import Page