def get_nodes(self, request): page_queryset = get_page_queryset(request) site = Site.objects.get_current() lang = get_language_from_request(request) filters = { 'site': site, } if hide_untranslated(lang, site.pk): filters['title_set__language'] = lang pages = page_queryset.published().filter(**filters).order_by( "tree_id", "lft") ids = {} nodes = [] first = True home_cut = False home_children = [] home = None actual_pages = [] # cache view perms visible_pages = get_visible_pages(request, pages, site) for page in pages: # Pages are ordered by tree_id, therefore the first page is the root # of the page tree (a.k.a "home") if page.pk not in visible_pages: # Don't include pages the user doesn't have access to continue if not home: home = page page.home_pk_cache = home.pk if first and page.pk != home.pk: home_cut = True if (page.parent_id == home.pk or page.parent_id in home_children) and home_cut: home_children.append(page.pk) if (page.pk == home.pk and home.in_navigation) or page.pk != home.pk: first = False ids[page.id] = page actual_pages.append(page) page.title_cache = {} langs = [lang] if not hide_untranslated(lang): langs.extend(get_fallback_languages(lang)) titles = list( get_title_queryset(request).filter(page__in=ids, language__in=langs)) for title in titles: # add the title and slugs and some meta data page = ids[title.page_id] page.title_cache[title.language] = title for page in actual_pages: if page.title_cache: nodes.append(page_to_node(page, home, home_cut)) return nodes
def applications_page_check(request, current_page=None, path=None): """Tries to find if given path was resolved over application. Applications have higher priority than other cms pages. """ if current_page: return current_page if path is None: # We should get in this branch only if an apphook is active on / # This removes the non-CMS part of the URL. path = request.path.replace(reverse('pages-root'), '', 1) # check if application resolver can resolve this for lang in get_language_list(): if path.startswith(lang + "/"): path = path[len(lang + "/"):] for resolver in APP_RESOLVERS: try: page_id = resolver.resolve_page_id(path) # yes, it is application page page = get_page_queryset(request).get(id=page_id) # If current page was matched, then we have some override for content # from cms, but keep current page. Otherwise return page to which was application assigned. return page except Resolver404: # Raised if the page is not managed by an apphook pass return None
def get_nodes(self, request): page_queryset = get_page_queryset(request) site = current_site(request) lang = get_language_from_request(request) filters = { 'site': site, } if hide_untranslated(lang, site.pk): filters['title_set__language'] = lang if not use_draft(request): filters['title_set__published'] = True if not use_draft(request): page_queryset = page_queryset.published() pages = page_queryset.filter(**filters).order_by("path") ids = {} nodes = [] first = True home_cut = False home_children = [] home = None actual_pages = [] # cache view perms visible_pages = get_visible_pages(request, pages, site) for page in pages: # Pages are ordered by path, therefore the first page is the root # of the page tree (a.k.a "home") if page.pk not in visible_pages: # Don't include pages the user doesn't have access to continue if not home: home = page if first and page.pk != home.pk: home_cut = True if (home_cut and (page.parent_id == home.pk or page.parent_id in home_children)): home_children.append(page.pk) if ((page.pk == home.pk and home.in_navigation) or page.pk != home.pk): first = False ids[page.id] = page actual_pages.append(page) page.title_cache = {} langs = [lang] if not hide_untranslated(lang): langs.extend(get_fallback_languages(lang)) titles = list(get_title_queryset(request).filter( page__in=ids, language__in=langs)) for title in titles: # add the title and slugs and some meta data page = ids[title.page_id] page.title_cache[title.language] = title for page in actual_pages: if page.title_cache: nodes.append(page_to_node(page, home, home_cut)) return nodes
def process_request(self, request): host = request.META.get('HTTP_HOST') if host in self.from_sites: site = get_current_site(request) page = get_page_queryset(request).get(reverse_id=settings.SITES[host]) return HttpResponseRedirect("http://%s/%s" % (site.domain, page.get_path())) return None
def _get_page_by_untyped_arg(page_lookup, request, site_id): """ The `page_lookup` argument can be of any of the following types: - Integer: interpreted as `pk` of the desired page - String: interpreted as `reverse_id` of the desired page - `dict`: a dictionary containing keyword arguments to find the desired page (for instance: `{'pk': 1}`) - `Page`: you can also pass a Page object directly, in which case there will be no database lookup. - `None`: the current page will be used """ if page_lookup is None: return request.current_page if isinstance(page_lookup, Page): return page_lookup if isinstance(page_lookup, basestring): page_lookup = {'reverse_id': page_lookup} elif isinstance(page_lookup, (int, long)): page_lookup = {'pk': page_lookup} elif not isinstance(page_lookup, dict): raise TypeError('The page_lookup argument can be either a Dictionary, Integer, Page, or String.') page_lookup.update({'site': site_id}) try: return get_page_queryset(request).get(**page_lookup) except Page.DoesNotExist: site = Site.objects.get_current() subject = _('Page not found on %(domain)s') % {'domain': site.domain} body = _("A template tag couldn't find the page with lookup arguments `%(page_lookup)s\n`. " "The URL of the request was: http://%(host)s%(path)s")\ % {'page_lookup': repr(page_lookup), 'host': site.domain, 'path': request.path} if settings.DEBUG: raise Page.DoesNotExist(body) else: if settings.SEND_BROKEN_LINK_EMAILS: mail_managers(subject, body, fail_silently=True) return None
def _get_page_by_untyped_arg(page_lookup, request, site_id): """ The `page_lookup` argument can be of any of the following types: - Integer: interpreted as `pk` of the desired page - String: interpreted as `reverse_id` of the desired page - `dict`: a dictionary containing keyword arguments to find the desired page (for instance: `{'pk': 1}`) - `Page`: you can also pass a Page object directly, in which case there will be no database lookup. - `None`: the current page will be used """ if page_lookup is None: return request.current_page if isinstance(page_lookup, Page): if request.current_page and request.current_page.pk == page_lookup.pk: return request.current_page return page_lookup if isinstance(page_lookup, six.string_types): page_lookup = {'reverse_id': page_lookup} elif isinstance(page_lookup, six.integer_types): page_lookup = {'pk': page_lookup} elif not isinstance(page_lookup, dict): raise TypeError('The page_lookup argument can be either a Dictionary, Integer, Page, or String.') page_lookup.update({'site': site_id}) try: if 'pk' in page_lookup: page = Page.objects.all().get(**page_lookup) if request and use_draft(request): if page.publisher_is_draft: return page else: return page.publisher_draft else: if page.publisher_is_draft: return page.publisher_public else: return page else: return get_page_queryset(request).get(**page_lookup) except Page.DoesNotExist: site = Site.objects.get_current() subject = _('Page not found on %(domain)s') % {'domain': site.domain} body = _("A template tag couldn't find the page with lookup arguments `%(page_lookup)s\n`. " "The URL of the request was: http://%(host)s%(path)s") \ % {'page_lookup': repr(page_lookup), 'host': site.domain, 'path': request.path_info} if settings.DEBUG: raise Page.DoesNotExist(body) else: mw = get_middleware() if getattr(settings, 'SEND_BROKEN_LINK_EMAILS', False): mail_managers(subject, body, fail_silently=True) elif 'django.middleware.common.BrokenLinkEmailsMiddleware' in mw: middle = BrokenLinkEmailsMiddleware() domain = request.get_host() path = request.get_full_path() referer = force_text(request.META.get('HTTP_REFERER', ''), errors='replace') if not middle.is_ignorable_request(request, path, domain, referer): mail_managers(subject, body, fail_silently=True) return None
def _get_page_by_untyped_arg(page_lookup, request, site_id): """ The `page_lookup` argument can be of any of the following types: - Integer: interpreted as `pk` of the desired page - String: interpreted as `reverse_id` of the desired page - `dict`: a dictionary containing keyword arguments to find the desired page (for instance: `{'pk': 1}`) - `Page`: you can also pass a Page object directly, in which case there will be no database lookup. - `None`: the current page will be used """ if page_lookup is None: return request.current_page if isinstance(page_lookup, Page): if request.current_page and request.current_page.pk == page_lookup.pk: return request.current_page return page_lookup if isinstance(page_lookup, six.string_types): page_lookup = {'reverse_id': page_lookup} elif isinstance(page_lookup, six.integer_types): page_lookup = {'pk': page_lookup} elif not isinstance(page_lookup, dict): raise TypeError('The page_lookup argument can be either a Dictionary, Integer, Page, or String.') page_lookup.update({'site': site_id}) try: if 'pk' in page_lookup: page = Page.objects.all().get(**page_lookup) if request and use_draft(request): if page.publisher_is_draft: return page else: return page.publisher_draft else: if page.publisher_is_draft: return page.publisher_public else: return page else: return get_page_queryset(request).get(**page_lookup) except Page.DoesNotExist: site = Site.objects.get_current() subject = _('Page not found on %(domain)s') % {'domain': site.domain} body = _("A template tag couldn't find the page with lookup arguments `%(page_lookup)s\n`. " "The URL of the request was: http://%(host)s%(path)s") \ % {'page_lookup': repr(page_lookup), 'host': site.domain, 'path': request.path_info} if settings.DEBUG: raise Page.DoesNotExist(body) else: if getattr(settings, 'SEND_BROKEN_LINK_EMAILS', False): mail_managers(subject, body, fail_silently=True) elif 'django.middleware.common.BrokenLinkEmailsMiddleware' in settings.MIDDLEWARE_CLASSES: middle = BrokenLinkEmailsMiddleware() domain = request.get_host() path = request.get_full_path() referer = force_text(request.META.get('HTTP_REFERER', ''), errors='replace') if not middle.is_ignorable_request(request, path, domain, referer): mail_managers(subject, body, fail_silently=True) return None
def process_request(self, request): host = request.META.get('HTTP_HOST') if host in self.from_sites: site = get_current_site(request) page = get_page_queryset(request).get( reverse_id=settings.SITES[host]) return HttpResponseRedirect("http://%s/%s" % (site.domain, page.get_path())) return None
def _get_page_by_untyped_arg(page_lookup, request, site_id): """ The `page_lookup` argument can be of any of the following types: - Integer: interpreted as `pk` of the desired page - String: interpreted as `reverse_id` of the desired page - `dict`: a dictionary containing keyword arguments to find the desired page (for instance: `{'pk': 1}`) - `Page`: you can also pass a Page object directly, in which case there will be no database lookup. - `None`: the current page will be used """ if page_lookup is None: return request.current_page if isinstance(page_lookup, Page): if request.current_page and request.current_page.pk == page_lookup.pk: return request.current_page return page_lookup if isinstance(page_lookup, string_types): page_lookup = {'reverse_id': page_lookup} elif isinstance(page_lookup, int_types): page_lookup = {'pk': page_lookup} elif not isinstance(page_lookup, dict): raise TypeError('The page_lookup argument can be either a Dictionary, Integer, Page, or String.') page_lookup.update({'site': site_id}) try: if 'pk' in page_lookup: page = Page.objects.all().get(**page_lookup) if request and use_draft(request): if page.publisher_is_draft: return page else: return page.publisher_draft else: if page.publisher_is_draft: return page.publisher_public else: return page else: return get_page_queryset(request).get(**page_lookup) except Page.DoesNotExist: site = Site.objects.get_current() subject = _('Page not found on %(domain)s') % {'domain': site.domain} body = _("A template tag couldn't find the page with lookup arguments `%(page_lookup)s\n`. " "The URL of the request was: http://%(host)s%(path)s") \ % {'page_lookup': repr(page_lookup), 'host': site.domain, 'path': request.path} if settings.DEBUG: raise Page.DoesNotExist(body) else: if settings.SEND_BROKEN_LINK_EMAILS: mail_managers(subject, body, fail_silently=True) return None
def _get_page_by_untyped_arg(page_lookup, request, site_id): """ The `page_lookup` argument can be of any of the following types: - Integer: interpreted as `pk` of the desired page - String: interpreted as `reverse_id` of the desired page - `dict`: a dictionary containing keyword arguments to find the desired page (for instance: `{'pk': 1}`) - `Page`: you can also pass a Page object directly, in which case there will be no database lookup. - `None`: the current page will be used """ if page_lookup is None: return request.current_page if isinstance(page_lookup, Page): return page_lookup if isinstance(page_lookup, basestring): page_lookup = {"reverse_id": page_lookup} elif isinstance(page_lookup, (int, long)): page_lookup = {"pk": page_lookup} elif not isinstance(page_lookup, dict): raise TypeError("The page_lookup argument can be either a Dictionary, Integer, Page, or String.") page_lookup.update({"site": site_id}) try: return get_page_queryset(request).get(**page_lookup) except Page.DoesNotExist: site = Site.objects.get_current() subject = _("Page not found on %(domain)s") % {"domain": site.domain} body = _( "A template tag couldn't find the page with lookup arguments `%(page_lookup)s\n`. " "The URL of the request was: http://%(host)s%(path)s" ) % {"page_lookup": repr(page_lookup), "host": site.domain, "path": request.path} if settings.DEBUG: raise Page.DoesNotExist(body) else: if settings.SEND_BROKEN_LINK_EMAILS: mail_managers(subject, body, fail_silently=True) return None
def items(self): from cms.utils.page_resolver import get_page_queryset page_queryset = get_page_queryset(None) all_pages = page_queryset.published().filter(login_required=False) return all_pages
def get_viewable_pages(self): site = self.get_site() page_queryset = get_page_queryset(self.request).published() pages = page_queryset.filter(site=site) return get_visible_pages(self.request, pages, site)
def get_nodes(self, request): site = self.renderer.site lang = self.renderer.language page_queryset = get_page_queryset(request) filters = { 'site': site, } if hide_untranslated(lang, site.pk): filters['title_set__language'] = lang if not self.renderer.draft_mode_active: filters['title_set__published'] = True if not self.renderer.draft_mode_active: page_queryset = page_queryset.published() pages = page_queryset.filter(**filters).order_by("path") ids = {} nodes = [] home = None actual_pages = [] # cache view perms visible_pages = frozenset(get_visible_pages(request, pages, site)) for page in pages: # Pages are ordered by path, therefore the first page is the root # of the page tree (a.k.a "home") if page.pk not in visible_pages: # Don't include pages the user doesn't have access to continue if not home: home = page ids[page.id] = page actual_pages.append(page) page.title_cache = {} langs = [lang] if not hide_untranslated(lang): langs.extend(get_fallback_languages(lang)) titles = get_title_queryset(request).filter(page__in=ids, language__in=langs) for title in titles.iterator(): # add the title and slugs and some meta data page = ids[title.page_id] page.title_cache[title.language] = title renderer = self.renderer _page_to_node = functools.partial( page_to_node, renderer=renderer, home=home, language=lang, ) for page in actual_pages: if page.title_cache: node = _page_to_node(page=page) nodes.append(node) return nodes
def get_nodes(self, request): site = self.renderer.site lang = self.renderer.language page_queryset = get_page_queryset(request) filters = { 'site': site, } if hide_untranslated(lang, site.pk): filters['title_set__language'] = lang if not self.renderer.draft_mode_active: filters['title_set__published'] = True if not self.renderer.draft_mode_active: page_queryset = page_queryset.published() pages = page_queryset.filter(**filters).order_by("path") ids = {} nodes = [] home = None actual_pages = [] # cache view perms visible_pages = frozenset(get_visible_pages(request, pages, site)) for page in pages: # Pages are ordered by path, therefore the first page is the root # of the page tree (a.k.a "home") if page.pk not in visible_pages: # Don't include pages the user doesn't have access to continue if not home: home = page ids[page.id] = page actual_pages.append(page) page.title_cache = {} langs = [lang] if not hide_untranslated(lang): langs.extend(get_fallback_languages(lang)) titles = get_title_queryset(request).filter(page__in=ids, language__in=langs) for title in titles.iterator( ): # add the title and slugs and some meta data page = ids[title.page_id] page.title_cache[title.language] = title renderer = self.renderer _page_to_node = functools.partial( page_to_node, renderer=renderer, home=home, language=lang, ) for page in actual_pages: if page.title_cache: node = _page_to_node(page=page) nodes.append(node) return nodes