def test_include_urlconf(self): self.create_base_structure(APP_NAME, 'en') path = reverse('extra_second') response = self.client.get(path) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'sampleapp/extra.html') self.assertContains(response, "test included urlconf") path = reverse('extra_first') response = self.client.get(path) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'sampleapp/extra.html') self.assertContains(response, "test urlconf") with force_language("de"): path = reverse('extra_first') response = self.client.get(path) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'sampleapp/extra.html') self.assertContains(response, "test urlconf") with force_language("de"): path = reverse('extra_second') response = self.client.get(path) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'sampleapp/extra.html') self.assertContains(response, "test included urlconf") self.apphook_clear()
def test_get_page_for_apphook(self): en_title, de_title = self.create_base_structure(APP_NAME, ['en', 'de']) with force_language("en"): path = reverse('sample-settings') request = self.get_request(path) request.LANGUAGE_CODE = 'en' attached_to_page = applications_page_check(request, path=path[1:]) # strip leading slash self.assertEqual(attached_to_page.pk, en_title.page.pk) response = self.client.get(path) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'sampleapp/home.html') self.assertContains(response, en_title.title) with force_language("de"): path = reverse('sample-settings') request = self.get_request(path) request.LANGUAGE_CODE = 'de' attached_to_page = applications_page_check(request, path=path[1:]) # strip leading slash and language prefix self.assertEqual(attached_to_page.pk, de_title.page.pk) response = self.client.get(path) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'sampleapp/home.html') self.assertContains(response, de_title.title) self.apphook_clear()
def test_get_apps(self): """ Check that urlconf are dynamically loaded according to the different page the apphook is attached to """ titles = self.create_base_structure('VariableUrlsApp', ['en', 'de']) titles[0].page.reverse_id = 'page1' titles[0].page.save() self.reload_urls() # only one urlconf is configured given that only one page is created with force_language('de'): reverse('extra_first') with self.assertRaises(NoReverseMatch): reverse('sample2-root') self.reload_urls() self.apphook_clear() page2 = create_page('page2', 'nav_playground.html', 'en', created_by=self.superuser, published=True, parent=titles[0].page.get_parent_page().get_draft_object(), apphook='VariableUrlsApp', reverse_id='page2') create_title('de', 'de_title', page2, slug='slug') page2.publish('de') self.reload_urls() with force_language('de'): reverse('sample2-root') reverse('extra_first') self.apphook_clear()
def test_get_page_for_apphook_on_preview_or_edit(self): if get_user_model().USERNAME_FIELD == 'email': superuser = get_user_model().objects.create_superuser('admin', '*****@*****.**', '*****@*****.**') else: superuser = get_user_model().objects.create_superuser('admin', '*****@*****.**', 'admin') page = create_page("home", "nav_playground.html", "en", created_by=superuser, published=True, apphook=APP_NAME) create_title('de', page.get_title(), page) page.publish('en') page.publish('de') page.save() # Needed because publish button only shows if the page is dirty page.set_publisher_state('en', state=PUBLISHER_STATE_DIRTY) public_page = page.get_public_object() with self.login_user_context(superuser): with force_language("en"): path = reverse('sample-settings') request = self.get_request(path + '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON')) request.LANGUAGE_CODE = 'en' attached_to_page = applications_page_check(request, path=path[1:]) # strip leading slash response = self.client.get(path+"?edit") self.assertContains(response, '?redirect=') with force_language("de"): path = reverse('sample-settings') request = self.get_request(path + '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON')) request.LANGUAGE_CODE = 'de' attached_to_page = applications_page_check(request, path=path[1:]) # strip leading slash self.assertEqual(attached_to_page.pk, public_page.pk)
def test_switch_moderator_on(self): site = get_current_site() with force_language("en"): pages_root = unquote(reverse("pages-root")) page1 = create_page('page', 'nav_playground.html', 'en', published=True) with disable_logger(log): call_command('cms', 'moderator', 'on') with force_language("en"): path = page1.get_absolute_url()[len(pages_root):].strip('/') page2 = get_page_from_path(site, path) self.assertEqual(page1.get_absolute_url(), page2.get_absolute_url())
def test_get_page_choices_with_multiple_translations(self): site = get_current_site() pages = [ create_page("0001", "nav_playground.html", "en"), create_page("0002", "nav_playground.html", "en"), create_page("0003", "nav_playground.html", "en"), create_page("0004", "nav_playground.html", "en"), ] languages = ['de', 'fr'] for page in pages: for language in languages: title = page.get_title('en') create_title(language, title, page=page) for language in ['en'] + languages: expected = [ ('', '----'), (site.name, [ (page.pk, page.get_title(language, fallback=False)) for page in pages ]) ] with force_language(language): self.assertSequenceEqual(get_page_choices(), expected)
def render(self): self.populate() self.post_template_populate() context = self.get_render_context() with force_language(self.toolbar_language): return render_to_string('cms/toolbar/toolbar.html', context, request=self.request)
def get_object_public_url(self): if self.obj: with force_language(self.request_language): try: return self.obj.get_public_url() except: pass return ''
def test_switch_moderator_off(self): site = get_current_site() with force_language("en"): pages_root = unquote(reverse("pages-root")) page1 = create_page('page', 'nav_playground.html', 'en', published=True) path = page1.get_absolute_url()[len(pages_root):].strip('/') page2 = get_page_from_path(site, path) self.assertIsNotNone(page2) self.assertEqual(page1.get_absolute_url(), page2.get_absolute_url())
def in_apphook(self): with force_language(self.toolbar.request_language): try: resolver = resolve(self.toolbar.request_path) except Resolver404: return False else: from cms.views import details return resolver.func != details
def test_apphook_include_extra_parameters(self): self.create_base_structure(NS_APP_NAME, ['en', 'de'], 'instance_1') with force_language("en"): path = reverse('namespaced_app_ns:extra_second') request = self.get_request(path) request.LANGUAGE_CODE = 'en' response = self.client.get(path) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'sampleapp/extra.html') self.assertContains(response, 'someopts')
def handle_old_url_exception(self, error): match = resolve(error.new_url_format) kwargs = match.kwargs kwargs['pk'] = self.kwargs['pk'] url_name = '{0}:faq-answer'.format(match.namespace) with force_language(self.current_language): new_url_format = reverse(url_name, kwargs=kwargs) return HttpResponsePermanentRedirect(new_url_format)
def update_translation(self, language, data): with force_language(language): # write to the db. # we bypass save() because saving a translation # should be very transparent. # So we avoid the save() method and signals. (self.__class__._default_manager.filter(pk=self.pk).update(**data)) # update the current instance self.translate(language, **data)
def render_with_structure(self, context, nodelist): self.populate() context.update(self.get_render_context()) with force_language(self.toolbar_language): # needed to populate the context with sekizai content render_to_string('cms/toolbar/toolbar_javascript.html', flatten_context(context)) # render everything below the tag rendered_contents = nodelist.render(context) self.post_template_populate() with force_language(self.toolbar_language): # render the toolbar content toolbar = render_to_string('cms/toolbar/toolbar_with_structure.html', flatten_context(context)) # return the toolbar content and the content below return '%s\n%s' % (toolbar, rendered_contents)
def test_apphook_csrf_exempt_endpoint(self): self.create_base_structure(NS_APP_NAME, 'en', 'instance_ns') client = self.client_class(enforce_csrf_checks=True) with force_language("en"): path = reverse('namespaced_app_ns:sample-exempt') response = client.post(path) # Assert our POST request went through self.assertEqual(response.status_code, 200) with force_language("en"): path = reverse('namespaced_app_ns:sample-account') response = client.post(path) # Assert our POST request did not go through self.assertEqual(response.status_code, 403)
def test_toolbar_current_app_namespace(self): self.create_base_structure(NS_APP_NAME, 'en', 'instance_ns') with force_language("en"): path = reverse('namespaced_app_ns:sample-settings') request = self.get_request(path) toolbar = CMSToolbar(request) self.assertTrue(toolbar.toolbars['cms.test_utils.project.sampleapp.cms_toolbars.CategoryToolbar'].is_current_app) self.assertFalse(toolbar.toolbars['cms.test_utils.project.extensionapp.cms_toolbars.MyTitleExtensionToolbar'].is_current_app) # Testing a decorated view with force_language("en"): path = reverse('namespaced_app_ns:sample-exempt') request = self.get_request(path) toolbar = CMSToolbar(request) self.assertEqual(toolbar.toolbars['cms.test_utils.project.sampleapp.cms_toolbars.CategoryToolbar'].app_path, 'cms.test_utils.project.sampleapp') self.assertTrue(toolbar.toolbars['cms.test_utils.project.sampleapp.cms_toolbars.CategoryToolbar'].is_current_app) self.assertEqual(toolbar.toolbars['cms.test_utils.project.extensionapp.cms_toolbars.MyTitleExtensionToolbar'].app_path, 'cms.test_utils.project.sampleapp') self.assertFalse(toolbar.toolbars['cms.test_utils.project.extensionapp.cms_toolbars.MyTitleExtensionToolbar'].is_current_app)
def get_object_draft_url(self): if self.obj: with force_language(self.request_language): try: return self.obj.get_draft_url() except: try: return self.obj.get_absolute_url() except: pass return ''
def test_publish_wrong_lang(self): page = self.create_page("test_admin", published=False) superuser = self.get_superuser() with self.settings( LANGUAGES=(('de', 'de'), ('en', 'en')), CMS_LANGUAGES={1: [{'code': 'en', 'name': 'en', 'fallbacks': ['fr', 'de'], 'public': True}]} ): with self.login_user_context(superuser): with force_language('de'): response = self.client.post(admin_reverse("cms_page_publish_page", args=[page.pk, 'en'])) self.assertEqual(response.status_code, 302) page = Page.objects.get(pk=page.pk)
def get_on_delete_redirect_url(self): language = self.current_lang parent_page = self.page.parent_page if self.page else None # if the current page has a parent in the request's current language redirect to it if parent_page and language in parent_page.get_languages(): with force_language(language): return parent_page.get_absolute_url(language=language) # else redirect to root, do not redirect to Page.objects.get_home() because user could have deleted the last # page, if DEBUG == False this could cause a 404 return reverse('pages-root')
def test_toolbar_current_app_apphook_with_implicit_current_app(self): self.create_base_structure(NS_APP_NAME, 'en', 'namespaced_app_ns') with force_language("en"): path = reverse('namespaced_app_ns:current-app') request = self.get_request(path) toolbar = CMSToolbar(request) self.assertEqual(toolbar.toolbars['cms.test_utils.project.sampleapp.cms_toolbars.CategoryToolbar'].app_path, 'cms.test_utils.project.sampleapp') self.assertTrue(toolbar.toolbars['cms.test_utils.project.sampleapp.cms_toolbars.CategoryToolbar'].is_current_app) self.assertEqual(toolbar.toolbars['cms.test_utils.project.extensionapp.cms_toolbars.MyTitleExtensionToolbar'].app_path, 'cms.test_utils.project.sampleapp') self.assertFalse(toolbar.toolbars['cms.test_utils.project.extensionapp.cms_toolbars.MyTitleExtensionToolbar'].is_current_app)
def test_apphook_breaking_under_home_with_new_path_caching(self): home = self.create_homepage("home", "nav_playground.html", "en", published=True) child = create_page("child", "nav_playground.html", "en", published=True, parent=home) # not-home is what breaks stuff, because it contains the slug of the home page not_home = create_page("not-home", "nav_playground.html", "en", published=True, parent=child) create_page("subchild", "nav_playground.html", "en", published=True, parent=not_home, apphook='SampleApp') with force_language("en"): self.reload_urls() urlpatterns = get_app_patterns() resolver = urlpatterns[0] url = resolver.reverse('sample-root') self.assertEqual(url, 'child/not-home/subchild/')
def get_publish_url(self): pk = self.page.pk if self.page else 0 params = {} if self.dirty_statics: params['statics'] = ','.join(str(sp.pk) for sp in self.dirty_statics) if self.in_apphook(): params['redirect'] = self.toolbar.request_path with force_language(self.current_lang): url = admin_reverse('cms_page_publish_page', args=(pk, self.current_lang)) return add_url_parameters(url, params)
def get_plugin_tree_as_json(request, plugins): from cms.utils.plugins import ( build_plugin_tree, downcast_plugins, get_plugin_restrictions, ) tree_data = [] tree_structure = [] restrictions = {} toolbar = get_toolbar_from_request(request) template = toolbar.templates.drag_item_template placeholder = plugins[0].placeholder host_page = placeholder.page copy_to_clipboard = placeholder.pk == toolbar.clipboard.pk plugins = downcast_plugins(plugins, select_placeholder=True) plugin_tree = build_plugin_tree(plugins) get_plugin_info = get_plugin_toolbar_info def collect_plugin_data(plugin): child_classes, parent_classes = get_plugin_restrictions( plugin=plugin, page=host_page, restrictions_cache=restrictions, ) plugin_info = get_plugin_info( plugin, children=child_classes, parents=parent_classes, ) tree_data.append(plugin_info) for plugin in plugin.child_plugin_instances or []: collect_plugin_data(plugin) with force_language(toolbar.toolbar_language): for root_plugin in plugin_tree: collect_plugin_data(root_plugin) context = { 'plugin': root_plugin, 'request': request, 'clipboard': copy_to_clipboard, 'cms_toolbar': toolbar, } tree_structure.append(template.render(context)) tree_data.reverse() return json.dumps({ 'html': '\n'.join(tree_structure), 'plugins': tree_data })
def test_get_i18n_apphook_with_explicit_current_app(self): self.apphook_clear() titles = self.create_base_structure(NS_APP_NAME, ['en', 'de'], 'instance_1') public_de_title = titles[1] de_title = Title.objects.get(page=public_de_title.page.publisher_draft, language="de") de_title.slug = "de" de_title.save() de_title.page.publish('de') self.reload_urls() self.apphook_clear() page2 = create_page("page2", "nav_playground.html", language="en", created_by=self.superuser, published=True, parent=de_title.page.get_parent_page(), apphook=NS_APP_NAME, apphook_namespace="instance_2") create_title("de", "de_title", page2, slug="slug") page2.publish('de') clear_app_resolvers() clear_url_caches() if APP_MODULE in sys.modules: del sys.modules[APP_MODULE] self.reload_urls() with force_language("de"): reverse('namespaced_app_ns:current-app', current_app="instance_1") reverse('namespaced_app_ns:current-app', current_app="instance_2") reverse('namespaced_app_ns:current-app') with force_language("en"): reverse('namespaced_app_ns:current-app', current_app="instance_1") reverse('namespaced_app_ns:current-app', current_app="instance_2") reverse('namespaced_app_ns:current-app') self.apphook_clear()
def test_apphook_permissions_preserves_view_name(self): self.create_base_structure(APP_NAME, ['en', 'de']) view_names = ( ('sample-settings', 'sample_view'), ('sample-class-view', 'ClassView'), ('sample-class-based-view', 'ClassBasedView'), ) with force_language("en"): for url_name, view_name in view_names: path = reverse(url_name) match = resolve(path) self.assertEqual(match.func.__name__, view_name)
def test_get_child_page_for_apphook_with_instance_namespace(self): en_title = self.create_base_structure(NS_APP_NAME, 'en', 'instance_ns') with force_language("en"): path = reverse('namespaced_app_ns:sample-settings') path_instance1 = reverse('instance_ns:sample-settings') path_instance2 = reverse('namespaced_app_ns:sample-settings', current_app='instance_ns') self.assertEqual(path, path_instance1) self.assertEqual(path, path_instance2) request = self.get_request(path) request.LANGUAGE_CODE = 'en' attached_to_page = applications_page_check(request, path=path[1:]) # strip leading slash self.assertEqual(attached_to_page.pk, en_title.page_id) self.apphook_clear()
def test_default_language_changer_with_implicit_current_app(self): self.create_base_structure(NS_APP_NAME, ['en', 'de'], 'namespaced_app_ns') self.reload_urls() with force_language("en"): path = reverse('namespaced_app_ns:translated-url') request = self.get_request(path) request.LANGUAGE_CODE = 'en' url = DefaultLanguageChanger(request)('en') self.assertEqual(url, path) url = DefaultLanguageChanger(request)('de') self.assertEqual(url, '/de%s' % path[3:].replace('/page', '/Seite')) self.apphook_clear()
def _call_toolbar(self, func_name): with force_language(self.toolbar_language): first = ('cms.cms_toolbars.BasicToolbar', 'cms.cms_toolbars.PlaceholderToolbar') for key in first: toolbar = self.toolbars.get(key) if not toolbar: continue getattr(toolbar, func_name)() for key in self.toolbars: if key in first: continue toolbar = self.toolbars[key] getattr(toolbar, func_name)()
def test_page_language_url_for_apphook(self): self.apphook_clear() superuser = get_user_model().objects.create_superuser('admin', '*****@*****.**', 'admin') page = self.create_homepage("home", "nav_playground.html", "en", created_by=superuser) create_title('de', page.get_title(), page) page.publish('en') page.publish('de') child_page = create_page("child_page", "nav_playground.html", "en", created_by=superuser, parent=page) create_title('de', child_page.get_title(), child_page) child_page.publish('en') child_page.publish('de') child_child_page = create_page("child_child_page", "nav_playground.html", "en", created_by=superuser, parent=child_page, apphook='SampleApp') create_title("de", '%s_de' % child_child_page.get_title(), child_child_page) child_child_page.publish('en') child_child_page.publish('de') # publisher_public is set to draft on publish, issue with one to one reverse child_child_page = self.reload(child_child_page) with force_language("en"): path = reverse('extra_first') request = self.get_request(path) request.LANGUAGE_CODE = 'en' request.current_page = child_child_page fake_context = {'request': request} tag = DumbPageLanguageUrl() output = tag.get_context(fake_context, 'en') url = output['content'] self.assertEqual(url, '/en/child_page/child_child_page/extra_1/') output = tag.get_context(fake_context, 'de') url = output['content'] # look the extra "_de" self.assertEqual(url, '/de/child_page/child_child_page_de/extra_1/') output = tag.get_context(fake_context, 'fr') url = output['content'] self.assertEqual(url, '/en/child_page/child_child_page/extra_1/') self.apphook_clear()
def get_success_url(self, obj, **kwargs): """ This should return the URL of the created object, «obj». """ if 'language' in kwargs: with force_language(kwargs['language']): url = obj.get_absolute_url() else: url = obj.get_absolute_url() # Add 'edit' to GET params of URL if self.edit_mode_on_success: sep = "&" if "?" in url else "?" url = '{0}{1}{2}'.format( url, sep, get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON')) return url
def build_core(self, backend, stage, **options): from deployment import project_name language = self.get_language(backend) core_name_format = options['format'] core_name = core_name_format % { 'project': project_name, 'stage': stage, 'language': language, } core_root = os.path.join(settings.PROJECT_ROOT, 'tmp', core_name) with force_language(language): core_conf_root = self.build_conf(core_root, language) schema_xml = self.build_template(using=backend) schema_xml_path = os.path.join(core_conf_root, 'schema.xml') self.write_file(schema_xml_path, schema_xml)