changeset 735:dbec976d9975 beta

added action loggers to following repositories, refactoring of repo_model get functions
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 22 Nov 2010 15:49:04 +0100
parents 49eb69d78988
children ab5c09715127
files rhodecode/controllers/admin/repos.py rhodecode/controllers/journal.py rhodecode/controllers/settings.py rhodecode/lib/helpers.py rhodecode/lib/utils.py rhodecode/model/forms.py rhodecode/model/repo.py rhodecode/model/scm.py
diffstat 8 files changed, 70 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/admin/repos.py	Mon Nov 22 03:57:47 2010 +0100
+++ b/rhodecode/controllers/admin/repos.py	Mon Nov 22 15:49:04 2010 +0100
@@ -140,7 +140,7 @@
                               changed_name, '', self.sa)
 
         except formencode.Invalid, errors:
-            c.repo_info = repo_model.get(repo_name)
+            c.repo_info = repo_model.get_by_repo_name(repo_name)
             c.users_array = repo_model.get_users_js()
             errors.value.update({'user':c.repo_info.user.username})
             return htmlfill.render(
@@ -168,7 +168,7 @@
         # url('repo', repo_name=ID)
 
         repo_model = RepoModel()
-        repo = repo_model.get(repo_name)
+        repo = repo_model.get_by_repo_name(repo_name)
         if not repo:
             h.flash(_('%s repository is not mapped to db perhaps'
                       ' it was moved or renamed  from the filesystem'
@@ -245,7 +245,7 @@
         """GET /repos/repo_name/edit: Form to edit an existing item"""
         # url('edit_repo', repo_name=ID)
         repo_model = RepoModel()
-        c.repo_info = repo = repo_model.get(repo_name)
+        c.repo_info = repo = repo_model.get_by_repo_name(repo_name)
         if repo.stats:
             last_rev = repo.stats.stat_on_revision
         else:
--- a/rhodecode/controllers/journal.py	Mon Nov 22 03:57:47 2010 +0100
+++ b/rhodecode/controllers/journal.py	Mon Nov 22 15:49:04 2010 +0100
@@ -28,6 +28,7 @@
 from rhodecode.lib.auth import LoginRequired
 from rhodecode.lib.base import BaseController, render
 from rhodecode.lib.helpers import get_token
+from rhodecode.lib.utils import action_logger
 from rhodecode.model.db import UserLog, UserFollowing
 from rhodecode.model.scm import ScmModel
 import logging
@@ -56,7 +57,6 @@
 
 
     def toggle_following(self):
-        print c.rhodecode_user
 
         if request.POST.get('auth_token') == get_token():
             scm_model = ScmModel()
--- a/rhodecode/controllers/settings.py	Mon Nov 22 03:57:47 2010 +0100
+++ b/rhodecode/controllers/settings.py	Mon Nov 22 15:49:04 2010 +0100
@@ -47,7 +47,7 @@
 
     def index(self, repo_name):
         repo_model = RepoModel()
-        c.repo_info = repo = repo_model.get(repo_name)
+        c.repo_info = repo = repo_model.get_by_repo_name(repo_name)
         if not repo:
             h.flash(_('%s repository is not mapped to db perhaps'
                       ' it was created or renamed from the filesystem'
@@ -85,7 +85,7 @@
             action_logger(self.rhodecode_user, 'user_updated_repo',
                               changed_name, '', self.sa)
         except formencode.Invalid, errors:
-            c.repo_info = repo_model.get(repo_name)
+            c.repo_info = repo_model.get_by_repo_name(repo_name)
             c.users_array = repo_model.get_users_js()
             errors.value.update({'user':c.repo_info.user.username})
             return htmlfill.render(
@@ -113,7 +113,7 @@
         # url('repo_settings_delete', repo_name=ID)
 
         repo_model = RepoModel()
-        repo = repo_model.get(repo_name)
+        repo = repo_model.get_by_repo_name(repo_name)
         if not repo:
             h.flash(_('%s repository is not mapped to db perhaps'
                       ' it was moved or renamed  from the filesystem'
@@ -136,7 +136,7 @@
 
     def fork(self, repo_name):
         repo_model = RepoModel()
-        c.repo_info = repo = repo_model.get(repo_name)
+        c.repo_info = repo = repo_model.get_by_repo_name(repo_name)
         if not repo:
             h.flash(_('%s repository is not mapped to db perhaps'
                       ' it was created or renamed from the filesystem'
@@ -152,7 +152,7 @@
 
     def fork_create(self, repo_name):
         repo_model = RepoModel()
-        c.repo_info = repo_model.get(repo_name)
+        c.repo_info = repo_model.get_by_repo_name(repo_name)
         _form = RepoForkForm(old_data={'repo_type':c.repo_info.repo_type})()
         form_result = {}
         try:
--- a/rhodecode/lib/helpers.py	Mon Nov 22 03:57:47 2010 +0100
+++ b/rhodecode/lib/helpers.py	Mon Nov 22 15:49:04 2010 +0100
@@ -459,7 +459,10 @@
            'admin_forked_repo':_('Admin forked repository'),
            'admin_updated_repo':_('Admin updated repository'),
            'push':_('Pushed') + get_cs_links(),
-           'pull':_('Pulled'), }
+           'pull':_('Pulled'),
+           'started_following_repo':_('User started following repository'),
+           'stopped_following_repo':_('User stopped following repository'),
+            }
 
     return map.get(action, action)
 
--- a/rhodecode/lib/utils.py	Mon Nov 22 03:57:47 2010 +0100
+++ b/rhodecode/lib/utils.py	Mon Nov 22 15:49:04 2010 +0100
@@ -70,13 +70,14 @@
 
 def action_logger(user, action, repo, ipaddr='', sa=None):
     """
-    Action logger for various action made by users
+    Action logger for various actions made by users
     
-    :param user: user that made this action, can be a string unique username or
+    :param user: user that made this action, can be a unique username string or
         object containing user_id attribute
     :param action: action to log, should be on of predefined unique actions for
         easy translations
-    :param repo: repository that action was made on
+    :param repo: string name of repository or object containing repo_id,
+        that action was made on
     :param ipaddr: optional ip address from what the action was made
     :param sa: optional sqlalchemy session
     
@@ -86,20 +87,22 @@
         sa = meta.Session()
 
     try:
+        um = UserModel()
         if hasattr(user, 'user_id'):
             user_obj = user
         elif isinstance(user, basestring):
-            user_obj = UserModel().get_by_username(user, cache=False)
+            user_obj = um.get_by_username(user, cache=False)
         else:
             raise Exception('You have to provide user object or username')
 
 
-        if repo:
+        rm = RepoModel()
+        if hasattr(repo, 'repo_id'):
+            repo_obj = rm.get(repo.repo_id, cache=False)
+            repo_name = repo_obj.repo_name
+        elif  isinstance(repo, basestring):
             repo_name = repo.lstrip('/')
-
-            repository = RepoModel().get(repo_name, cache=False)
-            if not repository:
-                raise Exception('You have to provide valid repository')
+            repo_obj = rm.get_by_repo_name(repo_name, cache=False)
         else:
             raise Exception('You have to provide repository to action logger')
 
@@ -107,8 +110,10 @@
         user_log = UserLog()
         user_log.user_id = user_obj.user_id
         user_log.action = action
+        
+        user_log.repository_id = repo_obj.repo_id
         user_log.repository_name = repo_name
-        user_log.repository = repository
+        
         user_log.action_date = datetime.datetime.now()
         user_log.user_ip = ipaddr
         sa.add(user_log)
@@ -352,7 +357,7 @@
     user = sa.query(User).filter(User.admin == True).first()
 
     for name, repo in initial_repo_list.items():
-        if not rm.get(name, cache=False):
+        if not rm.get_by_repo_name(name, cache=False):
             log.info('repository %s not found creating default', name)
 
             form_data = {
--- a/rhodecode/model/forms.py	Mon Nov 22 03:57:47 2010 +0100
+++ b/rhodecode/model/forms.py	Mon Nov 22 15:49:04 2010 +0100
@@ -170,7 +170,7 @@
                 raise formencode.Invalid(_('This repository name is disallowed'),
                                          value, state)
             if old_data.get('repo_name') != value or not edit:
-                if RepoModel().get(slug, cache=False):
+                if RepoModel().get_by_repo_name(slug, cache=False):
                     raise formencode.Invalid(_('This repository already exists') ,
                                              value, state)
             return slug
--- a/rhodecode/model/repo.py	Mon Nov 22 03:57:47 2010 +0100
+++ b/rhodecode/model/repo.py	Mon Nov 22 15:49:04 2010 +0100
@@ -42,13 +42,23 @@
 
     def get(self, repo_id, cache=False):
         repo = self.sa.query(Repository)\
-            .filter(Repository.repo_name == repo_id)
+            .filter(Repository.repo_id == repo_id)
 
         if cache:
             repo = repo.options(FromCache("sql_cache_short",
-                                          "get_repo_%s" % repo))
+                                          "get_repo_%s" % repo_id))
         return repo.scalar()
 
+
+    def get_by_repo_name(self, repo_name, cache=False):
+        repo = self.sa.query(Repository)\
+            .filter(Repository.repo_name == repo_name)
+
+        if cache:
+            repo = repo.options(FromCache("sql_cache_short",
+                                          "get_repo_%s" % repo_name))
+        return repo.scalar()        
+
     def get_users_js(self):
 
         users = self.sa.query(User).filter(User.active == True).all()
@@ -65,19 +75,21 @@
             #update permissions
             for username, perm in form_data['perms_updates']:
                 r2p = self.sa.query(RepoToPerm)\
-                        .filter(RepoToPerm.user == UserModel().get_by_username(username, cache=False))\
-                        .filter(RepoToPerm.repository == self.get(repo_name))\
+                        .filter(RepoToPerm.user == UserModel()\
+                                .get_by_username(username, cache=False))\
+                        .filter(RepoToPerm.repository == \
+                                self.get_by_repo_name(repo_name))\
                         .one()
 
                 r2p.permission_id = self.sa.query(Permission).filter(
-                                                Permission.permission_name ==
+                                                Permission.permission_name == 
                                                 perm).one().permission_id
                 self.sa.add(r2p)
 
             #set new permissions
             for username, perm in form_data['perms_new']:
                 r2p = RepoToPerm()
-                r2p.repository = self.get(repo_name)
+                r2p.repository = self.get_by_repo_name(repo_name)
                 r2p.user = UserModel().get_by_username(username, cache=False)
 
                 r2p.permission_id = self.sa.query(Permission).filter(
@@ -86,7 +98,7 @@
                 self.sa.add(r2p)
 
             #update current repo
-            cur_repo = self.get(repo_name, cache=False)
+            cur_repo = self.get_by_repo_name(repo_name, cache=False)
 
             for k, v in form_data.items():
                 if k == 'user':
@@ -172,7 +184,8 @@
     def delete_perm_user(self, form_data, repo_name):
         try:
             self.sa.query(RepoToPerm)\
-                .filter(RepoToPerm.repository == self.get(repo_name))\
+                .filter(RepoToPerm.repository \
+                        == self.get_by_repo_name(repo_name))\
                 .filter(RepoToPerm.user_id == form_data['user_id']).delete()
             self.sa.commit()
         except:
@@ -183,7 +196,8 @@
     def delete_stats(self, repo_name):
         try:
             self.sa.query(Statistics)\
-                .filter(Statistics.repository == self.get(repo_name)).delete()
+                .filter(Statistics.repository == \
+                        self.get_by_repo_name(repo_name)).delete()
             self.sa.commit()
         except:
             log.error(traceback.format_exc())
--- a/rhodecode/model/scm.py	Mon Nov 22 03:57:47 2010 +0100
+++ b/rhodecode/model/scm.py	Mon Nov 22 15:49:04 2010 +0100
@@ -27,7 +27,7 @@
 from rhodecode import BACKENDS
 from rhodecode.lib import helpers as h
 from rhodecode.lib.auth import HasRepoPermissionAny
-from rhodecode.lib.utils import get_repos, make_ui
+from rhodecode.lib.utils import get_repos, make_ui, action_logger
 from rhodecode.model import meta
 from rhodecode.model.db import Repository, User, RhodeCodeUi, CacheInvalidation, \
     UserFollowing
@@ -45,6 +45,15 @@
 
 log = logging.getLogger(__name__)
 
+class UserTemp(object):
+    def __init__(self, user_id):
+        self.user_id = user_id
+
+class RepoTemp(object):
+    def __init__(self, repo_id):
+        self.repo_id = repo_id
+        
+           
 class ScmModel(object):
     """
     Mercurial Model
@@ -227,9 +236,13 @@
             .filter(UserFollowing.user_id == user_id).scalar()
 
         if f is not None:
+                    
             try:
                 self.sa.delete(f)
                 self.sa.commit()
+                action_logger(UserTemp(user_id),
+                              'stopped_following_repo',
+                              RepoTemp(follow_repo_id))                
                 return
             except:
                 log.error(traceback.format_exc())
@@ -243,6 +256,9 @@
             f.follows_repo_id = follow_repo_id
             self.sa.add(f)
             self.sa.commit()
+            action_logger(UserTemp(user_id),
+                          'started_following_repo',
+                          RepoTemp(follow_repo_id))             
         except:
             log.error(traceback.format_exc())
             self.sa.rollback()