aboutsummaryrefslogtreecommitdiff
path: root/rhodecode/model/repo.py
diff options
context:
space:
mode:
Diffstat (limited to 'rhodecode/model/repo.py')
-rw-r--r--rhodecode/model/repo.py110
1 files changed, 108 insertions, 2 deletions
diff --git a/rhodecode/model/repo.py b/rhodecode/model/repo.py
index 79536c7e..18db88ce 100644
--- a/rhodecode/model/repo.py
+++ b/rhodecode/model/repo.py
@@ -41,6 +41,7 @@ from rhodecode.model.db import Repository, UserRepoToPerm, User, Permission, \
Statistics, UsersGroup, UsersGroupRepoToPerm, RhodeCodeUi, RepoGroup,\
RhodeCodeSetting
from rhodecode.lib import helpers as h
+from rhodecode.lib.auth import HasRepoPermissionAny
log = logging.getLogger(__name__)
@@ -89,6 +90,22 @@ class RepoModel(BaseModel):
"get_repo_%s" % repo_name))
return repo.scalar()
+ def get_all_user_repos(self, user):
+ """
+ Get's all repositories that user have at least read access
+
+ :param user:
+ :type user:
+ """
+ from rhodecode.lib.auth import AuthUser
+ user = self._get_user(user)
+ repos = AuthUser(user_id=user.user_id).permissions['repositories']
+ access_check = lambda r: r[1] in ['repository.read',
+ 'repository.write',
+ 'repository.admin']
+ repos = [x[0] for x in filter(access_check, repos.items())]
+ return Repository.query().filter(Repository.repo_name.in_(repos))
+
def get_users_js(self):
users = self.sa.query(User).filter(User.active == True).all()
return json.dumps([
@@ -113,6 +130,95 @@ class RepoModel(BaseModel):
} for gr in users_groups]
)
+ @classmethod
+ def _render_datatable(cls, tmpl, *args, **kwargs):
+ import rhodecode
+ from pylons import tmpl_context as c
+ from pylons.i18n.translation import _
+
+ _tmpl_lookup = rhodecode.CONFIG['pylons.app_globals'].mako_lookup
+ template = _tmpl_lookup.get_template('data_table/_dt_elements.html')
+
+ tmpl = template.get_def(tmpl)
+ kwargs.update(dict(_=_, h=h, c=c))
+ return tmpl.render(*args, **kwargs)
+
+ def get_repos_as_dict(self, repos_list=None, admin=False, perm_check=True):
+ _render = self._render_datatable
+
+ def quick_menu(repo_name):
+ return _render('quick_menu', repo_name)
+
+ def repo_lnk(name, rtype, private, fork_of):
+ return _render('repo_name', name, rtype, private, fork_of,
+ short_name=not admin, admin=False)
+
+ def last_change(last_change):
+ return _render("last_change", last_change)
+
+ def rss_lnk(repo_name):
+ return _render("rss", repo_name)
+
+ def atom_lnk(repo_name):
+ return _render("atom", repo_name)
+
+ def last_rev(repo_name, cs_cache):
+ return _render('revision', repo_name, cs_cache.get('revision'),
+ cs_cache.get('raw_id'), cs_cache.get('author'),
+ cs_cache.get('message'))
+
+ def desc(desc):
+ from pylons import tmpl_context as c
+ if c.visual.stylify_metatags:
+ return h.urlify_text(h.desc_stylize(h.truncate(desc, 60)))
+ else:
+ return h.urlify_text(h.truncate(desc, 60))
+
+ def repo_actions(repo_name):
+ return _render('repo_actions', repo_name)
+
+ def owner_actions(user_id, username):
+ return _render('user_name', user_id, username)
+
+ repos_data = []
+ for repo in repos_list:
+ if perm_check:
+ # check permission at this level
+ if not HasRepoPermissionAny(
+ 'repository.read', 'repository.write', 'repository.admin'
+ )(repo.repo_name, 'get_repos_as_dict check'):
+ continue
+ cs_cache = repo.changeset_cache
+ row = {
+ "menu": quick_menu(repo.repo_name),
+ "raw_name": repo.repo_name.lower(),
+ "name": repo_lnk(repo.repo_name, repo.repo_type,
+ repo.private, repo.fork),
+ "last_change": last_change(repo.last_db_change),
+ "last_changeset": last_rev(repo.repo_name, cs_cache),
+ "raw_tip": cs_cache.get('revision'),
+ "desc": desc(repo.description),
+ "owner": h.person(repo.user.username),
+ "rss": rss_lnk(repo.repo_name),
+ "atom": atom_lnk(repo.repo_name),
+
+ }
+ if admin:
+ row.update({
+ "action": repo_actions(repo.repo_name),
+ "owner": owner_actions(repo.user.user_id,
+ h.person(repo.user.username))
+ })
+ repos_data.append(row)
+
+ return {
+ "totalRecords": len(repos_list),
+ "startIndex": 0,
+ "sort": "name",
+ "dir": "asc",
+ "records": repos_data
+ }
+
def _get_defaults(self, repo_name):
"""
Get's information about repository, and returns a dict for
@@ -339,9 +445,9 @@ class RepoModel(BaseModel):
copy_fork_permissions = form_data.get('copy_permissions')
fork_of = form_data.get('fork_parent_id')
- ##defaults
+ ## repo creation defaults, private and repo_type are filled in form
defs = RhodeCodeSetting.get_default_repo_settings(strip_prefix=True)
- enable_statistics = defs.get('repo_enable_statistic')
+ enable_statistics = defs.get('repo_enable_statistics')
enable_locking = defs.get('repo_enable_locking')
enable_downloads = defs.get('repo_enable_downloads')