def group_facets(self, facets_dict, group_type, package_type): if(group_type == 'collection'): facets_dict = OrderedDict() facets_dict.update({'res_format': _('Formats')}) facets_dict.update({'vocab_geographical_coverage': _('Geographical Coverage')}) facets_dict.update({'groups': _('Groups')}) facets_dict.update({'organization': _('Organizations')}) facets_dict.update({'collections': _('Collections')}) return facets_dict
def _search(self, package_type, pager_url, additional_fq='', additional_facets=None, default_sort_by=DEFAULT_SORTING, num_of_items=NUM_OF_ITEMS, ignore_capacity_check=False, use_solr_collapse=False, enable_update_status_facet=False): from ckan.lib.search import SearchError # unicode format (decoded from utf8) q = c.q = request.params.get('q', u'') c.query_error = False page = self._page_number() # Commenting below parts as it doesn't seem to be used # 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 # self._set_remove_field_function() req_sort_by = request.params.get('sort', None) if not req_sort_by and q: req_sort_by = 'score desc, ' + DEFAULT_SORTING if req_sort_by: sort_by = req_sort_by c.used_default_sort_by = False else: sort_by = default_sort_by c.used_default_sort_by = True # params_nosort = [(k, v) for k, v in params_nopage if k != 'sort'] # The sort_by function seems to not be used anymore # 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 self._search_url(params, package_type) # # c.sort_by = _sort_by if not sort_by: c.sort_by_fields = [] else: c.sort_by_fields = [field.split()[0] for field in sort_by.split(',')] self._set_other_links() 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 = {} # limit = g.datasets_per_page fq = additional_fq tagged_fq_dict = {} featured_filters_set = False for (param, value) in request.params.items(): if param not in ['q', 'page', 'sort'] \ and len(value) and not param.startswith('_'): if param == 'fq': fq += ' %s' % (value,) elif not param.startswith('ext_'): c.fields.append((param, value)) # fq += ' {!tag=%s}%s:"%s"' % (param, param, value) if param not in tagged_fq_dict: tagged_fq_dict[param] = [] tagged_fq_dict[param].append(u'{}:"{}"'.format(param, value)) self.append_selected_facet_to_group(c.fields_grouped, param, value) elif param == UPDATE_STATUS_URL_FILTER: self.append_selected_facet_to_group(c.fields_grouped, param, value) else: if param in ['ext_cod', 'ext_subnational', 'ext_quickcharts', 'ext_geodata', 'ext_requestdata', 'ext_hxl', 'ext_showcases', 'ext_archived', 'ext_administrative_divisions']: featured_filters_set = True search_extras[param] = value if c.fields_grouped.get(UPDATE_STATUS_URL_FILTER): search_extras[UPDATE_STATUS_URL_FILTER] = c.fields_grouped[UPDATE_STATUS_URL_FILTER] self._set_filters_are_selected_flag() fq_list = [u'{{!tag={tag}}}{value}'.format(tag=key, category=key, value=' OR '.join(value_list)) for key, value_list in tagged_fq_dict.items()] # if the search is not filtered by query or facet group datasets solr_expand = 'false' if use_solr_collapse and not fq_list and not q and not featured_filters_set: fq_list = ['{!tag=batch}{!collapse field=batch nullPolicy=expand} '] solr_expand = 'true' try: limit = 1 if self._is_facet_only_request() else int(request.params.get('ext_page_size', num_of_items)) except: limit = num_of_items c.ext_page_size = limit context = {'model': model, 'session': model.Session, 'user': c.user or c.author, 'for_view': True, 'auth_user_obj': c.userobj} if ignore_capacity_check: context['ignore_capacity_check'] = ignore_capacity_check if package_type and package_type != 'dataset': # Only show datasets of this particular type fq += ' +dataset_type:{type}'.format(type=package_type) 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 = get_default_facet_titles() for facet in h.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) if additional_facets: facets.update(additional_facets) c.facet_titles = facets # TODO Line below to be removed after refactoring c.tab = 'all' #adding site_id to facets to facilitate totals counts in case of batch/collapse facet_keys = ['{!ex=batch}site_id'] + facets.keys() self._performing_search(q, fq, facet_keys, limit, page, sort_by, search_extras, pager_url, context, fq_list=fq_list, expand=solr_expand, enable_update_status_facet=enable_update_status_facet) 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=[])