diff -r 6dad90b78770 -r 8595c1129c74 app/soc/logic/site/page.py --- a/app/soc/logic/site/page.py Sat Oct 18 01:00:10 2008 +0000 +++ b/app/soc/logic/site/page.py Sat Oct 18 01:32:40 2008 +0000 @@ -66,10 +66,15 @@ self.name = name self.prefix = prefix - def makeDjangoUrl(self): - """Returns a Django url() used by urlpatterns. + def makeDjangoUrl(self, **extra_kwargs): + """Returns a Django url() used by urlpatterns, or None if not a view. """ - return defaults.url(self.regex, self.view, kwargs=self.kwargs, + if not self.view: + return None + + kwargs = copy.deepcopy(self.kwargs) + kwargs.update(extra_kwargs) + return defaults.url(self.regex, self.view, kwargs=kwargs, name=self.name, prefix=self.prefix) _STR_FMT = '''%(indent)sregex: %(regex)s @@ -154,7 +159,7 @@ def getChildren(self): """Returns an iterator over any child Pages """ - for page, _ in self.child_by_urls.itervalues(): + for page in self.child_by_views.itervalues(): yield page children = property(getChildren) @@ -224,15 +229,17 @@ url = page.url - if not isinstance(url.regex, basestring): - raise ValueError('"regex" must be a string, not a compiled regex') + if url.regex: + if not isinstance(url.regex, basestring): + raise ValueError('"regex" must be a string, not a compiled regex') - # TODO(tlarsen): see if Django has some way exposed in its API to get - # the view name from the request path matched against urlpatterns; - # if so, there would be no need for child_by_urls, because the - # request path could be converted for us by Django into a view/name, - # and we could just use child_by_views with that string instead - self.child_by_urls[url.regex] = (page, re.compile(url.regex)) + # TODO(tlarsen): see if Django has some way exposed in its API to get + # the view name from the request path matched against urlpatterns; + # if so, there would be no need for child_by_urls, because the + # request path could be converted for us by Django into a view/name, + # and we could just use child_by_views with that string instead + self.child_by_urls[url.regex] = (page, re.compile(url.regex)) + # else: NonUrl does not get indexed by regex, because it has none # TODO(tlarsen): make this work correctly if url has a prefix # (not sure how to make this work with include() views...) @@ -289,8 +296,9 @@ elif name in self.child_views: regex = self.child_by_views[name].url.regex - # regex must refer to an existing Page at this point - del self.child_urls[regex] + if regex: + # regex must refer to an existing Page at this point + del self.child_urls[regex] if not isinstance(view, basestring): # use name if view is callable() or None, etc. @@ -318,6 +326,9 @@ link = self.url.regex + if not link: + return None + if link.startswith('^'): link = link[1:] @@ -360,7 +371,7 @@ def makeDjangoUrl(self): """Returns the Django url() for the underlying self.url. """ - return self.url.makeDjangoUrl() + return self.url.makeDjangoUrl(page=self) def makeDjangoUrls(self): """Returns an ordered mapping of unique Django url() objects. @@ -379,9 +390,11 @@ Used to implement makeDjangoUrls(). See that method for details. """ urlpatterns = NoOverwriteSortedDict() + + django_url = self.makeDjangoUrl() - if self.url.view: - urlpatterns[self.url.regex] = self.makeDjangoUrl() + if django_url: + urlpatterns[self.url.regex] = django_url for child in self.children: urlpatterns.update(child._makeDjangoUrlsDict()) @@ -418,3 +431,32 @@ """Returns a string representation useful for logging. """ return self.asIndentedStr() + + +class NonUrl(Url): + """Placeholder for when a site-map entry is not a linkable URL. + """ + + def __init__(self, name): + """Creates a non-linkable Url placeholder. + + Args: + name: name of the non-view placeholder + """ + Url.__init__(self, None, None, name=name) + + def makeDjangoUrl(self, **extra_kwargs): + """Always returns None, since NonUrl is never a Django view. + """ + return None + + +class NonPage(Page): + """Placeholder for when a site-map entry is not a displayable page. + """ + + def __init__(self, non_url_name, long_name, **page_kwargs): + """ + """ + non_url = NonUrl(non_url_name) + Page.__init__(self, non_url, long_name, **page_kwargs)