# HG changeset patch # User Marcin Kuzminski # Date 1285977163 -7200 # Node ID 39203995f2c41dff9064aa2bf9bf4e1660c8fd40 # Parent 72778dda34cf2ff4ee8c87439cc251a9aafc82d2 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 diff -r 72778dda34cf -r 39203995f2c4 pylons_app/lib/hooks.py --- 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() diff -r 72778dda34cf -r 39203995f2c4 pylons_app/lib/middleware/simplehg.py --- 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 diff -r 72778dda34cf -r 39203995f2c4 pylons_app/lib/utils.py --- 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 ['*', '**']: diff -r 72778dda34cf -r 39203995f2c4 pylons_app/model/db.py --- 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' diff -r 72778dda34cf -r 39203995f2c4 pylons_app/templates/admin/admin_log.html --- 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): ${h.link_to(l.user.username,h.url('edit_user', id=l.user.user_id))} - ${h.link_to(l.repository,h.url('summary_home',repo_name=l.repository))} + ${h.link_to(l.repository.repo_name,h.url('summary_home',repo_name=l.repository.repo_name))} % 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