CloudApiRequest 1.0.0__py3-none-any.whl → 1.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of CloudApiRequest might be problematic. Click here for more details.

cloud/CloudApiConfig.py CHANGED
@@ -1,311 +1,437 @@
1
- from faker import Faker
2
- import string
3
- import time
4
- import random
5
- import datetime
6
- import pytz
7
- import hashlib
8
- import base64
9
- import hmac
10
- import json
11
- from urllib.parse import urlencode, urlparse
12
- from Crypto.Cipher import AES
13
- from Crypto.Util.Padding import pad, unpad
14
-
15
- from cloud.CloudRequestUtil import CloudHttpClient
16
-
17
-
18
- class CloudTimes:
19
- def __init__(self, dt=None, tz=pytz.timezone('Asia/Shanghai')):
20
- """
21
- 初始化时间工具类
22
-
23
- :param dt: datetime对象,默认使用当前时间
24
- :param tz: 时区,默认使用本地时区
25
- """
26
- self.tz = tz
27
- self.dt = dt or datetime.datetime.now(self.tz)
28
-
29
- def to_datetime(self):
30
- """
31
- 返回datetime对象
32
-
33
- :return: datetime对象
34
- """
35
- return self.dt
36
-
37
- def to_str(self, fmt='%Y-%m-%dT%H:%M:%SZ'):
38
- """
39
- 将datetime对象转换为指定格式的字符串
40
-
41
- :param fmt: 时间格式,默认为'%Y-%m-%d %H:%M:%S'
42
- :return: 格式化后的时间字符串
43
- """
44
- return self.dt.strftime(fmt)
45
-
46
-
47
- class CloudDataGenerator:
48
- """
49
- 生成中文数据的工具类
50
- """
51
-
52
- def __init__(self):
53
- self.fake = Faker(locale='zh_CN')
54
-
55
- def generate_name(self):
56
- """
57
- 生成中文姓名,返回字符串。
58
- """
59
- return self.fake.name()
60
-
61
- def generate_address(self):
62
- """
63
- 生成中文地址,返回字符串。
64
- """
65
- return self.fake.address()
66
-
67
- def generate_phone_number(self):
68
- """
69
- 生成中文手机号,返回字符串。
70
- """
71
- return self.fake.phone_number()
72
-
73
- def generate_id_number(self):
74
- """
75
- 生成中文身份证号码,返回字符串。
76
- """
77
- return self.fake.ssn()
78
-
79
- def random_number(self, digits=4):
80
- """
81
- 生成一个4位随机整数并转换为字符串类型
82
- 如果生成的整数不足4位,则在左侧用0进行填充
83
- """
84
- digits = int(digits)
85
- return "{:04d}".format(self.fake.random_number(digits=digits))
86
-
87
- def get_cloud_password(self):
88
- """
89
- 获取初始化的SK 加密后的密码
90
- :return:
91
- """
92
- # 这里不能直接引用config,因为config类还没有定义
93
- # 在实际使用时,会通过实例方法调用
94
- return "default_cloud_password"
95
-
96
- @staticmethod
97
- def start_of_day():
98
- """
99
- 获取当前时间开始时间戳:eg:2023-06-01 00:00:00
100
- """
101
- now = datetime.datetime.now()
102
- return datetime.datetime(now.year, now.month, now.day)
103
-
104
- @staticmethod
105
- def end_of_day():
106
- """
107
- 获取当前时间开始时间戳:eg:2023-06-01 23:59:59
108
- """
109
- return CloudDataGenerator.start_of_day() + datetime.timedelta(days=1) - datetime.timedelta(seconds=1)
110
-
111
- def start_of_day_s(self):
112
- """
113
- 获取当前时间开始时间戳:eg:1685548800 秒级
114
- """
115
- return int(time.mktime(CloudDataGenerator.start_of_day().timetuple()))
116
-
117
- def end_of_day_s(self):
118
- """
119
- 获取当前时间结束时间戳:eg:1685635199 秒级
120
- """
121
- return int(time.mktime(CloudDataGenerator.end_of_day().timetuple()))
122
-
123
- def random_externalId(self):
124
- """
125
- 生成唯一性数据,crm用于 外部企业客户id
126
- """
127
- num = str(random.randint(1000, 9999))
128
- src_uppercase = string.ascii_uppercase # string_大写字母
129
- src_lowercase = string.ascii_lowercase # string_小写字母
130
- chrs = random.sample(src_lowercase + src_uppercase, 3)
131
- for i in chrs:
132
- num += i
133
- return num
134
-
135
- def encryptPassword(self, plain_text='Aa112233'):
136
- """
137
- 加密 - 使用默认密钥
138
- """
139
- # 使用默认密钥进行加密
140
- password = "default_encryption_key"
141
- # 设置随机数生成器的种子
142
- secure_random = hashlib.sha1(password.encode()).digest()
143
- # 创建对称加密密钥生成器
144
- kgen = hashlib.sha1(secure_random).digest()[:16]
145
- # 创建密码器并初始化
146
- cipher = AES.new(kgen, AES.MODE_ECB)
147
- # 加密明文(使用PKCS7填充)
148
- padded_plain_text = pad(plain_text.encode(), AES.block_size)
149
- encrypted_bytes = cipher.encrypt(padded_plain_text)
150
- # 将加密结果转换为16进制字符串
151
- encrypted_text = base64.b16encode(encrypted_bytes).decode().lower()
152
- return encrypted_text
153
-
154
- def decrypt(self, encrypted_text, password):
155
- """
156
- # 解密
157
- """
158
- # 设置随机数生成器的种子
159
- secure_random = hashlib.sha1(password.encode()).digest()
160
- # 创建对称加密密钥生成器
161
- kgen = hashlib.sha1(secure_random).digest()[:16]
162
- # 创建密码器并初始化
163
- cipher = AES.new(kgen, AES.MODE_ECB)
164
- # 解密密文(parseHexStr2Byte方法为将16进制字符串转为二进制字节数组)
165
- encrypted_bytes = base64.b16decode(encrypted_text)
166
- decrypted_bytes = cipher.decrypt(encrypted_bytes)
167
- decrypted_text = unpad(decrypted_bytes, AES.block_size).decode()
168
- return decrypted_text
169
-
170
- def generate_cloud_signature(self, method, url, params, access_key_id, access_key_secret):
171
- """
172
- 生成云服务签名
173
- """
174
- # 获取当前时间戳
175
- timestamp = int(time.time())
176
-
177
- # 构建签名字符串
178
- # 1. 请求方法
179
- string_to_sign = method.upper() + "\n"
180
-
181
- # 2. 请求路径
182
- parsed_url = urlparse(url)
183
- string_to_sign += parsed_url.path + "\n"
184
-
185
- # 3. 查询参数(按字典序排序)
186
- if params:
187
- sorted_params = sorted(params.items())
188
- query_string = "&".join([f"{k}={v}" for k, v in sorted_params])
189
- string_to_sign += query_string + "\n"
190
- else:
191
- string_to_sign += "\n"
192
-
193
- # 4. 时间戳
194
- string_to_sign += str(timestamp)
195
-
196
- # 使用HMAC-SHA256进行签名
197
- signature = hmac.new(
198
- access_key_secret.encode('utf-8'),
199
- string_to_sign.encode('utf-8'),
200
- hashlib.sha256
201
- ).hexdigest()
202
-
203
- # 构建Authorization头
204
- auth_header = f"Cloud {access_key_id}:{signature}"
205
-
206
- return auth_header, timestamp
207
-
208
-
209
- class config:
210
- """
211
- 配置文件
212
- """
213
-
214
- def __init__(self, baseUrl=None, token=None, CloudPassword=None,
215
- commonTestCasePath=None, methObj=None, Session: CloudHttpClient = CloudHttpClient(),
216
- assertFail='stop', tEnv='base', enterpriseId=None, validateType='2'):
217
- """
218
- 初始化配置文件
219
- """
220
- self._baseUrl = baseUrl
221
- self._token = token
222
- self._enterpriseId = enterpriseId
223
- self._validateType = validateType
224
- # 加密后的密码
225
- self._CloudPassword = CloudPassword
226
- self._commonTestCasePath = commonTestCasePath
227
- self._methObj = methObj
228
- self._assertFail = assertFail
229
- self._tEnv = tEnv
230
- # 构建全局session
231
- self._Session = Session
232
-
233
- @property
234
- def Session(self):
235
- return self._Session
236
-
237
- @Session.setter
238
- def Session(self, value):
239
- self._Session = value
240
-
241
- @property
242
- def methObj(self):
243
- return self._methObj
244
-
245
- @methObj.setter
246
- def methObj(self, value):
247
- self._methObj = value
248
-
249
- @property
250
- def CloudPassword(self):
251
- return self._CloudPassword
252
-
253
- @CloudPassword.setter
254
- def CloudPassword(self, value):
255
- self._CloudPassword = value
256
-
257
- @property
258
- def commonTestCasePath(self):
259
- return self._commonTestCasePath
260
-
261
- @commonTestCasePath.setter
262
- def commonTestCasePath(self, value):
263
- self._commonTestCasePath = value
264
-
265
- @property
266
- def baseUrl(self):
267
- return self._baseUrl
268
-
269
- @baseUrl.setter
270
- def baseUrl(self, value):
271
- self._baseUrl = value
272
-
273
- @property
274
- def assertFail(self):
275
- return self._assertFail
276
-
277
- @assertFail.setter
278
- def assertFail(self, value):
279
- self._assertFail = value
280
-
281
- @property
282
- def enterpriseId(self):
283
- return self._enterpriseId
284
-
285
- @enterpriseId.setter
286
- def enterpriseId(self, value):
287
- self._enterpriseId = value
288
-
289
- @property
290
- def tEnv(self):
291
- return self._tEnv
292
-
293
- @tEnv.setter
294
- def tEnv(self, value):
295
- self._tEnv = value
296
-
297
- @property
298
- def validateType(self):
299
- return self._validateType
300
-
301
- @validateType.setter
302
- def validateType(self, value):
303
- self._validateType = value
304
-
305
- @property
306
- def token(self):
307
- return self._token
308
-
309
- @token.setter
310
- def token(self, value):
311
- self._token = value
1
+ from faker import Faker
2
+ import string
3
+ import time
4
+ import random
5
+ import datetime
6
+ import pytz
7
+ import hashlib
8
+ import base64
9
+ import hmac
10
+ import json
11
+ from urllib.parse import urlencode, urlparse
12
+ from Crypto.Cipher import AES
13
+ from Crypto.Util.Padding import pad, unpad
14
+
15
+ from cloud.CloudRequestUtil import CloudHttpClient
16
+
17
+
18
+ class CloudTimes:
19
+ def __init__(self, dt=None, tz=pytz.timezone('Asia/Shanghai')):
20
+ """
21
+ 初始化时间工具类
22
+
23
+ :param dt: datetime对象,默认使用当前时间
24
+ :param tz: 时区,默认使用本地时区
25
+ """
26
+ self.tz = tz
27
+ self.dt = dt or datetime.datetime.now(self.tz)
28
+
29
+ def to_datetime(self):
30
+ """
31
+ 返回datetime对象
32
+
33
+ :return: datetime对象
34
+ """
35
+ return self.dt
36
+
37
+ def to_str(self, fmt='%Y-%m-%dT%H:%M:%SZ'):
38
+ """
39
+ 将datetime对象转换为指定格式的字符串
40
+
41
+ :param fmt: 时间格式,默认为'%Y-%m-%d %H:%M:%S'
42
+ :return: 格式化后的时间字符串
43
+ """
44
+ return self.dt.strftime(fmt)
45
+
46
+
47
+ class CloudDataGenerator:
48
+ """
49
+ 生成中文数据的工具类
50
+ """
51
+
52
+ # 类级别的计数器,确保cno绝对唯一
53
+ _cno_counter = 0
54
+
55
+ def __init__(self):
56
+ self.fake = Faker(locale='zh_CN')
57
+
58
+ def generate_name(self):
59
+ """
60
+ 生成中文姓名,返回字符串。
61
+ """
62
+ return self.fake.name()
63
+
64
+ def generate_address(self):
65
+ """
66
+ 生成中文地址,返回字符串。
67
+ """
68
+ return self.fake.address()
69
+
70
+ def generate_phone_number(self):
71
+ """
72
+ 生成中文手机号,返回字符串。
73
+ """
74
+ return self.fake.phone_number()
75
+
76
+ def generate_id_number(self):
77
+ """
78
+ 生成中文身份证号码,返回字符串。
79
+ """
80
+ return self.fake.ssn()
81
+
82
+ def random_number(self, digits=4):
83
+ """
84
+ 生成一个指定位数的随机整数并转换为字符串类型
85
+ 如果生成的整数不足指定位数,则在左侧用0进行填充
86
+ """
87
+ digits = int(digits)
88
+ return f"{{:0{digits}d}}".format(self.fake.random_number(digits=digits))
89
+
90
+ def generate_cno(self, min_digits=3, max_digits=10):
91
+ """
92
+ 生成3-10位纯数字的cno,确保一次运行中不重复
93
+ 使用UUID+时间戳+计数器确保绝对唯一性,避免以0开头
94
+
95
+ Args:
96
+ min_digits (int): 最小位数,默认3
97
+ max_digits (int): 最大位数,默认10
98
+
99
+ Returns:
100
+ str: 生成的cno字符串
101
+ """
102
+ import uuid
103
+ import time
104
+
105
+ # 增加计数器确保绝对唯一性
106
+ CloudDataGenerator._cno_counter += 1
107
+
108
+ # 生成随机位数(3-10位)
109
+ digits = random.randint(min_digits, max_digits)
110
+
111
+ # 生成UUID并转换为数字
112
+ uuid_str = uuid.uuid4().hex
113
+ # 取UUID的前12位转换为数字
114
+ uuid_num = int(uuid_str[:12], 16)
115
+
116
+ # 添加时间戳确保唯一性(纳秒级精度)
117
+ timestamp = int(time.time() * 1000000000) # 纳秒级时间戳
118
+
119
+ # 添加计数器确保绝对唯一性
120
+ counter = CloudDataGenerator._cno_counter
121
+
122
+ # 组合生成唯一数字
123
+ unique_num = (uuid_num + timestamp + counter) % (10 ** 15) # 限制在15位以内
124
+
125
+ # 确保数字在指定位数范围内且不以0开头
126
+ min_value = 10 ** (digits - 1) # 最小n位数(不以0开头)
127
+ max_value = 10 ** digits - 1 # 最大n位数
128
+
129
+ # 如果超出范围则取模
130
+ if unique_num > max_value:
131
+ unique_num = min_value + (unique_num % (max_value - min_value + 1))
132
+ elif unique_num < min_value:
133
+ unique_num = min_value + (unique_num % (max_value - min_value + 1))
134
+
135
+ return str(unique_num)
136
+
137
+ def generate_cno_range(self, start_digits=3, end_digits=10, count=1):
138
+ """
139
+ 生成cno范围,用于批量操作
140
+ 确保endCno > cno且位数一致
141
+
142
+ Args:
143
+ start_digits (int): 起始位数,默认3
144
+ end_digits (int): 结束位数,默认10
145
+ count (int): 生成数量,默认1
146
+
147
+ Returns:
148
+ tuple: (start_cno, end_cno) 起始和结束cno
149
+ """
150
+ # 生成随机位数
151
+ digits = random.randint(start_digits, end_digits)
152
+
153
+ # 生成起始cno
154
+ start_cno = self.generate_cno(digits, digits)
155
+
156
+ # 计算结束cno
157
+ start_value = int(start_cno)
158
+ end_value = start_value + count - 1
159
+
160
+ # 确保结束值不超过指定位数的最大值
161
+ max_value = 10 ** digits - 1
162
+ if end_value > max_value:
163
+ # 如果超出范围,重新生成起始值
164
+ start_value = max_value - count + 1
165
+ start_cno = str(start_value)
166
+ end_value = max_value
167
+
168
+ end_cno = str(end_value)
169
+
170
+ return start_cno, end_cno
171
+
172
+ def generate_cno_fixed_digits(self, digits):
173
+ """
174
+ 生成指定位数的cno,保持向后兼容性
175
+
176
+ Args:
177
+ digits (int): 指定位数
178
+
179
+ Returns:
180
+ str: 生成的cno字符串
181
+ """
182
+ return self.generate_cno(digits, digits)
183
+
184
+ def get_cloud_password(self):
185
+ """
186
+ 获取初始化的SK 加密后的密码
187
+ :return:
188
+ """
189
+ # 这里不能直接引用config,因为config类还没有定义
190
+ # 在实际使用时,会通过实例方法调用
191
+ return "default_cloud_password"
192
+
193
+ @staticmethod
194
+ def start_of_day():
195
+ """
196
+ 获取当前时间开始时间戳:eg:2023-06-01 00:00:00
197
+ """
198
+ now = datetime.datetime.now()
199
+ return datetime.datetime(now.year, now.month, now.day)
200
+
201
+ @staticmethod
202
+ def end_of_day():
203
+ """
204
+ 获取当前时间开始时间戳:eg:2023-06-01 23:59:59
205
+ """
206
+ return CloudDataGenerator.start_of_day() + datetime.timedelta(days=1) - datetime.timedelta(seconds=1)
207
+
208
+ def start_of_day_s(self):
209
+ """
210
+ 获取当前时间开始时间戳:eg:1685548800 秒级
211
+ """
212
+ return int(time.mktime(CloudDataGenerator.start_of_day().timetuple()))
213
+
214
+ def end_of_day_s(self):
215
+ """
216
+ 获取当前时间结束时间戳:eg:1685635199 秒级
217
+ """
218
+ return int(time.mktime(CloudDataGenerator.end_of_day().timetuple()))
219
+
220
+ def random_externalId(self):
221
+ """
222
+ 生成唯一性数据,crm用于 外部企业客户id
223
+ """
224
+ num = str(random.randint(1000, 9999))
225
+ src_uppercase = string.ascii_uppercase # string_大写字母
226
+ src_lowercase = string.ascii_lowercase # string_小写字母
227
+ chrs = random.sample(src_lowercase + src_uppercase, 3)
228
+ for i in chrs:
229
+ num += i
230
+ return num
231
+
232
+ def encryptPassword(self, plain_text='Aa112233'):
233
+ """
234
+ 加密 - 使用默认密钥
235
+ """
236
+ # 使用默认密钥进行加密
237
+ password = "default_encryption_key"
238
+ # 设置随机数生成器的种子
239
+ secure_random = hashlib.sha1(password.encode()).digest()
240
+ # 创建对称加密密钥生成器
241
+ kgen = hashlib.sha1(secure_random).digest()[:16]
242
+ # 创建密码器并初始化
243
+ cipher = AES.new(kgen, AES.MODE_ECB)
244
+ # 加密明文(使用PKCS7填充)
245
+ padded_plain_text = pad(plain_text.encode(), AES.block_size)
246
+ encrypted_bytes = cipher.encrypt(padded_plain_text)
247
+ # 将加密结果转换为16进制字符串
248
+ encrypted_text = base64.b16encode(encrypted_bytes).decode().lower()
249
+ return encrypted_text
250
+
251
+ def decrypt(self, encrypted_text, password):
252
+ """
253
+ # 解密
254
+ """
255
+ # 设置随机数生成器的种子
256
+ secure_random = hashlib.sha1(password.encode()).digest()
257
+ # 创建对称加密密钥生成器
258
+ kgen = hashlib.sha1(secure_random).digest()[:16]
259
+ # 创建密码器并初始化
260
+ cipher = AES.new(kgen, AES.MODE_ECB)
261
+ # 解密密文(parseHexStr2Byte方法为将16进制字符串转为二进制字节数组)
262
+ encrypted_bytes = base64.b16decode(encrypted_text)
263
+ decrypted_bytes = cipher.decrypt(encrypted_bytes)
264
+ decrypted_text = unpad(decrypted_bytes, AES.block_size).decode()
265
+ return decrypted_text
266
+
267
+ def generate_user_data(self):
268
+ """
269
+ 生成随路数据JSON字符串
270
+ 格式:{"key":"value"},不支持数组和嵌套
271
+ """
272
+ data = {
273
+ "testKey1": f"testValue{self.fake.random_number(digits=3)}",
274
+ "testKey2": f"testValue{self.fake.random_number(digits=3)}",
275
+ "testKey3": f"testValue{self.fake.random_number(digits=3)}"
276
+ }
277
+ return json.dumps(data, ensure_ascii=False)
278
+
279
+ def generate_user_data_keys(self):
280
+ """
281
+ 生成随路数据键值字符串
282
+ 格式:key1,key2,key3
283
+ """
284
+ return "testKey1,testKey2,testKey3"
285
+
286
+ def generate_cloud_signature(self, method, url, params, access_key_id, access_key_secret):
287
+ """
288
+ 生成云服务签名
289
+ """
290
+ # 获取当前时间戳
291
+ timestamp = int(time.time())
292
+
293
+ # 构建签名字符串
294
+ # 1. 请求方法
295
+ string_to_sign = method.upper() + "\n"
296
+
297
+ # 2. 请求路径
298
+ parsed_url = urlparse(url)
299
+ string_to_sign += parsed_url.path + "\n"
300
+
301
+ # 3. 查询参数(按字典序排序)
302
+ if params:
303
+ sorted_params = sorted(params.items())
304
+ query_string = "&".join([f"{k}={v}" for k, v in sorted_params])
305
+ string_to_sign += query_string + "\n"
306
+ else:
307
+ string_to_sign += "\n"
308
+
309
+ # 4. 时间戳
310
+ string_to_sign += str(timestamp)
311
+
312
+ # 使用HMAC-SHA256进行签名
313
+ signature = hmac.new(
314
+ access_key_secret.encode('utf-8'),
315
+ string_to_sign.encode('utf-8'),
316
+ hashlib.sha256
317
+ ).hexdigest()
318
+
319
+ # 构建Authorization头
320
+ auth_header = f"Cloud {access_key_id}:{signature}"
321
+
322
+ return auth_header, timestamp
323
+
324
+
325
+ class config:
326
+ """
327
+ 配置文件
328
+ """
329
+
330
+ def __init__(self, baseUrl=None, token=None, CloudPassword=None,
331
+ commonTestCasePath=None, methObj=None, Session: CloudHttpClient = CloudHttpClient(),
332
+ assertFail='stop', tEnv='base', enterpriseId=None, validateType='2', obClids=None):
333
+ """
334
+ 初始化配置文件
335
+ """
336
+ self._baseUrl = baseUrl
337
+ self._token = token
338
+ self._enterpriseId = enterpriseId
339
+ self._validateType = validateType
340
+ # 加密后的密码
341
+ self._CloudPassword = CloudPassword
342
+ self._commonTestCasePath = commonTestCasePath
343
+ self._methObj = methObj
344
+ self._assertFail = assertFail
345
+ self._tEnv = tEnv
346
+ # 构建全局session
347
+ self._Session = Session
348
+ # 外呼号码配置
349
+ self._obClids = obClids
350
+
351
+ @property
352
+ def Session(self):
353
+ return self._Session
354
+
355
+ @Session.setter
356
+ def Session(self, value):
357
+ self._Session = value
358
+
359
+ @property
360
+ def methObj(self):
361
+ return self._methObj
362
+
363
+ @methObj.setter
364
+ def methObj(self, value):
365
+ self._methObj = value
366
+
367
+ @property
368
+ def CloudPassword(self):
369
+ return self._CloudPassword
370
+
371
+ @CloudPassword.setter
372
+ def CloudPassword(self, value):
373
+ self._CloudPassword = value
374
+
375
+ @property
376
+ def commonTestCasePath(self):
377
+ return self._commonTestCasePath
378
+
379
+ @commonTestCasePath.setter
380
+ def commonTestCasePath(self, value):
381
+ self._commonTestCasePath = value
382
+
383
+ @property
384
+ def baseUrl(self):
385
+ return self._baseUrl
386
+
387
+ @baseUrl.setter
388
+ def baseUrl(self, value):
389
+ self._baseUrl = value
390
+
391
+ @property
392
+ def assertFail(self):
393
+ return self._assertFail
394
+
395
+ @assertFail.setter
396
+ def assertFail(self, value):
397
+ self._assertFail = value
398
+
399
+ @property
400
+ def enterpriseId(self):
401
+ return self._enterpriseId
402
+
403
+ @enterpriseId.setter
404
+ def enterpriseId(self, value):
405
+ self._enterpriseId = value
406
+
407
+ @property
408
+ def tEnv(self):
409
+ return self._tEnv
410
+
411
+ @tEnv.setter
412
+ def tEnv(self, value):
413
+ self._tEnv = value
414
+
415
+ @property
416
+ def validateType(self):
417
+ return self._validateType
418
+
419
+ @validateType.setter
420
+ def validateType(self, value):
421
+ self._validateType = value
422
+
423
+ @property
424
+ def token(self):
425
+ return self._token
426
+
427
+ @token.setter
428
+ def token(self, value):
429
+ self._token = value
430
+
431
+ @property
432
+ def obClids(self):
433
+ return self._obClids
434
+
435
+ @obClids.setter
436
+ def obClids(self, value):
437
+ self._obClids = value