Mercurial > kallithea
diff rhodecode/controllers/admin/admin.py @ 3063:ca2b21819dfd beta
Implemented better support for Wildcard queries
add username column to journal for caching logs after user deletion
added tests for admin journal
migrations
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Wed, 05 Dec 2012 23:59:13 +0100 |
parents | a08624dd675e |
children | cc7eedb5323c |
line wrap: on
line diff
--- a/rhodecode/controllers/admin/admin.py Wed Dec 05 21:14:31 2012 +0100 +++ b/rhodecode/controllers/admin/admin.py Wed Dec 05 23:59:13 2012 +0100 @@ -35,7 +35,7 @@ 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 @@ :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 @@ 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 @@ 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