From d0ef55db59c01260546513707820b906c7328cb9 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Wed, 5 Dec 2012 23:59:13 +0100 Subject: Implemented better support for Wildcard queries add username column to journal for caching logs after user deletion added tests for admin journal migrations --HG-- branch : beta extra : amend_source : 9a26263147c2be6eb4505259293dc8059f7d5304 --- rhodecode/controllers/admin/admin.py | 39 ++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 20 deletions(-) (limited to 'rhodecode/controllers') diff --git a/rhodecode/controllers/admin/admin.py b/rhodecode/controllers/admin/admin.py index 194d024e..c5ffe1f5 100644 --- a/rhodecode/controllers/admin/admin.py +++ b/rhodecode/controllers/admin/admin.py @@ -35,7 +35,7 @@ from sqlalchemy.sql.expression import or_ from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator from rhodecode.lib.base import BaseController, render from rhodecode.model.db import UserLog, User -from rhodecode.lib.utils2 import safe_int, remove_prefix +from rhodecode.lib.utils2 import safe_int, remove_prefix, remove_suffix from rhodecode.lib.indexers import JOURNAL_SCHEMA @@ -50,13 +50,26 @@ def _filter(user_log, search_term): :param user_log: :param search_term: """ + log.debug('Initial search term: %r' % search_term) qry = None if search_term: qp = QueryParser('repository', schema=JOURNAL_SCHEMA) qry = qp.parse(unicode(search_term)) - log.debug('Filtering using query %r' % qry) + log.debug('Filtering using parsed query %r' % qry) + + def wildcard_handler(col, wc_term): + if wc_term.startswith('*') and not wc_term.endswith('*'): + #postfix == endswith + wc_term = remove_prefix(wc_term, prefix='*') + return getattr(col, 'endswith')(wc_term) + elif wc_term.startswith('*') and wc_term.endswith('*'): + #wildcard == ilike + wc_term = remove_prefix(wc_term, prefix='*') + wc_term = remove_suffix(wc_term, suffix='*') + return getattr(col, 'contains')(wc_term) def get_filterion(field, val, term): + if field == 'repository': field = getattr(UserLog, 'repository_name') elif field == 'ip': @@ -64,27 +77,14 @@ def _filter(user_log, search_term): elif field == 'date': field = getattr(UserLog, 'action_date') elif field == 'username': - ##special case for username - if isinstance(term, query.Wildcard): - #only support wildcards with * at beggining - val = remove_prefix(val, prefix='*') - return getattr(UserLog, 'user_id').in_( - [x.user_id for x in - User.query().filter(User.username.endswith(val))]) - elif isinstance(term, query.Prefix): - return getattr(UserLog, 'user_id').in_( - [x.user_id for x in - User.query().filter(User.username.startswith(val))]) - # term == exact match, case insensitive - field = getattr(UserLog, 'user') - val = User.get_by_username(val, case_insensitive=True) - + field = getattr(UserLog, 'username') else: field = getattr(UserLog, field) + log.debug('filter field: %s val=>%s' % (field, val)) #sql filtering if isinstance(term, query.Wildcard): - return field.endsswith(val) + return wildcard_handler(field, val) elif isinstance(term, query.Prefix): return field.startswith(val) return field == val @@ -101,8 +101,7 @@ def _filter(user_log, search_term): for term in qry: field = term.fieldname val = term.text - if isinstance(term, query.Term): - filters.append(get_filterion(field, val, term)) + filters.append(get_filterion(field, val, term)) user_log = user_log.filter(or_(*filters)) return user_log -- cgit v1.2.3