@@ -123,6 +123,15 @@ def name(self):
123
123
"""
124
124
return self ._name
125
125
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
+
126
135
@api_method
127
136
def rename (self , new_name ):
128
137
"""Rename the collection.
@@ -930,6 +939,7 @@ def indexes(self):
930
939
:rtype: [dict]
931
940
:raises arango.exceptions.IndexListError: if the list of indexes
932
941
cannot be retrieved
942
+
933
943
"""
934
944
request = Request (
935
945
method = 'get' ,
@@ -988,7 +998,11 @@ def handler(res):
988
998
return request , handler
989
999
990
1000
@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 ):
992
1006
"""Create a new hash index in the collection.
993
1007
994
1008
:param fields: the document fields to index
@@ -997,6 +1011,14 @@ def add_hash_index(self, fields, unique=None, sparse=None):
997
1011
:type unique: bool
998
1012
:param sparse: index ``None``'s
999
1013
: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
1000
1022
:returns: the details on the new index
1001
1023
:rtype: dict
1002
1024
:raises arango.exceptions.IndexCreateError: if the hash index cannot
@@ -1007,10 +1029,16 @@ def add_hash_index(self, fields, unique=None, sparse=None):
1007
1029
data ['unique' ] = unique
1008
1030
if sparse is not None :
1009
1031
data ['sparse' ] = sparse
1032
+ if deduplicate is not None :
1033
+ data ['deduplicate' ] = deduplicate
1010
1034
return self ._add_index (data )
1011
1035
1012
1036
@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 ):
1014
1042
"""Create a new skiplist index in the collection.
1015
1043
1016
1044
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):
1021
1049
:type unique: bool
1022
1050
:param sparse: index ``None``'s
1023
1051
: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
1024
1060
:returns: the details on the new index
1025
1061
:rtype: dict
1026
1062
:raises arango.exceptions.IndexCreateError: if the skiplist index
@@ -1031,6 +1067,8 @@ def add_skiplist_index(self, fields, unique=None, sparse=None):
1031
1067
data ['unique' ] = unique
1032
1068
if sparse is not None :
1033
1069
data ['sparse' ] = sparse
1070
+ if deduplicate is not None :
1071
+ data ['deduplicate' ] = deduplicate
1034
1072
return self ._add_index (data )
1035
1073
1036
1074
@api_method
@@ -1138,3 +1176,83 @@ def handler(res):
1138
1176
return not res .body ['error' ]
1139
1177
1140
1178
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