def test_matches_url(self): request = Mock(upath_info='/p/project/tool/artifact') s1 = SitemapEntry('tool', url='/p/project/tool') s2 = SitemapEntry('tool2', url='/p/project/tool2') s3 = SitemapEntry('Tool', url='/p/project/_list/tool') s3.matching_urls.append('/p/project/tool') self.assertTrue(s1.matches_url(request)) self.assertFalse(s2.matches_url(request)) self.assertTrue(s3.matches_url(request))
def sidebar_menu(self): if not self.repo or self.repo.status != 'ready': return [] links = [SitemapEntry('Browse Commits', c.app.url + 'commit_browser', ui_icon=g.icons['browse_commits'])] if self.forkable and self.repo.status == 'ready' and not self.repo.is_empty(): links.append( SitemapEntry('Fork', c.app.url + 'fork', ui_icon=g.icons['fork'])) merge_request_count = self.repo.merge_requests_by_statuses( 'open').count() if merge_request_count: links += [ SitemapEntry( 'Merge Requests', c.app.url + 'merge-requests/', small=merge_request_count)] if self.repo.forks: links += [ SitemapEntry('Forks', c.app.url + 'forks/', small=len(self.repo.forks)) ] if self.repo.upstream_repo.name: repo_path_parts = self.repo.upstream_repo.name.strip( '/').split('/') links += [ SitemapEntry('Clone of'), SitemapEntry('%s / %s' % (repo_path_parts[1], repo_path_parts[-1]), self.repo.upstream_repo.name) ] if not c.app.repo.is_empty() and has_access(c.app.repo, 'admin'): merge_url = c.app.url + 'request_merge' if getattr(c, 'revision', None): merge_url = merge_url + '?branch=' + h.urlquote(c.revision) links.append(SitemapEntry('Request Merge', merge_url, ui_icon=g.icons['merge'], )) pending_upstream_merges = self.repo.pending_upstream_merges() if pending_upstream_merges: links.append(SitemapEntry( 'Pending Merges', self.repo.upstream_repo.name + 'merge-requests/', small=pending_upstream_merges)) ref_url = self.repo.url_for_commit( self.default_branch_name, url_type='ref') branches = self.repo.get_branches() if branches: links.append(SitemapEntry('Branches')) for branch in branches: if branch.name == self.default_branch_name: branches.remove(branch) branches.insert(0, branch) break max_branches = 10 for branch in branches[:max_branches]: links.append(SitemapEntry( branch.name, quote(self.repo.url_for_commit(branch.name) + 'tree/'))) if len(branches) > max_branches: links.append( SitemapEntry( 'More Branches', ref_url + 'branches/', )) tags = self.repo.get_tags() if tags: links.append(SitemapEntry('Tags')) max_tags = 10 for b in tags[:max_tags]: links.append(SitemapEntry( b.name, quote(self.repo.url_for_commit(b.name) + 'tree/'))) if len(tags) > max_tags: links.append( SitemapEntry( 'More Tags', ref_url + 'tags/', )) return links
def main_menu(self): return [SitemapEntry(self.config.options.mount_label, '.')]
def update_project_sidebar_menu(self, sidebar_links): base_url = c.project.url() + 'admin/ext/' link = SitemapEntry('Import', base_url + 'import/') sidebar_links.append(link)
def sidebar_menu(self): if not self.repo or self.repo.status != 'ready': return [] if self.default_branch_name: default_branch_url = ( c.app.url + url(quote(self.default_branch_name + self.END_OF_REF_ESCAPE)) + '/') else: default_branch_url = c.app.url links = [SitemapEntry('Browse Commits', c.app.url + 'commit_browser', ui_icon=g.icons['folder'])] if self.forkable and self.repo.status == 'ready': links.append(SitemapEntry('Fork', c.app.url + 'fork', ui_icon=g.icons['fork'])) merge_request_count = self.repo.merge_requests_by_statuses('open').count() if merge_request_count: links += [ SitemapEntry( 'Merge Requests', c.app.url + 'merge-requests/', small=merge_request_count) ] if self.repo.upstream_repo.name: repo_path_parts = self.repo.upstream_repo.name.strip('/').split('/') links += [ SitemapEntry('Clone of'), SitemapEntry('%s / %s' % (repo_path_parts[1], repo_path_parts[-1]), self.repo.upstream_repo.name) ] if len(c.app.repo.branches) and has_access(c.app.repo, 'admin'): links.append(SitemapEntry('Request Merge', c.app.url + 'request_merge', ui_icon=g.icons['merge'], )) pending_upstream_merges = self.repo.pending_upstream_merges() if pending_upstream_merges: links.append(SitemapEntry( 'Pending Merges', self.repo.upstream_repo.name + 'merge-requests/', small=pending_upstream_merges)) if self.repo.branches: links.append(SitemapEntry('Branches')) for b in self.repo.branches: links.append(SitemapEntry( b.name, url(c.app.url, dict(branch='ref/' + b.name)), small=b.count)) if self.repo.repo_tags: links.append(SitemapEntry('Tags')) max_tags = 10 for i, b in enumerate(self.repo.repo_tags): if i < max_tags: links.append(SitemapEntry( b.name, url(c.app.url, dict(branch='ref/' + b.name)), small=b.count)) elif i == max_tags: links.append( SitemapEntry( 'More Tags', default_branch_url+'tags/', )) break if self.repo.forks: links.append(SitemapEntry('Forks')) for f in self.repo.forks: repo_path_parts = f.url().strip('/').split('/') links.append(SitemapEntry( '%s / %s' % (repo_path_parts[1], repo_path_parts[-1]), f.url())) return links
def main_menu(self): '''Apps should provide their entries to be added to the main nav :return: a list of :class:`SitemapEntries <allura.app.SitemapEntry>` ''' return [SitemapEntry(self.config.options.mount_label, '.')]
def sidebar_menu(self): return [SitemapEntry('Configure', 'configuration')]
def sitemap(self, excluded_tools=None): """Return the project sitemap. :param list excluded_tools: tool names (AppConfig.tool_name) to exclude from sitemap """ from allura.app import SitemapEntry entries = [] # Set menu mode delta_ordinal = 0 max_ordinal = 0 if self.is_user_project: entries.append({ 'ordinal': delta_ordinal, 'entry': SitemapEntry('Profile', "%sprofile/" % self.url(), ui_icon="tool-home") }) max_ordinal = delta_ordinal delta_ordinal = delta_ordinal + 1 for sub in self.direct_subprojects: ordinal = sub.ordinal + delta_ordinal if ordinal > max_ordinal: max_ordinal = ordinal entries.append({ 'ordinal': sub.ordinal + delta_ordinal, 'entry': SitemapEntry(sub.name, sub.url()) }) for ac in self.app_configs: if excluded_tools and ac.tool_name in excluded_tools: continue App = ac.load() app = App(self, ac) if app.is_visible_to(c.user): for sm in app.main_menu(): entry = sm.bind_app(app) entry.ui_icon = 'tool-%s' % ac.tool_name.lower() ordinal = int(ac.options.get('ordinal', 0)) + delta_ordinal if ordinal > max_ordinal: max_ordinal = ordinal entries.append({'ordinal': ordinal, 'entry': entry}) if 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]
def sidebar_menu(self): links = [] admin_url = c.project.url() + 'admin/' if c.project.is_nbhd_project: links.append( SitemapEntry('Add Project', c.project.url() + 'add_project', ui_icon=g.icons['plus'])) nbhd_admin_url = c.project.neighborhood.url() + '_admin/' links = links + [ SitemapEntry('Neighborhood'), SitemapEntry('Overview', nbhd_admin_url + 'overview'), SitemapEntry('Awards', nbhd_admin_url + 'accolades') ] else: links += [ SitemapEntry('Metadata', admin_url + 'overview'), ] if c.project.neighborhood.name != "Users": links += [ SitemapEntry('Screenshots', admin_url + 'screenshots'), SitemapEntry('Categorization', admin_url + 'trove') ] links.append(SitemapEntry('Tools', admin_url + 'tools')) if c.project.is_root and has_access(c.project, 'admin')(): links.append( SitemapEntry('User Permissions', admin_url + 'groups/')) if not c.project.is_root and has_access(c.project, 'admin')(): links.append( SitemapEntry('Permissions', admin_url + 'permissions/')) if len(c.project.neighborhood_invitations): links.append( SitemapEntry('Invitation(s)', admin_url + 'invitations')) links.append(SitemapEntry('Audit Trail', admin_url + 'audit/')) if c.project.is_nbhd_project: links.append(SitemapEntry('Statistics', nbhd_admin_url + 'stats/')) links.append(None) links.append(SitemapEntry('Help', nbhd_admin_url + 'help/')) return links
def __init__(self, project, config): Application.__init__(self, project, config) self.root = ProjectAdminController() self.admin = AdminAppAdminController(self) self.templates = pkg_resources.resource_filename('allura.ext.admin', 'templates') self.sitemap = [ SitemapEntry('Admin','.')]
def sidebar_menu(self): if not self.repo or self.repo.status != 'ready': return [] links = [ SitemapEntry('Browse Commits', c.app.url + 'commit_browser', ui_icon=g.icons['folder']) ] if self.forkable and self.repo.status == 'ready': links.append( SitemapEntry('Fork', c.app.url + 'fork', ui_icon=g.icons['fork'])) merge_request_count = self.repo.merge_requests_by_statuses( 'open').count() if merge_request_count: links += [ SitemapEntry('Merge Requests', c.app.url + 'merge-requests/', small=merge_request_count) ] if self.repo.forks: links += [ SitemapEntry('Forks', c.app.url + 'forks/', small=len(self.repo.forks)) ] if self.repo.upstream_repo.name: repo_path_parts = self.repo.upstream_repo.name.strip('/').split( '/') links += [ SitemapEntry('Clone of'), SitemapEntry( '%s / %s' % (repo_path_parts[1], repo_path_parts[-1]), self.repo.upstream_repo.name) ] if len(c.app.repo.branches) and has_access(c.app.repo, 'admin'): links.append( SitemapEntry( 'Request Merge', c.app.url + 'request_merge', ui_icon=g.icons['merge'], )) pending_upstream_merges = self.repo.pending_upstream_merges() if pending_upstream_merges: links.append( SitemapEntry('Pending Merges', self.repo.upstream_repo.name + 'merge-requests/', small=pending_upstream_merges)) ref_url = self.repo.url_for_commit(self.default_branch_name, url_type='ref') if self.repo.branches: links.append(SitemapEntry('Branches')) max_branches = 10 for b in self.repo.branches[:max_branches]: links.append( SitemapEntry( b.name, quote(self.repo.url_for_commit(b.name) + 'tree/'), small=b.count)) if len(self.repo.branches) > max_branches: links.append( SitemapEntry( 'More Branches', ref_url + 'branches/', )) if self.repo.repo_tags: links.append(SitemapEntry('Tags')) max_tags = 10 for b in self.repo.repo_tags[:max_tags]: links.append( SitemapEntry( b.name, quote(self.repo.url_for_commit(b.name) + 'tree/'), small=b.count)) if len(self.repo.repo_tags) > max_tags: links.append(SitemapEntry( 'More Tags', ref_url + 'tags/', )) return links
def sitemap(self): menu_id = 'Home' return [SitemapEntry('Home', '..')]
def admin_menu(self): links = super(ForgeSVNApp, self).admin_menu() links.insert(1, SitemapEntry( 'Import Repo', c.project.url() + 'admin/' + self.config.options.mount_point + '/' + 'importer/')) return links
def sitemap(self): return [SitemapEntry('Home', '..')]
def sidebar_menu(self): if not self.repo or self.repo.status != 'ready': return [] links = [] if not self.repo.is_empty(): links.append( SitemapEntry('Browse Commits', c.app.url + 'commit_browser', ui_icon=g.icons['browse_commits'])) if self.forkable and self.repo.status == 'ready' and not self.repo.is_empty( ): links.append( SitemapEntry('Fork', c.app.url + 'fork', ui_icon=g.icons['fork'])) merge_request_count = self.repo.merge_requests_by_statuses( 'open').count() if self.forkable: links += [ SitemapEntry('Merge Requests', c.app.url + 'merge-requests/', small=merge_request_count) ] if self.repo.forks: links += [ SitemapEntry('Forks', c.app.url + 'forks/', small=len(self.repo.forks)) ] has_upstream_repo = False if self.repo.upstream_repo.name: try: self.repo.push_upstream_context() except Exception: log.warn( 'Could not get upstream repo (perhaps it is gone) for: %s %s', self.repo, self.repo.upstream_repo.name, exc_info=True) else: has_upstream_repo = True if has_upstream_repo: repo_path_parts = self.repo.upstream_repo.name.strip('/').split( '/') links += [ SitemapEntry('Clone of'), SitemapEntry( '%s / %s' % (repo_path_parts[1], repo_path_parts[-1]), self.repo.upstream_repo.name) ] if not c.app.repo.is_empty() and has_access(c.app.repo, 'admin'): merge_url = c.app.url + 'request_merge' if getattr(c, 'revision', None): merge_url = merge_url + '?branch=' + h.urlquote(c.revision) links.append( SitemapEntry( 'Request Merge', merge_url, ui_icon=g.icons['merge'], )) pending_upstream_merges = self.repo.pending_upstream_merges() if pending_upstream_merges: links.append( SitemapEntry('Pending Merges', self.repo.upstream_repo.name + 'merge-requests/', small=pending_upstream_merges)) ref_url = self.repo.url_for_commit(self.default_branch_name, url_type='ref') branches = self.repo.get_branches() if branches: links.append(SitemapEntry('Branches')) for branch in branches: if branch.name == self.default_branch_name: branches.remove(branch) branches.insert(0, branch) break max_branches = 10 for branch in branches[:max_branches]: links.append( SitemapEntry( branch.name, h.urlquote( self.repo.url_for_commit(branch.name) + 'tree/'))) if len(branches) > max_branches: links.append( SitemapEntry( 'More Branches', ref_url + 'branches/', )) elif not self.repo.is_empty(): # SVN repos, for example, should have a sidebar link to get to the main view links.append(SitemapEntry('Browse Files', c.app.url)) tags = self.repo.get_tags() if tags: links.append(SitemapEntry('Tags')) max_tags = 10 for b in tags[:max_tags]: links.append( SitemapEntry( b.name, h.urlquote(self.repo.url_for_commit(b.name) + 'tree/'))) if len(tags) > max_tags: links.append(SitemapEntry( 'More Tags', ref_url + 'tags/', )) return links
def sitemap(self): menu_id = self.config.options.mount_label return [SitemapEntry(menu_id, self.config.options.get('url') or '.')]
def sitemap(self, excluded_tools=None): """Return the project sitemap. :param list excluded_tools: tool names (AppConfig.tool_name) to exclude from sitemap """ from allura.app import SitemapEntry entries = [] anchored_tools = self.neighborhood.get_anchored_tools() i = len(anchored_tools) new_tools = self.install_anchored_tools() self.app_config('admin').options.ordinal = 100 # Set menu mode delta_ordinal = i max_ordinal = i for sub in self.direct_subprojects: ordinal = sub.ordinal + delta_ordinal if ordinal > max_ordinal: max_ordinal = ordinal entries.append({ 'ordinal': sub.ordinal + delta_ordinal, 'entry': SitemapEntry(sub.name, sub.url()) }) for ac in self.app_configs + [a.config for a in new_tools]: if excluded_tools and ac.tool_name in excluded_tools: continue # Tool could've been uninstalled in the meantime try: App = ac.load() # If so, we don't want it listed except KeyError as e: log.exception('AppConfig %s references invalid tool %s', ac._id, ac.tool_name) continue app = App(self, ac) if app.is_visible_to(c.user): for sm in app.main_menu(): entry = sm.bind_app(app) entry.tool_name = ac.tool_name entry.ui_icon = 'tool-%s' % entry.tool_name.lower() if not self.is_nbhd_project and (entry.tool_name.lower() in anchored_tools.keys()): ordinal = anchored_tools.keys().index( entry.tool_name.lower()) 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}) if 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]
def sidebar_menu(self): return [ SitemapEntry('Home', '.'), SitemapEntry('Search', 'search'), ]
def sitemap(self): menu_id = 'Home' return [SitemapEntry('Home', c.project.url())]
def sitemap(self): return [SitemapEntry('Profile', '.')]
def index(self, sort='alpha', limit=25, page=0, **kw): text = None if self.neighborhood.use_wiki_page_as_root: default_wiki_page = get_default_wiki_page() if default_wiki_page: text = default_wiki_page.html_text elif self.neighborhood.redirect: redirect(self.neighborhood.redirect) elif not self.neighborhood.has_home_tool: mount = c.project.ordered_mounts()[0] if mount is not None: if 'ac' in mount: redirect(mount['ac'].options.mount_point + '/') elif 'sub' in mount: redirect(mount['sub'].url()) else: redirect(c.project.app_configs[0].options.mount_point + '/') else: text = g.markdown.cached_convert(self.neighborhood, 'homepage'), c.project_summary = W.project_summary c.page_list = W.page_list limit, page, start = g.handle_paging(limit, page) pq = M.Project.query.find( dict( neighborhood_id=self.neighborhood._id, deleted=False, is_nbhd_project=False, )) if sort == 'alpha': pq.sort('name') else: pq.sort('last_updated', pymongo.DESCENDING) count = pq.count() nb_max_projects = self.neighborhood.get_max_projects() projects = pq.skip(start).limit(int(limit)).all() categories = M.ProjectCategory.query.find({ 'parent_id': None }).sort('name').all() c.custom_sidebar_menu = [] if h.has_access(self.neighborhood, 'register')() and (nb_max_projects is None or count < nb_max_projects): c.custom_sidebar_menu += [ SitemapEntry('Add a Project', self.neighborhood.url() + 'add_project', ui_icon=g.icons['add']), SitemapEntry('') ] c.custom_sidebar_menu = c.custom_sidebar_menu + [ SitemapEntry(cat.label, self.neighborhood.url() + 'browse/' + cat.name) for cat in categories ] return dict(neighborhood=self.neighborhood, title="Welcome to " + self.neighborhood.name, text=text, projects=projects, sort=sort, limit=limit, page=page, count=count)
def main_menu(self): return [SitemapEntry('Profile', '.')]
def sidebar_menu(self): try: l = [] moderate_link = None forum_links = [] forums = DM.Forum.query.find( dict(app_config_id=c.app.config._id, parent_id=None, deleted=False)) for f in forums: if has_access(f, 'read')(): if f.url() in request.url and h.has_access(f, 'moderate')(): num_moderate = DM.ForumPost.query.find({ 'discussion_id': f._id, 'status': { '$ne': 'ok' }, 'deleted': False, }).count() moderate_link = SitemapEntry( 'Moderate', "%smoderate/" % f.url(), ui_icon=g.icons['moderate'], small=num_moderate) forum_links.append( SitemapEntry(f.name, f.url(), small=f.num_topics)) url = c.app.url + 'create_topic/' url = h.urlquote(url + c.forum.shortname if getattr(c, 'forum', None) and c.forum else url) l.append(SitemapEntry('Create Topic', url, ui_icon=g.icons['add'])) if has_access(c.app, 'configure')(): l.append( SitemapEntry('Add Forum', c.app.url + 'new_forum', ui_icon=g.icons['conversation'])) l.append( SitemapEntry('Admin Forums', c.project.url() + 'admin/' + self.config.options.mount_point + '/forums', ui_icon=g.icons['admin'])) if moderate_link: l.append(moderate_link) # if we are in a thread and not anonymous, provide placeholder # links to use in js if '/thread/' in request.url and c.user not in ( None, M.User.anonymous()): l.append( SitemapEntry('Mark as Spam', 'flag_as_spam', ui_icon=g.icons['flag'], className='sidebar_thread_spam')) l.append( SitemapEntry('Stats Graph', c.app.url + 'stats', ui_icon=g.icons['stats'])) if forum_links: l.append(SitemapEntry('Forums')) l = l + forum_links l.append(SitemapEntry('Help')) l.append( SitemapEntry('Formatting Help', c.app.url + 'markdown_syntax')) return l except: # pragma no cover log.exception('sidebar_menu') return []
def update_sidebar_menu(self, links): links.append( SitemapEntry('Stats', '/nf/admin/stats', ui_icon=g.icons['stats']))
def sitemap(self): menu_id = self.config.options.mount_label return [SitemapEntry(menu_id, '.')[self.sidebar_menu()]]
def admin_menu(self): links = [ SitemapEntry('Settings', c.project.url() + 'userstats/settings') ] return links
def sitemap(self): menu_id = self.config.options.mount_label.title() with h.push_config(c, app=self): return [SitemapEntry(menu_id, '.')[self.sidebar_menu()]]
def main_menu(self): '''Apps should provide their entries to be added to the main nav :return: a list of :class:`SitemapEntries <allura.app.SitemapEntry>` ''' return [SitemapEntry('Admin', '.')]
def sidebar_menu(self): links = [] admin_url = c.project.url() + 'admin/' if c.project.is_nbhd_project: links.append(SitemapEntry('Add Project', c.project.url() + 'add_project', ui_icon=g.icons['add'])) nbhd_admin_url = c.project.neighborhood.url() + '_admin/' links = links + [ SitemapEntry('Neighborhood'), SitemapEntry('Overview', nbhd_admin_url + 'overview'), SitemapEntry('Awards', nbhd_admin_url + 'accolades')] else: links += [ SitemapEntry('Welcome', admin_url), SitemapEntry('Metadata', admin_url + 'overview', className="admin-nav-metadata"), ] if c.project.neighborhood.name != "Users": links += [ SitemapEntry('Screenshots', admin_url + 'screenshots'), SitemapEntry('Categorization', admin_url + 'trove') ] if plugin.ProjectRegistrationProvider.get().registration_date(c.project) < datetime(2016, 6, 1): # only show transitional Tools page to older projects that may be used to it # no point is showing it to new projects links.append(SitemapEntry('Tools', admin_url + 'tools_moved')) if asbool(config.get('bulk_export_enabled', True)): links.append(SitemapEntry('Export', admin_url + 'export')) if c.project.is_root and has_access(c.project, 'admin')(): links.append( SitemapEntry('User Permissions', admin_url + 'groups/', className="admin-nav-user-perms")) if not c.project.is_root and has_access(c.project, 'admin')(): links.append( SitemapEntry('Permissions', admin_url + 'permissions/')) if len(c.project.neighborhood_invitations): links.append( SitemapEntry('Invitation(s)', admin_url + 'invitations')) links.append(SitemapEntry('Audit Trail', admin_url + 'audit/')) if c.project.is_nbhd_project: links.append(SitemapEntry('Statistics', nbhd_admin_url + 'stats/')) links.append(None) links.append(SitemapEntry('Help', nbhd_admin_url + 'help/')) for ep_name in sorted(g.entry_points['admin'].keys()): admin_extension = g.entry_points['admin'][ep_name] admin_extension().update_project_sidebar_menu(links) return links
def update_sidebar_menu(self, links): enable_editing = config.get('trovecategories.enableediting', 'false') if enable_editing in ('admin', 'true'): links.append( SitemapEntry('Troves', '/categories', ui_icon=g.icons['admin']))