diff --git a/rhodecode/api/views/user_api.py b/rhodecode/api/views/user_api.py --- a/rhodecode/api/views/user_api.py +++ b/rhodecode/api/views/user_api.py @@ -29,7 +29,6 @@ from rhodecode.lib.utils2 import safe_in from rhodecode.model.db import Session, User, Repository from rhodecode.model.user import UserModel - log = logging.getLogger(__name__) @@ -471,3 +470,45 @@ def get_user_locks(request, apiuser, use ret.append(_api_data) return ret + + +@jsonrpc_method() +def get_user_audit_logs(request, apiuser, userid=Optional(OAttr('apiuser'))): + """ + Fetches all action logs made by the specified user. + + This command takes the following options: + + :param apiuser: This is filled automatically from the |authtoken|. + :type apiuser: AuthUser + :param userid: Sets the userid whose list of locked |repos| will be + displayed. + :type userid: Optional(str or int) + + Example output: + + .. code-block:: bash + + id : + result : { + [action, action,...] + } + error : null + """ + + if not has_superadmin_permission(apiuser): + # make sure normal user does not pass someone else userid, + # he is not allowed to do that + if not isinstance(userid, Optional) and userid != apiuser.user_id: + raise JSONRPCError('userid is not the same as your user') + + userid = Optional.extract(userid, evaluate_locals=locals()) + userid = getattr(userid, 'user_id', userid) + user = get_user_or_error(userid) + + ret = [] + + # show all user actions + for entry in UserModel().get_user_log(user, filter_term=None): + ret.append(entry) + return ret diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -1108,9 +1108,19 @@ class UserLog(Base, BaseModel): action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None) def __unicode__(self): - return u"<%s('id:%s:%s')>" % (self.__class__.__name__, - self.repository_name, - self.action) + return u"<%s('id:%s:%s')>" % ( + self.__class__.__name__, self.repository_name, self.action) + + def __json__(self): + return { + 'user_id': self.user_id, + 'username': self.username, + 'repository_id': self.repository_id, + 'repository_name': self.repository_name, + 'user_ip': self.user_ip, + 'action_date': self.action_date, + 'action': self.action, + } @property def action_as_day(self):