def render(self, context, instance, placeholder): request = context['request'] language = request.toolbar.language if DJANGO_CMS_35 else request.LANGUAGE_CODE site = Site.objects.get_current() path_column = 'node__path' if DJANGO_CMS_35 else 'path' node_column = 'node__depth' if DJANGO_CMS_35 else 'depth' pages = Page.objects.public().published(site=site).order_by(path_column) \ .filter(login_required=False, **{node_column + '__gte': instance.min_depth}) \ .filter(title_set__language=language) \ .distinct() if instance.max_depth: pages = pages.filter(**{node_column + '__lte': instance.max_depth}) if instance.in_navigation is not None: pages = pages.filter(in_navigation=instance.in_navigation) context['instance'] = instance context['pages'] = pages if DJANGO_CMS_35: from cms.models.pagemodel import TreeNode nodes = [page.node for page in pages.select_related('node')] annotated_nodes = TreeNode.get_annotated_list_qs(nodes) annotated_pages = [(pages[x], annotated_nodes[x][1]) for x in range(0, len(nodes))] else: annotated_pages = Page.get_annotated_list_qs(pages) context['annotated_pages'] = annotated_pages return context
def get_tree(self, request): """ Get html for the descendants (only) of given page or if no page_id is provided, all the root nodes. Used for lazy loading pages in cms.pagetree.js Permission checks is done in admin_utils.get_admin_menu_item_context which is called by admin_utils.render_admin_menu_item. """ page_id = request.GET.get('pageId', None) site_id = request.GET.get('site', None) try: site_id = int(site_id) site = Site.objects.get(id=site_id) except (TypeError, ValueError, MultipleObjectsReturned, ObjectDoesNotExist): site = get_current_site(request) if page_id: page = get_object_or_404(self.model, pk=int(page_id)) pages = page.get_children() else: pages = Page.get_root_nodes().filter(site=site, publisher_is_draft=True) #\ #.exclude(title_set__title__startswith='X') pages = (pages.select_related('parent', 'publisher_public', 'site').prefetch_related('children')) response = render_admin_rows(request, pages, site=site, filtered=False) return HttpResponse(response)
def create_fixtures(self): """ Tree from fixture: page1 page2 page3 page4 page5 """ defaults = { 'template': 'nav_playground.html', 'language': 'en', } with self.settings(CMS_PERMISSION=False): p1 = create_page('page1', published=True, in_navigation=True, **defaults) Page.set_homepage(p1) p4 = create_page('page4', published=True, in_navigation=True, **defaults) p1 = Page.objects.get(pk=p1.pk) p2 = create_page('page2', published=True, in_navigation=True, parent=p1, **defaults) create_page('page3', published=True, in_navigation=True, parent=p2, **defaults) p4 = Page.objects.get(pk=p4.pk) create_page('page5', published=True, in_navigation=True, parent=p4, **defaults)
def render(self, context, instance, placeholder): site = Site.objects.get_current() pages = Page.objects.public().published(site=site).order_by('path') \ .filter(depth__gte=instance.min_depth, login_required=False) \ .distinct() if instance.max_depth: pages = pages.filter(depth__lte=instance.max_depth) if instance.in_navigation is not None: pages = pages.filter(in_navigation=instance.in_navigation) context['instance'] = instance context['pages'] = pages context['annotated_pages'] = Page.get_annotated_list_qs(pages) return context
def create_page(title, template, language, menu_title=None, slug=None, apphook=None, apphook_namespace=None, redirect=None, meta_description=None, created_by='python-api', parent=None, publication_date=None, publication_end_date=None, in_navigation=False, soft_root=False, reverse_id=None, navigation_extenders=None, published=False, site=None, login_required=False, limit_visibility_in_menu=constants.VISIBILITY_ALL, position="last-child", overwrite_url=None, xframe_options=Page.X_FRAME_OPTIONS_INHERIT): """ Create a CMS Page and it's title for the given language See docs/extending_cms/api_reference.rst for more info """ # validate template if not template == TEMPLATE_INHERITANCE_MAGIC: assert template in [tpl[0] for tpl in get_cms_setting('TEMPLATES')] get_template(template) # validate site if not site: site = get_current_site() else: assert isinstance(site, Site) # validate language: assert language in get_language_list(site), get_cms_setting('LANGUAGES').get(site.pk) # validate parent if parent: assert isinstance(parent, Page) assert parent.publisher_is_draft # validate publication date if publication_date: assert isinstance(publication_date, datetime.date) # validate publication end date if publication_end_date: assert isinstance(publication_end_date, datetime.date) if navigation_extenders: raw_menus = menu_pool.get_menus_by_attribute("cms_enabled", True) menus = [menu[0] for menu in raw_menus] assert navigation_extenders in menus # validate menu visibility accepted_limitations = (constants.VISIBILITY_ALL, constants.VISIBILITY_USERS, constants.VISIBILITY_ANONYMOUS) assert limit_visibility_in_menu in accepted_limitations # validate position assert position in ('last-child', 'first-child', 'left', 'right') target_node = parent.node if parent else None # validate and normalize apphook if apphook: application_urls = _verify_apphook(apphook, apphook_namespace) else: application_urls = None # ugly permissions hack if created_by and isinstance(created_by, get_user_model()): _thread_locals.user = created_by created_by = getattr(created_by, get_user_model().USERNAME_FIELD) else: _thread_locals.user = None if reverse_id: if Page.objects.drafts().filter(reverse_id=reverse_id, node__site=site).exists(): raise FieldError('A page with the reverse_id="%s" already exist.' % reverse_id) page = Page( created_by=created_by, changed_by=created_by, publication_date=publication_date, publication_end_date=publication_end_date, in_navigation=in_navigation, soft_root=soft_root, reverse_id=reverse_id, navigation_extenders=navigation_extenders, template=template, application_urls=application_urls, application_namespace=apphook_namespace, login_required=login_required, limit_visibility_in_menu=limit_visibility_in_menu, xframe_options=xframe_options, ) page.set_tree_node(site=site, target=target_node, position=position) page.save() page.rescan_placeholders() create_title( language=language, title=title, menu_title=menu_title, slug=slug, redirect=redirect, meta_description=meta_description, page=page, overwrite_url=overwrite_url, ) if published: page.publish(language) if parent and position in ('last-child', 'first-child'): parent._clear_node_cache() del _thread_locals.user return page
def create_page(title, template, language, menu_title=None, slug=None, apphook=None, redirect=None, meta_description=None, meta_keywords=None, created_by='python-api', parent=None, publication_date=None, publication_end_date=None, in_navigation=False, soft_root=False, reverse_id=None, navigation_extenders=None, published=False, site=None, login_required=False, limit_visibility_in_menu=VISIBILITY_ALL, position="last-child", overwrite_url=None): """ Create a CMS Page and it's title for the given language See docs/extending_cms/api_reference.rst for more info """ # ugly permissions hack if created_by and isinstance(created_by, auth.get_user_model()): _thread_locals.user = created_by created_by = created_by.username else: _thread_locals.user = None # validate template assert template in [tpl[0] for tpl in get_cms_setting('TEMPLATES')] # validate site if not site: site = Site.objects.get_current() else: assert isinstance(site, Site) # validate language: assert language in get_language_list(site), get_cms_setting('LANGUAGES').get(site.pk) # set default slug: if not slug: slug = _generate_valid_slug(title, parent, language) # validate and normalize apphook if apphook: application_urls = _verify_apphook(apphook) else: application_urls = None # validate parent if parent: assert isinstance(parent, Page) parent = Page.objects.get(pk=parent.pk) # validate publication date if publication_date: assert isinstance(publication_date, datetime.date) # validate publication end date if publication_end_date: assert isinstance(publication_end_date, datetime.date) # validate softroot assert get_cms_setting('SOFTROOT') or not soft_root if navigation_extenders: raw_menus = menu_pool.get_menus_by_attribute("cms_enabled", True) menus = [menu[0] for menu in raw_menus] assert navigation_extenders in menus # validate menu visibility accepted_limitations = (VISIBILITY_ALL, VISIBILITY_USERS, VISIBILITY_STAFF) assert limit_visibility_in_menu in accepted_limitations # validate position assert position in ('last-child', 'first-child', 'left', 'right') page = Page( created_by=created_by, changed_by=created_by, parent=parent, publication_date=publication_date, publication_end_date=publication_end_date, in_navigation=in_navigation, soft_root=soft_root, reverse_id=reverse_id, navigation_extenders=navigation_extenders, published=False, # will be published later template=template, site=site, login_required=login_required, limit_visibility_in_menu=limit_visibility_in_menu, ) page.insert_at(parent, position) page.save() create_title( language=language, title=title, menu_title=menu_title, slug=slug, apphook=application_urls, redirect=redirect, meta_description=meta_description, meta_keywords=meta_keywords, page=page, overwrite_url=overwrite_url ) if published: page.publish() del _thread_locals.user return page.reload()
def create_page(title, template, language, menu_title=None, slug=None, apphook=None, redirect=None, meta_description=None, meta_keywords=None, created_by='python-api', parent=None, publication_date=None, publication_end_date=None, in_navigation=False, soft_root=False, reverse_id=None, navigation_extenders=None, published=False, site=None, login_required=False, limit_visibility_in_menu=VISIBILITY_ALL, position="last-child", overwrite_url=None): """ Create a CMS Page and it's title for the given language See docs/extending_cms/api_reference.rst for more info """ # ugly permissions hack if created_by and isinstance(created_by, User): _thread_locals.user = created_by created_by = created_by.username else: _thread_locals.user = None # validate template assert template in [tpl[0] for tpl in get_cms_setting('TEMPLATES')] # validate site if not site: site = Site.objects.get_current() else: assert isinstance(site, Site) # validate language: assert language in get_language_list(site), get_cms_setting( 'LANGUAGES').get(site.pk) # set default slug: if not slug: slug = _generate_valid_slug(title, parent, language) # validate and normalize apphook if apphook: application_urls = _verify_apphook(apphook) else: application_urls = None # validate parent if parent: assert isinstance(parent, Page) parent = Page.objects.get(pk=parent.pk) # validate publication date if publication_date: assert isinstance(publication_date, datetime.date) # validate publication end date if publication_end_date: assert isinstance(publication_end_date, datetime.date) # validate softroot assert get_cms_setting('SOFTROOT') or not soft_root if navigation_extenders: raw_menus = menu_pool.get_menus_by_attribute("cms_enabled", True) menus = [menu[0] for menu in raw_menus] assert navigation_extenders in menus # validate menu visibility accepted_limitations = (VISIBILITY_ALL, VISIBILITY_USERS, VISIBILITY_STAFF) assert limit_visibility_in_menu in accepted_limitations # validate position assert position in ('last-child', 'first-child', 'left', 'right') page = Page( created_by=created_by, changed_by=created_by, parent=parent, publication_date=publication_date, publication_end_date=publication_end_date, in_navigation=in_navigation, soft_root=soft_root, reverse_id=reverse_id, navigation_extenders=navigation_extenders, published=False, # will be published later template=template, site=site, login_required=login_required, limit_visibility_in_menu=limit_visibility_in_menu, ) page.insert_at(parent, position) page.save() create_title(language=language, title=title, menu_title=menu_title, slug=slug, apphook=application_urls, redirect=redirect, meta_description=meta_description, meta_keywords=meta_keywords, page=page, overwrite_url=overwrite_url) if published: page.publish() del _thread_locals.user return page.reload()
def create_page(title, template, language, menu_title=None, slug=None, apphook=None, apphook_namespace=None, redirect=None, meta_description=None, created_by='python-api', parent=None, publication_date=None, publication_end_date=None, in_navigation=False, soft_root=False, reverse_id=None, navigation_extenders=None, published=False, site=None, login_required=False, limit_visibility_in_menu=VISIBILITY_ALL, position="last-child", overwrite_url=None, xframe_options=Page.X_FRAME_OPTIONS_INHERIT): """ Create a CMS Page and it's title for the given language See docs/extending_cms/api_reference.rst for more info """ # ugly permissions hack if created_by and isinstance(created_by, get_user_model()): _thread_locals.user = created_by created_by = getattr(created_by, get_user_model().USERNAME_FIELD) else: _thread_locals.user = None # validate template if not template == TEMPLATE_INHERITANCE_MAGIC: assert template in [tpl[0] for tpl in get_cms_setting('TEMPLATES')] get_template(template) # validate site if not site: site = Site.objects.get_current() else: assert isinstance(site, Site) # validate language: assert language in get_language_list(site), get_cms_setting('LANGUAGES').get(site.pk) # set default slug: if not slug: slug = _generate_valid_slug(title, parent, language) # validate parent if parent: assert isinstance(parent, Page) parent = Page.objects.get(pk=parent.pk) # validate publication date if publication_date: assert isinstance(publication_date, datetime.date) # validate publication end date if publication_end_date: assert isinstance(publication_end_date, datetime.date) if navigation_extenders: raw_menus = menu_pool.get_menus_by_attribute("cms_enabled", True) menus = [menu[0] for menu in raw_menus] assert navigation_extenders in menus # validate menu visibility accepted_limitations = (VISIBILITY_ALL, VISIBILITY_USERS, VISIBILITY_STAFF) assert limit_visibility_in_menu in accepted_limitations # validate position assert position in ('last-child', 'first-child', 'left', 'right') # validate and normalize apphook if apphook: application_urls = _verify_apphook(apphook, apphook_namespace) else: application_urls = None if reverse_id: if Page.objects.drafts().filter(reverse_id=reverse_id).count(): raise FieldError('A page with the reverse_id="%s" already exist.' % reverse_id) page = Page( created_by=created_by, changed_by=created_by, parent=parent, publication_date=publication_date, publication_end_date=publication_end_date, in_navigation=in_navigation, soft_root=soft_root, reverse_id=reverse_id, navigation_extenders=navigation_extenders, template=template, application_urls=application_urls, application_namespace=apphook_namespace, site=site, login_required=login_required, limit_visibility_in_menu=limit_visibility_in_menu, xframe_options=xframe_options, ) page.insert_at(parent, position) page.save() create_title( language=language, title=title, menu_title=menu_title, slug=slug, redirect=redirect, meta_description=meta_description, page=page, overwrite_url=overwrite_url, ) if published: page.publish(language) del _thread_locals.user return page.reload()
def get_absolute_url(self): return '/%s%s' % (lang, Page.get_absolute_url(self))
def create_page(title, template, language, menu_title=None, slug=None, apphook=None, apphook_namespace=None, redirect=None, meta_description=None, created_by='python-api', parent=None, publication_date=None, publication_end_date=None, in_navigation=False, soft_root=False, reverse_id=None, navigation_extenders=None, published=False, site=None, login_required=False, limit_visibility_in_menu=constants.VISIBILITY_ALL, position="last-child", overwrite_url=None, xframe_options=Page.X_FRAME_OPTIONS_INHERIT, with_revision=False): """ Create a CMS Page and it's title for the given language See docs/extending_cms/api_reference.rst for more info """ if with_revision: # fail fast if revision is requested # but not enabled on the project. _verify_revision_support() # validate template if not template == TEMPLATE_INHERITANCE_MAGIC: assert template in [tpl[0] for tpl in get_cms_setting('TEMPLATES')] get_template(template) # validate site if not site: site = Site.objects.get_current() else: assert isinstance(site, Site) # validate language: assert language in get_language_list(site), get_cms_setting('LANGUAGES').get(site.pk) # set default slug: if not slug: slug = generate_valid_slug(title, parent, language) # validate parent if parent: assert isinstance(parent, Page) parent = Page.objects.get(pk=parent.pk) # validate publication date if publication_date: assert isinstance(publication_date, datetime.date) # validate publication end date if publication_end_date: assert isinstance(publication_end_date, datetime.date) if navigation_extenders: raw_menus = menu_pool.get_menus_by_attribute("cms_enabled", True) menus = [menu[0] for menu in raw_menus] assert navigation_extenders in menus # validate menu visibility accepted_limitations = (constants.VISIBILITY_ALL, constants.VISIBILITY_USERS, constants.VISIBILITY_ANONYMOUS) assert limit_visibility_in_menu in accepted_limitations # validate position assert position in ('last-child', 'first-child', 'left', 'right') if parent: if position in ('last-child', 'first-child'): parent_id = parent.pk else: parent_id = parent.parent_id else: parent_id = None # validate and normalize apphook if apphook: application_urls = _verify_apphook(apphook, apphook_namespace) else: application_urls = None # ugly permissions hack if created_by and isinstance(created_by, get_user_model()): _thread_locals.user = created_by created_by = getattr(created_by, get_user_model().USERNAME_FIELD) else: _thread_locals.user = None if reverse_id: if Page.objects.drafts().filter(reverse_id=reverse_id, site=site).count(): raise FieldError('A page with the reverse_id="%s" already exist.' % reverse_id) page = Page( created_by=created_by, changed_by=created_by, parent_id=parent_id, publication_date=publication_date, publication_end_date=publication_end_date, in_navigation=in_navigation, soft_root=soft_root, reverse_id=reverse_id, navigation_extenders=navigation_extenders, template=template, application_urls=application_urls, application_namespace=apphook_namespace, site=site, login_required=login_required, limit_visibility_in_menu=limit_visibility_in_menu, xframe_options=xframe_options, ) page = page.add_root(instance=page) if parent: page = page.move(target=parent, pos=position) create_title( language=language, title=title, menu_title=menu_title, slug=slug, redirect=redirect, meta_description=meta_description, page=page, overwrite_url=overwrite_url, ) if published: page.publish(language) if with_revision: from cms.constants import REVISION_INITIAL_COMMENT _create_revision( obj=page, user=_thread_locals.user, message=REVISION_INITIAL_COMMENT, ) del _thread_locals.user return page.reload()
def get_absolute_url(self): # no language prefix return Page.get_absolute_url(self)
def test_republish_multiple_root(self): # TODO: The paths do not match expected behaviour home = self.create_homepage("Page", "nav_playground.html", "en", published=True) other = self.create_page("Another Page", published=True) child = self.create_page("Child", published=True, parent=home) child2 = self.create_page("Child", published=True, parent=other) self.assertTrue(Page.objects.filter(is_home=True).count(), 2) self.assertTrue(home.is_home) home = home.reload() self.assertTrue(home.publisher_public.is_home) root = reverse('pages-root') self.assertEqual(home.get_absolute_url(), root) self.assertEqual(home.get_public_object().get_absolute_url(), root) self.assertEqual(child.get_absolute_url(), root + 'child/') self.assertEqual(child.get_public_object().get_absolute_url(), root + 'child/') self.assertEqual(other.get_absolute_url(), root + 'another-page/') self.assertEqual(other.get_public_object().get_absolute_url(), root + 'another-page/') self.assertEqual(child2.get_absolute_url(), root + 'another-page/child/') self.assertEqual(child2.get_public_object().get_absolute_url(), root + 'another-page/child/') home = self.reload(home) home.unpublish('en') Page.set_homepage(other.reload()) home = self.reload(home) other = self.reload(other) child = self.reload(child) child2 = self.reload(child2) self.assertFalse(home.is_home) self.assertFalse(home.publisher_public.is_home) self.assertTrue(other.is_home) self.assertTrue(other.publisher_public.is_home) self.assertEqual(other.get_absolute_url(), root) self.assertEqual(other.get_public_object().get_absolute_url(), root) self.assertEqual(child2.get_absolute_url(), root + 'child/') self.assertEqual(child2.get_public_object().get_absolute_url(), root + 'child/') self.assertEqual(home.get_absolute_url(), root + 'page/') self.assertEqual(home.get_public_object().get_absolute_url(), root + 'page/') self.assertEqual(child.get_absolute_url(), root + 'page/child/') self.assertEqual(child.get_public_object().get_absolute_url(), root + 'page/child/') home.publish('en') Page.set_homepage(home) home = self.reload(home) other = self.reload(other) child = self.reload(child) child2 = self.reload(child2) self.assertTrue(home.is_home) self.assertTrue(home.publisher_public.is_home) self.assertEqual(home.get_absolute_url(), root) self.assertEqual(home.get_public_object().get_absolute_url(), root) self.assertEqual(child.get_absolute_url(), root + 'child/') self.assertEqual(child.get_public_object().get_absolute_url(), root + 'child/') self.assertEqual(other.get_absolute_url(), root + 'another-page/') self.assertEqual(other.get_public_object().get_absolute_url(), root + 'another-page/') self.assertEqual(child2.get_absolute_url(), root + 'another-page/child/') self.assertEqual(child2.get_public_object().get_absolute_url(), root + 'another-page/child/')