def count(self, request): request.response.set_content_type('application/json; charset=utf8') q = request.get_form_var('q', '') project = CodeDoubanProject.get_by_name(self.project) \ if self.project else None state = request.get_form_var('state', '') language = request.get_form_var('language', '') doctype = request.get_form_var('doctype', '') counts = {} for kind, cls in KIND_CLASS_MAP.iteritems(): kwargs = dict(phrase=q, from_=0, size=0) if project and kind in (K_DOC, K_CODE, K_PULL, K_ISSUE): kwargs.update(project_id=project.id) if language and kind == K_CODE: kwargs.update(language=language) if state and kind in (K_PULL, K_ISSUE): kwargs.update(state=state) if doctype and kind == K_DOC: kwargs.update(doctype=doctype) result = cls.search_a_phrase(**kwargs) counts[kind] = SearchEngine.get_count(result) tdt = { 'q': q, 'repos': counts[K_REPO], 'codes': counts[K_CODE], 'users': counts[K_USER], 'docs': counts[K_DOC], 'pulls': counts[K_PULL], 'issues': counts[K_ISSUE], } return json.dumps(tdt)
def _q_index(self, request): q = request.get_form_var('q', '') kind = request.get_form_var('kind', str(K_CODE)) order = request.get_form_var('s', '') order = int(order) if order else '' page = request.get_form_var('page') page = int(page) if page and page.isdigit() else 1 project = CodeDoubanProject.get_by_name(self.project) \ if self.project else None state = request.get_form_var('state', '') language = request.get_form_var('language', '') doctype = request.get_form_var('doctype', '') if not kind.isdigit() and int(kind) not in SEARCH_KINDS: raise TraversalError() kind = int(kind) orders = KIND_ORDERS_MAP.get(kind, CODE_ORDERS) sort_data = orders.get(order) if sort_data: sort_data = sort_data[1] limit = PERPAGE_LIMIT total = 0 offset = (page - 1) * limit result = {} formated_result = [] facets = {} tdt = {} cls = KIND_CLASS_MAP.get(kind) by_project = by_language = by_state = by_doctype = False if project and kind in (K_DOC, K_CODE, K_PULL, K_ISSUE): by_project = True if language and kind == K_CODE: by_language = True if state and kind in (K_PULL, K_ISSUE): by_state = True if doctype and kind == K_DOC: by_doctype = True # for facets if kind in (K_CODE, K_PULL, K_ISSUE, K_DOC): project_id = project.id if by_project else None result = cls.search_a_phrase( phrase=q, from_=0, size=0, project_id=project_id) facets = cls.format_facets(result) for title, data in facets.iteritems(): for item in data: params = {'q': q, 'kind': kind, 's': order, title: item['term']} if by_project: params.update(project_id=project_id) item['url'] = '?' + urlencode(params) # highlight current term current = None if by_language: current = language elif by_state: current = state elif by_doctype: current = doctype if current and current == item['term']: item['selected'] = True del params[title] item['url'] = '?' + urlencode(params) # for search kwargs = dict(phrase=q, sort_data=sort_data, from_=offset, size=limit) if by_project: kwargs.update(project_id=project.id) if by_language: kwargs.update(language=language) if by_state: kwargs.update(state=state) if by_doctype: kwargs.update(doctype=doctype) result = cls.search_a_phrase(**kwargs) formated_result = cls.format_search_result(result) total = SearchEngine.get_count(result) pages = total / limit + 1 if total % limit > 0 else total / limit tdt.update(request=request, q=q, kind=kind, total=total, facets=facets, language=language, state=state, doctype=doctype, result=formated_result, orders=orders, s=order, page=page, pages=pages) # for menu and pagenation SEARCH_URLS = dict() for k in SEARCH_KINDS: if project and k in (K_CODE, K_DOC, K_PULL, K_ISSUE): url_root = '/%s/search' % project.name else: url_root = SEARCH_URL_ROOT params = {'q': q, 'kind': k, 's': order} if state and k in (K_PULL, K_ISSUE): params.update({'state': state}) if language and k == K_CODE: params.update({'language': language}) if doctype and k == K_DOC: params.update({'doctype': doctype}) url = '%s?' % url_root + urlencode(params) SEARCH_URLS[k] = url tdt.update(SEARCH_URLS=SEARCH_URLS) return st('search/base.html', **tdt)