Created
October 17, 2017 00:06
-
-
Save KrzysztofMadejski/5bfc9dd24dc0d0ab6199a288cd9a9d8d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def search(self): | |
| from ckan.lib.search import SearchError | |
| package_type = self._guess_package_type() | |
| try: | |
| context = {'model': model, 'user': c.user or c.author, | |
| 'auth_user_obj': c.userobj} | |
| check_access('site_read', context) | |
| except NotAuthorized: | |
| abort(401, _('Not authorized to see this page')) | |
| # unicode format (decoded from utf8) | |
| q = c.q = request.params.get('q', u'') | |
| c.query_error = False | |
| page = self._get_page_number(request.params) | |
| limit = g.datasets_per_page | |
| # most search operations should reset the page counter: | |
| params_nopage = [(k, v) for k, v in request.params.items() | |
| if k != 'page'] | |
| def drill_down_url(alternative_url=None, **by): | |
| return h.add_url_param(alternative_url=alternative_url, | |
| controller='package', action='search', | |
| new_params=by) | |
| c.drill_down_url = drill_down_url | |
| def remove_field(key, value=None, replace=None): | |
| return h.remove_url_param(key, value=value, replace=replace, | |
| controller='package', action='search') | |
| c.remove_field = remove_field | |
| if package_type == 'dataset': | |
| default_sort_by = 'metadata_modified desc' if g.tracking_enabled else None | |
| else: | |
| default_sort_by = 'metadata_created desc' | |
| sort_by = request.params.get('sort', default_sort_by) | |
| params_nosort = [(k, v) for k, v in params_nopage if k != 'sort'] | |
| def _sort_by(fields): | |
| """ | |
| Sort by the given list of fields. | |
| Each entry in the list is a 2-tuple: (fieldname, sort_order) | |
| eg - [('metadata_modified', 'desc'), ('name', 'asc')] | |
| If fields is empty, then the default ordering is used. | |
| """ | |
| params = params_nosort[:] | |
| if fields: | |
| sort_string = ', '.join('%s %s' % f for f in fields) | |
| params.append(('sort', sort_string)) | |
| return search_url(params, package_type) | |
| c.sort_by = _sort_by | |
| if sort_by is None: | |
| c.sort_by_fields = [] | |
| else: | |
| c.sort_by_fields = [field.split()[0] | |
| for field in sort_by.split(',')] | |
| def pager_url(q=None, page=None): | |
| params = list(params_nopage) | |
| params.append(('page', page)) | |
| return search_url(params, package_type) | |
| c.search_url_params = urlencode(_encode_params(params_nopage)) | |
| api_search_url_params = None | |
| try: | |
| c.fields = [] | |
| # c.fields_grouped will contain a dict of params containing | |
| # a list of values eg {'tags':['tag1', 'tag2']} | |
| c.fields_grouped = {} | |
| search_extras = {} | |
| fq = '' | |
| fq_list = [] # filter statements that will be sent in separate "fq" params (because we want to be able to exclude them selectively from facets) | |
| for (param, value) in request.params.items(): | |
| if param not in ['q', 'page', 'sort'] \ | |
| and len(value) and not param.startswith('_'): | |
| if not param.startswith('ext_'): | |
| c.fields.append((param, value)) | |
| fq_list.append('{!tag=%s}%s:"%s"' % (param, param, value)) | |
| if param not in c.fields_grouped: | |
| c.fields_grouped[param] = [value] | |
| else: | |
| c.fields_grouped[param].append(value) | |
| else: | |
| search_extras[param] = value | |
| context = {'model': model, 'session': model.Session, | |
| 'user': c.user or c.author, 'for_view': True, | |
| 'auth_user_obj': c.userobj} | |
| if package_type and package_type != 'dataset': | |
| # Only show datasets of this particular type | |
| fq += ' +dataset_type:{type}'.format(type=package_type) | |
| if (package_type == 'application') and not (new_authz.is_sysadmin(c.user)): | |
| fq += ' +status:verified' | |
| else: | |
| # Unless changed via config options, don't show non standard | |
| # dataset types on the default search page | |
| if not asbool(config.get('ckan.search.show_all_types', 'False')): | |
| fq += ' +dataset_type:dataset' | |
| facets = OrderedDict() | |
| default_facet_titles = { | |
| 'organization': _('Organizations'), | |
| 'groups': _('Groups'), | |
| 'tags': _('Tags'), | |
| 'res_format': _('Formats'), | |
| 'license_id': _('Licenses'), | |
| } | |
| for facet in g.facets: | |
| if facet in default_facet_titles: | |
| facets[facet] = default_facet_titles[facet] | |
| else: | |
| facets[facet] = facet | |
| # Facet titles | |
| for plugin in p.PluginImplementations(p.IFacets): | |
| facets = plugin.dataset_facets(facets, package_type) | |
| c.facet_titles = facets | |
| facets_keys = [] | |
| for f in facets: | |
| facets_keys.append("{!ex=" + f + "}" + f) | |
| data_dict = { | |
| 'q': q, | |
| 'fq': fq.strip(), | |
| 'fq_list': fq_list, | |
| 'facet.field': facets_keys, | |
| 'rows': limit, | |
| 'start': (page - 1) * limit, | |
| 'sort': sort_by, | |
| 'extras': search_extras | |
| } | |
| ##### EXTENDING ORIGINAL <<<<<<<<<< | |
| # API Params | |
| api_url_params = { | |
| 'q': q, | |
| 'fq': fq.strip(), | |
| 'rows': limit, | |
| 'start': (page - 1) * limit, | |
| } | |
| if sort_by: | |
| api_url_params['sort'] = sort_by | |
| if facets.keys(): | |
| api_url_params['facet.field'] = json.dumps(facets.keys()) | |
| # if search_extras: | |
| # api_url_params['extras'] = ','.join(search_extras) | |
| api_search_url_params = urlencode(_encode_params(api_url_params.items())) | |
| ##### EXTENDING ORIGINAL >>>>>>>>>>>>>> | |
| query = get_action('package_search')(context, data_dict) | |
| c.sort_by_selected = query['sort'] | |
| c.page = h.Page( | |
| collection=query['results'], | |
| page=page, | |
| url=pager_url, | |
| item_count=query['count'], | |
| items_per_page=limit | |
| ) | |
| c.facets = query['facets'] | |
| c.search_facets = query['search_facets'] | |
| c.page.items = query['results'] | |
| except SearchError, se: | |
| log.error('Dataset search error: %r', se.args) | |
| c.query_error = True | |
| c.facets = {} | |
| c.search_facets = {} | |
| c.page = h.Page(collection=[]) | |
| c.search_facets_limits = {} | |
| for facet in c.search_facets.keys(): | |
| try: | |
| limit = int(request.params.get('_%s_limit' % facet, | |
| g.facets_default_number)) | |
| except ValueError: | |
| abort(400, _('Parameter "{parameter_name}" is not ' | |
| 'an integer').format( | |
| parameter_name='_%s_limit' % facet | |
| )) | |
| c.search_facets_limits[facet] = limit | |
| maintain.deprecate_context_item( | |
| 'facets', | |
| 'Use `c.search_facets` instead.') | |
| self._setup_template_variables(context, {}, | |
| package_type=package_type) | |
| return render(self._search_template(package_type), | |
| extra_vars={'dataset_type': package_type, 'api_search_url_params': api_search_url_params}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment