Exemple #1
0
 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
Exemple #2
0
 def add_filters_json(self, request_dict):
     """ adds JSON describing search filters """
     fl = FilterLinks()
     fl.base_search_link = self.base_search_link
     filters = []
     string_fields = []  # so we have an interface for string searches
     i = 0
     for param_key, param_vals in request_dict.items():
         if param_key == 'path':
             if param_vals:
                 i += 1
                 f_entity = self.m_cache.get_entity(param_vals)
                 label = http.urlunquote_plus(param_vals)
                 act_filter = LastUpdatedOrderedDict()
                 act_filter['id'] = '#filter-' + str(i)
                 act_filter['oc-api:filter'] = 'Context'
                 act_filter['label'] = label.replace('||', ' OR ')
                 if f_entity:
                     act_filter['rdfs:isDefinedBy'] = f_entity.uri
                 # generate a request dict without the context filter
                 rem_request = fl.make_request_sub(request_dict,
                                                   param_key,
                                                   param_vals)
                 act_filter['oc-api:remove'] = fl.make_request_url(rem_request)
                 act_filter['oc-api:remove-json'] = fl.make_request_url(rem_request, '.json')
                 filters.append(act_filter)
         else:
             for param_val in param_vals:
                 i += 1
                 remove_geodeep = False
                 act_filter = LastUpdatedOrderedDict()
                 act_filter['id'] = '#filter-' + str(i)
                 if self.hierarchy_delim in param_val:
                     all_vals = param_val.split(self.hierarchy_delim)
                 else:
                     all_vals = [param_val]
                 if param_key == 'proj':
                     # projects, only care about the last item in the parameter value
                     act_filter['oc-api:filter'] = 'Project'
                     label_dict = self.make_filter_label_dict(all_vals[-1])
                     act_filter['label'] = label_dict['label']
                     if len(label_dict['entities']) == 1:
                         act_filter['rdfs:isDefinedBy'] = label_dict['entities'][0].uri
                 elif param_key == 'prop':
                     # prop, the first item is the filter-label
                     # the last is the filter
                     act_filter['label'] = False
                     if len(all_vals) < 2:
                         act_filter['oc-api:filter'] = 'Description'
                         act_filter['oc-api:filter-slug'] = all_vals[0]
                     else:
                         filt_dict = self.make_filter_label_dict(all_vals[0])
                         act_filter['oc-api:filter'] = filt_dict['label']
                         if 'slug' in filt_dict:
                             act_filter['oc-api:filter-slug'] = filt_dict['slug']
                         if filt_dict['data-type'] == 'string':
                             act_filter['label'] = 'Search Term: \'' + all_vals[-1] + '\''
                     if act_filter['label'] is False:
                         label_dict = self.make_filter_label_dict(all_vals[-1])
                         act_filter['label'] = label_dict['label']
                 elif param_key == 'type':
                     act_filter['oc-api:filter'] = 'Open Context Type'
                     if all_vals[0] in QueryMaker.TYPE_MAPPINGS:
                         type_uri = QueryMaker.TYPE_MAPPINGS[all_vals[0]]
                         label_dict = self.make_filter_label_dict(type_uri)
                         act_filter['label'] = label_dict['label']
                     else:
                         act_filter['label'] = all_vals[0]
                 elif param_key == 'q':
                     act_filter['oc-api:filter'] = self.TEXT_SEARCH_TITLE
                     act_filter['label'] = 'Search Term: \'' + all_vals[0] + '\''
                 elif param_key == 'id':
                     act_filter['oc-api:filter'] = 'Identifier Lookup'
                     act_filter['label'] = 'Identifier: \'' + all_vals[0] + '\''
                 elif param_key == 'form-chronotile':
                     act_filter['oc-api:filter'] = 'Time of formation, use, or life'
                     chrono = ChronoTile()
                     dates = chrono.decode_path_dates(all_vals[0])
                     if isinstance(dates, dict):
                         act_filter['label'] = 'Time range: ' + str(dates['earliest_bce'])
                         act_filter['label'] += ' to ' + str(dates['latest_bce'])
                 elif param_key == 'form-start':
                     act_filter['oc-api:filter'] = 'Earliest formation, use, or life date'
                     try:
                         val_date = int(float(all_vals[0]))
                     except:
                         val_date = False
                     if val_date is False:
                         act_filter['label'] = '[Invalid year]'
                     elif val_date < 0:
                         act_filter['label'] = str(val_date * -1) + ' BCE'
                     else:
                         act_filter['label'] = str(val_date) + ' CE'
                 elif param_key == 'form-stop':
                     act_filter['oc-api:filter'] = 'Latest formation, use, or life date'
                     try:
                         val_date = int(float(all_vals[0]))
                     except:
                         val_date = False
                     if val_date is False:
                         act_filter['label'] = '[Invalid year]'
                     elif val_date < 0:
                         act_filter['label'] = str(val_date * -1) + ' BCE'
                     else:
                         act_filter['label'] = str(val_date) + ' CE'
                 elif param_key == 'disc-geotile':
                     act_filter['oc-api:filter'] = 'Location of discovery or observation'
                     act_filter['label'] = self.make_geotile_filter_label(all_vals[0])
                     remove_geodeep = True
                 elif param_key == 'disc-bbox':
                     act_filter['oc-api:filter'] = 'Location of discovery or observation'
                     act_filter['label'] = self.make_bbox_filter_label(all_vals[0])
                     remove_geodeep = True
                 elif param_key == 'images':
                     act_filter['oc-api:filter'] = 'Has related media'
                     act_filter['label'] = 'Linked to images'
                 elif param_key == 'other-media':
                     act_filter['oc-api:filter'] = 'Has related media'
                     act_filter['label'] = 'Linked to media (other than images)'
                 elif param_key == 'documents':
                     act_filter['oc-api:filter'] = 'Has related media'
                     act_filter['label'] = 'Linked to documents'
                 elif param_key == 'dc-subject':
                     act_filter['oc-api:filter'] = 'Has subject metadata'
                     label_dict = self.make_filter_label_dict(all_vals[-1])
                     if len(label_dict['label']) > 0:
                         act_filter['label'] = label_dict['label']
                     if 'tdar' == all_vals[-1] or 'tdar*' == all_vals[-1]:
                         act_filter['label'] = 'tDAR defined metadata record(s)'
                     if len(label_dict['entities']) == 1:
                         act_filter['rdfs:isDefinedBy'] = label_dict['entities'][0].uri
                         if label_dict['entities'][0].vocabulary is not False:
                             act_filter['label'] += ' in ' + label_dict['entities'][0].vocabulary
                 elif param_key == 'dc-spatial':
                     act_filter['oc-api:filter'] = 'Has spatial metadata'
                     label_dict = self.make_filter_label_dict(all_vals[-1])
                     if len(label_dict['label']) > 0:
                         act_filter['label'] = label_dict['label']
                     if len(label_dict['entities']) == 1:
                         act_filter['rdfs:isDefinedBy'] = label_dict['entities'][0].uri
                         if label_dict['entities'][0].vocabulary is not False:
                             act_filter['label'] += ' in ' + label_dict['entities'][0].vocabulary
                 elif param_key == 'dc-coverage':
                     act_filter['oc-api:filter'] = 'Has coverage / period metadata'
                     label_dict = self.make_filter_label_dict(all_vals[-1])
                     if len(label_dict['label']) > 0:
                         act_filter['label'] = label_dict['label']
                     if len(label_dict['entities']) == 1:
                         act_filter['rdfs:isDefinedBy'] = label_dict['entities'][0].uri
                         if label_dict['entities'][0].vocabulary is not False:
                             act_filter['label'] += ' in ' + label_dict['entities'][0].vocabulary
                 elif param_key == 'dc-temporal':
                     act_filter['oc-api:filter'] = 'Has temporal coverage'
                     label_dict = self.make_filter_label_dict(all_vals[-1])
                     if len(label_dict['label']) > 0:
                         act_filter['label'] = label_dict['label']
                         if len(label_dict['entities']) == 1: 
                             if label_dict['entities'][0].entity_type == 'vocabulary':
                                 act_filter['label'] = 'Concepts defined by: ' + label_dict['label']
                         elif 'periodo' in all_vals[-1]:
                             act_filter['label'] = 'PeriodO defined concepts'
                     if len(label_dict['entities']) == 1:
                         act_filter['rdfs:isDefinedBy'] = label_dict['entities'][0].uri
                         if label_dict['entities'][0].vocabulary is not False\
                            and label_dict['entities'][0].vocabulary != label_dict['label']:
                             act_filter['label'] += ' in ' + label_dict['entities'][0].vocabulary
                 elif param_key == 'obj':
                     act_filter['oc-api:filter'] = 'Links (in some manner) to object'
                     label_dict = self.make_filter_label_dict(all_vals[-1])
                     if len(label_dict['label']) > 0:
                         act_filter['label'] = label_dict['label']
                     if len(label_dict['entities']) == 1:
                         act_filter['rdfs:isDefinedBy'] = label_dict['entities'][0].uri
                         if label_dict['entities'][0].vocabulary is not False:
                             act_filter['label'] += ' in ' + label_dict['entities'][0].vocabulary
                 elif param_key == 'dc-isReferencedBy':
                     act_filter['oc-api:filter'] = 'Is referenced by'
                     label_dict = self.make_filter_label_dict(all_vals[-1])
                     if len(label_dict['label']) > 0:
                         act_filter['label'] = label_dict['label']
                     if len(label_dict['entities']) == 1:
                         act_filter['rdfs:isDefinedBy'] = label_dict['entities'][0].uri
                         if label_dict['entities'][0].vocabulary is not False\
                            and label_dict['entities'][0].vocab_uri != label_dict['entities'][0].uri:
                             act_filter['label'] += ' in ' + label_dict['entities'][0].vocabulary
                 elif param_key == 'linked' and all_vals[-1] == 'dinaa-cross-ref':
                     act_filter['oc-api:filter'] = 'Has cross references'
                     act_filter['label'] = 'Links to, or with, DINAA curated site files'
                 else:
                     act_filter = False
                 if act_filter is not False:
                     rem_request = fl.make_request_sub(request_dict,
                                                       param_key,
                                                       param_val)
                     if 'geodeep' in rem_request and remove_geodeep:
                         rem_request.pop('geodeep', None)    
                     act_filter['oc-api:remove'] = fl.make_request_url(rem_request)
                     act_filter['oc-api:remove-json'] = fl.make_request_url(rem_request, '.json')
                     filters.append(act_filter)
     return filters
 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