in Allura/allura/model/project.py [0:0]
def sitemap(self, excluded_tools=None, included_tools=None,
tools_only=False, per_tool_limit=SITEMAP_PER_TOOL_LIMIT, xml=False):
"""
Return the project sitemap.
:param list excluded_tools:
Tool names (AppConfig.tool_name) to exclude from sitemap.
:param list included_tools:
Tool names (AppConfig.tool_name) to include. Use `None` to
include all tool types.
:param bool tools_only:
Only include tools in the sitemap (exclude subprojects).
:param int per_tool_limit:
Max number of entries included in the sitemap for a single tool
type. Use `None` to include all.
:param bool xml:
If True, return sitemap entries for use in the sitemap.xml
instead of site navigation.
"""
from allura.app import SitemapEntry
entries = []
anchored_tools = self.neighborhood.get_anchored_tools()
i = len(anchored_tools)
new_tools = self.install_anchored_tools()
# Set menu mode
delta_ordinal = i
max_ordinal = i
# Keep running count of entries per tool type
tool_counts = Counter({tool_name: 0 for tool_name in g.entry_points['tool']})
if not tools_only:
for sub in self.direct_subprojects:
ordinal = sub.ordinal + delta_ordinal
if ordinal > max_ordinal:
max_ordinal = ordinal
mount_point = sub.shortname.split('/')[-1]
entries.append({'ordinal': sub.ordinal + delta_ordinal,
'entry': SitemapEntry(sub.name, sub.url(), mount_point=mount_point)})
for ac in self.app_configs + [a.config for a in new_tools]:
if per_tool_limit:
# We already have max entries for every tool type
if min(tool_counts.values()) >= per_tool_limit:
break
# We already have max entries for this tool type
if tool_counts.get(ac.tool_name, 0) >= per_tool_limit:
continue
if excluded_tools and ac.tool_name in excluded_tools:
continue
if included_tools and ac.tool_name not in included_tools:
continue
# Tool could've been uninstalled in the meantime
try:
App = ac.load()
# If so, we don't want it listed
except KeyError:
log.exception('AppConfig %s references invalid tool %s',
ac._id, ac.tool_name)
continue
if getattr(c, 'app', None) and c.app.config._id == ac._id:
# slight performance gain (depending on the app) by using the current app if we're on it
app = c.app
else:
app = App(self, ac)
if app.is_visible_to(c.user):
if xml:
sms = app.sitemap_xml()
else:
sms = app.main_menu()
for sm in sms:
entry = sm.bind_app(app)
entry.tool_name = ac.tool_name
entry.ui_icon = 'tool-%s' % entry.tool_name.lower()
if is_nofollow_url(entry.url):
entry.extra_html_attrs.update({'rel': 'nofollow'})
if not self.is_nbhd_project and (entry.tool_name.lower() in list(anchored_tools.keys())):
ordinal = list(anchored_tools.keys()).index(
entry.tool_name.lower())
elif ac.tool_name == 'admin':
ordinal = 100
else:
ordinal = int(ac.options.get('ordinal', 0)) + \
delta_ordinal
if self.is_nbhd_project and entry.label == 'Admin':
entry.matching_urls.append('%s_admin/' % self.url())
if ordinal > max_ordinal:
max_ordinal = ordinal
entries.append({'ordinal': ordinal, 'entry': entry})
tool_counts.update({ac.tool_name: 1})
if (not tools_only and
self == self.neighborhood.neighborhood_project and
h.has_access(self.neighborhood, 'admin')):
entries.append({
'ordinal': max_ordinal + 1,
'entry': SitemapEntry(
'Moderate',
"%s_moderate/" % self.neighborhood.url(),
ui_icon="tool-admin")
})
max_ordinal += 1
entries = sorted(entries, key=lambda e: e['ordinal'])
return [e['entry'] for e in entries]