Skip to content
This repository has been archived by the owner on Oct 29, 2019. It is now read-only.

Commit

Permalink
Merge pull request #330 from aldryn/issue/fix-language-fallbacks
Browse files Browse the repository at this point in the history
Respect language fallback settings in views, test cases for fallbacks.
  • Loading branch information
Kirill Kniazev committed Dec 30, 2015
2 parents 0006853 + bca1ad8 commit ada9f93
Show file tree
Hide file tree
Showing 8 changed files with 427 additions and 29 deletions.
11 changes: 4 additions & 7 deletions aldryn_newsblog/cms_wizards.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

from django.utils.translation import ugettext_lazy as _
from django import forms
from django.core.urlresolvers import reverse, NoReverseMatch

from cms.api import add_plugin
from cms.utils import permissions
Expand All @@ -18,6 +17,7 @@

from .cms_appconfig import NewsBlogConfig
from .models import Article
from .utils.utilities import is_valid_namespace


def get_published_app_configs():
Expand All @@ -26,13 +26,10 @@ def get_published_app_configs():
"""
published_configs = []
for config in NewsBlogConfig.objects.iterator():
try:
reverse('{0}:article-list'.format(config.namespace))
# We don't want to let people try to create Articles here, as
# they'll just 404 on arrival because the apphook isn't active.
if is_valid_namespace(config.namespace):
published_configs.append(config)
except NoReverseMatch:
# We don't want to let people try to create Articles here, as
# they'll just 404 on arrival because the apphook isn't active.
pass
return published_configs


Expand Down
22 changes: 16 additions & 6 deletions aldryn_newsblog/feeds.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,30 @@

from django.contrib.sites.models import Site
from django.contrib.syndication.views import Feed
try:
from django.contrib.sites.shortcuts import get_current_site
except ImportError:
# Django 1.6
from django.contrib.sites.models import get_current_site
from django.core.urlresolvers import reverse
from django.utils.translation import get_language_from_request, ugettext as _

from aldryn_apphooks_config.utils import get_app_instance
from aldryn_categories.models import Category
from aldryn_newsblog.models import Article
from cms.utils.i18n import get_current_language
from aldryn_newsblog.utils.utilities import get_valid_languages


class LatestArticlesFeed(Feed):

def __call__(self, request, *args, **kwargs):
self.namespace, self.config = get_app_instance(request)
language = get_language_from_request(request)
site_id = getattr(get_current_site(request), 'id', None)
self.valid_languages = get_valid_languages(
self.namespace,
language_code=language,
site_id=site_id)
return super(LatestArticlesFeed, self).__call__(
request, *args, **kwargs)

Expand All @@ -25,10 +36,9 @@ def title(self):
return _('Articles on {0}').format(Site.objects.get_current().name)

def get_queryset(self):
language = get_current_language()
return Article.objects.published().active_translations(
language
).namespace(self.namespace)
qs = Article.objects.published().namespace(self.namespace).translated(
*self.valid_languages)
return qs

def items(self, obj):
qs = self.get_queryset()
Expand Down Expand Up @@ -58,7 +68,7 @@ class CategoryFeed(LatestArticlesFeed):
def get_object(self, request, category):
language = get_language_from_request(request, check_path=True)
return Category.objects.language(language).translated(
slug=category).get()
*self.valid_languages, slug=category).get()

def items(self, obj):
return self.get_queryset().filter(categories=obj)[:10]
112 changes: 110 additions & 2 deletions aldryn_newsblog/tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,23 @@
import os
import random
import string
import sys

from django.conf import settings
from django.contrib.auth.models import User
from django.core.urlresolvers import clear_url_caches
from django.core.cache import cache
from django.utils.timezone import now
from django.utils.translation import override
from aldryn_categories.models import Category
from aldryn_newsblog.cms_app import NewsBlogApp
from aldryn_newsblog.models import Article, NewsBlogConfig
from aldryn_people.models import Person
from aldryn_search.helpers import get_request
from cms import api
from cms.apphook_pool import apphook_pool
from cms.appresolver import clear_app_resolvers
from cms.exceptions import AppAlreadyRegistered
from cms.test_utils.testcases import CMSTestCase, TransactionCMSTestCase
from cms.utils import get_cms_setting
from parler.utils.context import switch_language
Expand Down Expand Up @@ -181,9 +188,110 @@ def setUp(self):
page.publish(language)


class NewsBlogTestCase(NewsBlogTestsMixin, CMSTestCase):
class CleanUpMixin(object):
apphook_object = None

def tearDown(self):
"""
Do a proper cleanup, delete everything what is preventing us from
clean environment for tests.
:return: None
"""
self.app_config.delete()
self.reset_all()
cache.clear()
super(CleanUpMixin, self).tearDown()

def get_apphook_object(self):
return self.apphook_object

def reset_apphook_cmsapp(self, apphook_object=None):
"""
For tests that should not be polluted by previous setup we need to
ensure that app hooks are reloaded properly. One of the steps is to
reset the relation between EventListAppHook and EventsConfig
"""
if apphook_object is None:
apphook_object = self.get_apphook_object()
app_config = getattr(apphook_object, 'app_config', None)
if (app_config and
getattr(app_config, 'cmsapp', None)):
delattr(apphook_object.app_config, 'cmsapp')
if getattr(app_config, 'cmsapp', None):
delattr(app_config, 'cmsapp')

def reset_all(self):
"""
Reset all that could leak from previous test to current/next test.
:return: None
"""
apphook_object = self.get_apphook_object()
self.delete_app_module(apphook_object.__module__)
self.reload_urls(apphook_object)
self.apphook_clear()

def delete_app_module(self, app_module=None):
"""
Remove APP_MODULE from sys.modules. Taken from cms.
:return: None
"""
if app_module is None:
apphook_object = self.get_apphook_object()
app_module = apphook_object.__module__
if app_module in sys.modules:
del sys.modules[app_module]

def apphook_clear(self):
"""
Clean up apphook_pool and sys.modules. Taken from cms with slight
adjustments and fixes.
:return: None
"""
try:
apphooks = apphook_pool.get_apphooks()
except AppAlreadyRegistered:
# there is an issue with discover apps, or i'm using it wrong.
# setting discovered to True solves it. Maybe that is due to import
# from aldryn_events.cms_app which registers EventListAppHook
apphook_pool.discovered = True
apphooks = apphook_pool.get_apphooks()

for name, label in list(apphooks):
if apphook_pool.apps[name].__class__.__module__ in sys.modules:
del sys.modules[apphook_pool.apps[name].__class__.__module__]
apphook_pool.clear()
self.reset_apphook_cmsapp()

def reload_urls(self, apphook_object=None):
"""
Clean up url related things (caches, app resolvers, modules).
Taken from cms.
:return: None
"""
if apphook_object is None:
apphook_object = self.get_apphook_object()
app_module = apphook_object.__module__
package = app_module.split('.')[0]
clear_app_resolvers()
clear_url_caches()
url_modules = [
'cms.urls',
'{0}.urls'.format(package),
settings.ROOT_URLCONF
]

for module in url_modules:
if module in sys.modules:
del sys.modules[module]


class NewsBlogTestCase(CleanUpMixin, NewsBlogTestsMixin, CMSTestCase):
apphook_object = NewsBlogApp
pass


class NewsBlogTransactionTestCase(NewsBlogTestsMixin, TransactionCMSTestCase):
class NewsBlogTransactionTestCase(CleanUpMixin,
NewsBlogTestsMixin,
TransactionCMSTestCase):
apphook_object = NewsBlogApp
pass

0 comments on commit ada9f93

Please sign in to comment.