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