@@ -123,6 +123,15 @@ def name(self):
123123 """
124124 return self ._name
125125
126+ @property
127+ def database (self ):
128+ """Return the name of the database the collection belongs to.
129+
130+ :returns: The name of the database.
131+ :rtype: str | unicode
132+ """
133+ return self ._conn .database
134+
126135 @api_method
127136 def rename (self , new_name ):
128137 """Rename the collection.
@@ -930,6 +939,7 @@ def indexes(self):
930939 :rtype: [dict]
931940 :raises arango.exceptions.IndexListError: if the list of indexes
932941 cannot be retrieved
942+
933943 """
934944 request = Request (
935945 method = 'get' ,
@@ -988,7 +998,11 @@ def handler(res):
988998 return request , handler
989999
9901000 @api_method
991- def add_hash_index (self , fields , unique = None , sparse = None ):
1001+ def add_hash_index (self ,
1002+ fields ,
1003+ unique = None ,
1004+ sparse = None ,
1005+ deduplicate = None ):
9921006 """Create a new hash index in the collection.
9931007
9941008 :param fields: the document fields to index
@@ -997,6 +1011,14 @@ def add_hash_index(self, fields, unique=None, sparse=None):
9971011 :type unique: bool
9981012 :param sparse: index ``None``'s
9991013 :type sparse: bool
1014+ :param deduplicate: Controls whether inserting duplicate index values
1015+ from the same document into a unique array index leads to a unique
1016+ constraint error or not. If set to ``True`` (default), only a
1017+ single instance of each non-unique index values is inserted into
1018+ the index per document. Trying to insert a value into the index
1019+ that already exists will always fail, regardless of the value of
1020+ this field.
1021+ :param deduplicate: bool
10001022 :returns: the details on the new index
10011023 :rtype: dict
10021024 :raises arango.exceptions.IndexCreateError: if the hash index cannot
@@ -1007,10 +1029,16 @@ def add_hash_index(self, fields, unique=None, sparse=None):
10071029 data ['unique' ] = unique
10081030 if sparse is not None :
10091031 data ['sparse' ] = sparse
1032+ if deduplicate is not None :
1033+ data ['deduplicate' ] = deduplicate
10101034 return self ._add_index (data )
10111035
10121036 @api_method
1013- def add_skiplist_index (self , fields , unique = None , sparse = None ):
1037+ def add_skiplist_index (self ,
1038+ fields ,
1039+ unique = None ,
1040+ sparse = None ,
1041+ deduplicate = None ):
10141042 """Create a new skiplist index in the collection.
10151043
10161044 A skiplist index is used to find the ranges of documents (e.g. time).
@@ -1021,6 +1049,14 @@ def add_skiplist_index(self, fields, unique=None, sparse=None):
10211049 :type unique: bool
10221050 :param sparse: index ``None``'s
10231051 :type sparse: bool
1052+ :param deduplicate: Controls whether inserting duplicate index values
1053+ from the same document into a unique array index leads to a unique
1054+ constraint error or not. If set to ``True`` (default), only a
1055+ single instance of each non-unique index values is inserted into
1056+ the index per document. Trying to insert a value into the index
1057+ that already exists will always fail, regardless of the value of
1058+ this field.
1059+ :param deduplicate: bool
10241060 :returns: the details on the new index
10251061 :rtype: dict
10261062 :raises arango.exceptions.IndexCreateError: if the skiplist index
@@ -1031,6 +1067,8 @@ def add_skiplist_index(self, fields, unique=None, sparse=None):
10311067 data ['unique' ] = unique
10321068 if sparse is not None :
10331069 data ['sparse' ] = sparse
1070+ if deduplicate is not None :
1071+ data ['deduplicate' ] = deduplicate
10341072 return self ._add_index (data )
10351073
10361074 @api_method
@@ -1138,3 +1176,83 @@ def handler(res):
11381176 return not res .body ['error' ]
11391177
11401178 return request , handler
1179+
1180+ @api_method
1181+ def user_access (self , username ):
1182+ """Return a user's access details for the collection.
1183+
1184+ Appropriate permissions are required in order to execute this method.
1185+
1186+ :param username: The name of the user.
1187+ :type username: str | unicode
1188+ :returns: The access details (e.g. ``"rw"``, ``None``)
1189+ :rtype: str | unicode | None
1190+ :raises: arango.exceptions.UserAccessError: If the retrieval fails.
1191+ """
1192+ request = Request (
1193+ method = 'get' ,
1194+ endpoint = '/_api/user/{}/database/{}/{}' .format (
1195+ username , self .database , self .name
1196+ )
1197+ )
1198+
1199+ def handler (res ):
1200+ if res .status_code in HTTP_OK :
1201+ result = res .body ['result' ].lower ()
1202+ return None if result == 'none' else result
1203+ raise UserAccessError (res )
1204+
1205+ return request , handler
1206+
1207+ @api_method
1208+ def grant_user_access (self , username ):
1209+ """Grant user access to the collection.
1210+
1211+ Appropriate permissions are required in order to execute this method.
1212+
1213+ :param username: The name of the user.
1214+ :type username: str | unicode
1215+ :returns: Whether the operation was successful or not.
1216+ :rtype: bool
1217+ :raises arango.exceptions.UserGrantAccessError: If the operation fails.
1218+ """
1219+ request = Request (
1220+ method = 'put' ,
1221+ endpoint = '/_api/user/{}/database/{}/{}' .format (
1222+ username , self .database , self .name
1223+ ),
1224+ data = {'grant' : 'rw' }
1225+ )
1226+
1227+ def handler (res ):
1228+ if res .status_code in HTTP_OK :
1229+ return True
1230+ raise UserGrantAccessError (res )
1231+
1232+ return request , handler
1233+
1234+ @api_method
1235+ def revoke_user_access (self , username ):
1236+ """Revoke user access to the collection.
1237+
1238+ Appropriate permissions are required in order to execute this method.
1239+
1240+ :param username: The name of the user.
1241+ :type username: str | unicode
1242+ :returns: Whether the operation was successful or not.
1243+ :rtype: bool
1244+ :raises arango.exceptions.UserRevokeAccessError: If the operation fails.
1245+ """
1246+ request = Request (
1247+ method = 'delete' ,
1248+ endpoint = '/_api/user/{}/database/{}/{}' .format (
1249+ username , self .database , self .name
1250+ )
1251+ )
1252+
1253+ def handler (res ):
1254+ if res .status_code in HTTP_OK :
1255+ return True
1256+ raise UserRevokeAccessError (res )
1257+
1258+ return request , handler
0 commit comments