예제 #1
0
 def add_member_annotations(self, catalog_id, dataset_id, member_id,
                            annotation_dict):
     path = ("/catalog/id=%s/dataset/id=%s/member/id=%s/annotation"
             % (urlquote(catalog_id), urlquote(dataset_id),
                urlquote(member_id)))
     body = json.dumps(annotation_dict)
     return self._request("POST", path, body)
예제 #2
0
    def get_dataset_annotations(self,
                                catalog_id,
                                dataset_id=None,
                                annotation_list=None,
                                selector_list=None,
                                **params):
        """Get a list of annotations on the matching datasets in the specified
        catalog. Pass either dataset_id for a single dataset, a
        selector_list for complex searching, or neither to get all datasets
        in the catalog.

        @param catalog_id: catalog containing the dataset
        @param dataset_id: dataset to return annotation for
        @param selector_list: list of selector tuples, as an alternative to
                              dataset_id
        @param annotation_list: optional list of annotation names to return;
                                defaults to all annotations.
        """
        if selector_list is not None and dataset_id is not None:
            raise ValueError("specify one of selector_list or dataset_id")
        if selector_list is None:
            if dataset_id is None:
                selector_list = ["name"]
            else:
                selector_list = [("id", Op.EQUAL, dataset_id)]
        query = build_selector(selector_list)
        path = "/catalog/id=%s/dataset/%s/annotation" % (urlquote(catalog_id),
                                                         query)
        if annotation_list is not None:
            path = "%s/%s" % (path, ";".join(
                urlquote(x) for x in annotation_list))
        if params:
            path = "%s?%s" % (path, urllib.urlencode(params))
        return self._request("GET", path)
예제 #3
0
    def get_dataset_annotations(self, catalog_id, dataset_id=None,
                                annotation_list=None, selector_list=None,
                                **params):
        """Get a list of annotations on the matching datasets in the specified
        catalog. Pass either dataset_id for a single dataset, a
        selector_list for complex searching, or neither to get all datasets
        in the catalog.

        @param catalog_id: catalog containing the dataset
        @param dataset_id: dataset to return annotation for
        @param selector_list: list of selector tuples, as an alternative to
                              dataset_id
        @param annotation_list: optional list of annotation names to return;
                                defaults to all annotations.
        """
        if selector_list is not None and dataset_id is not None:
            raise ValueError("specify one of selector_list or dataset_id")
        if selector_list is None:
            if dataset_id is None:
                selector_list = ["name"]
            else:
                selector_list = [("id", Op.EQUAL, dataset_id)]
        query = build_selector(selector_list)
        path = "/catalog/id=%s/dataset/%s/annotation" %(
                urlquote(catalog_id), query)
        if annotation_list is not None:
            path = "%s/%s" % (path,
                              ";".join(urlquote(x) for x in annotation_list))
        if params:
            path = "%s?%s" % (path, urllib.urlencode(params))
        return self._request("GET", path)
예제 #4
0
 def delete_member(self, catalog_id, dataset_id, member_id):
     """Delete the specified member."""
     return self._request("DELETE",
                          "/catalog/id=%s/dataset/id=%s/member/id=%s"
                           % (urlquote(catalog_id),
                              urlquote(dataset_id),
                              urlquote(member_id)))
예제 #5
0
 def add_member_annotations(self, catalog_id, dataset_id, member_id,
                            annotation_dict):
     path = (
         "/catalog/id=%s/dataset/id=%s/member/id=%s/annotation" %
         (urlquote(catalog_id), urlquote(dataset_id), urlquote(member_id)))
     body = json.dumps(annotation_dict)
     return self._request("POST", path, body)
예제 #6
0
def build_selector(selector_list):
    """Build a tagfiler selector query from a list of tuples."""
    sl = []
    for s in selector_list:
        if (not isinstance(s, (tuple, list))) or len(s) == 1:
            s = (s, UnaryOp.TAGGED)

        if len(s) == 2:
            tagname, op = s
            if op in BinaryOpSet:
                raise ValueError("Binary operator '%s' requires second "
                                 "argument" % op)
            elif op not in UnaryOpSet:
                raise ValueError("Unknown operator '%s'" % op)
            sl.append("%s%s" % (urlquote(tagname), op))
        elif len(s) == 3:
            tagname, op, value = s
            if op in UnaryOpSet:
                raise ValueError("Unary operator '%s' does not support a"
                                 "second argument" % op)
            elif op not in BinaryOpSet:
                raise ValueError("Unknown operator '%s'" % op)
            else:
                if not isinstance(value, (tuple, list)):
                    value = (value,)
                value = ",".join(urlquote(v) for v in value)
                sl.append("%s%s%s" % (urlquote(tagname), op, value))
        else:
            raise ValueError("Selector expression must contain one, two "
                            +"or three values")
    return ";".join(sl)
예제 #7
0
 def delete_dataset_access_rule(self, catalog_id, dataset_id,
                                principal_type, principal):
     if principal_type not in ("user", "group"):
         raise ValueError("principal_type must be 'user' or 'group'")
     path = "/catalog/id=%s/dataset/id=%s/acl/%s/%s" % (
         urlquote(catalog_id), urlquote(dataset_id), principal_type,
         urlquote(principal))
     return self._request("DELETE", path)
예제 #8
0
 def delete_dataset_access_rule(self, catalog_id, dataset_id,
                                principal_type, principal):
     if principal_type not in ("user", "group"):
         raise ValueError("principal_type must be 'user' or 'group'")
     path = "/catalog/id=%s/dataset/id=%s/acl/%s/%s" % (
                 urlquote(catalog_id), urlquote(dataset_id),
                 principal_type, urlquote(principal))
     return self._request("DELETE", path)
예제 #9
0
 def create_annotation_def(self, catalog_id, annotation_name,
                           value_type, multivalued=False, unique=False):
     body = dict(value_type=value_type,
                 multivalued=multivalued,
                 unique=unique)
     return self._request("PUT", "/catalog/id=%s/annotation_def/%s"
                                 % (urlquote(catalog_id),
                                    urlquote(annotation_name)),
                          json.dumps(body))
예제 #10
0
    def create_members(self, catalog_id, dataset_id, members):
        """Create members in the given dataset.

        @param catalog_id: catalog to create the member in
        @param member: list of dictionaries of member properties

        @return: list of dictionary of member properties (most notably 'id')
        """
        return self._request(
            "POST", "/catalog/id=%s/dataset/id=%s/member" %
            (urlquote(catalog_id), urlquote(dataset_id)), json.dumps(members))
예제 #11
0
 def get_member_annotations(self, catalog_id, dataset_id, member_id,
                            annotation_list=None):
     path = ("/catalog/id=%s/dataset/id=%s/member/id=%s/annotation"
             % (urlquote(catalog_id), urlquote(dataset_id),
                urlquote(member_id)))
     if annotation_list:
         # TODO: handle tag=value patterns, useful for multivalued
         # tags
         pattern = ";".join(urlquote(x) for x in annotation_list)
         path = "%s/%s" % (path, pattern)
     return self._request("GET", path)
예제 #12
0
    def create_members(self, catalog_id, dataset_id, members):
        """Create members in the given dataset.

        @param catalog_id: catalog to create the member in
        @param member: list of dictionaries of member properties

        @return: list of dictionary of member properties (most notably 'id')
        """
        return self._request("POST", "/catalog/id=%s/dataset/id=%s/member"
                                     % (urlquote(catalog_id),
                                        urlquote(dataset_id)),
                             json.dumps(members))
예제 #13
0
    def delete_dataset_annotation(self, catalog_id, dataset_id,
                                 annotation_name, annotation_value=None):
        """Delete the given annotation and/or value from the specified
        dataset."""
        if annotation_value is not None:
            query = "%s=%s" % (urlquote(annotation_name),
                               urlquote(annotation_value))
        else:
            query = urlquote(annotation_name)

        path = ("/catalog/id=%s/dataset/id=%s/annotation/%s"
                % (urlquote(catalog_id), urlquote(dataset_id), query))
        return self._request("DELETE", path)
예제 #14
0
 def create_annotation_def(self,
                           catalog_id,
                           annotation_name,
                           value_type,
                           multivalued=False,
                           unique=False):
     body = dict(value_type=value_type,
                 multivalued=multivalued,
                 unique=unique)
     return self._request(
         "PUT", "/catalog/id=%s/annotation_def/%s" %
         (urlquote(catalog_id), urlquote(annotation_name)),
         json.dumps(body))
예제 #15
0
 def get_member_annotations(self,
                            catalog_id,
                            dataset_id,
                            member_id,
                            annotation_list=None):
     path = (
         "/catalog/id=%s/dataset/id=%s/member/id=%s/annotation" %
         (urlquote(catalog_id), urlquote(dataset_id), urlquote(member_id)))
     if annotation_list:
         # TODO: handle tag=value patterns, useful for multivalued
         # tags
         pattern = ";".join(urlquote(x) for x in annotation_list)
         path = "%s/%s" % (path, pattern)
     return self._request("GET", path)
예제 #16
0
    def delete_dataset_annotation(self,
                                  catalog_id,
                                  dataset_id,
                                  annotation_name,
                                  annotation_value=None):
        """Delete the given annotation and/or value from the specified
        dataset."""
        if annotation_value is not None:
            query = "%s=%s" % (urlquote(annotation_name),
                               urlquote(annotation_value))
        else:
            query = urlquote(annotation_name)

        path = ("/catalog/id=%s/dataset/id=%s/annotation/%s" %
                (urlquote(catalog_id), urlquote(dataset_id), query))
        return self._request("DELETE", path)
예제 #17
0
    def get_annotation_defs(self, catalog_id):
        """Get a list of all annotations defined for the catalog.

        @return: list of annotation def dictionaries
        """
        return self._request(
            "GET", "/catalog/id=%s/annotation_def" % (urlquote(catalog_id)))
예제 #18
0
    def get_annotation_defs(self, catalog_id):
        """Get a list of all annotations defined for the catalog.

        @return: list of annotation def dictionaries
        """
        return self._request("GET", "/catalog/id=%s/annotation_def"
                                    % (urlquote(catalog_id)))
예제 #19
0
    def get_all_member_annotations(self, catalog_id, dataset_id, member_list, annotation_list=None, limit=100):
        path = ("/catalog/id=%s/dataset/id=%s/member"
                % (urlquote(catalog_id), urlquote(dataset_id)))
        print path

        params = dict(limit=limit)
        qs = urllib.urlencode(params)

        if annotation_list:
            # TODO: handle tag=value patterns, useful for multivalued
            # tags
            member_pattern = ";".join(urlquote(x) for x in annotation_list)
            annotation_pattern = ";".join(urlquote(y) for y in annotation_list)
            path = "%s/%s/annotation/%s?%s" % (path, member_pattern, annotation_pattern,qs)
            print path
        return self._request("GET", path)
예제 #20
0
def build_projection(projection_list):
    """Build a tagfiler projection from a list of tuples."""
    if not projection_list:
        return ""
    pl = []
    for p in projection_list:
        if not isinstance(p, (tuple, list)):
            p = (p,)

        if len(p) == 1:
            pl.append(urlquote(p[0]))
        elif len(p) == 2:
            pl.append("%s=%s" % (urlquote(p[0]), urlquote(p[1])))
        else:
            raise ValueError("Projection expression must contain one or "
                             "more values")
    return ";".join(pl)
예제 #21
0
    def create_dataset(self, catalog_id, dataset):
        """Create a dataset with the given name and addional attributes
        specified in keyword parameters.

        @param catalog_id: catalog to create the dataset in
        @param dataset: dictionary of dataset properties

        @return: dictionary of dataset properties (most notably 'id')
        """
        return self._request("POST",
                             "/catalog/id=%s/dataset" % urlquote(catalog_id),
                             json.dumps(dataset))
예제 #22
0
    def create_dataset(self, catalog_id, dataset):
        """Create a dataset with the given name and addional attributes
        specified in keyword parameters.

        @param catalog_id: catalog to create the dataset in
        @param dataset: dictionary of dataset properties

        @return: dictionary of dataset properties (most notably 'id')
        """
        return self._request("POST", "/catalog/id=%s/dataset"
                                     % urlquote(catalog_id),
                             json.dumps(dataset))
예제 #23
0
    def get_members(self,
                    catalog_id,
                    dataset_id,
                    last_id=None,
                    limit=100,
                    selector_list=None):
        """Get a list of all members the user has permission to view.
        Paging is done based on last id from the previous page, not numeric
        offset.

        @return: list of member dictionaries
        """
        params = dict(limit=limit)
        qs = urllib.urlencode(params)
        if selector_list is None:
            selector_list = []
        if last_id is not None:
            selector_list += [("id", Op.GT, last_id)]
        query = build_selector(selector_list)
        return self._request(
            "GET", "/catalog/id=%s/dataset/id=%s/member/%s?%s" %
            (urlquote(catalog_id), urlquote(dataset_id), query, qs))
예제 #24
0
    def get_all_member_annotations(self,
                                   catalog_id,
                                   dataset_id,
                                   member_list,
                                   annotation_list=None,
                                   limit=100):
        path = ("/catalog/id=%s/dataset/id=%s/member" %
                (urlquote(catalog_id), urlquote(dataset_id)))
        print path

        params = dict(limit=limit)
        qs = urllib.urlencode(params)

        if annotation_list:
            # TODO: handle tag=value patterns, useful for multivalued
            # tags
            member_pattern = ";".join(urlquote(x) for x in annotation_list)
            annotation_pattern = ";".join(urlquote(y) for y in annotation_list)
            path = "%s/%s/annotation/%s?%s" % (path, member_pattern,
                                               annotation_pattern, qs)
            print path
        return self._request("GET", path)
예제 #25
0
    def get_members(self, catalog_id, dataset_id, last_id=None, limit=100, selector_list=None):
        """Get a list of all members the user has permission to view.
        Paging is done based on last id from the previous page, not numeric
        offset.

        @return: list of member dictionaries
        """
        params = dict(limit=limit)
        qs = urllib.urlencode(params)
        if selector_list is None:
            selector_list = []
        if last_id is not None:
            selector_list += [("id", Op.GT, last_id)]
        query = build_selector(selector_list)
        return self._request("GET", "/catalog/id=%s/dataset/id=%s/member/%s?%s" % (urlquote(catalog_id), urlquote(dataset_id),query, qs))
예제 #26
0
 def add_dataset_annotations(self, catalog_id, dataset_id,
                             annotations_dict):
     path = "/catalog/id=%s/dataset/id=%s/annotation" % (
         urlquote(catalog_id), urlquote(dataset_id))
     return self._request("POST", path, json.dumps(annotations_dict))
예제 #27
0
 def add_dataset_acl(self, catalog_id, dataset_id, access_rules):
     path = "/catalog/id=%s/dataset/id=%s/acl" % (
                 urlquote(catalog_id), urlquote(dataset_id))
     return self._request("POST", path, json.dumps(access_rules))
예제 #28
0
 def delete_annotation_def(self, catalog_id, annotation_name):
     return self._request(
         "DELETE", "/catalog/id=%s/annotation_def/%s" %
         (urlquote(catalog_id), urlquote(annotation_name)))
예제 #29
0
 def add_dataset_annotations(self, catalog_id, dataset_id,
                             annotations_dict):
     path = "/catalog/id=%s/dataset/id=%s/annotation" %(
             urlquote(catalog_id), urlquote(dataset_id))
     return self._request("POST", path, json.dumps(annotations_dict))
예제 #30
0
 def delete_member(self, catalog_id, dataset_id, member_id):
     """Delete the specified member."""
     return self._request(
         "DELETE", "/catalog/id=%s/dataset/id=%s/member/id=%s" %
         (urlquote(catalog_id), urlquote(dataset_id), urlquote(member_id)))
예제 #31
0
 def get_dataset_acl(self, catalog_id, dataset_id):
     path = "/catalog/id=%s/dataset/id=%s/acl" % (urlquote(catalog_id),
                                                  urlquote(dataset_id))
     return self._request("GET", path)
예제 #32
0
 def delete_catalog(self, catalog_id):
     """Delete the specified catalog."""
     return self._request("DELETE", "/catalog/id=%s"
                                    % urlquote(catalog_id))
예제 #33
0
 def add_dataset_acl(self, catalog_id, dataset_id, access_rules):
     path = "/catalog/id=%s/dataset/id=%s/acl" % (urlquote(catalog_id),
                                                  urlquote(dataset_id))
     return self._request("POST", path, json.dumps(access_rules))
예제 #34
0
 def delete_annotation_def(self, catalog_id, annotation_name):
     return self._request("DELETE", "/catalog/id=%s/annotation_def/%s"
                                 % (urlquote(catalog_id),
                                    urlquote(annotation_name)))
예제 #35
0
 def delete_catalog(self, catalog_id):
     """Delete the specified catalog."""
     return self._request("DELETE", "/catalog/id=%s" % urlquote(catalog_id))
예제 #36
0
 def delete_dataset(self, catalog_id, dataset_id):
     """Delete the specified dataset."""
     return self._request("DELETE", "/catalog/id=%s/dataset/id=%s"
                                    % (urlquote(catalog_id),
                                       urlquote(dataset_id)))
예제 #37
0
 def delete_dataset(self, catalog_id, dataset_id):
     """Delete the specified dataset."""
     return self._request(
         "DELETE", "/catalog/id=%s/dataset/id=%s" %
         (urlquote(catalog_id), urlquote(dataset_id)))
예제 #38
0
 def get_dataset_acl(self, catalog_id, dataset_id):
     path = "/catalog/id=%s/dataset/id=%s/acl" % (
                 urlquote(catalog_id), urlquote(dataset_id))
     return self._request("GET", path)