changeset 536:39203995f2c4

made action logger more global, to be used in other places to log other actions. cleaned unused import in simpleHG, fixed little logging in hooks
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 02 Oct 2010 01:52:43 +0200
parents 72778dda34cf
children 48be953851fc
files pylons_app/lib/hooks.py pylons_app/lib/middleware/simplehg.py pylons_app/lib/utils.py pylons_app/model/db.py pylons_app/templates/admin/admin_log.html
diffstat 5 files changed, 47 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/pylons_app/lib/hooks.py	Fri Oct 01 03:04:52 2010 +0200
+++ b/pylons_app/lib/hooks.py	Sat Oct 02 01:52:43 2010 +0200
@@ -63,10 +63,10 @@
         username = kwargs['url'].split(':')[-1]
         user_log = sa.query(UserLog)\
             .filter(UserLog.user == sa.query(User)\
-                                        .filter(User.username == username).one())\
+                                    .filter(User.username == username).one())\
             .order_by(UserLog.user_log_id.desc()).first()
-            
-        if not user_log.revision:
+        
+        if user_log and not user_log.revision:
             user_log.revision = str(repo['tip'])
             sa.add(user_log)
             sa.commit()
--- a/pylons_app/lib/middleware/simplehg.py	Fri Oct 01 03:04:52 2010 +0200
+++ b/pylons_app/lib/middleware/simplehg.py	Sat Oct 02 01:52:43 2010 +0200
@@ -24,7 +24,6 @@
 SimpleHG middleware for handling mercurial protocol request (push/clone etc.)
 It's implemented with basic auth function
 """
-from datetime import datetime
 from itertools import chain
 from mercurial.error import RepoError
 from mercurial.hgweb import hgweb
@@ -35,12 +34,10 @@
     get_user_cached
 from pylons_app.lib.utils import is_mercurial, make_ui, invalidate_cache, \
     check_repo_fast, ui_sections
-from pylons_app.model import meta
-from pylons_app.model.db import UserLog, User
 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError
+from pylons_app.lib.utils import action_logger
 import logging
 import os
-import pylons_app.lib.helpers as h
 import traceback
  
 log = logging.getLogger(__name__)
@@ -183,23 +180,7 @@
                     return mapping[cmd]
     
     def __log_user_action(self, user, action, repo, ipaddr):
-        sa = meta.Session
-        try:
-            user_log = UserLog()
-            user_log.user_id = user.user_id
-            user_log.action = action
-            user_log.repository = repo.replace('/', '')
-            user_log.action_date = datetime.now()
-            user_log.user_ip = ipaddr
-            sa.add(user_log)
-            sa.commit()
-            log.info('Adding user %s, action %s on %s',
-                                            user.username, action, repo)
-        except Exception, e:
-            sa.rollback()
-            log.error('could not log user action:%s', str(e))
-        finally:
-            meta.Session.remove()
+        action_logger(user, action, repo, ipaddr)
         
     def __invalidate_cache(self, repo_name):
         """we know that some change was made to repositories and we should
--- a/pylons_app/lib/utils.py	Fri Oct 01 03:04:52 2010 +0200
+++ b/pylons_app/lib/utils.py	Sat Oct 02 01:52:43 2010 +0200
@@ -26,16 +26,17 @@
 from mercurial import ui, config, hg
 from mercurial.error import RepoError
 from pylons_app.model import meta
-from pylons_app.model.db import Repository, User, HgAppUi, HgAppSettings
+from pylons_app.model.db import Repository, User, HgAppUi, HgAppSettings,UserLog
 from vcs.backends.base import BaseChangeset
 from vcs.utils.lazy import LazyProperty
 import logging
+import datetime
 import os
 
 log = logging.getLogger(__name__)
 
 
-def get_repo_slug(request):
+def get_repo_slug(request):    
     return request.environ['pylons.routes_dict'].get('repo_name')
 
 def is_mercurial(environ):
@@ -48,6 +49,40 @@
         return True
     return False
 
+def action_logger(user, action, repo, ipaddr, sa=None):
+    """
+    Action logger for various action made by users
+    """
+    
+    if not sa:
+        sa = meta.Session 
+        
+    
+    if hasattr(user, 'user_id'):
+        user_id = user.user_id
+    elif isinstance(user, basestring):
+        
+        user_id = sa.Query(User).filter(User.username == user).one()
+    else:
+        raise Exception('You have to provide user object or username')
+   
+    try:
+        user_log = UserLog()
+        user_log.user_id = user_id
+        user_log.action = action
+        user_log.repository = sa.query(Repository)\
+            .filter(Repository.repo_name==repo.lstrip('/')).one()
+        user_log.action_date = datetime.datetime.now()
+        user_log.user_ip = ipaddr
+        sa.add(user_log)
+        sa.commit()
+        log.info('Adding user %s, action %s on %s',
+                                        user.username, action, repo)
+    except Exception, e:
+        raise
+        sa.rollback()
+        log.error('could not log user action:%s', str(e))
+                
 def check_repo_dir(paths):
     repos_path = paths[0][1].split('/')
     if repos_path[-1] in ['*', '**']:
--- a/pylons_app/model/db.py	Fri Oct 01 03:04:52 2010 +0200
+++ b/pylons_app/model/db.py	Sat Oct 02 01:52:43 2010 +0200
@@ -66,12 +66,14 @@
     __table_args__ = {'useexisting':True}
     user_log_id = Column("user_log_id", INTEGER(), nullable=False, unique=True, default=None, primary_key=True)
     user_id = Column("user_id", INTEGER(), ForeignKey(u'users.user_id'), nullable=False, unique=None, default=None)
+    repository_id = Column("repository", TEXT(length=None, convert_unicode=False, assert_unicode=None), ForeignKey(u'repositories.repo_id'), nullable=False, unique=None, default=None)
     user_ip = Column("user_ip", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 
-    repository = Column("repository", TEXT(length=None, convert_unicode=False, assert_unicode=None), ForeignKey(u'repositories.repo_name'), nullable=False, unique=None, default=None)
     action = Column("action", TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
     action_date = Column("action_date", DATETIME(timezone=False), nullable=True, unique=None, default=None)
     revision = Column('revision', TEXT(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    
     user = relation('User')
+    repository = relation('Repository')
     
 class Repository(Base):
     __tablename__ = 'repositories'
--- a/pylons_app/templates/admin/admin_log.html	Fri Oct 01 03:04:52 2010 +0200
+++ b/pylons_app/templates/admin/admin_log.html	Sat Oct 02 01:52:43 2010 +0200
@@ -12,11 +12,11 @@
 	%for cnt,l in enumerate(c.users_log):
 	<tr class="parity${cnt%2}">
 		<td>${h.link_to(l.user.username,h.url('edit_user', id=l.user.user_id))}</td>
-		<td>${h.link_to(l.repository,h.url('summary_home',repo_name=l.repository))}</td>
+		<td>${h.link_to(l.repository.repo_name,h.url('summary_home',repo_name=l.repository.repo_name))}</td>
 		<td>
 		% if l.action == 'push' and l.revision:
 		  ${h.link_to('%s - %s' % (l.action,l.revision),
-		  h.url('changeset_home',repo_name=l.repository,revision=l.revision))}
+		  h.url('changeset_home',repo_name=l.repository.repo_name,revision=l.revision))}
 		%else:
 		  ${l.action}
 		%endif