From e72e4e231838587e0d51f6ab33346b870c11106a Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Thu, 6 Dec 2012 23:55:12 +0100 Subject: final implementation of #210 journal filtering. --HG-- branch : beta --- rhodecode/controllers/admin/admin.py | 19 +++++++++++++------ rhodecode/controllers/journal.py | 20 ++++++++++++++++---- 2 files changed, 29 insertions(+), 10 deletions(-) (limited to 'rhodecode/controllers') diff --git a/rhodecode/controllers/admin/admin.py b/rhodecode/controllers/admin/admin.py index c5ffe1f5..32444fbb 100644 --- a/rhodecode/controllers/admin/admin.py +++ b/rhodecode/controllers/admin/admin.py @@ -30,19 +30,20 @@ from sqlalchemy.orm import joinedload from webhelpers.paginate import Page from whoosh.qparser.default import QueryParser from whoosh import query -from sqlalchemy.sql.expression import or_ +from sqlalchemy.sql.expression import or_, and_ 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, remove_suffix from rhodecode.lib.indexers import JOURNAL_SCHEMA +from whoosh.qparser.dateparse import DateParserPlugin log = logging.getLogger(__name__) -def _filter(user_log, search_term): +def _journal_filter(user_log, search_term): """ Filters sqlalchemy user_log based on search_term with whoosh Query language http://packages.python.org/Whoosh/querylang.html @@ -54,6 +55,7 @@ def _filter(user_log, search_term): qry = None if search_term: qp = QueryParser('repository', schema=JOURNAL_SCHEMA) + qp.add_plugin(DateParserPlugin()) qry = qp.parse(unicode(search_term)) log.debug('Filtering using parsed query %r' % qry) @@ -87,20 +89,25 @@ def _filter(user_log, search_term): return wildcard_handler(field, val) elif isinstance(term, query.Prefix): return field.startswith(val) + elif isinstance(term, query.DateRange): + return and_(field >= val[0], field <= val[1]) return field == val - if isinstance(qry, (query.And, query.Term, query.Prefix, query.Wildcard)): + if isinstance(qry, (query.And, query.Term, query.Prefix, query.Wildcard, + query.DateRange)): if not isinstance(qry, query.And): qry = [qry] for term in qry: field = term.fieldname - val = term.text + val = (term.text if not isinstance(term, query.DateRange) + else [term.startdate, term.enddate]) user_log = user_log.filter(get_filterion(field, val, term)) elif isinstance(qry, query.Or): filters = [] for term in qry: field = term.fieldname - val = term.text + val = (term.text if not isinstance(term, query.DateRange) + else [term.startdate, term.enddate]) filters.append(get_filterion(field, val, term)) user_log = user_log.filter(or_(*filters)) @@ -122,7 +129,7 @@ class AdminController(BaseController): #FILTERING c.search_term = request.GET.get('filter') try: - users_log = _filter(users_log, c.search_term) + users_log = _journal_filter(users_log, c.search_term) except: # we want this to crash for now raise diff --git a/rhodecode/controllers/journal.py b/rhodecode/controllers/journal.py index 7b34e0c8..ed0bd2d2 100644 --- a/rhodecode/controllers/journal.py +++ b/rhodecode/controllers/journal.py @@ -42,6 +42,7 @@ from rhodecode.model.meta import Session from sqlalchemy.sql.expression import func from rhodecode.model.scm import ScmModel from rhodecode.lib.utils2 import safe_int +from rhodecode.controllers.admin.admin import _journal_filter log = logging.getLogger(__name__) @@ -65,9 +66,14 @@ class JournalController(BaseController): .options(joinedload(UserFollowing.follows_repository))\ .all() + #FILTERING + c.search_term = request.GET.get('filter') journal = self._get_journal_data(c.following) - c.journal_pager = Page(journal, page=p, items_per_page=20) + def url_generator(**kw): + return url.current(filter=c.search_term, **kw) + + c.journal_pager = Page(journal, page=p, items_per_page=20, url=url_generator) c.journal_day_aggreagate = self._get_daily_aggregate(c.journal_pager) c.journal_data = render('journal/journal_data.html') @@ -141,9 +147,15 @@ class JournalController(BaseController): if filtering_criterion is not None: journal = self.sa.query(UserLog)\ .options(joinedload(UserLog.user))\ - .options(joinedload(UserLog.repository))\ - .filter(filtering_criterion)\ - .order_by(UserLog.action_date.desc()) + .options(joinedload(UserLog.repository)) + #filter + try: + journal = _journal_filter(journal, c.search_term) + except: + # we want this to crash for now + raise + journal = journal.filter(filtering_criterion)\ + .order_by(UserLog.action_date.desc()) else: journal = [] -- cgit v1.2.3