changeset 1193:523382549c45 beta

Added repo group page showing what reposiories are inside a group
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 01 Apr 2011 18:46:24 +0200
parents 01fe71db71f6
children 07963dd1f0f1
files rhodecode/controllers/admin/repos_groups.py rhodecode/model/db.py rhodecode/model/scm.py rhodecode/templates/admin/repos_groups/repos_groups.html
diffstat 4 files changed, 167 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/admin/repos_groups.py	Fri Apr 01 18:08:30 2011 +0200
+++ b/rhodecode/controllers/admin/repos_groups.py	Fri Apr 01 18:46:24 2011 +0200
@@ -1,9 +1,11 @@
 import logging
+from operator import itemgetter
 
 from pylons import request, response, session, tmpl_context as c, url
 from pylons.controllers.util import abort, redirect
 
 from rhodecode.lib.base import BaseController, render
+from rhodecode.model.db import Group
 
 log = logging.getLogger(__name__)
 
@@ -47,6 +49,43 @@
         """GET /repos_groups/id: Show a specific item"""
         # url('repos_group', id=ID)
 
+        c.group = Group.get(id)
+        if c.group:
+            c.group_repos = c.group.repositories
+        else:
+            return redirect(url('repos_group'))
+
+        sortables = ['name', 'description', 'last_change', 'tip', 'owner']
+        current_sort = request.GET.get('sort', 'name')
+        current_sort_slug = current_sort.replace('-', '')
+
+        if current_sort_slug not in sortables:
+            c.sort_by = 'name'
+            current_sort_slug = c.sort_by
+        else:
+            c.sort_by = current_sort
+        c.sort_slug = current_sort_slug
+
+        sort_key = current_sort_slug + '_sort'
+
+
+        #overwrite our cached list with current filter
+        gr_filter = [r.repo_name for r in c.group_repos]
+        c.cached_repo_list = self.scm_model.get_repos(all_repos=gr_filter)
+
+        if c.sort_by.startswith('-'):
+            c.repos_list = sorted(c.cached_repo_list, key=itemgetter(sort_key),
+                                  reverse=True)
+        else:
+            c.repos_list = sorted(c.cached_repo_list, key=itemgetter(sort_key),
+                                  reverse=False)
+
+        c.repo_cnt = len(c.repos_list)
+
+
+        return render('admin/repos_groups/repos_groups.html')
+
+
     def edit(self, id, format='html'):
         """GET /repos_groups/id/edit: Form to edit an existing item"""
         # url('edit_repos_group', id=ID)
--- a/rhodecode/model/db.py	Fri Apr 01 18:08:30 2011 +0200
+++ b/rhodecode/model/db.py	Fri Apr 01 18:46:24 2011 +0200
@@ -270,6 +270,10 @@
             groups.insert(0, gr)
         return groups
 
+    @property
+    def repositories(self):
+        return Session.query(Repository).filter(Repository.group == self).all()
+
 class Permission(Base):
     __tablename__ = 'permissions'
     __table_args__ = {'useexisting':True}
--- a/rhodecode/model/scm.py	Fri Apr 01 18:08:30 2011 +0200
+++ b/rhodecode/model/scm.py	Fri Apr 01 18:46:24 2011 +0200
@@ -125,8 +125,9 @@
             this have to be a list of  just the repository names
         """
         if all_repos is None:
-            all_repos = [r.repo_name for r in self.sa.query(Repository)\
-                .order_by(Repository.repo_name).all()]
+            repos = self.sa.query(Repository)\
+                        .order_by(Repository.repo_name).all()
+            all_repos = [r.repo_name for r in repos]
 
         #get the repositories that should be invalidated
         invalidation_list = [str(x.cache_key) for x in \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/templates/admin/repos_groups/repos_groups.html	Fri Apr 01 18:46:24 2011 +0200
@@ -0,0 +1,121 @@
+## -*- coding: utf-8 -*-
+<%inherit file="/base/base.html"/>
+
+<%def name="title()">
+    ${_('Repository group')} - ${c.rhodecode_name}
+</%def>
+
+
+<%def name="breadcrumbs_links()">
+    ${_('Group')} &raquo; ${c.group.group_name} - ${_(' %s repositories' % c.repo_cnt)} 
+</%def>
+<%def name="page_nav()">
+    ${self.menu('admin')}
+</%def>
+<%def name="main()">
+    <%def name="get_sort(name)">
+        <%name_slug = name.lower().replace(' ','_') %>
+        
+        %if name_slug == c.sort_slug:
+          %if c.sort_by.startswith('-'):
+            <a href="?sort=${name_slug}">${name}&uarr;</a>
+          %else:
+            <a href="?sort=-${name_slug}">${name}&darr;</a>
+          %endif:
+        %else:
+            <a href="?sort=${name_slug}">${name}</a>
+        %endif
+    </%def>
+<div class="box">
+    <!-- box / title -->
+    <div class="title">
+        ${self.breadcrumbs()}       
+    </div>
+    <!-- end box / title -->
+        <div class="table">
+            <table>
+            <thead>
+                <tr>
+                    <th class="left">${get_sort(_('Name'))}</th>
+                    <th class="left">${get_sort(_('Description'))}</th>
+                    <th class="left">${get_sort(_('Last change'))}</th>
+                    <th class="left">${get_sort(_('Tip'))}</th>
+                    <th class="left">${get_sort(_('Owner'))}</th>
+                    <th class="left">${_('RSS')}</th>
+                    <th class="left">${_('Atom')}</th>
+                </tr>
+            </thead>
+            <tbody>
+            %for cnt,repo in enumerate(c.repos_list):
+                <tr class="parity${cnt%2}">
+                    <td>
+                    <div style="white-space: nowrap">
+                     ## TYPE OF REPO
+                     %if repo['dbrepo']['repo_type'] =='hg':
+                       <img class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="${h.url("/images/icons/hgicon.png")}"/>
+                     %elif repo['dbrepo']['repo_type'] =='git':
+                       <img class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="${h.url("/images/icons/giticon.png")}"/>
+                     %else:
+                       
+                     %endif 
+                    
+                     ##PRIVATE/PUBLIC
+                     %if repo['dbrepo']['private']:
+                        <img class="icon" title="${_('private repository')}" alt="${_('private repository')}" src="${h.url("/images/icons/lock.png")}"/>
+                     %else:
+                        <img class="icon" title="${_('public repository')}" alt="${_('public repository')}" src="${h.url("/images/icons/lock_open.png")}"/>
+                     %endif
+                    
+                    ##NAME   
+                    ${h.link_to(repo['name'],
+                        h.url('summary_home',repo_name=repo['name']),class_="repo_name")}
+                    %if repo['dbrepo_fork']:
+                        <a href="${h.url('summary_home',repo_name=repo['dbrepo_fork']['repo_name'])}">
+                        <img class="icon" alt="${_('fork')}"
+                        title="${_('Fork of')} ${repo['dbrepo_fork']['repo_name']}" 
+                        src="${h.url("/images/icons/arrow_divide.png")}"/></a>
+                    %endif
+                    </div>
+                    </td>
+                    ##DESCRIPTION
+                    <td><span class="tooltip" title="${h.tooltip(repo['description'])}">
+                       ${h.truncate(repo['description'],60)}</span>
+                    </td>
+                    ##LAST CHANGE
+                    <td>
+                      <span class="tooltip" title="${repo['last_change']}">
+                      ${h.age(repo['last_change'])}</span>
+                    </td>
+                    <td>
+                        %if repo['rev']>=0:
+                        ${h.link_to('r%s:%s' % (repo['rev'],h.short_id(repo['tip'])),
+                        h.url('changeset_home',repo_name=repo['name'],revision=repo['tip']),
+                        class_="tooltip",
+                        title=h.tooltip(repo['last_msg']))}
+                        %else:
+                            ${_('No changesets yet')}
+                        %endif    
+                    </td>
+                    <td title="${repo['contact']}">${h.person(repo['contact'])}</td>
+                    <td>
+                      %if c.rhodecode_user.username != 'default':
+                        <a title="${_('Subscribe to %s rss feed')%repo['name']}" class="rss_icon"  href="${h.url('rss_feed_home',repo_name=repo['name'],api_key=c.rhodecode_user.api_key)}"></a>
+                      %else:
+                        <a title="${_('Subscribe to %s rss feed')%repo['name']}" class="rss_icon"  href="${h.url('rss_feed_home',repo_name=repo['name'])}"></a>
+                      %endif:                       
+                    </td>        
+                    <td>
+                      %if c.rhodecode_user.username != 'default':
+                        <a title="${_('Subscribe to %s atom feed')%repo['name']}"  class="atom_icon" href="${h.url('atom_feed_home',repo_name=repo['name'],api_key=c.rhodecode_user.api_key)}"></a>
+                      %else:
+                        <a title="${_('Subscribe to %s atom feed')%repo['name']}"  class="atom_icon" href="${h.url('atom_feed_home',repo_name=repo['name'])}"></a>
+                      %endif:
+                    </td>
+                </tr>
+            %endfor
+            </tbody>
+            </table>
+            </div>
+</div> 
+           
+</%def>