Changeset - 7a46d67c263c
[Not reviewed]
beta
0 2 0
Marcin Kuzminski - 14 years ago 2011-07-22 20:06:40
marcin@python-works.com
added welcome message if no repositories are present in current view
2 files changed with 27 insertions and 12 deletions:
0 comments (0 inline, 0 general)
rhodecode/model/scm.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
"""
 
    rhodecode.model.scm
 
    ~~~~~~~~~~~~~~~~~~~
 

	
 
    Scm model for RhodeCode
 

	
 
    :created_on: Apr 9, 2010
 
    :author: marcink
 
    :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
 
    :license: GPLv3, see COPYING for more details.
 
"""
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
import os
 
import time
 
import traceback
 
import logging
 

	
 
from sqlalchemy.exc import DatabaseError
 

	
 
from vcs import get_backend
 
from vcs.utils.helpers import get_scm
 
from vcs.exceptions import RepositoryError, VCSError
 
from vcs.exceptions import RepositoryError
 
from vcs.utils.lazy import LazyProperty
 
from vcs.nodes import FileNode
 

	
 
from rhodecode import BACKENDS
 
from rhodecode.lib import helpers as h
 
from rhodecode.lib import safe_str
 
from rhodecode.lib.auth import HasRepoPermissionAny
 
from rhodecode.lib.utils import get_repos as get_filesystem_repos, make_ui, \
 
    action_logger
 
from rhodecode.model import BaseModel
 
from rhodecode.model.user import UserModel
 
from rhodecode.model.db import Repository, RhodeCodeUi, CacheInvalidation, \
 
    UserFollowing, UserLog
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
class UserTemp(object):
 
    def __init__(self, user_id):
 
        self.user_id = user_id
 

	
 
    def __repr__(self):
 
        return "<%s('id:%s')>" % (self.__class__.__name__, self.user_id)
 

	
 

	
 
class RepoTemp(object):
 
    def __init__(self, repo_id):
 
        self.repo_id = repo_id
 

	
 
    def __repr__(self):
 
        return "<%s('id:%s')>" % (self.__class__.__name__, self.repo_id)
 

	
 
class CachedRepoList(object):
 

	
 
    def __init__(self, db_repo_list, repos_path, order_by=None):
 
        self.db_repo_list = db_repo_list
 
        self.repos_path = repos_path
 
        self.order_by = order_by
 
        self.reversed = (order_by or '').startswith('-')
 

	
 
    def __len__(self):
 
        return len(self.db_repo_list)
 

	
 
    def __repr__(self):
 
        return '<%s (%s)>' % (self.__class__.__name__, self.__len__())
 

	
 
    def __iter__(self):
 
        for dbr in self.db_repo_list:
 

	
 
            scmr = dbr.scm_instance_cached
 

	
 
            #check permission at this level
 
            if not HasRepoPermissionAny('repository.read',
 
                                        'repository.write',
 
            # check permission at this level
 
            if not HasRepoPermissionAny('repository.read', 'repository.write',
 
                                        'repository.admin')(dbr.repo_name,
 
                                                            'get repo check'):
 
                continue
 

	
 

	
 
            if scmr is None:
 
                log.error('%s this repository is present in database but it '
 
                          'cannot be created as an scm instance',
 
                          dbr.repo_name)
 
                continue
 

	
 

	
 
            last_change = scmr.last_change
 
            tip = h.get_changeset_safe(scmr, 'tip')
 

	
 
            tmp_d = {}
 
            tmp_d['name'] = dbr.repo_name
 
            tmp_d['name_sort'] = tmp_d['name'].lower()
 
            tmp_d['description'] = dbr.description
 
            tmp_d['description_sort'] = tmp_d['description']
 
            tmp_d['last_change'] = last_change
 
            tmp_d['last_change_sort'] = time.mktime(last_change \
 
                                                    .timetuple())
 
            tmp_d['tip'] = tip.raw_id
 
            tmp_d['tip_sort'] = tip.revision
 
            tmp_d['rev'] = tip.revision
 
            tmp_d['contact'] = dbr.user.full_contact
 
            tmp_d['contact_sort'] = tmp_d['contact']
 
            tmp_d['owner_sort'] = tmp_d['contact']
 
            tmp_d['repo_archives'] = list(scmr._get_archives())
 
            tmp_d['last_msg'] = tip.message
 
            tmp_d['repo'] = scmr
 
            tmp_d['dbrepo'] = dbr.get_dict()
 
            tmp_d['dbrepo_fork'] = dbr.fork.get_dict() if dbr.fork \
 
                                                                    else {}
 
            yield tmp_d
 

	
 
class ScmModel(BaseModel):
 
    """Generic Scm Model
 
    """
 

	
 
    @LazyProperty
 
    def repos_path(self):
 
        """Get's the repositories root path from database
 
        """
 

	
 
        q = self.sa.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/').one()
 

	
 
        return q.ui_value
 

	
 
    def repo_scan(self, repos_path=None):
 
        """Listing of repositories in given path. This path should not be a
 
        repository itself. Return a dictionary of repository objects
 

	
 
        :param repos_path: path to directory containing repositories
 
        """
 

	
 
        log.info('scanning for repositories in %s', repos_path)
 

	
 
        if repos_path is None:
rhodecode/templates/index_base.html
Show inline comments
 
<%page args="parent" /> 
 
    <%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">
 
            <h5><input class="top-right-rounded-corner top-left-rounded-corner 
 
                               bottom-left-rounded-corner bottom-right-rounded-corner" 
 
                        id="q_filter" size="15" type="text" name="filter" 
 
                        value="${_('quick filter...')}"/>
 
            ${parent.breadcrumbs()} <span id="repo_count"></span> ${_('repositories')} 
 
            </h5>
 
            %if c.rhodecode_user.username != 'default':
 
                %if h.HasPermissionAny('hg.admin','hg.create.repository')():
 
                <ul class="links">
 
                  <li>
 
                    <span>${h.link_to(_('ADD NEW REPOSITORY'),h.url('admin_settings_create_repository'))}</span>
 
                  </li>          
 
                </ul>           
 
                %endif
 
            %endif
 
        </div>
 
        <!-- end box / title -->
 
        <div class="table">
 
           % if c.groups:
 
            <table>
 
                <thead>
 
                    <tr>
 
                        <th class="left"><a href="#">${_('Group name')}</a></th>
 
                        <th class="left"><a href="#">${_('Description')}</a></th>
 
                        <th class="left"><a href="#">${_('Number of repositories')}</a></th>
 
                        ##<th class="left"><a href="#">${_('Number of repositories')}</a></th>
 
                    </tr>
 
                </thead>
 
                
 
                ## REPO GROUPS
 
                
 
                % for gr in c.groups:
 
                  <tr>
 
                      <td>
 
                          <div style="white-space: nowrap">
 
                          <img class="icon" alt="${_('Repositories group')}" src="${h.url('/images/icons/database_link.png')}"/>
 
                          ${h.link_to(gr.group_name,url('repos_group',id=gr.group_id))}
 
                          </div>
 
                      </td>
 
                      <td>${gr.group_description}</td>
 
                      <td><b>${gr.repositories.count()}</b></td>
 
                      ##<td><b>${gr.repositories.count()}</b></td>
 
                  </tr>
 
                % endfor
 
                
 
            </table>
 
            <div style="height: 20px"></div>
 
            % endif
 
            <table>
 
            <div id="welcome" style="display:none;text-align:center">
 
                <h1><a href="${h.url('home')}">${c.rhodecode_name} ${c.rhodecode_version}</a></h1>
 
            </div>
 
            <table id="repos_list">
 
            <thead>
 
                <tr>
 
                    <th class="left"></th>
 
                    <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 class="quick_repo_menu">
 
                    <ul class="menu_items hidden">
 
                      <li>
 
                         <a title="${_('Summary')}" href="${h.url('summary_home',repo_name=repo['name'])}">
 
                         <span class="icon">
 
                             <img src="${h.url('/images/icons/clipboard_16.png')}" alt="${_('Summary')}" />
 
                         </span>
 
                         <span>${_('Summary')}</span>                 
 
                         </a>             
 
                      </li>
 
                      <li>
 
                         <a title="${_('Changelog')}" href="${h.url('changelog_home',repo_name=repo['name'])}">
 
                         <span class="icon">
 
                             <img src="${h.url('/images/icons/time.png')}" alt="${_('Changelog')}" />
 
                         </span>
 
                         <span>${_('Changelog')}</span>                 
 
                         </a>             
 
                      </li>
 
                      <li>
 
                         <a title="${_('Files')}" href="${h.url('files_home',repo_name=repo['name'])}">
 
                         <span class="icon">
 
                             <img src="${h.url('/images/icons/file.png')}" alt="${_('Files')}" />
 
                         </span>
 
                         <span>${_('Files')}</span>                 
 
                         </a>             
 
                      </li>                                    
 
                    </ul>
 
                    </td>
 
                    <td>
 
                    ## TYPE OF REPO
 
                    <div style="white-space: nowrap">
 
                     %if repo['dbrepo']['repo_type'] =='hg':
 
                       <img class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="${h.url('/images/icons/hgicon.png')}"/>
 
@@ -145,83 +148,99 @@
 
                    <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>
 
    
 
    
 
    <script type="text/javascript">
 
     var D = YAHOO.util.Dom;
 
     var E = YAHOO.util.Event;
 
     var S = YAHOO.util.Selector;
 
     
 
     var q_filter = D.get('q_filter');
 
     var F = YAHOO.namespace('q_filter'); 
 
     
 
     E.on(q_filter,'click',function(){
 
        q_filter.value = '';
 
     });
 

	
 
     F.filterTimeout = null;
 
     
 
     function set_count(count){
 
    
 
    	 if(count == 0){
 
    		 YUD.setStyle('repos_list','display','none');
 
    		 YUD.setStyle('welcome','display','');
 
    	 }
 
    	 else{
 
    		 YUD.setStyle('repos_list','display','');
 
    		 YUD.setStyle('welcome','display','none');
 
    	 }
 
    	 YUD.get('repo_count').innerHTML = count;
 
    	 
 
     }
 
     
 
     
 
     //set initial count for repos
 
     var nodes = S.query('div.table tr td div a.repo_name');
 
     YUD.get('repo_count').innerHTML = nodes.length;
 
     
 
     set_count(nodes.length)
 
     F.updateFilter  = function() { 
 
        // Reset timeout 
 
        F.filterTimeout = null;
 
        
 
        var obsolete = [];
 
        nodes = S.query('div.table tr td div a.repo_name');
 
        var req = q_filter.value.toLowerCase();
 
        for (n in nodes){
 
            D.setStyle(nodes[n].parentNode.parentNode.parentNode,'display','')
 
        }
 
        if (req){
 
            for (n in nodes){
 
                if (nodes[n].innerHTML.toLowerCase().indexOf(req) == -1) {
 
                    obsolete.push(nodes[n]); 
 
                }
 
            }
 
            if(obsolete){
 
                for (n in obsolete){
 
                    D.setStyle(obsolete[n].parentNode.parentNode.parentNode,'display','none');
 
                }
 
            }
 
        }
 
        // set new count into dashboard
 
        YUD.get('repo_count').innerHTML = nodes.length - obsolete.length;      
 
        set_count(nodes.length - obsolete.length)
 
     }
 
     
 
     E.on(q_filter,'keyup',function(e){
 
         clearTimeout(F.filterTimeout); 
 
         setTimeout(F.updateFilter,600); 
 
     });
 
     
 
    </script>
0 comments (0 inline, 0 general)