| 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] |