def automatic_search_connector(free_text, user = None): """ automatic_search_connector: Call the automatic search API and extract the result from XML. Arguments: free-text (string): input text Returns: json_results (obj): object JSON format """ results = OrderedDict() response = requests.get(AUTOMATIC_SEARCH_API % free_text) concept_list = etree.fromstring(response.text.encode()) for concept_elem in concept_list: dataset_dict = OrderedDict() concept_uri = concept_elem.attrib['uri'] for dataset_elem in concept_elem: dataset_label = dataset_elem.attrib['label'] MetadataDataset = filter_resources_by_facet('Dataset','localID',dataset_label) permision = False globalID = '' if MetadataDataset['resource_metadata']: r = Resource.objects.get(global_id=MetadataDataset['resource_metadata'][0].value['globalID']) permision = r.can_read(user) globalID = MetadataDataset['resource_metadata'][0].value['globalID'] num_metch = dataset_elem[0].text rdf_data = dataset_elem[1].text dataset_dict[dataset_label] = [num_metch, rdf_data, globalID, permision] results[concept_uri] = dataset_dict return results
def complex_query_connector(load_groups, user): """ guided_search_complex_query_connector: Call the guided search ComplexQuery API and extract the result from XML. Arguments: concept_uri_list (string): concept_uri list Returns: json_results (obj): object JSON format """ results = OrderedDict() terms = "" for (j, group) in enumerate(load_groups): if j == 0: if group[0] == "NOT": if (len(group) - 1) > 1: for (i, concept) in enumerate(group): if concept != "NOT": if i < (len(group) - 1) and i == 1: terms = terms + ' ( NOT ' + concept[0] + ' ) AND ' elif i < (len(group) - 1): terms = terms + '( NOT ' + concept[0] + ' ) AND ' else: terms = terms + '( NOT ' + concept[0] + ' ) ' else: terms = terms + ' ( NOT ' + group[1][0] + ' ) ' else: if (len(group) - 1) > 1: for (i, concept) in enumerate(group): if concept != "": if i < (len(group) - 1) and i == 1: terms = terms + ' ( ' + concept[0] + ' OR ' elif i < (len(group) - 1): terms = terms + concept[0] + ' OR ' else: terms = terms + concept[0] + ' ) ' else: terms = terms + ' ( ' + group[1][0] + ' ) ' else: if group[0] == "NOT": if (len(group) - 1) > 1: for (i, concept) in enumerate(group): if concept != "NOT": if i < (len(group) - 1) and i == 1: terms = terms + 'AND ( NOT ' + concept[0] + ' ) AND ' elif i < (len(group) - 1): terms = terms + '( NOT ' + concept[0] + ' ) AND ' else: terms = terms + '( NOT ' + concept[0] + ' ) ' else: terms = terms + 'AND ( NOT ' + group[1][0] + ' ) ' else: if (len(group) - 1) > 1: for (i, concept) in enumerate(group): if concept != "": if i < (len(group) - 1) and i == 1: terms = terms + 'AND ( ' + concept[0] + ' OR ' elif i < (len(group) - 1): terms = terms + concept[0] + ' OR ' else: terms = terms + concept[0] + ' ) ' else: terms = terms + 'AND ( ' + group[1][0] + ' ) ' response = requests.get(GUIDED_SEARCH_COMPLEX_QUERY_API % quote(terms)) concept_list = etree.fromstring(response.text.encode()) for concept_elem in concept_list: dataset = OrderedDict() concept_uri = concept_elem.attrib['logicalExpression'] for dataset_elem in concept_elem: dataset_label = dataset_elem.attrib['label'] MetadataDataset = filter_resources_by_facet('Dataset','localID',dataset_label) permision = False globalID = '' if MetadataDataset['resource_metadata']: r = Resource.objects.get(global_id=MetadataDataset['resource_metadata'][0]['globalID']) permision = r.can_read(user) globalID = MetadataDataset[0]['globalID'] num_metch = dataset_elem[0].text rdf_data = dataset_elem[1].text dataset[dataset_label] = [num_metch, rdf_data, globalID, permision ] results[concept_uri] = dataset return results
def read(self, request, local_id='', type='', role='', ticket=''): """ Process a search user request. Arguments: request (HTTP request istance): HTTP request send from client. ticket (string) : base 64 ticket. global_id (list): list of global id to check local_id (list) : list of local id to check type (string) : the type of the resource role (string) : the role to be checked ticket (string) : the authentication ticket - optional Return: Successes - Json/xml/yaml format response Failure - 403 error """ try: client_address = request.META['REMOTE_ADDR'] try: if request.GET.get('ticket'): user, tkt64 = authenticate(ticket=request.GET['ticket'], cip=client_address) else: auth = request.META['HTTP_AUTHORIZATION'].split() if len(auth) == 2: if auth[0].lower() == 'basic': # Currently, only basic http auth is used. username, ticket = base64.b64decode(auth[1]).split(':') user, tkt64 = authenticate(ticket=ticket, cip=client_address) except Exception, e: response = HttpResponse(status=401) response._is_string = True return response if user is not None: if request.GET.get('role','') not in Roles: response = HttpResponse(status=403) response._is_string = True return response role = request.GET['role'] # if global_id is provided, look for local resources if 'global_id' in request.GET: global_ids = request.GET.getlist('global_id', []) resources = [] for global_id in global_ids: try: resource = Resource.objects.get(global_id=global_id, metadata=False) except ObjectDoesNotExist, e: metadata = get_resource_metadata(global_id) author = User.objects.get(username=metadata['author']) if metadata['type'] == "Workflow": resource, created = Workflow.objects.get_or_create(global_id=global_id, metadata=metadata, owner=author, type=metadata['type']) resource.save() resource = resource.resource_ptr else: resource, created = Resource.objects.get_or_create(global_id=global_id, metadata=metadata, owner=author, type=metadata['type']) resource.save() if resource.can_I(role, user): resources.append(resource) else: return False if len(resources) == 0: # no resources with given ids! response = HttpResponse(status=403) response._is_string = True return response return True # if resource_type and local_ids are provided, else: local_ids = request.GET.getlist('local_id', []) resources = [] for local_id in local_ids: r = filter_resources_by_facet(request.GET['type'], 'localID', local_id ) resources += r['resource_metadata'] if len(resources) == 0: # no resources with given ids! response = HttpResponse(status=403) response._is_string = True return response for resource in resources: resource = resource.value try: if resource['localID'] not in local_ids: continue author = User.objects.get(username=resource['author']) if resource['type'] == "Workflow": resource_in_db, created = Workflow.objects.get_or_create(global_id=resource['globalID'], metadata=resource, owner=author, type=resource['type']) resource_in_db.save() resource_in_db = resource_in_db.resource_ptr else: resource_in_db, created = Resource.objects.get_or_create(global_id=resource['globalID'], metadata=resource, owner=author, type=resource['type']) resource_in_db.save() if not resource_in_db.can_I(role, user): return False except ObjectDoesNotExist, e: # not in local db, no roles return False return True