def url(self, sitetree_item, context=None): """Resolves item's URL. :param TreeItemBase sitetree_item: TreeItemBase heir object, 'url' property of which is processed as URL pattern or simple URL. :param Context context: :rtype: str|unicode """ context = context or self.current_page_context resolve_var = self.resolve_var if not isinstance(sitetree_item, MODEL_TREE_ITEM_CLASS): sitetree_item = resolve_var(sitetree_item, context) resolved_url = self._items_urls.get(sitetree_item) if resolved_url is not None: return resolved_url # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: url = sitetree_item.url view_path = url all_arguments = [] if ' ' in url: view_path = url.split(' ') # We should try to resolve URL parameters from site tree item. for view_argument in view_path[1:]: resolved = resolve_var(view_argument) # We enclose arg in double quotes as already resolved. all_arguments.append('"%s"' % resolved) view_path = view_path[0].strip('"\' ') url_pattern = "'%s' %s" % (view_path, ' '.join(all_arguments)) else: url_pattern = '%s' % sitetree_item.url if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. url_token = 'url %s as item.url_resolved' % url_pattern url_tag( Parser(None), Token(token_type=TOKEN_BLOCK, contents=url_token) ).render(context) resolved_url = context['item.url_resolved'] or UNRESOLVED_ITEM_MARKER else: resolved_url = url_pattern self._items_urls[sitetree_item] = resolved_url return resolved_url
def url(self, sitetree_item, context=None): """Resolves item's URL. :param TreeItemBase sitetree_item: TreeItemBase heir object, 'url' property of which is processed as URL pattern or simple URL. :param Context context: :rtype: str|unicode """ context = context or self.current_page_context resolve_var = self.resolve_var if not isinstance(sitetree_item, MODEL_TREE_ITEM_CLASS): sitetree_item = resolve_var(sitetree_item, context) resolved_url = self._items_urls.get(sitetree_item) if resolved_url is not None: return resolved_url # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: url = sitetree_item.url view_path = url all_arguments = [] if ' ' in url: view_path = url.split(' ') # We should try to resolve URL parameters from site tree item. for view_argument in view_path[1:]: resolved = resolve_var(view_argument) # We enclose arg in double quotes as already resolved. all_arguments.append('"%s"' % resolved) view_path = view_path[0].strip('"\' ') url_pattern = "'%s' %s" % (view_path, ' '.join(all_arguments)) else: url_pattern = '%s' % sitetree_item.url if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. url_token = 'url %s as item.url_resolved' % url_pattern url_tag(Parser(None), Token(token_type=TOKEN_BLOCK, contents=url_token)).render(context) resolved_url = context[ 'item.url_resolved'] or UNRESOLVED_ITEM_MARKER else: resolved_url = url_pattern self._items_urls[sitetree_item] = resolved_url return resolved_url
def url(self, sitetree_item: Union['TreeItemBase', FilterExpression], context: Context = None) -> str: """Resolves item's URL. :param sitetree_item: TreeItemBase heir object, 'url' property of which is processed as URL pattern or simple URL. :param context: """ context = context or self.current_page_context resolve_var = self.resolve_var if not isinstance(sitetree_item, MODEL_TREE_ITEM_CLASS): sitetree_item = resolve_var(sitetree_item, context) resolved_url = self._items_urls.get(sitetree_item) if resolved_url is not None: return resolved_url # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: url = sitetree_item.url view_path = url all_arguments = [] if ' ' in url: view_path = url.split(' ') # We should try to resolve URL parameters from site tree item. for view_argument in view_path[1:]: resolved = resolve_var(view_argument) # We enclose arg in double quotes as already resolved. all_arguments.append(f'"{resolved}"') view_path = view_path[0].strip('"\' ') url_pattern = f"'{view_path}' {' '.join(all_arguments)}" else: url_pattern = f'{sitetree_item.url}' if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. url_token = f'url {url_pattern} as item.url_resolved' url_tag( Parser([]), Token(token_type=TOKEN_BLOCK, contents=url_token) ).render(context) resolved_url = context['item.url_resolved'] or UNRESOLVED_ITEM_MARKER else: resolved_url = url_pattern self._items_urls[sitetree_item] = resolved_url return resolved_url
def url_optional(parser, token): """ Creates the default `URLNode`, then routes it through the optional resolver with the same properties by first creating the `URLNode`. The parsing stays in Django core where it belongs. """ urlnode = url_tag(parser, token) return URLNodeOptional(urlnode.view_name, urlnode.args, urlnode.kwargs, urlnode.asvar)
def breadcrumb_url(parser, token): """ Same as breadcrumb but instead of url context variable takes in all the arguments URL tag takes. {% breadcrumb "Title of breadcrumb" person_detail person.id %} {% breadcrumb person.name person_detail person.id %} """ bits = token.split_contents() if len(bits) == 2: return breadcrumb(parser, token) # Extract our extra title parameter title = bits.pop(1) token.contents = ' '.join(bits) url_node = url_tag(parser, token) return UrlBreadcrumbNode(title, url_node)
def url(self, sitetree_item, tag_arguments=None, context=None): """Resolves item's URL. 'sitetree_item' points to TreeItem object, 'url' property of which is processed as URL pattern or simple URL. 'tag_arguments' is a list of additional arguments passed to 'sitetree_url' in template. """ if tag_arguments is None: tag_arguments = [] else: # TODO Remove tag_arguments in 1.0. warnings.warn('Use of sitetree_url tag additional arguments is deprecated. Feature support will be completely removed in 1.0.', DeprecationWarning) if context is None: context = self._global_context if not isinstance(sitetree_item, TreeItem): sitetree_item = self.resolve_var(sitetree_item, context) # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: resolved_var = self.resolve_var(sitetree_item.url, context) # Check whether a template variable is used instead of a URL pattern. if resolved_var != sitetree_item.url: if not isinstance(resolved_var, six.string_types): # Variable contains what we're not expecting, revert to original URL. resolved_var = sitetree_item.url # TODO Remove template var resolution in 1.0. warnings.warn('Use of a template variable in URL field is deprecated. Feature support will be completely removed in 1.0.', DeprecationWarning) view_path = resolved_var all_arguments = copy(tag_arguments) if ' ' in resolved_var: view_path = resolved_var.split(' ') # We should try to resolve URL parameters from site tree item. for view_argument in view_path[1:]: resolved = self.resolve_var(view_argument) # In case of non-ascii data we leave variable unresolved. if isinstance(resolved, six.text_type): if resolved.encode('ascii', 'ignore').decode('ascii') != resolved: resolved = view_argument # URL parameters from site tree item should be concatenated with those from template. all_arguments.append('"%s"' % str(resolved)) # We enclose arg in double quotes as already resolved. view_path = view_path[0].strip('"\' ') if DJANGO_VERSION_INT >= 150: # "new-style" url tag - consider sitetree named urls literals. view_path = "'%s'" % view_path url_pattern = u'%s %s' % (view_path, ' '.join(all_arguments)) else: url_pattern = str(sitetree_item.url) tree_alias = sitetree_item.tree.alias entry_from_cache = self.get_cache_entry('urls', tree_alias) if not entry_from_cache: # Create 'cache_urls' for this tree. entry_from_cache = {} self.set_cache_entry('urls', tree_alias, {}) if url_pattern in entry_from_cache: resolved_url = entry_from_cache[url_pattern][0] else: if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. url_token = u'url %s as item.url_resolved' % url_pattern url_tag(template.Parser(None), template.Token(token_type=template.TOKEN_BLOCK, contents=url_token)).render(context) # We make an anchor link from an unresolved URL as a reminder. if not context['item.url_resolved']: resolved_url = u'#unresolved' else: resolved_url = context['item.url_resolved'] else: resolved_url = url_pattern self.update_cache_entry_value('urls', tree_alias, {url_pattern: (resolved_url, sitetree_item)}) return resolved_url
def url(self, sitetree_item, tag_arguments=[], context=None): """Resolves item's URL. 'sitetree_item' points to TreeItem object, 'url' property of which is processed as URL pattern or simple URL. 'tag_arguments' is a list of additional arguments passed to 'sitetree_url' in template. """ if context is None: context = self.global_context if not isinstance(sitetree_item, TreeItem): sitetree_item = self.resolve_var(sitetree_item, context) # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: resolved_var = self.resolve_var(sitetree_item.url, context) if isinstance(resolved_var, list): raise SiteTreeError('Named URL for "%s" sitetree item clashes with template variable name. Please change either name.' % sitetree_item.title) view_path = resolved_var.split(' ') # We should try to resolve URL parameters from site tree item. view_arguments = [] for view_argument in view_path[1:]: resolved = self.resolve_var(view_argument) # In case of non-ascii data we leave variable unresolved. if isinstance(resolved, unicode): if resolved.encode('ascii', 'ignore').decode('ascii') != resolved: resolved = view_argument view_arguments.append(resolved) # URL parameters from site tree item should be concatenated with # those from template. arguments_couled = tag_arguments + view_arguments view_arguments = [] for argument in arguments_couled: argument = str(argument) # To be able to process slug-like strings (strings with "-"'s and "_"'s) # we enclose those in double quotes. if '-' in argument or '_': argument = '"%s"' % argument view_arguments.append(argument) view_arguments = ' '.join(view_arguments).strip() view_path = view_path[0] url_pattern = u'%s %s' % (view_path, view_arguments) else: url_pattern = u'%s' % sitetree_item.url url_pattern = url_pattern.strip() # Create 'cache_urls' for this tree. tree_alias = sitetree_item.tree.alias entry_from_cache = self.get_cache_entry('urls', tree_alias) if not entry_from_cache: entry_from_cache = {} self.set_cache_entry('urls', tree_alias, {}) if url_pattern in entry_from_cache: resolved_url = entry_from_cache[url_pattern][0] else: if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. url_token = u'url %s as item.url_resolved' % url_pattern url_tag(template.Parser(None), template.Token(token_type=template.TOKEN_BLOCK, contents=url_token)).render(context) # We make an anchor link from an unresolved URL as a reminder. if context['item.url_resolved'] == '': resolved_url = u'#unresolved' else: resolved_url = context['item.url_resolved'] else: resolved_url = url_pattern self.update_cache_entry_value('urls', tree_alias, {url_pattern: (resolved_url, sitetree_item)}) return resolved_url
def url(self, sitetree_item, context=None): """Resolves item's URL. 'sitetree_item' points to TreeItem object, 'url' property of which is processed as URL pattern or simple URL. """ if context is None: context = self._global_context if not isinstance(sitetree_item, MODEL_TREE_ITEM_CLASS): sitetree_item = self.resolve_var(sitetree_item, context) # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: url = sitetree_item.url view_path = url all_arguments = [] if ' ' in url: view_path = url.split(' ') # We should try to resolve URL parameters from site tree item. for view_argument in view_path[1:]: resolved = self.resolve_var(view_argument) # In case of non-ascii data we leave variable unresolved. if isinstance(resolved, six.text_type): if resolved.encode('ascii', 'ignore').decode('ascii') != resolved: resolved = view_argument # URL parameters from site tree item should be concatenated with those from template. all_arguments.append('"%s"' % str(resolved)) # We enclose arg in double quotes as already resolved. view_path = view_path[0].strip('"\' ') if VERSION >= (1, 5, 0): # "new-style" url tag - consider sitetree named urls literals. view_path = "'%s'" % view_path url_pattern = '%s %s' % (view_path, ' '.join(all_arguments)) else: url_pattern = str(sitetree_item.url) tree_alias = sitetree_item.tree.alias entry_from_cache = self.get_cache_entry('urls', tree_alias) if not entry_from_cache: # Create 'cache_urls' for this tree. entry_from_cache = {} self.set_cache_entry('urls', tree_alias, {}) if url_pattern in entry_from_cache: resolved_url = entry_from_cache[url_pattern][0] else: if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. url_token = 'url %s as item.url_resolved' % url_pattern url_tag(template.Parser(None), template.Token(token_type=template.TOKEN_BLOCK, contents=url_token)).render(context) # We make an anchor link from an unresolved URL as a reminder. if not context['item.url_resolved']: resolved_url = UNRESOLVED_ITEM_MARKER else: resolved_url = context['item.url_resolved'] else: resolved_url = url_pattern self.update_cache_entry_value('urls', tree_alias, {url_pattern: (resolved_url, sitetree_item)}) return resolved_url
def url(parser, token): validator = url_tag(parser, token) return SmartURLNode(validator.view_name, validator.args, validator.kwargs, validator.asvar)
def url(self, sitetree_item, tag_arguments=None, context=None): """Resolves item's URL. 'sitetree_item' points to TreeItem object, 'url' property of which is processed as URL pattern or simple URL. 'tag_arguments' is a list of additional arguments passed to 'sitetree_url' in template. """ if tag_arguments is None: tag_arguments = [] else: # TODO Remove tag_arguments in 1.0. warnings.warn( 'Use of sitetree_url tag additional arguments is deprecated. Feature support will be completely removed in 1.0.', DeprecationWarning) if context is None: context = self._global_context if not isinstance(sitetree_item, TreeItem): sitetree_item = self.resolve_var(sitetree_item, context) # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: resolved_var = self.resolve_var(sitetree_item.url, context) # Check whether a template variable is used instead of a URL pattern. if resolved_var != sitetree_item.url: if not isinstance( resolved_var, six.string_types ): # Variable contains what we're not expecting, revert to original URL. resolved_var = sitetree_item.url # TODO Remove template var resolution in 1.0. warnings.warn( 'Use of a template variable in URL field is deprecated. Feature support will be completely removed in 1.0.', DeprecationWarning) view_path = resolved_var all_arguments = copy(tag_arguments) if ' ' in resolved_var: view_path = resolved_var.split(' ') # We should try to resolve URL parameters from site tree item. for view_argument in view_path[1:]: resolved = self.resolve_var(view_argument) # In case of non-ascii data we leave variable unresolved. if isinstance(resolved, six.text_type): if resolved.encode( 'ascii', 'ignore').decode('ascii') != resolved: resolved = view_argument # URL parameters from site tree item should be concatenated with those from template. all_arguments.append( '"%s"' % str(resolved) ) # We enclose arg in double quotes as already resolved. view_path = view_path[0].strip('"\' ') if DJANGO_VERSION_INT >= 150: # "new-style" url tag - consider sitetree named urls literals. view_path = "'%s'" % view_path url_pattern = u'%s %s' % (view_path, ' '.join(all_arguments)) else: url_pattern = str(sitetree_item.url) tree_alias = sitetree_item.tree.alias entry_from_cache = self.get_cache_entry('urls', tree_alias) if not entry_from_cache: # Create 'cache_urls' for this tree. entry_from_cache = {} self.set_cache_entry('urls', tree_alias, {}) if url_pattern in entry_from_cache: resolved_url = entry_from_cache[url_pattern][0] else: if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. url_token = u'url %s as item.url_resolved' % url_pattern url_tag( template.Parser(None), template.Token(token_type=template.TOKEN_BLOCK, contents=url_token)).render(context) # We make an anchor link from an unresolved URL as a reminder. if not context['item.url_resolved']: resolved_url = u'#unresolved' else: resolved_url = context['item.url_resolved'] else: resolved_url = url_pattern self.update_cache_entry_value( 'urls', tree_alias, {url_pattern: (resolved_url, sitetree_item)}) return resolved_url
def url(self, sitetree_item, context=None): """Resolves item's URL. 'sitetree_item' points to TreeItem object, 'url' property of which is processed as URL pattern or simple URL. """ if context is None: context = self._global_context if not isinstance(sitetree_item, MODEL_TREE_ITEM_CLASS): sitetree_item = self.resolve_var(sitetree_item, context) # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: url = sitetree_item.url view_path = url all_arguments = [] if " " in url: view_path = url.split(" ") # We should try to resolve URL parameters from site tree item. for view_argument in view_path[1:]: resolved = self.resolve_var(view_argument) # In case of non-ascii data we leave variable unresolved. if isinstance(resolved, six.text_type): if resolved.encode("ascii", "ignore").decode("ascii") != resolved: resolved = view_argument # We enclose arg in double quotes as already resolved. all_arguments.append('"%s"' % str(resolved)) view_path = view_path[0].strip("\"' ") if VERSION >= (1, 5, 0): # "new-style" url tag - consider sitetree named urls literals. view_path = "'%s'" % view_path url_pattern = "%s %s" % (view_path, " ".join(all_arguments)) else: url_pattern = str(sitetree_item.url.encode("utf-8")) # i18n_patterns compatibility organized using compound cache key. cache_key = "%s%s" % (sitetree_item.tree.alias, self.lang_get()) entry_from_cache = self.get_cache_entry("urls", cache_key) if not entry_from_cache: # Create 'cache_urls' for this tree. entry_from_cache = {} self.set_cache_entry("urls", cache_key, {}) if url_pattern in entry_from_cache: resolved_url = entry_from_cache[url_pattern][0] else: if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. url_token = "url %s as item.url_resolved" % url_pattern url_tag(Parser(None), Token(token_type=TOKEN_BLOCK, contents=url_token)).render(context) # We make an anchor link from an unresolved URL as a reminder. if not context["item.url_resolved"]: resolved_url = UNRESOLVED_ITEM_MARKER else: resolved_url = context["item.url_resolved"] else: resolved_url = url_pattern self.update_cache_entry_value("urls", cache_key, {url_pattern: (resolved_url, sitetree_item)}) return resolved_url
def url(self, sitetree_item, context=None, url_kwargs=None): """Resolves item's URL. :param TreeItemBase sitetree_item: TreeItemBase heir object, 'url' property of which is processed as URL pattern or simple URL. :param Context context: :rtype: str|unicode """ context = context or self.current_page_context if not isinstance(sitetree_item, MODEL_TREE_ITEM_CLASS): sitetree_item = self.resolve_var(sitetree_item, context) resolved_url = self._items_urls.get(sitetree_item) if resolved_url is not None: if not url_kwargs: return resolved_url if '?P' not in resolved_url: return resolved_url # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: url = sitetree_item.url view_path = url all_arguments = [] if ' ' in url: view_path = url.split(' ') # We should try to resolve URL parameters from site tree item. for view_argument in view_path[1:]: resolved = self.resolve_var(view_argument) # In case of non-ascii data we leave variable unresolved. if isinstance(resolved, six.text_type): if resolved.encode( 'ascii', 'ignore').decode('ascii') != resolved: resolved = view_argument # We enclose arg in double quotes as already resolved. all_arguments.append('"%s"' % resolved) view_path = view_path[0].strip('"\' ') if _URL_TAG_NEW_STYLE: view_path = "'%s'" % view_path url_pattern = '%s %s' % (view_path, ' '.join(all_arguments)) else: url_pattern = '%s' % sitetree_item.url if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. if url_kwargs: url_kwargs = ','.join( ["{}='{}'".format(k, v) for k, v in url_kwargs.items()]) url_token = 'url {} {} as item.url_resolved'.format( url_pattern, url_kwargs) else: url_token = 'url {} as item.url_resolved'.format(url_pattern) url_tag(Parser(None), Token(token_type=TOKEN_BLOCK, contents=url_token)).render(context) resolved_url = context['item.url_resolved'] if not resolved_url: url_pattern = url_pattern[1:-2] resolved_url = hooks_by_gram.url_soft(url_pattern) if not resolved_url: resolved_url = UNRESOLVED_ITEM_MARKER else: resolved_url = url_pattern self._items_urls[sitetree_item] = resolved_url return resolved_url
def url(self, sitetree_item, context=None): """Resolves item's URL. 'sitetree_item' points to TreeItem object, 'url' property of which is processed as URL pattern or simple URL. """ if context is None: context = self._global_context if not isinstance(sitetree_item, MODEL_TREE_ITEM_CLASS): sitetree_item = self.resolve_var(sitetree_item, context) # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: url = sitetree_item.url view_path = url all_arguments = [] if ' ' in url: view_path = url.split(' ') # We should try to resolve URL parameters from site tree item. for view_argument in view_path[1:]: resolved = self.resolve_var(view_argument) # In case of non-ascii data we leave variable unresolved. if isinstance(resolved, six.text_type): if resolved.encode('ascii', 'ignore').decode('ascii') != resolved: resolved = view_argument # We enclose arg in double quotes as already resolved. all_arguments.append('"%s"' % str(resolved)) view_path = view_path[0].strip('"\' ') if VERSION >= (1, 5, 0): # "new-style" url tag - consider sitetree named urls literals. view_path = "'%s'" % view_path url_pattern = u'%s %s' % (view_path, ' '.join(all_arguments)) else: url_pattern = str(sitetree_item.url) # i18n_patterns compatibility organized using compound cache key. cache_key = '%s%s' % (sitetree_item.tree.alias, self.lang_get()) entry_from_cache = self.get_cache_entry('urls', cache_key) if not entry_from_cache: # Create 'cache_urls' for this tree. entry_from_cache = {} self.set_cache_entry('urls', cache_key, {}) if url_pattern in entry_from_cache: resolved_url = entry_from_cache[url_pattern][0] else: if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. url_token = u'url %s as item.url_resolved' % url_pattern url_tag( Parser(None), Token(token_type=TOKEN_BLOCK, contents=url_token) ).render(context) # We make an anchor link from an unresolved URL as a reminder. if not context['item.url_resolved']: resolved_url = UNRESOLVED_ITEM_MARKER else: resolved_url = context['item.url_resolved'] else: resolved_url = url_pattern self.update_cache_entry_value('urls', cache_key, {url_pattern: (resolved_url, sitetree_item)}) return resolved_url
def url(self, sitetree_item, tag_arguments=[], context=None): """Resolves item's URL. 'sitetree_item' points to TreeItem object, 'url' property of which is processed as URL pattern or simple URL. 'tag_arguments' id a list of additional arguments passed to 'sitetree_url' in template. """ if context is None: context = self.global_context if not isinstance(sitetree_item, TreeItem): sitetree_item = self.resolve_var(sitetree_item, context) # Resolve only if item's URL is marked as pattern if sitetree_item.urlaspattern: view_path = self.resolve_var(sitetree_item.url, context).split(' ') # We should try to resolve URL parameters from site tree item view_arguments = [] for view_argument in view_path[1:]: resolved = self.resolve_var(view_argument) # In case of non-ascii data we leave variable unresolved if isinstance(resolved, unicode): if resolved.encode("ascii", "ignore").decode("ascii") != resolved: resolved = view_argument view_arguments.append(resolved) # URL parameters from site tree item should be concatenated with # those from template. view_arguments = tag_arguments + view_arguments view_arguments = [ str(view_argument) for view_argument in view_arguments] view_arguments = ' '.join(view_arguments).strip() view_path = view_path[0] url_pattern = u'%s %s' % (view_path, view_arguments) else: url_pattern = u'%s' % (sitetree_item.url) # Create 'cache_urls' for this tree tree_alias = sitetree_item.tree.alias if not self.cache_urls.has_key(tree_alias): self.cache_urls[tree_alias] = {} if url_pattern in self.cache_urls[tree_alias]: resolved_url = self.cache_urls[tree_alias][url_pattern][0] else: if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag url_token = u'url %s as item.url_resolved' % (url_pattern) url_tag(template.Parser(None), template.Token(token_type=template.TOKEN_BLOCK, contents=url_token)).render(context) # We make an anchor link from an unresolved URL as a reminder if context['item.url_resolved'] == '': resolved_url = u'#unresolved' else: resolved_url = context['item.url_resolved'] else: resolved_url = url_pattern self.cache_urls[tree_alias][url_pattern] = (resolved_url, sitetree_item) return resolved_url
def url(self, sitetree_item, tag_arguments=[], context=None): """Resolves item's URL. 'sitetree_item' points to TreeItem object, 'url' property of which is processed as URL pattern or simple URL. 'tag_arguments' id a list of additional arguments passed to 'sitetree_url' in template. """ if context is None: context = self.global_context if not isinstance(sitetree_item, TreeItem): sitetree_item = self.resolve_var(sitetree_item, context) # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: resolved_var = self.resolve_var(sitetree_item.url, context) if isinstance(resolved_var, (list, QuerySet)): # needs for correct work with Django 1.3 generic CBV ListView and the same # if template context contains variable with the same name as URL pattern resolved_var = sitetree_item.url view_path = resolved_var.split(" ") # We should try to resolve URL parameters from site tree item. view_arguments = [] for view_argument in view_path[1:]: resolved = self.resolve_var(view_argument) # In case of non-ascii data we leave variable unresolved. if isinstance(resolved, unicode): if resolved.encode("ascii", "ignore").decode("ascii") != resolved: resolved = view_argument view_arguments.append(resolved) # URL parameters from site tree item should be concatenated with # those from template. view_arguments = tag_arguments + view_arguments view_arguments = [str(view_argument) for view_argument in view_arguments] view_arguments = " ".join(view_arguments).strip() view_path = view_path[0] url_pattern = u"%s %s" % (view_path, view_arguments) else: url_pattern = u"%s" % sitetree_item.url url_pattern = url_pattern.strip() # Create 'cache_urls' for this tree. tree_alias = sitetree_item.tree.alias if tree_alias not in self.cache_urls: self.cache_urls[tree_alias] = {} if url_pattern in self.cache_urls[tree_alias]: resolved_url = self.cache_urls[tree_alias][url_pattern][0] else: if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. url_token = u"url %s as item.url_resolved" % url_pattern url_tag( template.Parser(None), template.Token(token_type=template.TOKEN_BLOCK, contents=url_token) ).render(context) # We make an anchor link from an unresolved URL as a reminder. if context["item.url_resolved"] == "": resolved_url = u"#unresolved" else: resolved_url = context["item.url_resolved"] else: resolved_url = url_pattern self.cache_urls[tree_alias][url_pattern] = (resolved_url, sitetree_item) return resolved_url
def contextual_url(*args, **kwargs): urlnode = url_tag(*args, **kwargs) return ContextualURLNode(urlnode)
def url(self, sitetree_item, tag_arguments=[], context=None): """Resolves item's URL. 'sitetree_item' points to TreeItem object, 'url' property of which is processed as URL pattern or simple URL. 'tag_arguments' is a list of additional arguments passed to 'sitetree_url' in template. """ if context is None: context = self.global_context if not isinstance(sitetree_item, TreeItem): sitetree_item = self.resolve_var(sitetree_item, context) # Resolve only if item's URL is marked as pattern. if sitetree_item.urlaspattern: resolved_var = self.resolve_var(sitetree_item.url, context) if isinstance(resolved_var, list): raise SiteTreeError( 'Named URL for "%s" sitetree item clashes with template variable name. Please change either name.' % sitetree_item.title) view_path = resolved_var.split(' ') # We should try to resolve URL parameters from site tree item. view_arguments = [] for view_argument in view_path[1:]: resolved = self.resolve_var(view_argument) # In case of non-ascii data we leave variable unresolved. if isinstance(resolved, unicode): if resolved.encode('ascii', 'ignore').decode('ascii') != resolved: resolved = view_argument view_arguments.append(resolved) # URL parameters from site tree item should be concatenated with # those from template. arguments_couled = tag_arguments + view_arguments view_arguments = [] for argument in arguments_couled: argument = str(argument) # To be able to process slug-like strings (strings with "-"'s and "_"'s) # we enclose those in double quotes. if '-' in argument or '_': argument = '"%s"' % argument view_arguments.append(argument) view_arguments = ' '.join(view_arguments).strip() view_path = view_path[0] url_pattern = u'%s %s' % (view_path, view_arguments) else: url_pattern = u'%s' % sitetree_item.url url_pattern = url_pattern.strip() # Create 'cache_urls' for this tree. tree_alias = sitetree_item.tree.alias entry_from_cache = self.get_cache_entry('urls', tree_alias) if not entry_from_cache: entry_from_cache = {} self.set_cache_entry('urls', tree_alias, {}) if url_pattern in entry_from_cache: resolved_url = entry_from_cache[url_pattern][0] else: if sitetree_item.urlaspattern: # Form token to pass to Django 'url' tag. url_token = u'url %s as item.url_resolved' % url_pattern url_tag( template.Parser(None), template.Token(token_type=template.TOKEN_BLOCK, contents=url_token)).render(context) # We make an anchor link from an unresolved URL as a reminder. if context['item.url_resolved'] == '': resolved_url = u'#unresolved' else: resolved_url = context['item.url_resolved'] else: resolved_url = url_pattern self.update_cache_entry_value( 'urls', tree_alias, {url_pattern: (resolved_url, sitetree_item)}) return resolved_url