|
a/webui.py |
|
b/webui.py |
|
... |
|
... |
36 |
'timefmt': '%c',
|
36 |
'timefmt': '%c',
|
37 |
'dirdepth': 3,
|
37 |
'dirdepth': 3,
|
38 |
'maxchars': 500,
|
38 |
'maxchars': 500,
|
39 |
'maxresults': 0,
|
39 |
'maxresults': 0,
|
40 |
'perpage': 25,
|
40 |
'perpage': 25,
|
|
|
41 |
'csvfields': 'filename title author size time mtype url',
|
41 |
}
|
42 |
}
|
42 |
|
43 |
|
43 |
# sort fields/labels
|
44 |
# sort fields/labels
|
44 |
SORTS = [
|
45 |
SORTS = [
|
45 |
("relevancyrating", "Relevancy"),
|
46 |
("relevancyrating", "Relevancy"),
|
|
... |
|
... |
109 |
config['stemlang'] = rclconf.getConfParam('indexstemminglanguages')
|
110 |
config['stemlang'] = rclconf.getConfParam('indexstemminglanguages')
|
110 |
# get config from cookies or defaults
|
111 |
# get config from cookies or defaults
|
111 |
for k, v in DEFAULTS.items():
|
112 |
for k, v in DEFAULTS.items():
|
112 |
value = select([bottle.request.get_cookie(k), v])
|
113 |
value = select([bottle.request.get_cookie(k), v])
|
113 |
config[k] = type(v)(value)
|
114 |
config[k] = type(v)(value)
|
|
|
115 |
# Fix csvfields: get rid of invalid ones to avoid needing tests in the dump function
|
|
|
116 |
cf = config['csvfields'].split()
|
|
|
117 |
ncf = [f for f in cf if f in FIELDS]
|
|
|
118 |
config['csvfields'] = ' '.join(ncf)
|
|
|
119 |
config['fields'] = ' '.join(FIELDS)
|
114 |
# get mountpoints
|
120 |
# get mountpoints
|
115 |
config['mounts'] = {}
|
121 |
config['mounts'] = {}
|
116 |
for d in config['dirs']:
|
122 |
for d in config['dirs']:
|
117 |
name = 'mount_%s' % urllib.quote(d,'')
|
123 |
name = 'mount_%s' % urllib.quote(d,'')
|
118 |
config['mounts'][d] = select([bottle.request.get_cookie(name), 'file://%s' % d], [None, ''])
|
124 |
config['mounts'][d] = select([bottle.request.get_cookie(name), 'file://%s' % d], [None, ''])
|
|
... |
|
... |
173 |
return '<span class="search-result-highlight">'
|
179 |
return '<span class="search-result-highlight">'
|
174 |
def endMatch(self):
|
180 |
def endMatch(self):
|
175 |
return '</span>'
|
181 |
return '</span>'
|
176 |
#}}}
|
182 |
#}}}
|
177 |
#{{{ recoll_search
|
183 |
#{{{ recoll_search
|
178 |
def recoll_search(q):
|
184 |
def recoll_search(q, dosnippets=True):
|
179 |
config = get_config()
|
185 |
config = get_config()
|
180 |
tstart = datetime.datetime.now()
|
186 |
tstart = datetime.datetime.now()
|
181 |
results = []
|
187 |
results = []
|
182 |
query = recoll_initsearch(q)
|
188 |
query = recoll_initsearch(q)
|
183 |
nres = query.rowcount
|
189 |
nres = query.rowcount
|
|
... |
|
... |
211 |
else:
|
217 |
else:
|
212 |
d[f] = ''
|
218 |
d[f] = ''
|
213 |
d['label'] = select([d['title'], d['filename'], '?'], [None, ''])
|
219 |
d['label'] = select([d['title'], d['filename'], '?'], [None, ''])
|
214 |
d['sha'] = hashlib.sha1(d['url']+d['ipath']).hexdigest()
|
220 |
d['sha'] = hashlib.sha1(d['url']+d['ipath']).hexdigest()
|
215 |
d['time'] = timestr(d['mtime'], config['timefmt'])
|
221 |
d['time'] = timestr(d['mtime'], config['timefmt'])
|
|
|
222 |
if dosnippets:
|
216 |
d['snippet'] = query.makedocabstract(doc, highlighter).encode('utf-8')
|
223 |
d['snippet'] = query.makedocabstract(doc, highlighter).encode('utf-8')
|
217 |
results.append(d)
|
224 |
results.append(d)
|
218 |
tend = datetime.datetime.now()
|
225 |
tend = datetime.datetime.now()
|
219 |
return results, nres, tend - tstart
|
226 |
return results, nres, tend - tstart
|
220 |
#}}}
|
227 |
#}}}
|
221 |
#}}}
|
228 |
#}}}
|
|
... |
|
... |
315 |
return json.dumps({ 'query': query, 'results': res })
|
322 |
return json.dumps({ 'query': query, 'results': res })
|
316 |
#}}}
|
323 |
#}}}
|
317 |
#{{{ csv
|
324 |
#{{{ csv
|
318 |
@bottle.route('/csv')
|
325 |
@bottle.route('/csv')
|
319 |
def get_csv():
|
326 |
def get_csv():
|
|
|
327 |
config = get_config()
|
320 |
query = get_query()
|
328 |
query = get_query()
|
321 |
query['page'] = 0
|
329 |
query['page'] = 0
|
322 |
qs = query_to_recoll_string(query)
|
330 |
qs = query_to_recoll_string(query)
|
323 |
bottle.response.headers['Content-Type'] = 'text/csv'
|
331 |
bottle.response.headers['Content-Type'] = 'text/csv'
|
324 |
bottle.response.headers['Content-Disposition'] = 'attachment; filename=recoll-%s.csv' % normalise_filename(qs)
|
332 |
bottle.response.headers['Content-Disposition'] = 'attachment; filename=recoll-%s.csv' % normalise_filename(qs)
|
325 |
res, nres, timer = recoll_search(query)
|
333 |
res, nres, timer = recoll_search(query, False)
|
326 |
si = StringIO.StringIO()
|
334 |
si = StringIO.StringIO()
|
327 |
cw = csv.writer(si)
|
335 |
cw = csv.writer(si)
|
|
|
336 |
fields = config['csvfields'].split()
|
328 |
cw.writerow(FIELDS)
|
337 |
cw.writerow(fields)
|
329 |
for doc in res:
|
338 |
for doc in res:
|
330 |
row = []
|
339 |
row = []
|
331 |
for f in FIELDS:
|
340 |
for f in fields:
|
332 |
row.append(doc[f])
|
341 |
row.append(doc[f])
|
333 |
cw.writerow(row)
|
342 |
cw.writerow(row)
|
334 |
return si.getvalue().strip("\r\n")
|
343 |
return si.getvalue().strip("\r\n")
|
335 |
#}}}
|
344 |
#}}}
|
336 |
#{{{ settings/set
|
345 |
#{{{ settings/set
|