diff rhodecode/model/repo.py @ 3179:cd50d1b5f35b

merged with beta
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 21 Jan 2013 00:03:44 +0100
parents a5f0bc867edc 28571535dd61
children d1004dd51a66
line wrap: on
line diff
--- a/rhodecode/model/repo.py	Fri Dec 14 04:45:03 2012 +0100
+++ b/rhodecode/model/repo.py	Mon Jan 21 00:03:44 2013 +0100
@@ -41,6 +41,7 @@
     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 @@
                                           "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 @@
             } 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 @@
         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')