Example #1
0
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
Example #2
0
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
Example #3
0
File: api.py Project: b3c/vphshare
    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