Show More
@@ -1837,6 +1837,7 b' def journal_filter_help():' | |||
|
1837 | 1837 | 'Example filter terms:\n' + |
|
1838 | 1838 | ' repository:vcs\n' + |
|
1839 | 1839 | ' username:marcin\n' + |
|
1840 | ' username:(NOT marcin)\n' + | |
|
1840 | 1841 | ' action:*push*\n' + |
|
1841 | 1842 | ' ip:127.0.0.1\n' + |
|
1842 | 1843 | ' date:20120101\n' + |
@@ -23,10 +23,10 b' import logging' | |||
|
23 | 23 | from whoosh.qparser.default import QueryParser, query |
|
24 | 24 | from whoosh.qparser.dateparse import DateParserPlugin |
|
25 | 25 | from whoosh.fields import (TEXT, Schema, DATETIME) |
|
26 | from sqlalchemy.sql.expression import or_, and_, func | |
|
26 | from sqlalchemy.sql.expression import or_, and_, not_, func | |
|
27 | 27 | |
|
28 | 28 | from rhodecode.model.db import UserLog |
|
29 | from rhodecode.lib.utils2 import remove_prefix, remove_suffix | |
|
29 | from rhodecode.lib.utils2 import remove_prefix, remove_suffix, safe_unicode | |
|
30 | 30 | |
|
31 | 31 | # JOURNAL SCHEMA used only to generate queries in journal. We use whoosh |
|
32 | 32 | # querylang to build sql queries and filter journals |
@@ -54,7 +54,7 b' def user_log_filter(user_log, search_ter' | |||
|
54 | 54 | if search_term: |
|
55 | 55 | qp = QueryParser('repository', schema=JOURNAL_SCHEMA) |
|
56 | 56 | qp.add_plugin(DateParserPlugin()) |
|
57 | qry = qp.parse(unicode(search_term)) | |
|
57 | qry = qp.parse(safe_unicode(search_term)) | |
|
58 | 58 | log.debug('Filtering using parsed query %r' % qry) |
|
59 | 59 | |
|
60 | 60 | def wildcard_handler(col, wc_term): |
@@ -89,16 +89,27 b' def user_log_filter(user_log, search_ter' | |||
|
89 | 89 | return func.lower(field).startswith(func.lower(val)) |
|
90 | 90 | elif isinstance(term, query.DateRange): |
|
91 | 91 | return and_(field >= val[0], field <= val[1]) |
|
92 | elif isinstance(term, query.Not): | |
|
93 | return not_(field == val) | |
|
92 | 94 | return func.lower(field) == func.lower(val) |
|
93 | 95 | |
|
94 |
if isinstance(qry, (query.And, query.Term, query.Prefix, |
|
|
95 | query.DateRange)): | |
|
96 | if isinstance(qry, (query.And, query.Not, query.Term, query.Prefix, | |
|
97 | query.Wildcard, query.DateRange)): | |
|
96 | 98 | if not isinstance(qry, query.And): |
|
97 | 99 | qry = [qry] |
|
100 | ||
|
98 | 101 | for term in qry: |
|
102 | if isinstance(term, query.Not): | |
|
103 | not_term = [z for z in term.leaves()][0] | |
|
104 | field = not_term.fieldname | |
|
105 | val = not_term.text | |
|
106 | elif isinstance(term, query.DateRange): | |
|
99 | 107 | field = term.fieldname |
|
100 | val = (term.text if not isinstance(term, query.DateRange) | |
|
101 | else [term.startdate, term.enddate]) | |
|
108 | val = [term.startdate, term.enddate] | |
|
109 | else: | |
|
110 | field = term.fieldname | |
|
111 | val = term.text | |
|
112 | ||
|
102 | 113 | user_log = user_log.filter(get_filterion(field, val, term)) |
|
103 | 114 | elif isinstance(qry, query.Or): |
|
104 | 115 | filters = [] |
General Comments 0
You need to be logged in to leave comments.
Login now