def make_specialized_facet_value_obj(self, solr_facet_key, solr_facet_value_key, solr_facet_count): """ makes a facet_value obj for specialzied solr faccets """ fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context new_rparams = fl.add_to_request_by_solr_field(solr_facet_key, solr_facet_value_key) output = LastUpdatedOrderedDict() output['id'] = fl.make_request_url(new_rparams) output['json'] = fl.make_request_url(new_rparams, '.json') output['label'] = False if solr_facet_key == 'item_type': if solr_facet_value_key in QueryMaker.TYPE_URIS: output['rdfs:isDefinedBy'] = QueryMaker.TYPE_URIS[ solr_facet_value_key] entity = self.get_entity(output['rdfs:isDefinedBy']) if entity is not False: output['label'] = entity.label output['count'] = solr_facet_count output['slug'] = solr_facet_value_key output['data-type'] = 'id' return output
def make_specialized_facet_value_obj(self, solr_facet_key, solr_facet_value_key, solr_facet_count): """ makes a facet_value obj for specialzied solr faccets """ fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context new_rparams = fl.add_to_request_by_solr_field(solr_facet_key, solr_facet_value_key) output = LastUpdatedOrderedDict() output['id'] = fl.make_request_url(new_rparams) output['json'] = fl.make_request_url(new_rparams, '.json') output['label'] = False if solr_facet_key == 'item_type': if solr_facet_value_key in QueryMaker.TYPE_URIS: output['rdfs:isDefinedBy'] = QueryMaker.TYPE_URIS[solr_facet_value_key] entity = self.get_entity(output['rdfs:isDefinedBy']) if entity is not False: output['label'] = entity.label output['count'] = solr_facet_count output['slug'] = solr_facet_value_key output['data-type'] = 'id' return output
def make_rel_media_option(self, rel_media_count, rel_media_type, rel_media_options): """ makes a facet option for related media """ if rel_media_count > 0: fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context option = LastUpdatedOrderedDict() new_rparams = fl.add_to_request_by_solr_field(rel_media_type, '1') option['id'] = fl.make_request_url(new_rparams) option['json'] = fl.make_request_url(new_rparams, '.json') if rel_media_type == 'images': option['label'] = 'Linked with images' elif rel_media_type == 'other-media': option['label'] = 'Linked with media (non-image)' elif rel_media_type == 'documents': option['label'] = 'Linked with documents' option['count'] = rel_media_count rel_media_options.append(option) return rel_media_options
def add_date_fields(self, solr_json): """ adds numeric fields with query options """ date_fields = [] date_facet_ranges = self.get_solr_ranges(solr_json, 'date') if date_facet_ranges is not False: for solr_field_key, ranges in date_facet_ranges.items(): facet_key_list = solr_field_key.split('___') slug = facet_key_list[0].replace('_', '-') # check to see if the field is a linkded data field # if so, it needs some help with making Filter Links linked_field = False field_entity = self.get_entity(slug) if field_entity is not False: self.add_active_facet_field(slug) if field_entity.item_type == 'uri': linked_field = True field = self.get_facet_meta(solr_field_key) field['oc-api:min-date'] = ranges['start'] field['oc-api:max-date'] = ranges['end'] field['oc-api:gap-date'] = ranges['gap'] field['oc-api:has-range-options'] = [] i = -1 qm = QueryMaker() for range_min_key in ranges['counts'][::2]: i += 2 solr_count = ranges['counts'][i] fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context fl.partial_param_val_match = True dt_end = qm.add_solr_gap_to_date(range_min_key, ranges['gap']) range_end = qm.convert_date_to_solr_date(dt_end) solr_range = '[' + range_min_key + ' TO ' + range_end + ' ]' new_rparams = fl.add_to_request('prop', solr_range, slug) range_dict = LastUpdatedOrderedDict() range_dict['id'] = fl.make_request_url(new_rparams) range_dict['json'] = fl.make_request_url( new_rparams, '.json') range_dict['label'] = qm.make_human_readable_date( range_min_key) + ' to ' + qm.make_human_readable_date( range_end) range_dict['count'] = solr_count range_dict['oc-api:min-date'] = range_min_key range_dict['oc-api:max-date'] = range_end field['oc-api:has-range-options'].append(range_dict) date_fields.append(field) if len(date_fields) > 0 and 'facet' in self.act_responses: self.json_ld['oc-api:has-date-facets'] = date_fields
def add_numeric_fields(self, solr_json): """ adds numeric fields with query options """ num_fields = [] num_facet_ranges = self.get_solr_ranges(solr_json, 'numeric') if num_facet_ranges is not False: for solr_field_key, ranges in num_facet_ranges.items(): facet_key_list = solr_field_key.split('___') slug = facet_key_list[0].replace('_', '-') # check to see if the field is a linkded data field # if so, it needs some help with making Filter Links linked_field = False field_entity = self.get_entity(slug) if field_entity is not False: self.add_active_facet_field(slug) if field_entity.item_type == 'uri': linked_field = True field = self.get_facet_meta(solr_field_key) field['oc-api:min'] = float(ranges['start']) field['oc-api:max'] = float(ranges['end']) gap = float(ranges['gap']) field['oc-api:gap'] = gap field['oc-api:has-range-options'] = [] i = -1 for range_min_key in ranges['counts'][::2]: i += 2 solr_count = ranges['counts'][i] fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context fl.partial_param_val_match = True range_start = float(range_min_key) range_end = range_start + gap solr_range = '[' + str(range_start) + ' TO ' + str( range_end) + ' ]' new_rparams = fl.add_to_request('prop', solr_range, slug) range_dict = LastUpdatedOrderedDict() range_dict['id'] = fl.make_request_url(new_rparams) range_dict['json'] = fl.make_request_url( new_rparams, '.json') range_dict['label'] = str(round(range_start, 3)) range_dict['count'] = solr_count range_dict['oc-api:min'] = range_start range_dict['oc-api:max'] = range_end field['oc-api:has-range-options'].append(range_dict) num_fields.append(field) if len(num_fields) > 0 and 'facet' in self.act_responses: self.json_ld['oc-api:has-numeric-facets'] = num_fields
def add_date_fields(self, solr_json): """ adds numeric fields with query options """ date_fields = [] date_facet_ranges = self.get_solr_ranges(solr_json, 'date') if date_facet_ranges is not False: for solr_field_key, ranges in date_facet_ranges.items(): facet_key_list = solr_field_key.split('___') slug = facet_key_list[0].replace('_', '-') # check to see if the field is a linkded data field # if so, it needs some help with making Filter Links linked_field = False field_entity = self.get_entity(slug) if field_entity is not False: self.add_active_facet_field(slug) if field_entity.item_type == 'uri': linked_field = True field = self.get_facet_meta(solr_field_key) field['oc-api:min-date'] = ranges['start'] field['oc-api:max-date'] = ranges['end'] field['oc-api:gap-date'] = ranges['gap'] field['oc-api:has-range-options'] = [] i = -1 qm = QueryMaker() for range_min_key in ranges['counts'][::2]: i += 2 solr_count = ranges['counts'][i] fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context fl.partial_param_val_match = True dt_end = qm.add_solr_gap_to_date(range_min_key, ranges['gap']) range_end = qm.convert_date_to_solr_date(dt_end) solr_range = '[' + range_min_key + ' TO ' + range_end + ' ]' new_rparams = fl.add_to_request('prop', solr_range, slug) range_dict = LastUpdatedOrderedDict() range_dict['id'] = fl.make_request_url(new_rparams) range_dict['json'] = fl.make_request_url(new_rparams, '.json') range_dict['label'] = qm.make_human_readable_date(range_min_key) + ' to ' + qm.make_human_readable_date(range_end) range_dict['count'] = solr_count range_dict['oc-api:min-date'] = range_min_key range_dict['oc-api:max-date'] = range_end field['oc-api:has-range-options'].append(range_dict) date_fields.append(field) if len(date_fields) > 0 and 'facet' in self.act_responses: self.json_ld['oc-api:has-date-facets'] = date_fields
def add_numeric_fields(self, solr_json): """ adds numeric fields with query options """ num_fields = [] num_facet_ranges = self.get_solr_ranges(solr_json, 'numeric') if num_facet_ranges is not False: for solr_field_key, ranges in num_facet_ranges.items(): facet_key_list = solr_field_key.split('___') slug = facet_key_list[0].replace('_', '-') # check to see if the field is a linkded data field # if so, it needs some help with making Filter Links linked_field = False field_entity = self.get_entity(slug) if field_entity is not False: self.add_active_facet_field(slug) if field_entity.item_type == 'uri': linked_field = True field = self.get_facet_meta(solr_field_key) field['oc-api:min'] = float(ranges['start']) field['oc-api:max'] = float(ranges['end']) gap = float(ranges['gap']) field['oc-api:gap'] = gap field['oc-api:has-range-options'] = [] i = -1 for range_min_key in ranges['counts'][::2]: i += 2 solr_count = ranges['counts'][i] fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context fl.partial_param_val_match = True range_start = float(range_min_key) range_end = range_start + gap solr_range = '[' + str(range_start) + ' TO ' + str(range_end) + ' ]' new_rparams = fl.add_to_request('prop', solr_range, slug) range_dict = LastUpdatedOrderedDict() range_dict['id'] = fl.make_request_url(new_rparams) range_dict['json'] = fl.make_request_url(new_rparams, '.json') range_dict['label'] = str(round(range_start,3)) range_dict['count'] = solr_count range_dict['oc-api:min'] = range_start range_dict['oc-api:max'] = range_end field['oc-api:has-range-options'].append(range_dict) num_fields.append(field) if len(num_fields) > 0 and 'facet' in self.act_responses: self.json_ld['oc-api:has-numeric-facets'] = num_fields
def make_facet_value_obj(self, solr_facet_key, solr_facet_value_key, solr_facet_count): """ Makes an last-ordered-dict for a facet """ facet_key_list = solr_facet_value_key.split('___') if len(facet_key_list) == 4: # ---------------------------- # Case where facet values are encoded as: # slug___data-type___/uri-item-type/uuid___label # ---------------------------- data_type = facet_key_list[1] if 'http://' in facet_key_list[2] or 'https://' in facet_key_list[2]: is_linked_data = True else: is_linked_data = False fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context fl.partial_param_val_match = is_linked_data # allow partial matches of parameters. output = LastUpdatedOrderedDict() slug = facet_key_list[0] new_rparams = fl.add_to_request_by_solr_field(solr_facet_key, slug) output['id'] = fl.make_request_url(new_rparams) output['json'] = fl.make_request_url(new_rparams, '.json') if is_linked_data: output['rdfs:isDefinedBy'] = facet_key_list[2] else: output['rdfs:isDefinedBy'] = settings.CANONICAL_HOST + facet_key_list[2] output['label'] = facet_key_list[3] output['count'] = solr_facet_count output['slug'] = slug output['data-type'] = data_type else: # ---------------------------- # Sepcilized cases of non-encoded facet values # ---------------------------- output = self.make_specialized_facet_value_obj(solr_facet_key, solr_facet_value_key, solr_facet_count) return output
def make_facet_value_obj(self, solr_facet_key, solr_facet_value_key, solr_facet_count): """ Makes an last-ordered-dict for a facet """ facet_key_list = solr_facet_value_key.split('___') if len(facet_key_list) == 4: # ---------------------------- # Case where facet values are encoded as: # slug___data-type___/uri-item-type/uuid___label # ---------------------------- data_type = facet_key_list[1] if 'http://' in facet_key_list[2] or 'https://' in facet_key_list[ 2]: is_linked_data = True else: is_linked_data = False fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context fl.partial_param_val_match = is_linked_data # allow partial matches of parameters. output = LastUpdatedOrderedDict() slug = facet_key_list[0] new_rparams = fl.add_to_request_by_solr_field(solr_facet_key, slug) output['id'] = fl.make_request_url(new_rparams) output['json'] = fl.make_request_url(new_rparams, '.json') if is_linked_data: output['rdfs:isDefinedBy'] = facet_key_list[2] else: output[ 'rdfs:isDefinedBy'] = settings.CANONICAL_HOST + facet_key_list[ 2] output['label'] = facet_key_list[3] output['count'] = solr_facet_count output['slug'] = slug output['data-type'] = data_type else: # ---------------------------- # Sepcilized cases of non-encoded facet values # ---------------------------- output = self.make_specialized_facet_value_obj( solr_facet_key, solr_facet_value_key, solr_facet_count) return output
def make_rel_media_option(self, rel_media_count, rel_media_type, rel_media_options): """ makes a facet option for related media """ if rel_media_count > 0: fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context option = LastUpdatedOrderedDict() new_rparams = fl.add_to_request_by_solr_field(rel_media_type, '1') option['id'] = fl.make_request_url(new_rparams) option['json'] = fl.make_request_url(new_rparams, '.json') if rel_media_type == 'images': option['label'] = 'Linked with images' elif rel_media_type == 'other-media': option['label'] = 'Linked with media (non-image)' elif rel_media_type == 'documents': option['label'] = 'Linked with documents' option['count'] = rel_media_count rel_media_options.append(option) return rel_media_options
def add_text_fields(self): """ adds text fields with query options """ text_fields = [] # first add a general key-word search option fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context q_request_dict = self.request_dict if 'q' not in q_request_dict: q_request_dict['q'] = [] param_vals = q_request_dict['q'] if len(param_vals) < 1: search_term = None else: search_term = param_vals[0] field = LastUpdatedOrderedDict() field['id'] = '#textfield-keyword-search' field['label'] = 'General Keyword Search' field['oc-api:search-term'] = search_term if search_term is False or search_term is None: new_rparams = fl.add_to_request_by_solr_field('q', '{SearchTerm}') field['oc-api:template'] = fl.make_request_url(new_rparams) field['oc-api:template-json'] = fl.make_request_url( new_rparams, '.json') else: param_search = param_vals[0].replace(search_term, '{SearchTerm}') rem_request = fl.make_request_sub(q_request_dict, 'q', search_term, '{SearchTerm}') field['oc-api:template'] = fl.make_request_url(rem_request) field['oc-api:template-json'] = fl.make_request_url( rem_request, '.json') text_fields.append(field) # now add an option looking in properties if 'prop' in self.request_dict: param_vals = self.request_dict['prop'] for param_val in param_vals: if self.hierarchy_delim in param_val: all_vals = param_val.split(self.hierarchy_delim) else: all_vals = [param_val] if len(all_vals) < 2: check_field = all_vals[0] search_term = None # no search term else: check_field = all_vals[ -2] # penultimate value is the field search_term = all_vals[-1] # last value is search term check_dict = self.make_filter_label_dict(check_field) if check_dict['data-type'] == 'string': fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context field = LastUpdatedOrderedDict() field['id'] = '#textfield-' + check_dict['slug'] field['label'] = check_dict['label'] field['oc-api:search-term'] = search_term if len(check_dict['entities']) == 1: field['rdfs:isDefinedBy'] = check_dict['entities'][ 0].uri if search_term is False or search_term is None: param_search = param_val + self.hierarchy_delim + '{SearchTerm}' new_rparams = fl.add_to_request_by_solr_field( 'prop', param_search) field['oc-api:template'] = fl.make_request_url( new_rparams) field['oc-api:template-json'] = fl.make_request_url( new_rparams, '.json') else: param_search = param_val.replace( search_term, '{SearchTerm}') rem_request = fl.make_request_sub( self.request_dict, 'prop', param_val, param_search) field['oc-api:template'] = fl.make_request_url( rem_request) field['oc-api:template-json'] = fl.make_request_url( rem_request, '.json') text_fields.append(field) if len(text_fields) > 0: self.json_ld['oc-api:has-text-search'] = text_fields
def add_text_fields(self): """ adds text fields with query options """ text_fields = [] # first add a general key-word search option fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context q_request_dict = self.request_dict if 'q' not in q_request_dict: q_request_dict['q'] = [] param_vals = q_request_dict['q'] if len(param_vals) < 1: search_term = None else: search_term = param_vals[0] field = LastUpdatedOrderedDict() field['id'] = '#textfield-keyword-search' field['label'] = 'General Keyword Search' field['oc-api:search-term'] = search_term if search_term is False or search_term is None: new_rparams = fl.add_to_request_by_solr_field('q', '{SearchTerm}') field['oc-api:template'] = fl.make_request_url(new_rparams) field['oc-api:template-json'] = fl.make_request_url(new_rparams, '.json') else: param_search = param_vals[0].replace(search_term, '{SearchTerm}') rem_request = fl.make_request_sub(q_request_dict, 'q', search_term, '{SearchTerm}') field['oc-api:template'] = fl.make_request_url(rem_request) field['oc-api:template-json'] = fl.make_request_url(rem_request, '.json') text_fields.append(field) # now add an option looking in properties if 'prop' in self.request_dict: param_vals = self.request_dict['prop'] for param_val in param_vals: if self.hierarchy_delim in param_val: all_vals = param_val.split(self.hierarchy_delim) else: all_vals = [param_val] if len(all_vals) < 2: check_field = all_vals[0] search_term = None # no search term else: check_field = all_vals[-2] # penultimate value is the field search_term = all_vals[-1] # last value is search term check_dict = self.make_filter_label_dict(check_field) if check_dict['data-type'] == 'string': fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context field = LastUpdatedOrderedDict() field['id'] = '#textfield-' + check_dict['slug'] field['label'] = check_dict['label'] field['oc-api:search-term'] = search_term if len(check_dict['entities']) == 1: field['rdfs:isDefinedBy'] = check_dict['entities'][0].uri if search_term is False or search_term is None: param_search = param_val + self.hierarchy_delim + '{SearchTerm}' new_rparams = fl.add_to_request_by_solr_field('prop', param_search) field['oc-api:template'] = fl.make_request_url(new_rparams) field['oc-api:template-json'] = fl.make_request_url(new_rparams, '.json') else: param_search = param_val.replace(search_term, '{SearchTerm}') rem_request = fl.make_request_sub(self.request_dict, 'prop', param_val, param_search) field['oc-api:template'] = fl.make_request_url(rem_request) field['oc-api:template-json'] = fl.make_request_url(rem_request, '.json') text_fields.append(field) if len(text_fields) > 0: self.json_ld['oc-api:has-text-search'] = text_fields