blob: 4d73c8352199da7e29db523c63ee56f8c9ed5f84 [file] [log] [blame]
import re
import socket
import cPickle as pickle
from logging import getLogger
from pprint import pformat
from itertools import islice, chain
import markdown
from pylons import tmpl_context as c, app_globals as g
from pysolr import SolrError
from . import helpers as h
from .markdown_extensions import ForgeExtension
log = getLogger(__name__)
def solarize(obj):
if obj is None: return None
doc = obj.index()
if doc is None: return None
text = doc.pop('text', '')
try:
text = text + pformat(doc.values())
except TypeError:
# log.exception('Indexing empty text: %s', doc)
text = pformat(doc.values())
doc['text'] = text
return doc
class SearchError(SolrError):
pass
def search(q,short_timeout=False,ignore_errors=True,**kw):
try:
if short_timeout:
return g.solr_short_timeout.search(q, **kw)
else:
return g.solr.search(q, **kw)
except (SolrError, socket.error) as e:
log.exception('Error in solr search')
if not ignore_errors:
match = re.search(r'<pre>(.*)</pre>', str(e))
raise SearchError('Error running search query: %s' % (match.group(1) if match else e))
def search_artifact(atype, q, history=False, rows=10, short_timeout=False, **kw):
"""Performs SOLR search.
Raises SearchError if SOLR returns an error.
"""
# first, grab an artifact and get the fields that it indexes
a = atype.query.find().first()
if a is None: return # if there are no instance of atype, we won't find anything
fields = a.index()
# Now, we'll translate all the fld:
q = atype.translate_query(q, fields)
fq = [
'type_s:%s' % fields['type_s'],
'project_id_s:%s' % c.project._id,
'mount_point_s:%s' % c.app.config.options.mount_point ]
if not history:
fq.append('is_history_b:False')
return search(q, fq=fq, rows=rows, short_timeout=short_timeout, ignore_errors=False, **kw)
def find_shortlinks(text):
md = markdown.Markdown(
extensions=['codehilite', ForgeExtension(), 'tables'],
output_format='html4')
md.convert(text)
link_index = md.treeprocessors['links'].alinks
return [ link for link in link_index if link is not None]