def expand_patterns(urlpatterns): new_patterns = [] def recursive_expand(patterns): for p in patterns: if getattr(p,'url_patterns',False): recursive_expand(p.url_patterns) else: new_patterns.append(p) recursive_expand(patterns) return new_patterns # Example usage, a Sitemap class class StaticSitemap(Sitemap): """Return the static sitemap items""" priority = 0.4 changefreq = 'yearly' def __init__(self, patterns): self.patterns = expand_patterns(patterns) self._items = {} self._initialize() def _initialize(self): do_not_show = ['logout','admin','login'] for p in self.patterns: if [url for url in do_not_show if url in p.regex.pattern]: # do not show urls with this word in them continue if p.regex.groups: # do not show dynamic urls, we handle those in another Sitemap class continue if 'template_name' in p.default_args or 'template' in p.default_args : # only urls with templates, because we get mtime from the file if getattr(p,'name',False): # only views with names so reverse() can work on them self._items[p.name] = self._get_modification_date(p) def _get_modification_date(self, p): # We get the modification date from the template itself if getattr(p,'default_args',None): if 'template_name' in p.default_args: template = p.default_args['template_name'] elif 'template' in p.default_args: template = p.default_args['template'] template_path = self._get_template_path(template) mtime = os.stat(template_path).st_mtime return datetime.datetime.fromtimestamp(mtime) def _get_template_path(self, template_path): for template_dir in settings.TEMPLATE_DIRS: path = os.path.join(template_dir, template_path) if os.path.exists(path): return path return None def items(self): return self._items.keys() def changefreq(self, obj): return 'monthly' #Todo unhardcode this, somehow def lastmod(self, obj): return self._items[obj] def location(self, obj): return urlresolvers.reverse(obj)