22
33from irods .manager import Manager
44from irods .api_number import api_number
5- from irods .message import ModAclRequest , iRODSMessage
5+ from irods .message import ModAclRequest , iRODSMessage , JSON_Message
66from irods .data_object import iRODSDataObject , irods_dirname , irods_basename
77from irods .collection import iRODSCollection
88from irods .models import (
1414 CollectionAccess ,
1515)
1616from irods .access import iRODSAccess
17+ import irods .exception as ex
1718from irods .column import In
1819from irods .user import iRODSUser
1920
@@ -36,6 +37,33 @@ def users_by_ids(session, ids=()):
3637
3738
3839class AccessManager (Manager ):
40+
41+ def _ACL_operation (self , op_input : iRODSAccess ):
42+ return {
43+ "acl" : op_input .access_name ,
44+ "entity_name" : op_input .user_name ,
45+ ** (
46+ {} if not (z := op_input .user_zone )
47+ else {"zone" : z }
48+ )
49+ }
50+
51+ def _call_atomic_acl_api (self , logical_path : str , * operations , admin = False ):
52+ request_text = {"logical_path" : logical_path }
53+ request_text ["admin_mode" ] = admin
54+ request_text ["operations" ] = [self ._ACL_operation (op ) for op in operations ]
55+
56+ with self .sess .pool .get_connection () as conn :
57+ request_msg = iRODSMessage (
58+ "RODS_API_REQ" ,
59+ JSON_Message (request_text , conn .server_version ),
60+ int_info = 20005 ,
61+ )
62+ conn .send (request_msg )
63+ response = conn .recv ()
64+ response_msg = response .get_json_encoded_struct ()
65+ logger .debug ("in atomic ACL api, server responded with: %r" , response_msg )
66+
3967 def get (self , target , report_raw_acls = True , ** kw ):
4068
4169 if report_raw_acls :
0 commit comments