aboutsummaryrefslogtreecommitdiff
path: root/rhodecode/controllers
diff options
context:
space:
mode:
authorMarcin Kuzminski <marcin@python-works.com>2012-12-06 23:55:12 +0100
committerMarcin Kuzminski <marcin@python-works.com>2012-12-06 23:55:12 +0100
commite72e4e231838587e0d51f6ab33346b870c11106a (patch)
tree0d8915d2c955804a77e3e5e66986a22767453bca /rhodecode/controllers
parent3e4e16e41709230c6f8ab3f2afe9809a6929410e (diff)
final implementation of #210 journal filtering.
--HG-- branch : beta
Diffstat (limited to 'rhodecode/controllers')
-rw-r--r--rhodecode/controllers/admin/admin.py19
-rw-r--r--rhodecode/controllers/journal.py20
2 files changed, 29 insertions, 10 deletions
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 = []