You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
5.9 KiB
172 lines
5.9 KiB
# -*- coding: utf-8 -*-
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
from django.conf import settings
|
|
from django.contrib.auth.models import User
|
|
from django.contrib.sites.models import Site
|
|
from django.db import IntegrityError
|
|
from django.test import RequestFactory, TestCase
|
|
from django.utils.translation import override
|
|
|
|
from cms import api
|
|
from cms.models import Title
|
|
from cms.test_utils.testcases import BaseCMSTestCase
|
|
from cms.utils import get_cms_setting
|
|
from cms.utils.i18n import get_language_list
|
|
|
|
from djangocms_helper.utils import create_user
|
|
|
|
from ..models import Group, Person
|
|
|
|
|
|
class BasePeopleTest(BaseCMSTestCase, TestCase):
|
|
su_username = 'user'
|
|
su_password = 'pass'
|
|
|
|
data = {
|
|
'group1': {
|
|
'en': {'name': 'group1', 'description': 'description1'},
|
|
'de': {'name': 'Gruppe1', 'description': 'Beschreibung1'},
|
|
},
|
|
'group2': {
|
|
# This should *not* have a EN translation
|
|
'de': {'name': 'Gruppe2', 'description': 'Beschreibung2'},
|
|
},
|
|
'person1': {
|
|
'en': {'function': 'function1', 'description': 'description-en'},
|
|
'de': {'function': 'Funktion1', 'description': 'Beschreibung-de'},
|
|
},
|
|
'person2': {
|
|
# This should *not* have a EN translation
|
|
'de': {'function': 'Funktion2', 'description': 'Beschreibung2'},
|
|
},
|
|
}
|
|
|
|
@staticmethod
|
|
def reload(obj, language=None):
|
|
"""Simple convenience method for re-fetching an object from the ORM,
|
|
optionally "as" a specified language."""
|
|
try:
|
|
new_obj = obj.__class__.objects.language(language).get(id=obj.id)
|
|
except:
|
|
new_obj = obj.__class__.objects.get(id=obj.id)
|
|
return new_obj
|
|
|
|
def assertEqualItems(self, a, b):
|
|
try:
|
|
# In Python3, this method has been renamed (poorly)
|
|
return self.assertCountEqual(a, b)
|
|
except:
|
|
# In 2.6, assertItemsEqual() doesn't sort first
|
|
return self.assertItemsEqual(sorted(a), sorted(b))
|
|
|
|
def mktranslation(self, obj, lang, **kwargs):
|
|
"""Simple method of adding a translation to an existing object."""
|
|
try:
|
|
obj.set_current_language(lang)
|
|
except:
|
|
try:
|
|
obj.translate(lang)
|
|
except IntegrityError:
|
|
pass
|
|
for k, v in kwargs.items():
|
|
setattr(obj, k, v)
|
|
obj.save()
|
|
|
|
def setUp(self):
|
|
self.template = get_cms_setting('TEMPLATES')[0][0]
|
|
self.language = settings.LANGUAGES[0][0]
|
|
self.page = api.create_page(
|
|
'page', self.template, self.language, published=True)
|
|
self.placeholder = self.page.placeholders.all()[0]
|
|
self.superuser = self.create_superuser()
|
|
with override('en'):
|
|
self.person1 = Person(**self.data['person1']['en'])
|
|
self.group1 = Group(**self.data['group1']['en'])
|
|
self.person1.name = 'person1'
|
|
self.person1.slug = 'person1-slug'
|
|
self.person1.save()
|
|
self.group1.save()
|
|
|
|
# Add a DE translation for person1, group1
|
|
self.mktranslation(self.person1, 'de', **self.data['person1']['de'])
|
|
self.mktranslation(self.group1, 'de', **self.data['group1']['de'])
|
|
|
|
# Make person2, group2
|
|
with override('de'):
|
|
self.person2 = Person(**self.data['person2']['de'])
|
|
self.group2 = Group(**self.data['group2']['de'])
|
|
self.person2.name = 'person2'
|
|
self.person2.slug = 'person2-slug'
|
|
self.person2.save()
|
|
self.group2.save()
|
|
|
|
def tearDown(self):
|
|
Person.objects.all().delete()
|
|
Group.objects.all().delete()
|
|
|
|
def create_superuser(self):
|
|
return User.objects.create_superuser(
|
|
self.su_username, 'email@example.com', self.su_password)
|
|
|
|
|
|
class CMSRequestBasedTest(TestCase):
|
|
"""Sets-up User(s) and CMS Pages for testing."""
|
|
languages = get_language_list()
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.request_factory = RequestFactory()
|
|
cls.user = create_user('normal', 'normal@admin.com', 'normal')
|
|
cls.site1 = Site.objects.get(pk=1)
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
User.objects.all().delete()
|
|
|
|
def get_or_create_page(self, base_title=None, languages=None):
|
|
"""Creates a page with a given title, or, if it already exists, just
|
|
retrieves and returns it."""
|
|
from cms.api import create_page, create_title
|
|
if not base_title:
|
|
# No title? Create one.
|
|
base_title = self.rand_str(prefix="page", length=8)
|
|
if not languages:
|
|
# If no langs supplied, use'em all
|
|
languages = self.languages
|
|
# If there is already a page with this title, just return it.
|
|
try:
|
|
page_title = Title.objects.get(title=base_title)
|
|
return page_title.page.get_draft_object()
|
|
except:
|
|
pass
|
|
|
|
# No? Okay, create one.
|
|
page = create_page(base_title, 'fullwidth.html', language=languages[0])
|
|
# If there are multiple languages, create the translations
|
|
if len(languages) > 1:
|
|
for lang in languages[1:]:
|
|
title_lang = "{0}-{1}".format(base_title, lang)
|
|
create_title(language=lang, title=title_lang, page=page)
|
|
page.publish(lang)
|
|
return page.get_draft_object()
|
|
|
|
def get_page_request(
|
|
self, page, user, path=None, edit=False, lang_code='en'):
|
|
from cms.middleware.toolbar import ToolbarMiddleware
|
|
path = path or page and page.get_absolute_url()
|
|
if edit:
|
|
path += '?edit'
|
|
request = RequestFactory().get(path)
|
|
request.session = {}
|
|
request.user = user
|
|
request.LANGUAGE_CODE = lang_code
|
|
if edit:
|
|
request.GET = {'edit': None}
|
|
else:
|
|
request.GET = {'edit_off': None}
|
|
request.current_page = page
|
|
mid = ToolbarMiddleware()
|
|
mid.process_request(request)
|
|
return request
|
|
|