正在显示
1 个修改的文件
包含
197 行增加
和
197 行删除
1 | -import requests | ||
2 | -import time | ||
3 | -import oss2 | ||
4 | -from common.log import * | ||
5 | - | ||
6 | -logger = BotLogger(os.path.basename(__file__), logname=1).getLogger() | ||
7 | - | ||
8 | - | ||
9 | -def handle_error(res, normal_status_code): | ||
10 | - """ | ||
11 | - 统一处理workai平台返回的error | ||
12 | - :param res: 调用接口的返回 | ||
13 | - :param normal_status_code: 正常返回的status code | ||
14 | - :return: 返回错误信息 | ||
15 | - """ | ||
16 | - if res is None or res.status_code == normal_status_code: | ||
17 | - return '' | ||
18 | - | ||
19 | - logger.info('The res is %s' % res) | ||
20 | - err = '网络或服务器繁忙!' | ||
21 | - try: | ||
22 | - if 'message' in res.json(): | ||
23 | - err = res.json()['message'] | ||
24 | - except Exception as e: | ||
25 | - logger.error(str(e)) | ||
26 | - | ||
27 | - return err | ||
28 | - | ||
29 | - | ||
30 | -def get_token_by_password(username, password, tenant_id, tenant_type): | ||
31 | - """ | ||
32 | - 密码方式获取access_token | ||
33 | - :param username: 系统管理员用户 | ||
34 | - :param password: 系统管理员密码 | ||
35 | - :param tenant_id: 客户在workai云平台唯一表示 | ||
36 | - :return: 返回access_token, refresh_token 以及error, access_token用于访问接口的令牌, refresh_token | ||
37 | - 用于刷新获取新的access_token, error为返回的错误信息 | ||
38 | - """ | ||
39 | - data = { | ||
40 | - 'grant_type': 'password', | ||
41 | - 'username': username, | ||
42 | - 'password': password, | ||
43 | - 'scope': 'global_access:tenant_admin,tenant:%s,tenant_type:%s' % (tenant_id, tenant_type), | ||
44 | - } | ||
45 | - | ||
46 | - path = '%s/uaa/v1/auth/tokens' % WACLOUD_API_ENDPOINT | ||
47 | - try: | ||
48 | - res = requests.post(path, json=data, timeout=10) | ||
49 | - err = handle_error(res, 200) | ||
50 | - if err != '': | ||
51 | - logger.error('Could not get the token by password for user: %s, tenant: %s' % (username, tenant_id)) | ||
52 | - return '', '', err, None | ||
53 | - | ||
54 | - ret = res.json() | ||
55 | - company, username, play_type = '', '', '' | ||
56 | - if tenant_type == '0': | ||
57 | - play_type = 'HRO' | ||
58 | - elif tenant_type == '1': | ||
59 | - play_type = 'HR' | ||
60 | - | ||
61 | - try: | ||
62 | - company = ret['tenant']['name'] | ||
63 | - username = ret['user']['name'] | ||
64 | - except Exception as e: | ||
65 | - logger.error(str(e)) | ||
66 | - | ||
67 | - return ret['access_token'], ret['refresh_token'], '', (company, username, play_type) | ||
68 | - except Exception as e: | ||
69 | - logger.error(str(e)) | ||
70 | - return '', '', '网络或服务器异常,请稍后再试!', None | ||
71 | - | ||
72 | - | ||
73 | -def refresh_token(rtoken, tenant_id): | ||
74 | - """ | ||
75 | - 刷新token方式获取access_token | ||
76 | - :return: 返回access_token, refresh_token 以及error, access_token用于访问接口的令牌, refresh_token | ||
77 | - 用于刷新获取新的access_token, error为返回的错误信息 | ||
78 | - """ | ||
79 | - data = { | ||
80 | - 'grant_type': 'refresh_token', | ||
81 | - 'refresh_token': rtoken, | ||
82 | - 'scope': 'global_access:tenant_admin,tenant:%s' % tenant_id, | ||
83 | - } | ||
84 | - | ||
85 | - path = '%s/uaa/v1/auth/tokens' % WACLOUD_API_ENDPOINT | ||
86 | - res = requests.post(path, json=data) | ||
87 | - | ||
88 | - err = handle_error(res, 200) | ||
89 | - if err != '': | ||
90 | - logger.error('Could not get the token by refresh token for tenant: %s' % (tenant_id,)) | ||
91 | - return '', '', err | ||
92 | - | ||
93 | - ret = res.json() | ||
94 | - return ret['access_token'], ret['refresh_token'], '' | ||
95 | - | ||
96 | - | ||
97 | -def upload_file(ctx, local_path, tenant_type, file_name): | ||
98 | - """上传附件""" | ||
99 | - object_path = "" | ||
100 | - if ctx is None or local_path is None: | ||
101 | - return 401, object_path | ||
102 | - | ||
103 | - headers = {'Authorization': 'Bearer %s' % ctx['access_token']} | ||
104 | - path = '%s/filemeta/v2/inits' % (WACLOUD_API_ENDPOINT,) | ||
105 | - if tenant_type == "0": | ||
106 | - data = {"object_type": "hro", "access_type": "sdk"} | ||
107 | - elif tenant_type == "1": | ||
108 | - data = {"object_type": "hr", "access_type": "sdk"} | ||
109 | - else: | ||
110 | - return 401, '配置文件设置tenant_type的值有误' | ||
111 | - | ||
112 | - res = None | ||
113 | - try: | ||
114 | - res = requests.post(path, json=data, headers=headers, timeout=120) | ||
115 | - if res.status_code == 401: | ||
116 | - access_token, _refresh_token, err = refresh_token(ctx['refresh_token'], ctx['tenant_id']) | ||
117 | - if err != '': | ||
118 | - return 401, object_path | ||
119 | - ctx['access_token'] = access_token | ||
120 | - ctx['refresh_token'] = _refresh_token | ||
121 | - headers = {'Authorization': 'Bearer %s' % ctx['access_token']} | ||
122 | - res = requests.post(path, json=data, headers=headers, timeout=120) | ||
123 | - | ||
124 | - err = handle_error(res, 200) | ||
125 | - if err != '': | ||
126 | - return res.status_code, object_path | ||
127 | - except Exception as e: | ||
128 | - logger.error(str(e)) | ||
129 | - return 401, str(e) | ||
130 | - | ||
131 | - try: | ||
132 | - datas = res.json() | ||
133 | - # 使用临时token中的认证信息初始化StsAuth实例。 | ||
134 | - # auth = oss2.Auth(datas['access_key_id'], datas['access_key_secret']) | ||
135 | - auth = oss2.StsAuth(datas['access_key_id'], datas['access_key_secret'], datas['security_token']) | ||
136 | - # 使用StsAuth实例初始化存储空间。 | ||
137 | - bucket = oss2.Bucket(auth, datas['domain'], datas['bucket']) | ||
138 | - object_path = datas['object_path'] + "/" + file_name | ||
139 | - result = bucket.put_object_from_file(object_path, local_path) | ||
140 | - return result.status, object_path | ||
141 | - except Exception as e: | ||
142 | - logger.error(str(e)) | ||
143 | - return 403, str(e) | ||
144 | - | ||
145 | - | ||
146 | -def update_object_path(ctx, tenant_type, object_path, types, file_name): | ||
147 | - """上传文件路径到saas平台""" | ||
148 | - if tenant_type == "0" or tenant_type == "1": | ||
149 | - path = '%s/payroll/v1/do-import-data?type=%s' % (WACLOUD_API_ENDPOINT, types) | ||
150 | - else: | ||
151 | - return False, '平台类型设置有误' | ||
152 | - | ||
153 | - headers = {'Authorization': 'Bearer %s' % ctx['access_token']} | ||
154 | - bucket = '/hro/' | ||
155 | - if 'hx' in WACLOUD_API_ENDPOINT: | ||
156 | - bucket = '/hxhro/' | ||
157 | - elif "xsb" in WACLOUD_API_ENDPOINT: | ||
158 | - bucket = "/xsbhro/" | ||
159 | - elif "engma" in WACLOUD_API_ENDPOINT: | ||
160 | - bucket = "/engmahro/" | ||
161 | - elif "anbo" in WACLOUD_API_ENDPOINT: | ||
162 | - bucket = "/anbohro/" | ||
163 | - elif "teda" in WACLOUD_API_ENDPOINT: | ||
164 | - bucket = "/tedahro/" | ||
165 | - elif "hwapi" in WACLOUD_API_ENDPOINT: | ||
166 | - bucket = "/hro/" | ||
167 | - elif "jincao" in WACLOUD_API_ENDPOINT: | ||
168 | - bucket = "/jchro/" | ||
169 | - elif 'jincao' in WACLOUD_API_ENDPOINT: | ||
170 | - bucket = '/jchro/' | ||
171 | - elif 'bhgn' in WACLOUD_API_ENDPOINT: | ||
172 | - bucket = '/bhgnhro/' | ||
173 | - elif 'gongyuanhr' in WACLOUD_API_ENDPOINT: | ||
174 | - bucket = '/szgyhro/' | ||
175 | - | ||
176 | - | ||
177 | - object_path = bucket + object_path | ||
178 | - data = { | ||
179 | - "object_path": object_path, | ||
180 | - "file_name": file_name | ||
181 | - } | ||
182 | - | ||
183 | - try: | ||
184 | - res = requests.post(path, json=data, headers=headers, timeout=120) | ||
185 | - if res.status_code == 401: | ||
186 | - time.sleep(2) | ||
187 | - res = requests.post(path, json=data, headers=headers, timeout=120) | ||
188 | - | ||
189 | - err = handle_error(res, 200) | ||
190 | - if err != '': | ||
191 | - logger.error("上传失败:{file}, 原因:{reason}".format(file=object_path, reason=err)) | ||
192 | - if 'Internal Server Error' in err: | ||
193 | - err = '数据助手sheet附表内容错误' | ||
194 | - return False, err | ||
195 | - return True, '任务办理成功' | ||
196 | - except Exception as e: | ||
197 | - logger.error(str(e)) | 1 | +import requests |
2 | +import time | ||
3 | +import oss2 | ||
4 | +from common.log import * | ||
5 | + | ||
6 | +logger = BotLogger(os.path.basename(__file__), logname=1).getLogger() | ||
7 | + | ||
8 | + | ||
9 | +def handle_error(res, normal_status_code): | ||
10 | + """ | ||
11 | + 统一处理workai平台返回的error | ||
12 | + :param res: 调用接口的返回 | ||
13 | + :param normal_status_code: 正常返回的status code | ||
14 | + :return: 返回错误信息 | ||
15 | + """ | ||
16 | + if res is None or res.status_code == normal_status_code: | ||
17 | + return '' | ||
18 | + | ||
19 | + logger.info('The res is %s' % res) | ||
20 | + err = '网络或服务器繁忙!' | ||
21 | + try: | ||
22 | + if 'message' in res.json(): | ||
23 | + err = res.json()['message'] | ||
24 | + except Exception as e: | ||
25 | + logger.error(str(e)) | ||
26 | + | ||
27 | + return err | ||
28 | + | ||
29 | + | ||
30 | +def get_token_by_password(username, password, tenant_id, tenant_type): | ||
31 | + """ | ||
32 | + 密码方式获取access_token | ||
33 | + :param username: 系统管理员用户 | ||
34 | + :param password: 系统管理员密码 | ||
35 | + :param tenant_id: 客户在workai云平台唯一表示 | ||
36 | + :return: 返回access_token, refresh_token 以及error, access_token用于访问接口的令牌, refresh_token | ||
37 | + 用于刷新获取新的access_token, error为返回的错误信息 | ||
38 | + """ | ||
39 | + data = { | ||
40 | + 'grant_type': 'password', | ||
41 | + 'username': username, | ||
42 | + 'password': password, | ||
43 | + 'scope': 'global_access:tenant_admin,tenant:%s,tenant_type:%s' % (tenant_id, tenant_type), | ||
44 | + } | ||
45 | + | ||
46 | + path = '%s/uaa/v1/auth/tokens' % WACLOUD_API_ENDPOINT | ||
47 | + try: | ||
48 | + res = requests.post(path, json=data, timeout=10) | ||
49 | + err = handle_error(res, 200) | ||
50 | + if err != '': | ||
51 | + logger.error('Could not get the token by password for user: %s, tenant: %s' % (username, tenant_id)) | ||
52 | + return '', '', err, None | ||
53 | + | ||
54 | + ret = res.json() | ||
55 | + company, username, play_type = '', '', '' | ||
56 | + if tenant_type == '0': | ||
57 | + play_type = 'HRO' | ||
58 | + elif tenant_type == '1': | ||
59 | + play_type = 'HR' | ||
60 | + | ||
61 | + try: | ||
62 | + company = ret['tenant']['name'] | ||
63 | + username = ret['user']['name'] | ||
64 | + except Exception as e: | ||
65 | + logger.error(str(e)) | ||
66 | + | ||
67 | + return ret['access_token'], ret['refresh_token'], '', (company, username, play_type) | ||
68 | + except Exception as e: | ||
69 | + logger.error(str(e)) | ||
70 | + return '', '', '网络或服务器异常,请稍后再试!', None | ||
71 | + | ||
72 | + | ||
73 | +def refresh_token(rtoken, tenant_id): | ||
74 | + """ | ||
75 | + 刷新token方式获取access_token | ||
76 | + :return: 返回access_token, refresh_token 以及error, access_token用于访问接口的令牌, refresh_token | ||
77 | + 用于刷新获取新的access_token, error为返回的错误信息 | ||
78 | + """ | ||
79 | + data = { | ||
80 | + 'grant_type': 'refresh_token', | ||
81 | + 'refresh_token': rtoken, | ||
82 | + 'scope': 'global_access:tenant_admin,tenant:%s' % tenant_id, | ||
83 | + } | ||
84 | + | ||
85 | + path = '%s/uaa/v1/auth/tokens' % WACLOUD_API_ENDPOINT | ||
86 | + res = requests.post(path, json=data) | ||
87 | + | ||
88 | + err = handle_error(res, 200) | ||
89 | + if err != '': | ||
90 | + logger.error('Could not get the token by refresh token for tenant: %s' % (tenant_id,)) | ||
91 | + return '', '', err | ||
92 | + | ||
93 | + ret = res.json() | ||
94 | + return ret['access_token'], ret['refresh_token'], '' | ||
95 | + | ||
96 | + | ||
97 | +def upload_file(ctx, local_path, tenant_type, file_name): | ||
98 | + """上传附件""" | ||
99 | + object_path = "" | ||
100 | + if ctx is None or local_path is None: | ||
101 | + return 401, object_path | ||
102 | + | ||
103 | + headers = {'Authorization': 'Bearer %s' % ctx['access_token']} | ||
104 | + path = '%s/filemeta/v2/inits' % (WACLOUD_API_ENDPOINT,) | ||
105 | + if tenant_type == "0": | ||
106 | + data = {"object_type": "hro", "access_type": "sdk"} | ||
107 | + elif tenant_type == "1": | ||
108 | + data = {"object_type": "hr", "access_type": "sdk"} | ||
109 | + else: | ||
110 | + return 401, '配置文件设置tenant_type的值有误' | ||
111 | + | ||
112 | + res = None | ||
113 | + try: | ||
114 | + res = requests.post(path, json=data, headers=headers, timeout=120) | ||
115 | + if res.status_code == 401: | ||
116 | + access_token, _refresh_token, err = refresh_token(ctx['refresh_token'], ctx['tenant_id']) | ||
117 | + if err != '': | ||
118 | + return 401, object_path | ||
119 | + ctx['access_token'] = access_token | ||
120 | + ctx['refresh_token'] = _refresh_token | ||
121 | + headers = {'Authorization': 'Bearer %s' % ctx['access_token']} | ||
122 | + res = requests.post(path, json=data, headers=headers, timeout=120) | ||
123 | + | ||
124 | + err = handle_error(res, 200) | ||
125 | + if err != '': | ||
126 | + return res.status_code, object_path | ||
127 | + except Exception as e: | ||
128 | + logger.error(str(e)) | ||
129 | + return 401, str(e) | ||
130 | + | ||
131 | + try: | ||
132 | + datas = res.json() | ||
133 | + # 使用临时token中的认证信息初始化StsAuth实例。 | ||
134 | + # auth = oss2.Auth(datas['access_key_id'], datas['access_key_secret']) | ||
135 | + auth = oss2.StsAuth(datas['access_key_id'], datas['access_key_secret'], datas['security_token']) | ||
136 | + # 使用StsAuth实例初始化存储空间。 | ||
137 | + bucket = oss2.Bucket(auth, datas['domain'], datas['bucket']) | ||
138 | + object_path = datas['object_path'] + "/" + file_name | ||
139 | + result = bucket.put_object_from_file(object_path, local_path) | ||
140 | + return result.status, object_path | ||
141 | + except Exception as e: | ||
142 | + logger.error(str(e)) | ||
143 | + return 403, str(e) | ||
144 | + | ||
145 | + | ||
146 | +def update_object_path(ctx, tenant_type, object_path, types, file_name): | ||
147 | + """上传文件路径到saas平台""" | ||
148 | + if tenant_type == "0" or tenant_type == "1": | ||
149 | + path = '%s/payroll/v1/do-import-data?type=%s' % (WACLOUD_API_ENDPOINT, types) | ||
150 | + else: | ||
151 | + return False, '平台类型设置有误' | ||
152 | + | ||
153 | + headers = {'Authorization': 'Bearer %s' % ctx['access_token']} | ||
154 | + bucket = '/hro/' | ||
155 | + if 'hx' in WACLOUD_API_ENDPOINT: | ||
156 | + bucket = '/new-hxhro/' | ||
157 | + elif "xsb" in WACLOUD_API_ENDPOINT: | ||
158 | + bucket = "/xsbhro/" | ||
159 | + elif "engma" in WACLOUD_API_ENDPOINT: | ||
160 | + bucket = "/engmahro/" | ||
161 | + elif "anbo" in WACLOUD_API_ENDPOINT: | ||
162 | + bucket = "/anbohro/" | ||
163 | + elif "teda" in WACLOUD_API_ENDPOINT: | ||
164 | + bucket = "/tedahro/" | ||
165 | + elif "hwapi" in WACLOUD_API_ENDPOINT: | ||
166 | + bucket = "/hro/" | ||
167 | + elif "jincao" in WACLOUD_API_ENDPOINT: | ||
168 | + bucket = "/jchro/" | ||
169 | + elif 'jincao' in WACLOUD_API_ENDPOINT: | ||
170 | + bucket = '/jchro/' | ||
171 | + elif 'bhgn' in WACLOUD_API_ENDPOINT: | ||
172 | + bucket = '/bhgnhro/' | ||
173 | + elif 'gongyuanhr' in WACLOUD_API_ENDPOINT: | ||
174 | + bucket = '/szgyhro/' | ||
175 | + | ||
176 | + | ||
177 | + object_path = bucket + object_path | ||
178 | + data = { | ||
179 | + "object_path": object_path, | ||
180 | + "file_name": file_name | ||
181 | + } | ||
182 | + | ||
183 | + try: | ||
184 | + res = requests.post(path, json=data, headers=headers, timeout=120) | ||
185 | + if res.status_code == 401: | ||
186 | + time.sleep(2) | ||
187 | + res = requests.post(path, json=data, headers=headers, timeout=120) | ||
188 | + | ||
189 | + err = handle_error(res, 200) | ||
190 | + if err != '': | ||
191 | + logger.error("上传失败:{file}, 原因:{reason}".format(file=object_path, reason=err)) | ||
192 | + if 'Internal Server Error' in err: | ||
193 | + err = '数据助手sheet附表内容错误' | ||
194 | + return False, err | ||
195 | + return True, '任务办理成功' | ||
196 | + except Exception as e: | ||
197 | + logger.error(str(e)) | ||
198 | return False, '请求服务器异常:{}'.format(str(e)) | 198 | return False, '请求服务器异常:{}'.format(str(e)) |
请
注册
或
登录
后发表评论