larkify 0.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.
Files changed (1549) hide show
  1. larkify/__init__.py +16 -0
  2. larkify/auth/__init__.py +8 -0
  3. larkify/auth/app.py +334 -0
  4. larkify/auth/base.py +303 -0
  5. larkify/auth/oauth.py +243 -0
  6. larkify/auth/token.py +46 -0
  7. larkify/auth/unauth.py +25 -0
  8. larkify/cache/__init__.py +11 -0
  9. larkify/cache/base.py +48 -0
  10. larkify/cache/mem_cache.py +72 -0
  11. larkify/cache/redis.py +95 -0
  12. larkify/config.py +153 -0
  13. larkify/core.py +646 -0
  14. larkify/exception.py +131 -0
  15. larkify/feishu.py +40 -0
  16. larkify/log.py +3 -0
  17. larkify/model.py +33 -0
  18. larkify/models/__init__.py +0 -0
  19. larkify/models/acs/__init__.py +0 -0
  20. larkify/models/acs/v1/__init__.py +0 -0
  21. larkify/models/acs/v1/_shared.py +41 -0
  22. larkify/models/acs/v1/access_record.py +47 -0
  23. larkify/models/acs/v1/device.py +49 -0
  24. larkify/models/acs/v1/rule_external.py +239 -0
  25. larkify/models/acs/v1/user.py +79 -0
  26. larkify/models/acs/v1/user_face.py +36 -0
  27. larkify/models/acs/v1/visitor.py +40 -0
  28. larkify/models/admin/__init__.py +0 -0
  29. larkify/models/admin/v1/__init__.py +0 -0
  30. larkify/models/admin/v1/_shared.py +24 -0
  31. larkify/models/admin/v1/admin_dept_stat.py +118 -0
  32. larkify/models/admin/v1/admin_user_stat.py +98 -0
  33. larkify/models/admin/v1/audit_info.py +358 -0
  34. larkify/models/admin/v1/badge.py +145 -0
  35. larkify/models/admin/v1/badge_grant.py +176 -0
  36. larkify/models/admin/v1/badge_image.py +39 -0
  37. larkify/models/admin/v1/password.py +45 -0
  38. larkify/models/aily/__init__.py +0 -0
  39. larkify/models/aily/v1/__init__.py +0 -0
  40. larkify/models/aily/v1/_shared.py +20 -0
  41. larkify/models/aily/v1/agent_agent_artifact.py +32 -0
  42. larkify/models/aily/v1/agent_agent_attachment.py +42 -0
  43. larkify/models/aily/v1/agent_agent_chat.py +97 -0
  44. larkify/models/aily/v1/agent_agent_chat_session.py +93 -0
  45. larkify/models/aily/v1/agent_agent_visibility.py +35 -0
  46. larkify/models/aily/v1/aily_session.py +80 -0
  47. larkify/models/aily/v1/aily_session_aily_message.py +179 -0
  48. larkify/models/aily/v1/aily_session_run.py +104 -0
  49. larkify/models/aily/v1/app_data_asset.py +296 -0
  50. larkify/models/aily/v1/app_data_asset_tag.py +30 -0
  51. larkify/models/aily/v1/app_knowledge.py +94 -0
  52. larkify/models/aily/v1/app_skill.py +108 -0
  53. larkify/models/aily/v1/tenant_app_stat.py +66 -0
  54. larkify/models/apaas/__init__.py +0 -0
  55. larkify/models/apaas/v1/__init__.py +0 -0
  56. larkify/models/apaas/v1/_shared.py +79 -0
  57. larkify/models/apaas/v1/app.py +94 -0
  58. larkify/models/apaas/v1/application_audit_log.py +240 -0
  59. larkify/models/apaas/v1/application_environment_variable.py +96 -0
  60. larkify/models/apaas/v1/application_flow.py +55 -0
  61. larkify/models/apaas/v1/application_function.py +33 -0
  62. larkify/models/apaas/v1/application_object.py +180 -0
  63. larkify/models/apaas/v1/application_object_record.py +213 -0
  64. larkify/models/apaas/v1/application_record_permission_member.py +42 -0
  65. larkify/models/apaas/v1/application_role_member.py +118 -0
  66. larkify/models/apaas/v1/approval_instance.py +32 -0
  67. larkify/models/apaas/v1/approval_task.py +86 -0
  68. larkify/models/apaas/v1/seat_activity.py +40 -0
  69. larkify/models/apaas/v1/seat_assignment.py +38 -0
  70. larkify/models/apaas/v1/tenant_app_metrics.py +46 -0
  71. larkify/models/apaas/v1/user_task.py +207 -0
  72. larkify/models/apaas/v1/workspace.py +35 -0
  73. larkify/models/apaas/v1/workspace_enum.py +68 -0
  74. larkify/models/apaas/v1/workspace_table.py +137 -0
  75. larkify/models/apaas/v1/workspace_view.py +24 -0
  76. larkify/models/application/__init__.py +0 -0
  77. larkify/models/application/v5/__init__.py +0 -0
  78. larkify/models/application/v5/application.py +72 -0
  79. larkify/models/application/v6/__init__.py +0 -0
  80. larkify/models/application/v6/_shared.py +64 -0
  81. larkify/models/application/v6/app_badge.py +57 -0
  82. larkify/models/application/v6/app_recommend_rule.py +96 -0
  83. larkify/models/application/v6/application.py +186 -0
  84. larkify/models/application/v6/application_app_usage.py +129 -0
  85. larkify/models/application/v6/application_app_version.py +358 -0
  86. larkify/models/application/v6/application_collaborators.py +60 -0
  87. larkify/models/application/v6/application_contacts_range.py +54 -0
  88. larkify/models/application/v6/application_feedback.py +64 -0
  89. larkify/models/application/v6/application_management.py +27 -0
  90. larkify/models/application/v6/application_owner.py +29 -0
  91. larkify/models/application/v6/application_visibility.py +119 -0
  92. larkify/models/application/v6/scope.py +30 -0
  93. larkify/models/application/v7/__init__.py +0 -0
  94. larkify/models/application/v7/app_avatar_upload.py +36 -0
  95. larkify/models/application/v7/application_ability.py +188 -0
  96. larkify/models/application/v7/application_base.py +74 -0
  97. larkify/models/application/v7/application_config.py +250 -0
  98. larkify/models/application/v7/application_publish.py +49 -0
  99. larkify/models/approval/__init__.py +0 -0
  100. larkify/models/approval/v4/__init__.py +0 -0
  101. larkify/models/approval/v4/_shared.py +164 -0
  102. larkify/models/approval/v4/approval.py +378 -0
  103. larkify/models/approval/v4/district.py +76 -0
  104. larkify/models/approval/v4/external_approval.py +185 -0
  105. larkify/models/approval/v4/external_instance.py +587 -0
  106. larkify/models/approval/v4/external_task.py +76 -0
  107. larkify/models/approval/v4/instance.py +805 -0
  108. larkify/models/approval/v4/instance_comment.py +139 -0
  109. larkify/models/approval/v4/task.py +490 -0
  110. larkify/models/attendance/__init__.py +0 -0
  111. larkify/models/attendance/v1/__init__.py +0 -0
  112. larkify/models/attendance/v1/_shared.py +60 -0
  113. larkify/models/attendance/v1/approval_info.py +53 -0
  114. larkify/models/attendance/v1/archive_rule.py +174 -0
  115. larkify/models/attendance/v1/file.py +42 -0
  116. larkify/models/attendance/v1/group.py +1074 -0
  117. larkify/models/attendance/v1/leave_accrual_record.py +108 -0
  118. larkify/models/attendance/v1/leave_employ_expire_record.py +81 -0
  119. larkify/models/attendance/v1/shift.py +497 -0
  120. larkify/models/attendance/v1/user_approval.py +525 -0
  121. larkify/models/attendance/v1/user_daily_shift.py +182 -0
  122. larkify/models/attendance/v1/user_flow.py +189 -0
  123. larkify/models/attendance/v1/user_setting.py +83 -0
  124. larkify/models/attendance/v1/user_stats_data.py +106 -0
  125. larkify/models/attendance/v1/user_stats_field.py +76 -0
  126. larkify/models/attendance/v1/user_stats_view.py +150 -0
  127. larkify/models/attendance/v1/user_task.py +96 -0
  128. larkify/models/attendance/v1/user_task_remedy.py +154 -0
  129. larkify/models/auth/__init__.py +0 -0
  130. larkify/models/auth/v3/__init__.py +0 -0
  131. larkify/models/auth/v3/auth.py +123 -0
  132. larkify/models/authen/__init__.py +0 -0
  133. larkify/models/authen/v1/__init__.py +0 -0
  134. larkify/models/authen/v1/access_token.py +74 -0
  135. larkify/models/authen/v1/oidc_access_token.py +48 -0
  136. larkify/models/authen/v1/oidc_refresh_access_token.py +48 -0
  137. larkify/models/authen/v1/refresh_access_token.py +74 -0
  138. larkify/models/authen/v1/user_info.py +44 -0
  139. larkify/models/baike/__init__.py +0 -0
  140. larkify/models/baike/v1/__init__.py +0 -0
  141. larkify/models/baike/v1/_shared.py +305 -0
  142. larkify/models/baike/v1/classification.py +28 -0
  143. larkify/models/baike/v1/draft.py +105 -0
  144. larkify/models/baike/v1/entity.py +245 -0
  145. larkify/models/baike/v1/file.py +39 -0
  146. larkify/models/base/__init__.py +0 -0
  147. larkify/models/base/v2/__init__.py +0 -0
  148. larkify/models/base/v2/app_role.py +322 -0
  149. larkify/models/bitable/__init__.py +0 -0
  150. larkify/models/bitable/v1/__init__.py +0 -0
  151. larkify/models/bitable/v1/_shared.py +325 -0
  152. larkify/models/bitable/v1/app.py +159 -0
  153. larkify/models/bitable/v1/app_block_workflow.py +30 -0
  154. larkify/models/bitable/v1/app_dashboard.py +60 -0
  155. larkify/models/bitable/v1/app_role.py +227 -0
  156. larkify/models/bitable/v1/app_role_member.py +110 -0
  157. larkify/models/bitable/v1/app_table.py +218 -0
  158. larkify/models/bitable/v1/app_table_field.py +438 -0
  159. larkify/models/bitable/v1/app_table_field_group.py +69 -0
  160. larkify/models/bitable/v1/app_table_form.py +99 -0
  161. larkify/models/bitable/v1/app_table_form_field.py +127 -0
  162. larkify/models/bitable/v1/app_table_record.py +348 -0
  163. larkify/models/bitable/v1/app_table_view.py +230 -0
  164. larkify/models/bitable/v1/app_workflow.py +45 -0
  165. larkify/models/board/__init__.py +0 -0
  166. larkify/models/board/v1/__init__.py +0 -0
  167. larkify/models/board/v1/whiteboard.py +39 -0
  168. larkify/models/board/v1/whiteboard_node.py +1645 -0
  169. larkify/models/bot/__init__.py +0 -0
  170. larkify/models/bot/v3/__init__.py +0 -0
  171. larkify/models/bot/v3/bot_menu.py +327 -0
  172. larkify/models/bot/v4/__init__.py +0 -0
  173. larkify/models/bot/v4/bot.py +88 -0
  174. larkify/models/calendar/__init__.py +0 -0
  175. larkify/models/calendar/v4/__init__.py +0 -0
  176. larkify/models/calendar/v4/_shared.py +80 -0
  177. larkify/models/calendar/v4/calendar.py +219 -0
  178. larkify/models/calendar/v4/calendar_acl.py +92 -0
  179. larkify/models/calendar/v4/calendar_event.py +916 -0
  180. larkify/models/calendar/v4/calendar_event_attendee.py +215 -0
  181. larkify/models/calendar/v4/calendar_event_attendee_chat_member.py +44 -0
  182. larkify/models/calendar/v4/calendar_event_meeting_chat.py +20 -0
  183. larkify/models/calendar/v4/calendar_event_meeting_minute.py +18 -0
  184. larkify/models/calendar/v4/exchange_binding.py +61 -0
  185. larkify/models/calendar/v4/freebusy.py +109 -0
  186. larkify/models/calendar/v4/setting.py +39 -0
  187. larkify/models/calendar/v4/timeoff_event.py +62 -0
  188. larkify/models/cardkit/__init__.py +0 -0
  189. larkify/models/cardkit/v1/__init__.py +0 -0
  190. larkify/models/cardkit/v1/card.py +122 -0
  191. larkify/models/cardkit/v1/card_element.py +106 -0
  192. larkify/models/compensation/__init__.py +0 -0
  193. larkify/models/compensation/v1/__init__.py +0 -0
  194. larkify/models/compensation/v1/_shared.py +104 -0
  195. larkify/models/compensation/v1/archive.py +174 -0
  196. larkify/models/compensation/v1/change_reason.py +48 -0
  197. larkify/models/compensation/v1/indicator.py +46 -0
  198. larkify/models/compensation/v1/item.py +58 -0
  199. larkify/models/compensation/v1/item_category.py +42 -0
  200. larkify/models/compensation/v1/lump_sum_payment.py +525 -0
  201. larkify/models/compensation/v1/plan.py +132 -0
  202. larkify/models/compensation/v1/recurring_payment.py +321 -0
  203. larkify/models/compensation/v1/social_archive.py +50 -0
  204. larkify/models/compensation/v1/social_archive_adjust_record.py +54 -0
  205. larkify/models/compensation/v1/social_insurance.py +40 -0
  206. larkify/models/compensation/v1/social_plan.py +119 -0
  207. larkify/models/contact/__init__.py +0 -0
  208. larkify/models/contact/v3/__init__.py +0 -0
  209. larkify/models/contact/v3/_shared.py +50 -0
  210. larkify/models/contact/v3/custom_attr.py +66 -0
  211. larkify/models/contact/v3/department.py +362 -0
  212. larkify/models/contact/v3/employee_type_enum.py +108 -0
  213. larkify/models/contact/v3/functional_role.py +46 -0
  214. larkify/models/contact/v3/functional_role_member.py +112 -0
  215. larkify/models/contact/v3/group.py +128 -0
  216. larkify/models/contact/v3/group_member.py +129 -0
  217. larkify/models/contact/v3/job_family.py +128 -0
  218. larkify/models/contact/v3/job_level.py +128 -0
  219. larkify/models/contact/v3/job_title.py +52 -0
  220. larkify/models/contact/v3/scope.py +26 -0
  221. larkify/models/contact/v3/unit.py +140 -0
  222. larkify/models/contact/v3/user.py +1130 -0
  223. larkify/models/contact/v3/work_city.py +52 -0
  224. larkify/models/corehr/__init__.py +0 -0
  225. larkify/models/corehr/v1/__init__.py +0 -0
  226. larkify/models/corehr/v1/_shared.py +302 -0
  227. larkify/models/corehr/v1/assigned_user.py +85 -0
  228. larkify/models/corehr/v1/authorization.py +233 -0
  229. larkify/models/corehr/v1/common_data_id.py +43 -0
  230. larkify/models/corehr/v1/common_data_meta_data.py +139 -0
  231. larkify/models/corehr/v1/company.py +593 -0
  232. larkify/models/corehr/v1/compensation_standard.py +104 -0
  233. larkify/models/corehr/v1/contract.py +177 -0
  234. larkify/models/corehr/v1/country_region.py +52 -0
  235. larkify/models/corehr/v1/currency.py +54 -0
  236. larkify/models/corehr/v1/custom_field.py +204 -0
  237. larkify/models/corehr/v1/department.py +239 -0
  238. larkify/models/corehr/v1/employee_type.py +123 -0
  239. larkify/models/corehr/v1/employment.py +312 -0
  240. larkify/models/corehr/v1/job.py +179 -0
  241. larkify/models/corehr/v1/job_change.py +445 -0
  242. larkify/models/corehr/v1/job_data.py +452 -0
  243. larkify/models/corehr/v1/job_family.py +157 -0
  244. larkify/models/corehr/v1/job_level.py +155 -0
  245. larkify/models/corehr/v1/leave.py +405 -0
  246. larkify/models/corehr/v1/leave_granting_record.py +99 -0
  247. larkify/models/corehr/v1/location.py +204 -0
  248. larkify/models/corehr/v1/national_id_type.py +150 -0
  249. larkify/models/corehr/v1/offboarding.py +318 -0
  250. larkify/models/corehr/v1/person.py +1396 -0
  251. larkify/models/corehr/v1/pre_hire.py +146 -0
  252. larkify/models/corehr/v1/process_form_variable_data.py +244 -0
  253. larkify/models/corehr/v1/security_group.py +91 -0
  254. larkify/models/corehr/v1/subdivision.py +53 -0
  255. larkify/models/corehr/v1/subregion.py +52 -0
  256. larkify/models/corehr/v1/transfer_reason.py +40 -0
  257. larkify/models/corehr/v1/transfer_type.py +42 -0
  258. larkify/models/corehr/v1/working_hours_type.py +131 -0
  259. larkify/models/corehr/v2/__init__.py +0 -0
  260. larkify/models/corehr/v2/_shared.py +1218 -0
  261. larkify/models/corehr/v2/approval_groups.py +542 -0
  262. larkify/models/corehr/v2/approver.py +38 -0
  263. larkify/models/corehr/v2/basic_info_bank.py +75 -0
  264. larkify/models/corehr/v2/basic_info_bank_branch.py +89 -0
  265. larkify/models/corehr/v2/basic_info_city.py +67 -0
  266. larkify/models/corehr/v2/basic_info_country_region.py +66 -0
  267. larkify/models/corehr/v2/basic_info_country_region_subdivision.py +68 -0
  268. larkify/models/corehr/v2/basic_info_currency.py +48 -0
  269. larkify/models/corehr/v2/basic_info_district.py +65 -0
  270. larkify/models/corehr/v2/basic_info_language.py +60 -0
  271. larkify/models/corehr/v2/basic_info_nationality.py +69 -0
  272. larkify/models/corehr/v2/basic_info_time_zone.py +62 -0
  273. larkify/models/corehr/v2/bp.py +65 -0
  274. larkify/models/corehr/v2/company.py +215 -0
  275. larkify/models/corehr/v2/contract.py +82 -0
  276. larkify/models/corehr/v2/cost_allocation.py +232 -0
  277. larkify/models/corehr/v2/cost_center.py +270 -0
  278. larkify/models/corehr/v2/cost_center_version.py +111 -0
  279. larkify/models/corehr/v2/custom_org.py +344 -0
  280. larkify/models/corehr/v2/default_cost_center.py +212 -0
  281. larkify/models/corehr/v2/department.py +495 -0
  282. larkify/models/corehr/v2/draft.py +32 -0
  283. larkify/models/corehr/v2/employee.py +1944 -0
  284. larkify/models/corehr/v2/employee_custom_org.py +170 -0
  285. larkify/models/corehr/v2/employees_additional_job.py +309 -0
  286. larkify/models/corehr/v2/employees_bp.py +50 -0
  287. larkify/models/corehr/v2/employees_international_assignment.py +340 -0
  288. larkify/models/corehr/v2/employees_job_data.py +272 -0
  289. larkify/models/corehr/v2/enum.py +61 -0
  290. larkify/models/corehr/v2/job.py +179 -0
  291. larkify/models/corehr/v2/job_change.py +723 -0
  292. larkify/models/corehr/v2/job_family.py +139 -0
  293. larkify/models/corehr/v2/job_grade.py +132 -0
  294. larkify/models/corehr/v2/job_level.py +77 -0
  295. larkify/models/corehr/v2/location.py +216 -0
  296. larkify/models/corehr/v2/location_address.py +201 -0
  297. larkify/models/corehr/v2/offboarding.py +131 -0
  298. larkify/models/corehr/v2/pathway.py +123 -0
  299. larkify/models/corehr/v2/person.py +1396 -0
  300. larkify/models/corehr/v2/position.py +283 -0
  301. larkify/models/corehr/v2/pre_hire.py +2203 -0
  302. larkify/models/corehr/v2/probation.py +346 -0
  303. larkify/models/corehr/v2/probation_assessment.py +100 -0
  304. larkify/models/corehr/v2/process.py +244 -0
  305. larkify/models/corehr/v2/process_approver.py +54 -0
  306. larkify/models/corehr/v2/process_extra.py +50 -0
  307. larkify/models/corehr/v2/process_form_variable_data.py +24 -0
  308. larkify/models/corehr/v2/process_query_flow_data_template.py +108 -0
  309. larkify/models/corehr/v2/process_revoke.py +33 -0
  310. larkify/models/corehr/v2/process_start.py +49 -0
  311. larkify/models/corehr/v2/process_transfer.py +41 -0
  312. larkify/models/corehr/v2/process_withdraw.py +33 -0
  313. larkify/models/corehr/v2/report_detail_row.py +57 -0
  314. larkify/models/corehr/v2/signature_file.py +138 -0
  315. larkify/models/corehr/v2/signature_node.py +52 -0
  316. larkify/models/corehr/v2/signature_template.py +225 -0
  317. larkify/models/corehr/v2/signature_template_info_with_thumbnail.py +70 -0
  318. larkify/models/corehr/v2/workforce_plan.py +50 -0
  319. larkify/models/corehr/v2/workforce_plan_detail.py +225 -0
  320. larkify/models/corehr/v2/workforce_plan_detail_row.py +51 -0
  321. larkify/models/directory/__init__.py +0 -0
  322. larkify/models/directory/v1/__init__.py +0 -0
  323. larkify/models/directory/v1/_shared.py +335 -0
  324. larkify/models/directory/v1/collaboration_rule.py +113 -0
  325. larkify/models/directory/v1/collaboration_tenant.py +49 -0
  326. larkify/models/directory/v1/collboration_share_entity.py +65 -0
  327. larkify/models/directory/v1/department.py +212 -0
  328. larkify/models/directory/v1/employee.py +740 -0
  329. larkify/models/docs/__init__.py +0 -0
  330. larkify/models/docs/v1/__init__.py +0 -0
  331. larkify/models/docs/v1/content.py +18 -0
  332. larkify/models/document_ai/__init__.py +0 -0
  333. larkify/models/document_ai/v1/__init__.py +0 -0
  334. larkify/models/document_ai/v1/bank_card.py +52 -0
  335. larkify/models/document_ai/v1/business_card.py +50 -0
  336. larkify/models/document_ai/v1/business_license.py +52 -0
  337. larkify/models/document_ai/v1/chinese_passport.py +52 -0
  338. larkify/models/document_ai/v1/contract.py +185 -0
  339. larkify/models/document_ai/v1/driving_license.py +52 -0
  340. larkify/models/document_ai/v1/food_manage_license.py +52 -0
  341. larkify/models/document_ai/v1/food_produce_license.py +52 -0
  342. larkify/models/document_ai/v1/health_certificate.py +52 -0
  343. larkify/models/document_ai/v1/hkm_mainland_travel_permit.py +52 -0
  344. larkify/models/document_ai/v1/id_card.py +58 -0
  345. larkify/models/document_ai/v1/resume.py +184 -0
  346. larkify/models/document_ai/v1/taxi_invoice.py +50 -0
  347. larkify/models/document_ai/v1/train_invoice.py +50 -0
  348. larkify/models/document_ai/v1/tw_mainland_travel_permit.py +50 -0
  349. larkify/models/document_ai/v1/vat_invoice.py +60 -0
  350. larkify/models/document_ai/v1/vehicle_invoice.py +52 -0
  351. larkify/models/document_ai/v1/vehicle_license.py +52 -0
  352. larkify/models/docx/__init__.py +0 -0
  353. larkify/models/docx/v1/__init__.py +0 -0
  354. larkify/models/docx/v1/_shared.py +2538 -0
  355. larkify/models/docx/v1/chat_announcement.py +36 -0
  356. larkify/models/docx/v1/chat_announcement_block.py +179 -0
  357. larkify/models/docx/v1/chat_announcement_block_children.py +85 -0
  358. larkify/models/docx/v1/document.py +134 -0
  359. larkify/models/docx/v1/document_block.py +305 -0
  360. larkify/models/docx/v1/document_block_children.py +85 -0
  361. larkify/models/docx/v1/document_block_descendant.py +312 -0
  362. larkify/models/drive/__init__.py +0 -0
  363. larkify/models/drive/v1/__init__.py +0 -0
  364. larkify/models/drive/v1/_shared.py +170 -0
  365. larkify/models/drive/v1/export_task.py +75 -0
  366. larkify/models/drive/v1/file.py +327 -0
  367. larkify/models/drive/v1/file_comment.py +224 -0
  368. larkify/models/drive/v1/file_comment_reply.py +94 -0
  369. larkify/models/drive/v1/file_statistics.py +44 -0
  370. larkify/models/drive/v1/file_subscription.py +99 -0
  371. larkify/models/drive/v1/file_version.py +140 -0
  372. larkify/models/drive/v1/file_view_record.py +40 -0
  373. larkify/models/drive/v1/import_task.py +92 -0
  374. larkify/models/drive/v1/media.py +172 -0
  375. larkify/models/drive/v1/meta.py +109 -0
  376. larkify/models/drive/v1/permission_member.py +263 -0
  377. larkify/models/drive/v1/permission_public.py +80 -0
  378. larkify/models/drive/v1/permission_public_password.py +26 -0
  379. larkify/models/drive/v1/user.py +35 -0
  380. larkify/models/drive/v2/__init__.py +0 -0
  381. larkify/models/drive/v2/comment_reaction.py +38 -0
  382. larkify/models/drive/v2/file_like.py +44 -0
  383. larkify/models/drive/v2/permission_public.py +120 -0
  384. larkify/models/ehr/__init__.py +0 -0
  385. larkify/models/ehr/v1/__init__.py +0 -0
  386. larkify/models/ehr/v1/employee.py +300 -0
  387. larkify/models/event/__init__.py +0 -0
  388. larkify/models/event/v1/__init__.py +0 -0
  389. larkify/models/event/v1/connection.py +18 -0
  390. larkify/models/event/v1/outbound_ip.py +26 -0
  391. larkify/models/helpdesk/__init__.py +0 -0
  392. larkify/models/helpdesk/v1/__init__.py +0 -0
  393. larkify/models/helpdesk/v1/_shared.py +155 -0
  394. larkify/models/helpdesk/v1/agent.py +33 -0
  395. larkify/models/helpdesk/v1/agent_schedule.py +58 -0
  396. larkify/models/helpdesk/v1/agent_schedules.py +55 -0
  397. larkify/models/helpdesk/v1/agent_skill.py +184 -0
  398. larkify/models/helpdesk/v1/agent_skill_rule.py +36 -0
  399. larkify/models/helpdesk/v1/bot_message.py +44 -0
  400. larkify/models/helpdesk/v1/category.py +79 -0
  401. larkify/models/helpdesk/v1/event.py +54 -0
  402. larkify/models/helpdesk/v1/faq.py +210 -0
  403. larkify/models/helpdesk/v1/notification.py +330 -0
  404. larkify/models/helpdesk/v1/ticket.py +293 -0
  405. larkify/models/helpdesk/v1/ticket_customized_field.py +143 -0
  406. larkify/models/helpdesk/v1/ticket_message.py +66 -0
  407. larkify/models/hire/__init__.py +0 -0
  408. larkify/models/hire/v1/__init__.py +0 -0
  409. larkify/models/hire/v1/_shared.py +873 -0
  410. larkify/models/hire/v1/advertisement.py +27 -0
  411. larkify/models/hire/v1/agency.py +344 -0
  412. larkify/models/hire/v1/application.py +992 -0
  413. larkify/models/hire/v1/application_interview.py +48 -0
  414. larkify/models/hire/v1/attachment.py +48 -0
  415. larkify/models/hire/v1/background_check_order.py +249 -0
  416. larkify/models/hire/v1/diversity_inclusion.py +84 -0
  417. larkify/models/hire/v1/eco_account_custom_field.py +85 -0
  418. larkify/models/hire/v1/eco_background_check.py +107 -0
  419. larkify/models/hire/v1/eco_background_check_custom_field.py +114 -0
  420. larkify/models/hire/v1/eco_background_check_package.py +107 -0
  421. larkify/models/hire/v1/eco_exam.py +111 -0
  422. larkify/models/hire/v1/eco_exam_paper.py +86 -0
  423. larkify/models/hire/v1/ehr_import_task.py +35 -0
  424. larkify/models/hire/v1/employee.py +86 -0
  425. larkify/models/hire/v1/evaluation.py +30 -0
  426. larkify/models/hire/v1/evaluation_task.py +42 -0
  427. larkify/models/hire/v1/exam.py +59 -0
  428. larkify/models/hire/v1/exam_marking_task.py +42 -0
  429. larkify/models/hire/v1/external_application.py +155 -0
  430. larkify/models/hire/v1/external_background_check.py +130 -0
  431. larkify/models/hire/v1/external_interview.py +164 -0
  432. larkify/models/hire/v1/external_interview_assessment.py +108 -0
  433. larkify/models/hire/v1/external_offer.py +130 -0
  434. larkify/models/hire/v1/external_referral_reward.py +110 -0
  435. larkify/models/hire/v1/interview.py +142 -0
  436. larkify/models/hire/v1/interview_feedback_form.py +162 -0
  437. larkify/models/hire/v1/interview_record.py +38 -0
  438. larkify/models/hire/v1/interview_record_attachment.py +36 -0
  439. larkify/models/hire/v1/interview_registration_schema.py +44 -0
  440. larkify/models/hire/v1/interview_round_type.py +56 -0
  441. larkify/models/hire/v1/interview_task.py +42 -0
  442. larkify/models/hire/v1/interviewer.py +70 -0
  443. larkify/models/hire/v1/job.py +1205 -0
  444. larkify/models/hire/v1/job_function.py +44 -0
  445. larkify/models/hire/v1/job_manager.py +57 -0
  446. larkify/models/hire/v1/job_process.py +54 -0
  447. larkify/models/hire/v1/job_publish_record.py +111 -0
  448. larkify/models/hire/v1/job_requirement.py +469 -0
  449. larkify/models/hire/v1/job_requirement_schema.py +43 -0
  450. larkify/models/hire/v1/job_schema.py +45 -0
  451. larkify/models/hire/v1/job_type.py +30 -0
  452. larkify/models/hire/v1/location.py +159 -0
  453. larkify/models/hire/v1/minutes.py +48 -0
  454. larkify/models/hire/v1/note.py +135 -0
  455. larkify/models/hire/v1/offer.py +575 -0
  456. larkify/models/hire/v1/offer_application_form.py +178 -0
  457. larkify/models/hire/v1/offer_approval_template.py +58 -0
  458. larkify/models/hire/v1/offer_custom_field.py +61 -0
  459. larkify/models/hire/v1/offer_schema.py +60 -0
  460. larkify/models/hire/v1/portal_apply_schema.py +30 -0
  461. larkify/models/hire/v1/questionnaire.py +102 -0
  462. larkify/models/hire/v1/referral.py +79 -0
  463. larkify/models/hire/v1/referral_account.py +250 -0
  464. larkify/models/hire/v1/referral_website_job_post.py +160 -0
  465. larkify/models/hire/v1/registration_schema.py +30 -0
  466. larkify/models/hire/v1/resume_source.py +42 -0
  467. larkify/models/hire/v1/role.py +125 -0
  468. larkify/models/hire/v1/subject.py +49 -0
  469. larkify/models/hire/v1/talent.py +1287 -0
  470. larkify/models/hire/v1/talent_blocklist.py +35 -0
  471. larkify/models/hire/v1/talent_external_info.py +62 -0
  472. larkify/models/hire/v1/talent_folder.py +38 -0
  473. larkify/models/hire/v1/talent_object.py +22 -0
  474. larkify/models/hire/v1/talent_operation_log.py +69 -0
  475. larkify/models/hire/v1/talent_pool.py +90 -0
  476. larkify/models/hire/v1/talent_tag.py +48 -0
  477. larkify/models/hire/v1/termination_reason.py +48 -0
  478. larkify/models/hire/v1/test.py +113 -0
  479. larkify/models/hire/v1/todo.py +54 -0
  480. larkify/models/hire/v1/tripartite_agreement.py +89 -0
  481. larkify/models/hire/v1/user_role.py +58 -0
  482. larkify/models/hire/v1/website.py +44 -0
  483. larkify/models/hire/v1/website_channel.py +90 -0
  484. larkify/models/hire/v1/website_delivery.py +507 -0
  485. larkify/models/hire/v1/website_delivery_task.py +28 -0
  486. larkify/models/hire/v1/website_job_post.py +213 -0
  487. larkify/models/hire/v1/website_site_user.py +65 -0
  488. larkify/models/hire/v2/__init__.py +0 -0
  489. larkify/models/hire/v2/_shared.py +22 -0
  490. larkify/models/hire/v2/interview_record.py +192 -0
  491. larkify/models/hire/v2/talent.py +436 -0
  492. larkify/models/human_authentication/__init__.py +0 -0
  493. larkify/models/human_authentication/v1/__init__.py +0 -0
  494. larkify/models/human_authentication/v1/identity.py +41 -0
  495. larkify/models/im/__init__.py +0 -0
  496. larkify/models/im/v1/__init__.py +0 -0
  497. larkify/models/im/v1/_shared.py +183 -0
  498. larkify/models/im/v1/batch_message.py +60 -0
  499. larkify/models/im/v1/chat.py +377 -0
  500. larkify/models/im/v1/chat_announcement.py +52 -0
  501. larkify/models/im/v1/chat_managers.py +54 -0
  502. larkify/models/im/v1/chat_members.py +90 -0
  503. larkify/models/im/v1/chat_menu_item.py +44 -0
  504. larkify/models/im/v1/chat_menu_tree.py +174 -0
  505. larkify/models/im/v1/chat_moderation.py +59 -0
  506. larkify/models/im/v1/chat_tab.py +239 -0
  507. larkify/models/im/v1/chat_top_notice.py +43 -0
  508. larkify/models/im/v1/file.py +45 -0
  509. larkify/models/im/v1/image.py +39 -0
  510. larkify/models/im/v1/message.py +610 -0
  511. larkify/models/im/v1/message_reaction.py +199 -0
  512. larkify/models/im/v1/pin.py +65 -0
  513. larkify/models/im/v1/thread.py +78 -0
  514. larkify/models/im/v2/__init__.py +0 -0
  515. larkify/models/im/v2/_shared.py +204 -0
  516. larkify/models/im/v2/app_feed_card.py +44 -0
  517. larkify/models/im/v2/app_feed_card_batch.py +91 -0
  518. larkify/models/im/v2/biz_entity_tag_relation.py +88 -0
  519. larkify/models/im/v2/chat.py +120 -0
  520. larkify/models/im/v2/chat_button.py +47 -0
  521. larkify/models/im/v2/feed_card.py +62 -0
  522. larkify/models/im/v2/tag.py +150 -0
  523. larkify/models/im/v2/url_preview.py +32 -0
  524. larkify/models/lingo/__init__.py +0 -0
  525. larkify/models/lingo/v1/__init__.py +0 -0
  526. larkify/models/lingo/v1/_shared.py +336 -0
  527. larkify/models/lingo/v1/classification.py +48 -0
  528. larkify/models/lingo/v1/draft.py +113 -0
  529. larkify/models/lingo/v1/entity.py +232 -0
  530. larkify/models/lingo/v1/file.py +39 -0
  531. larkify/models/lingo/v1/repo.py +28 -0
  532. larkify/models/mail/__init__.py +0 -0
  533. larkify/models/mail/v1/__init__.py +0 -0
  534. larkify/models/mail/v1/_shared.py +222 -0
  535. larkify/models/mail/v1/mailgroup.py +196 -0
  536. larkify/models/mail/v1/mailgroup_alias.py +43 -0
  537. larkify/models/mail/v1/mailgroup_manager.py +69 -0
  538. larkify/models/mail/v1/mailgroup_member.py +159 -0
  539. larkify/models/mail/v1/mailgroup_permission_member.py +145 -0
  540. larkify/models/mail/v1/multi_entity.py +64 -0
  541. larkify/models/mail/v1/public_mailbox.py +142 -0
  542. larkify/models/mail/v1/public_mailbox_alias.py +43 -0
  543. larkify/models/mail/v1/public_mailbox_member.py +121 -0
  544. larkify/models/mail/v1/user.py +45 -0
  545. larkify/models/mail/v1/user_mailbox.py +172 -0
  546. larkify/models/mail/v1/user_mailbox_alias.py +43 -0
  547. larkify/models/mail/v1/user_mailbox_draft.py +140 -0
  548. larkify/models/mail/v1/user_mailbox_event.py +46 -0
  549. larkify/models/mail/v1/user_mailbox_folder.py +82 -0
  550. larkify/models/mail/v1/user_mailbox_label.py +110 -0
  551. larkify/models/mail/v1/user_mailbox_mail_contact.py +122 -0
  552. larkify/models/mail/v1/user_mailbox_message.py +273 -0
  553. larkify/models/mail/v1/user_mailbox_message_attachment.py +27 -0
  554. larkify/models/mail/v1/user_mailbox_rule.py +201 -0
  555. larkify/models/mail/v1/user_mailbox_sent_message.py +58 -0
  556. larkify/models/mail/v1/user_mailbox_setting.py +90 -0
  557. larkify/models/mail/v1/user_mailbox_template.py +177 -0
  558. larkify/models/mail/v1/user_mailbox_template_attachment.py +25 -0
  559. larkify/models/mail/v1/user_mailbox_thread.py +108 -0
  560. larkify/models/mdm/__init__.py +0 -0
  561. larkify/models/mdm/v1/__init__.py +0 -0
  562. larkify/models/mdm/v1/user_auth_data_relation.py +58 -0
  563. larkify/models/mdm/v3/__init__.py +0 -0
  564. larkify/models/mdm/v3/_shared.py +60 -0
  565. larkify/models/mdm/v3/batch_country_region.py +22 -0
  566. larkify/models/mdm/v3/country_region.py +105 -0
  567. larkify/models/minutes/__init__.py +0 -0
  568. larkify/models/minutes/v1/__init__.py +0 -0
  569. larkify/models/minutes/v1/minute.py +255 -0
  570. larkify/models/minutes/v1/minute_media.py +18 -0
  571. larkify/models/minutes/v1/minute_statistics.py +40 -0
  572. larkify/models/moments/__init__.py +0 -0
  573. larkify/models/moments/v1/__init__.py +0 -0
  574. larkify/models/moments/v1/post.py +70 -0
  575. larkify/models/okr/__init__.py +0 -0
  576. larkify/models/okr/v1/__init__.py +0 -0
  577. larkify/models/okr/v1/_shared.py +136 -0
  578. larkify/models/okr/v1/image.py +44 -0
  579. larkify/models/okr/v1/okr.py +22 -0
  580. larkify/models/okr/v1/period.py +91 -0
  581. larkify/models/okr/v1/period_rule.py +32 -0
  582. larkify/models/okr/v1/progress_record.py +509 -0
  583. larkify/models/okr/v1/review.py +50 -0
  584. larkify/models/okr/v1/user_okr.py +24 -0
  585. larkify/models/okr/v2/__init__.py +0 -0
  586. larkify/models/okr/v2/_shared.py +560 -0
  587. larkify/models/okr/v2/okr_alignment.py +30 -0
  588. larkify/models/okr/v2/okr_category.py +58 -0
  589. larkify/models/okr/v2/okr_cycle.py +109 -0
  590. larkify/models/okr/v2/okr_cycle_objective.py +68 -0
  591. larkify/models/okr/v2/okr_indicator.py +73 -0
  592. larkify/models/okr/v2/okr_key_result.py +57 -0
  593. larkify/models/okr/v2/okr_key_result_indicator.py +22 -0
  594. larkify/models/okr/v2/okr_key_result_progress.py +30 -0
  595. larkify/models/okr/v2/okr_objective.py +116 -0
  596. larkify/models/okr/v2/okr_objective_alignment.py +56 -0
  597. larkify/models/okr/v2/okr_objective_indicator.py +22 -0
  598. larkify/models/okr/v2/okr_objective_key_result.py +59 -0
  599. larkify/models/okr/v2/okr_objective_progress.py +30 -0
  600. larkify/models/optical_char_recognition/__init__.py +0 -0
  601. larkify/models/optical_char_recognition/v1/__init__.py +0 -0
  602. larkify/models/optical_char_recognition/v1/image.py +33 -0
  603. larkify/models/passport/__init__.py +0 -0
  604. larkify/models/passport/v1/__init__.py +0 -0
  605. larkify/models/passport/v1/password.py +35 -0
  606. larkify/models/passport/v1/session.py +73 -0
  607. larkify/models/payroll/__init__.py +0 -0
  608. larkify/models/payroll/v1/__init__.py +0 -0
  609. larkify/models/payroll/v1/_shared.py +116 -0
  610. larkify/models/payroll/v1/acct_item.py +48 -0
  611. larkify/models/payroll/v1/cost_allocation_detail.py +54 -0
  612. larkify/models/payroll/v1/cost_allocation_plan.py +67 -0
  613. larkify/models/payroll/v1/cost_allocation_report.py +59 -0
  614. larkify/models/payroll/v1/datasource.py +64 -0
  615. larkify/models/payroll/v1/datasource_record.py +135 -0
  616. larkify/models/payroll/v1/paygroup.py +64 -0
  617. larkify/models/payroll/v1/payment_activity.py +73 -0
  618. larkify/models/payroll/v1/payment_activity_detail.py +34 -0
  619. larkify/models/payroll/v1/payment_detail.py +72 -0
  620. larkify/models/performance/__init__.py +0 -0
  621. larkify/models/performance/v1/__init__.py +0 -0
  622. larkify/models/performance/v1/_shared.py +54 -0
  623. larkify/models/performance/v1/review_data.py +190 -0
  624. larkify/models/performance/v1/semester.py +22 -0
  625. larkify/models/performance/v1/stage_task.py +147 -0
  626. larkify/models/performance/v2/__init__.py +0 -0
  627. larkify/models/performance/v2/_shared.py +34 -0
  628. larkify/models/performance/v2/activity.py +64 -0
  629. larkify/models/performance/v2/additional_information.py +119 -0
  630. larkify/models/performance/v2/additional_informations_batch.py +38 -0
  631. larkify/models/performance/v2/indicator.py +67 -0
  632. larkify/models/performance/v2/metric_detail.py +156 -0
  633. larkify/models/performance/v2/metric_field.py +47 -0
  634. larkify/models/performance/v2/metric_lib.py +114 -0
  635. larkify/models/performance/v2/metric_tag.py +46 -0
  636. larkify/models/performance/v2/metric_template.py +159 -0
  637. larkify/models/performance/v2/question.py +63 -0
  638. larkify/models/performance/v2/review_data.py +299 -0
  639. larkify/models/performance/v2/review_template.py +105 -0
  640. larkify/models/performance/v2/reviewee.py +65 -0
  641. larkify/models/performance/v2/user_group_user_rel.py +59 -0
  642. larkify/models/performance/v2/user_info.py +89 -0
  643. larkify/models/personal_settings/__init__.py +0 -0
  644. larkify/models/personal_settings/v1/__init__.py +0 -0
  645. larkify/models/personal_settings/v1/system_status.py +406 -0
  646. larkify/models/report/__init__.py +0 -0
  647. larkify/models/report/v1/__init__.py +0 -0
  648. larkify/models/report/v1/rule.py +74 -0
  649. larkify/models/report/v1/rule_view.py +27 -0
  650. larkify/models/report/v1/task.py +94 -0
  651. larkify/models/search/__init__.py +0 -0
  652. larkify/models/search/v2/__init__.py +0 -0
  653. larkify/models/search/v2/_shared.py +47 -0
  654. larkify/models/search/v2/app.py +43 -0
  655. larkify/models/search/v2/data_source.py +201 -0
  656. larkify/models/search/v2/data_source_item.py +167 -0
  657. larkify/models/search/v2/doc_wiki.py +271 -0
  658. larkify/models/search/v2/message.py +67 -0
  659. larkify/models/search/v2/schema.py +470 -0
  660. larkify/models/security_and_compliance/__init__.py +0 -0
  661. larkify/models/security_and_compliance/v1/__init__.py +0 -0
  662. larkify/models/security_and_compliance/v1/multi_geo_entity_tenant.py +28 -0
  663. larkify/models/security_and_compliance/v1/openapi_log.py +90 -0
  664. larkify/models/security_and_compliance/v1/user_migration.py +86 -0
  665. larkify/models/security_and_compliance/v2/__init__.py +0 -0
  666. larkify/models/security_and_compliance/v2/device_apply_record.py +29 -0
  667. larkify/models/security_and_compliance/v2/device_record.py +178 -0
  668. larkify/models/sheets/__init__.py +0 -0
  669. larkify/models/sheets/v3/__init__.py +0 -0
  670. larkify/models/sheets/v3/spreadsheet.py +81 -0
  671. larkify/models/sheets/v3/spreadsheet_sheet.py +189 -0
  672. larkify/models/sheets/v3/spreadsheet_sheet_filter.py +104 -0
  673. larkify/models/sheets/v3/spreadsheet_sheet_filter_view.py +83 -0
  674. larkify/models/sheets/v3/spreadsheet_sheet_filter_view_condition.py +91 -0
  675. larkify/models/sheets/v3/spreadsheet_sheet_float_image.py +115 -0
  676. larkify/models/spark/__init__.py +0 -0
  677. larkify/models/spark/v1/__init__.py +0 -0
  678. larkify/models/spark/v1/app.py +425 -0
  679. larkify/models/spark/v1/app_available_scope.py +49 -0
  680. larkify/models/spark/v1/app_enum.py +52 -0
  681. larkify/models/spark/v1/app_release.py +82 -0
  682. larkify/models/spark/v1/app_storage.py +128 -0
  683. larkify/models/spark/v1/app_table.py +181 -0
  684. larkify/models/spark/v1/app_view.py +24 -0
  685. larkify/models/spark/v1/directory_user.py +46 -0
  686. larkify/models/speech_to_text/__init__.py +0 -0
  687. larkify/models/speech_to_text/v1/__init__.py +0 -0
  688. larkify/models/speech_to_text/v1/speech.py +119 -0
  689. larkify/models/task/__init__.py +0 -0
  690. larkify/models/task/v1/__init__.py +0 -0
  691. larkify/models/task/v1/_shared.py +30 -0
  692. larkify/models/task/v1/task.py +400 -0
  693. larkify/models/task/v1/task_collaborator.py +54 -0
  694. larkify/models/task/v1/task_comment.py +100 -0
  695. larkify/models/task/v1/task_follower.py +54 -0
  696. larkify/models/task/v1/task_reminder.py +59 -0
  697. larkify/models/task/v2/__init__.py +0 -0
  698. larkify/models/task/v2/_shared.py +658 -0
  699. larkify/models/task/v2/attachment.py +70 -0
  700. larkify/models/task/v2/comment.py +126 -0
  701. larkify/models/task/v2/custom_field.py +349 -0
  702. larkify/models/task/v2/custom_field_option.py +96 -0
  703. larkify/models/task/v2/section.py +167 -0
  704. larkify/models/task/v2/task.py +513 -0
  705. larkify/models/task/v2/task_subtask.py +159 -0
  706. larkify/models/task/v2/task_v2.py +122 -0
  707. larkify/models/task/v2/tasklist.py +256 -0
  708. larkify/models/task/v2/tasklist_activity_subscription.py +122 -0
  709. larkify/models/tenant/__init__.py +0 -0
  710. larkify/models/tenant/v2/__init__.py +0 -0
  711. larkify/models/tenant/v2/tenant.py +52 -0
  712. larkify/models/tenant/v2/tenant_product_assign_info.py +52 -0
  713. larkify/models/translation/__init__.py +0 -0
  714. larkify/models/translation/v1/__init__.py +0 -0
  715. larkify/models/translation/v1/text.py +81 -0
  716. larkify/models/trust_party/__init__.py +0 -0
  717. larkify/models/trust_party/v1/__init__.py +0 -0
  718. larkify/models/trust_party/v1/_shared.py +62 -0
  719. larkify/models/trust_party/v1/collaboration_tenant.py +115 -0
  720. larkify/models/trust_party/v1/collaboration_tenant_collaboration_department.py +54 -0
  721. larkify/models/trust_party/v1/collaboration_tenant_collaboration_user.py +119 -0
  722. larkify/models/vc/__init__.py +0 -0
  723. larkify/models/vc/v1/__init__.py +0 -0
  724. larkify/models/vc/v1/_shared.py +261 -0
  725. larkify/models/vc/v1/alert.py +72 -0
  726. larkify/models/vc/v1/bot.py +421 -0
  727. larkify/models/vc/v1/export.py +161 -0
  728. larkify/models/vc/v1/meeting.py +326 -0
  729. larkify/models/vc/v1/meeting_list.py +92 -0
  730. larkify/models/vc/v1/meeting_recording.py +76 -0
  731. larkify/models/vc/v1/note.py +66 -0
  732. larkify/models/vc/v1/participant_list.py +88 -0
  733. larkify/models/vc/v1/participant_quality_list.py +132 -0
  734. larkify/models/vc/v1/report.py +66 -0
  735. larkify/models/vc/v1/reserve.py +402 -0
  736. larkify/models/vc/v1/reserve_config.py +180 -0
  737. larkify/models/vc/v1/reserve_config_admin.py +73 -0
  738. larkify/models/vc/v1/reserve_config_disable_inform.py +83 -0
  739. larkify/models/vc/v1/reserve_config_form.py +85 -0
  740. larkify/models/vc/v1/resource_reservation_list.py +68 -0
  741. larkify/models/vc/v1/room.py +208 -0
  742. larkify/models/vc/v1/room_config.py +194 -0
  743. larkify/models/vc/v1/room_level.py +133 -0
  744. larkify/models/vc/v1/scope_config.py +105 -0
  745. larkify/models/verification/__init__.py +0 -0
  746. larkify/models/verification/v1/__init__.py +0 -0
  747. larkify/models/verification/v1/verification.py +30 -0
  748. larkify/models/wiki/__init__.py +0 -0
  749. larkify/models/wiki/v1/__init__.py +0 -0
  750. larkify/models/wiki/v1/node.py +77 -0
  751. larkify/models/wiki/v2/__init__.py +0 -0
  752. larkify/models/wiki/v2/_shared.py +52 -0
  753. larkify/models/wiki/v2/space.py +87 -0
  754. larkify/models/wiki/v2/space_member.py +100 -0
  755. larkify/models/wiki/v2/space_node.py +153 -0
  756. larkify/models/wiki/v2/space_setting.py +51 -0
  757. larkify/models/wiki/v2/task.py +76 -0
  758. larkify/models/workplace/__init__.py +0 -0
  759. larkify/models/workplace/v1/__init__.py +0 -0
  760. larkify/models/workplace/v1/_shared.py +22 -0
  761. larkify/models/workplace/v1/custom_workplace_access_data.py +52 -0
  762. larkify/models/workplace/v1/workplace_access_data.py +42 -0
  763. larkify/models/workplace/v1/workplace_block_access_data.py +42 -0
  764. larkify/response.py +208 -0
  765. larkify/rest/__init__.py +488 -0
  766. larkify/rest/_base.py +66 -0
  767. larkify/rest/acs/__init__.py +26 -0
  768. larkify/rest/acs/v1/__init__.py +72 -0
  769. larkify/rest/acs/v1/access_record.py +103 -0
  770. larkify/rest/acs/v1/access_record_access_photo.py +69 -0
  771. larkify/rest/acs/v1/device.py +69 -0
  772. larkify/rest/acs/v1/rule_external.py +364 -0
  773. larkify/rest/acs/v1/user.py +270 -0
  774. larkify/rest/acs/v1/user_face.py +216 -0
  775. larkify/rest/acs/v1/visitor.py +199 -0
  776. larkify/rest/admin/__init__.py +26 -0
  777. larkify/rest/admin/v1/__init__.py +68 -0
  778. larkify/rest/admin/v1/admin_dept_stat.py +115 -0
  779. larkify/rest/admin/v1/admin_user_stat.py +119 -0
  780. larkify/rest/admin/v1/audit_info.py +131 -0
  781. larkify/rest/admin/v1/badge.py +356 -0
  782. larkify/rest/admin/v1/badge_grant.py +534 -0
  783. larkify/rest/admin/v1/badge_image.py +129 -0
  784. larkify/rest/admin/v1/password.py +138 -0
  785. larkify/rest/aily/__init__.py +26 -0
  786. larkify/rest/aily/v1/__init__.py +122 -0
  787. larkify/rest/aily/v1/agent_agent_artifact.py +74 -0
  788. larkify/rest/aily/v1/agent_agent_attachment.py +141 -0
  789. larkify/rest/aily/v1/agent_agent_chat.py +180 -0
  790. larkify/rest/aily/v1/agent_agent_chat_session.py +295 -0
  791. larkify/rest/aily/v1/agent_agent_visibility.py +129 -0
  792. larkify/rest/aily/v1/aily_session.py +319 -0
  793. larkify/rest/aily/v1/aily_session_aily_message.py +269 -0
  794. larkify/rest/aily/v1/aily_session_run.py +298 -0
  795. larkify/rest/aily/v1/app_data_asset.py +501 -0
  796. larkify/rest/aily/v1/app_data_asset_tag.py +97 -0
  797. larkify/rest/aily/v1/app_knowledge.py +131 -0
  798. larkify/rest/aily/v1/app_skill.py +255 -0
  799. larkify/rest/aily/v1/tenant_app_stat.py +99 -0
  800. larkify/rest/apaas/__init__.py +26 -0
  801. larkify/rest/apaas/v1/__init__.py +174 -0
  802. larkify/rest/apaas/v1/app.py +87 -0
  803. larkify/rest/apaas/v1/application_audit_log.py +348 -0
  804. larkify/rest/apaas/v1/application_environment_variable.py +198 -0
  805. larkify/rest/apaas/v1/application_flow.py +141 -0
  806. larkify/rest/apaas/v1/application_function.py +89 -0
  807. larkify/rest/apaas/v1/application_object.py +250 -0
  808. larkify/rest/apaas/v1/application_object_record.py +924 -0
  809. larkify/rest/apaas/v1/application_record_permission_member.py +266 -0
  810. larkify/rest/apaas/v1/application_role_member.py +329 -0
  811. larkify/rest/apaas/v1/approval_instance.py +130 -0
  812. larkify/rest/apaas/v1/approval_task.py +438 -0
  813. larkify/rest/apaas/v1/seat_activity.py +91 -0
  814. larkify/rest/apaas/v1/seat_assignment.py +91 -0
  815. larkify/rest/apaas/v1/tenant_app_metrics.py +125 -0
  816. larkify/rest/apaas/v1/user_task.py +645 -0
  817. larkify/rest/apaas/v1/workspace.py +125 -0
  818. larkify/rest/apaas/v1/workspace_enum.py +140 -0
  819. larkify/rest/apaas/v1/workspace_table.py +658 -0
  820. larkify/rest/apaas/v1/workspace_view.py +103 -0
  821. larkify/rest/application/__init__.py +47 -0
  822. larkify/rest/application/legacy.py +437 -0
  823. larkify/rest/application/v5/__init__.py +26 -0
  824. larkify/rest/application/v5/application.py +154 -0
  825. larkify/rest/application/v6/__init__.py +133 -0
  826. larkify/rest/application/v6/app_badge.py +144 -0
  827. larkify/rest/application/v6/app_recommend_rule.py +91 -0
  828. larkify/rest/application/v6/application.py +442 -0
  829. larkify/rest/application/v6/application_app_usage.py +455 -0
  830. larkify/rest/application/v6/application_app_version.py +381 -0
  831. larkify/rest/application/v6/application_collaborators.py +219 -0
  832. larkify/rest/application/v6/application_contacts_range.py +182 -0
  833. larkify/rest/application/v6/application_feedback.py +179 -0
  834. larkify/rest/application/v6/application_management.py +128 -0
  835. larkify/rest/application/v6/application_owner.py +144 -0
  836. larkify/rest/application/v6/application_visibility.py +341 -0
  837. larkify/rest/application/v6/scope.py +115 -0
  838. larkify/rest/application/v7/__init__.py +60 -0
  839. larkify/rest/application/v7/app_avatar_upload.py +131 -0
  840. larkify/rest/application/v7/application_ability.py +134 -0
  841. larkify/rest/application/v7/application_base.py +130 -0
  842. larkify/rest/application/v7/application_config.py +204 -0
  843. larkify/rest/application/v7/application_publish.py +137 -0
  844. larkify/rest/approval/__init__.py +33 -0
  845. larkify/rest/approval/legacy.py +1269 -0
  846. larkify/rest/approval/v4/__init__.py +75 -0
  847. larkify/rest/approval/v4/approval.py +507 -0
  848. larkify/rest/approval/v4/district.py +212 -0
  849. larkify/rest/approval/v4/external_approval.py +252 -0
  850. larkify/rest/approval/v4/external_instance.py +328 -0
  851. larkify/rest/approval/v4/external_task.py +153 -0
  852. larkify/rest/approval/v4/instance.py +1882 -0
  853. larkify/rest/approval/v4/instance_comment.py +374 -0
  854. larkify/rest/approval/v4/task.py +1513 -0
  855. larkify/rest/attendance/__init__.py +26 -0
  856. larkify/rest/attendance/v1/__init__.py +137 -0
  857. larkify/rest/attendance/v1/approval_info.py +123 -0
  858. larkify/rest/attendance/v1/archive_rule.py +455 -0
  859. larkify/rest/attendance/v1/file.py +187 -0
  860. larkify/rest/attendance/v1/group.py +493 -0
  861. larkify/rest/attendance/v1/leave_accrual_record.py +173 -0
  862. larkify/rest/attendance/v1/leave_employ_expire_record.py +165 -0
  863. larkify/rest/attendance/v1/shift.py +440 -0
  864. larkify/rest/attendance/v1/user_approval.py +262 -0
  865. larkify/rest/attendance/v1/user_daily_shift.py +381 -0
  866. larkify/rest/attendance/v1/user_flow.py +412 -0
  867. larkify/rest/attendance/v1/user_setting.py +246 -0
  868. larkify/rest/attendance/v1/user_stats_data.py +149 -0
  869. larkify/rest/attendance/v1/user_stats_field.py +141 -0
  870. larkify/rest/attendance/v1/user_stats_view.py +256 -0
  871. larkify/rest/attendance/v1/user_task.py +157 -0
  872. larkify/rest/attendance/v1/user_task_remedy.py +391 -0
  873. larkify/rest/auth/__init__.py +26 -0
  874. larkify/rest/auth/v3/__init__.py +26 -0
  875. larkify/rest/auth/v3/auth.py +526 -0
  876. larkify/rest/authen/__init__.py +26 -0
  877. larkify/rest/authen/v1/__init__.py +58 -0
  878. larkify/rest/authen/v1/access_token.py +121 -0
  879. larkify/rest/authen/v1/oidc_access_token.py +125 -0
  880. larkify/rest/authen/v1/oidc_refresh_access_token.py +129 -0
  881. larkify/rest/authen/v1/refresh_access_token.py +125 -0
  882. larkify/rest/authen/v1/user_info.py +69 -0
  883. larkify/rest/baike/__init__.py +26 -0
  884. larkify/rest/baike/v1/__init__.py +47 -0
  885. larkify/rest/baike/v1/classification.py +87 -0
  886. larkify/rest/baike/v1/draft.py +280 -0
  887. larkify/rest/baike/v1/entity.py +834 -0
  888. larkify/rest/baike/v1/file.py +173 -0
  889. larkify/rest/base/__init__.py +26 -0
  890. larkify/rest/base/v2/__init__.py +26 -0
  891. larkify/rest/base/v2/app_role.py +311 -0
  892. larkify/rest/bitable/__init__.py +26 -0
  893. larkify/rest/bitable/v1/__init__.py +112 -0
  894. larkify/rest/bitable/v1/app.py +378 -0
  895. larkify/rest/bitable/v1/app_block_workflow.py +72 -0
  896. larkify/rest/bitable/v1/app_dashboard.py +200 -0
  897. larkify/rest/bitable/v1/app_role.py +365 -0
  898. larkify/rest/bitable/v1/app_role_member.py +567 -0
  899. larkify/rest/bitable/v1/app_table.py +560 -0
  900. larkify/rest/bitable/v1/app_table_field.py +646 -0
  901. larkify/rest/bitable/v1/app_table_field_group.py +137 -0
  902. larkify/rest/bitable/v1/app_table_form.py +315 -0
  903. larkify/rest/bitable/v1/app_table_form_field.py +236 -0
  904. larkify/rest/bitable/v1/app_table_record.py +1240 -0
  905. larkify/rest/bitable/v1/app_table_view.py +460 -0
  906. larkify/rest/bitable/v1/app_workflow.py +179 -0
  907. larkify/rest/board/__init__.py +26 -0
  908. larkify/rest/board/v1/__init__.py +33 -0
  909. larkify/rest/board/v1/whiteboard.py +226 -0
  910. larkify/rest/board/v1/whiteboard_node.py +456 -0
  911. larkify/rest/bot/__init__.py +33 -0
  912. larkify/rest/bot/v3/__init__.py +26 -0
  913. larkify/rest/bot/v3/bot_menu.py +310 -0
  914. larkify/rest/bot/v4/__init__.py +26 -0
  915. larkify/rest/bot/v4/bot.py +155 -0
  916. larkify/rest/calendar/__init__.py +26 -0
  917. larkify/rest/calendar/v4/__init__.py +114 -0
  918. larkify/rest/calendar/v4/calendar.py +973 -0
  919. larkify/rest/calendar/v4/calendar_acl.py +360 -0
  920. larkify/rest/calendar/v4/calendar_event.py +1111 -0
  921. larkify/rest/calendar/v4/calendar_event_attendee.py +386 -0
  922. larkify/rest/calendar/v4/calendar_event_attendee_chat_member.py +97 -0
  923. larkify/rest/calendar/v4/calendar_event_meeting_chat.py +136 -0
  924. larkify/rest/calendar/v4/calendar_event_meeting_minute.py +74 -0
  925. larkify/rest/calendar/v4/exchange_binding.py +252 -0
  926. larkify/rest/calendar/v4/freebusy.py +266 -0
  927. larkify/rest/calendar/v4/setting.py +123 -0
  928. larkify/rest/calendar/v4/timeoff_event.py +193 -0
  929. larkify/rest/card/__init__.py +26 -0
  930. larkify/rest/card/legacy.py +73 -0
  931. larkify/rest/cardkit/__init__.py +26 -0
  932. larkify/rest/cardkit/v1/__init__.py +33 -0
  933. larkify/rest/cardkit/v1/card.py +482 -0
  934. larkify/rest/cardkit/v1/card_element.py +562 -0
  935. larkify/rest/ccm_doc/__init__.py +26 -0
  936. larkify/rest/ccm_doc/legacy.py +343 -0
  937. larkify/rest/ccm_docs/__init__.py +26 -0
  938. larkify/rest/ccm_docs/legacy.py +125 -0
  939. larkify/rest/ccm_drive_explorer/__init__.py +26 -0
  940. larkify/rest/ccm_drive_explorer/legacy.py +451 -0
  941. larkify/rest/ccm_sheet/__init__.py +26 -0
  942. larkify/rest/ccm_sheet/legacy.py +1751 -0
  943. larkify/rest/compensation/__init__.py +26 -0
  944. larkify/rest/compensation/v1/__init__.py +109 -0
  945. larkify/rest/compensation/v1/archive.py +288 -0
  946. larkify/rest/compensation/v1/change_reason.py +87 -0
  947. larkify/rest/compensation/v1/indicator.py +87 -0
  948. larkify/rest/compensation/v1/item.py +91 -0
  949. larkify/rest/compensation/v1/item_category.py +87 -0
  950. larkify/rest/compensation/v1/lump_sum_payment.py +705 -0
  951. larkify/rest/compensation/v1/plan.py +87 -0
  952. larkify/rest/compensation/v1/recurring_payment.py +562 -0
  953. larkify/rest/compensation/v1/social_archive.py +137 -0
  954. larkify/rest/compensation/v1/social_archive_adjust_record.py +147 -0
  955. larkify/rest/compensation/v1/social_insurance.py +69 -0
  956. larkify/rest/compensation/v1/social_plan.py +192 -0
  957. larkify/rest/contact/__init__.py +33 -0
  958. larkify/rest/contact/legacy.py +281 -0
  959. larkify/rest/contact/v3/__init__.py +121 -0
  960. larkify/rest/contact/v3/custom_attr.py +87 -0
  961. larkify/rest/contact/v3/department.py +1365 -0
  962. larkify/rest/contact/v3/employee_type_enum.py +361 -0
  963. larkify/rest/contact/v3/functional_role.py +265 -0
  964. larkify/rest/contact/v3/functional_role_member.py +569 -0
  965. larkify/rest/contact/v3/group.py +556 -0
  966. larkify/rest/contact/v3/group_member.py +510 -0
  967. larkify/rest/contact/v3/job_family.py +414 -0
  968. larkify/rest/contact/v3/job_level.py +414 -0
  969. larkify/rest/contact/v3/job_title.py +136 -0
  970. larkify/rest/contact/v3/scope.py +99 -0
  971. larkify/rest/contact/v3/unit.py +656 -0
  972. larkify/rest/contact/v3/user.py +1499 -0
  973. larkify/rest/contact/v3/work_city.py +136 -0
  974. larkify/rest/contact_search/__init__.py +26 -0
  975. larkify/rest/contact_search/legacy.py +73 -0
  976. larkify/rest/contact_user/__init__.py +26 -0
  977. larkify/rest/contact_user/legacy.py +73 -0
  978. larkify/rest/corehr/__init__.py +33 -0
  979. larkify/rest/corehr/v1/__init__.py +260 -0
  980. larkify/rest/corehr/v1/assigned_user.py +161 -0
  981. larkify/rest/corehr/v1/authorization.py +559 -0
  982. larkify/rest/corehr/v1/common_data_id.py +207 -0
  983. larkify/rest/corehr/v1/common_data_meta_data.py +288 -0
  984. larkify/rest/corehr/v1/company.py +558 -0
  985. larkify/rest/corehr/v1/compensation_standard.py +211 -0
  986. larkify/rest/corehr/v1/contract.py +484 -0
  987. larkify/rest/corehr/v1/country_region.py +136 -0
  988. larkify/rest/corehr/v1/currency.py +136 -0
  989. larkify/rest/corehr/v1/custom_field.py +209 -0
  990. larkify/rest/corehr/v1/department.py +644 -0
  991. larkify/rest/corehr/v1/employee_type.py +440 -0
  992. larkify/rest/corehr/v1/employment.py +468 -0
  993. larkify/rest/corehr/v1/file.py +69 -0
  994. larkify/rest/corehr/v1/job.py +476 -0
  995. larkify/rest/corehr/v1/job_change.py +207 -0
  996. larkify/rest/corehr/v1/job_data.py +736 -0
  997. larkify/rest/corehr/v1/job_family.py +456 -0
  998. larkify/rest/corehr/v1/job_level.py +456 -0
  999. larkify/rest/corehr/v1/leave.py +636 -0
  1000. larkify/rest/corehr/v1/leave_granting_record.py +219 -0
  1001. larkify/rest/corehr/v1/location.py +337 -0
  1002. larkify/rest/corehr/v1/national_id_type.py +480 -0
  1003. larkify/rest/corehr/v1/offboarding.py +487 -0
  1004. larkify/rest/corehr/v1/person.py +666 -0
  1005. larkify/rest/corehr/v1/pre_hire.py +341 -0
  1006. larkify/rest/corehr/v1/process_form_variable_data.py +72 -0
  1007. larkify/rest/corehr/v1/security_group.py +228 -0
  1008. larkify/rest/corehr/v1/subdivision.py +140 -0
  1009. larkify/rest/corehr/v1/subregion.py +140 -0
  1010. larkify/rest/corehr/v1/transfer_reason.py +87 -0
  1011. larkify/rest/corehr/v1/transfer_type.py +87 -0
  1012. larkify/rest/corehr/v1/working_hours_type.py +452 -0
  1013. larkify/rest/corehr/v2/__init__.py +485 -0
  1014. larkify/rest/corehr/v2/approval_groups.py +616 -0
  1015. larkify/rest/corehr/v2/approver.py +107 -0
  1016. larkify/rest/corehr/v2/basic_info_bank.py +151 -0
  1017. larkify/rest/corehr/v2/basic_info_bank_branch.py +159 -0
  1018. larkify/rest/corehr/v2/basic_info_city.py +147 -0
  1019. larkify/rest/corehr/v2/basic_info_country_region.py +153 -0
  1020. larkify/rest/corehr/v2/basic_info_country_region_subdivision.py +159 -0
  1021. larkify/rest/corehr/v2/basic_info_currency.py +149 -0
  1022. larkify/rest/corehr/v2/basic_info_district.py +151 -0
  1023. larkify/rest/corehr/v2/basic_info_language.py +149 -0
  1024. larkify/rest/corehr/v2/basic_info_nationality.py +151 -0
  1025. larkify/rest/corehr/v2/basic_info_time_zone.py +149 -0
  1026. larkify/rest/corehr/v2/bp.py +262 -0
  1027. larkify/rest/corehr/v2/company.py +391 -0
  1028. larkify/rest/corehr/v2/contract.py +165 -0
  1029. larkify/rest/corehr/v2/cost_allocation.py +578 -0
  1030. larkify/rest/corehr/v2/cost_center.py +900 -0
  1031. larkify/rest/corehr/v2/cost_center_version.py +434 -0
  1032. larkify/rest/corehr/v2/custom_org.py +889 -0
  1033. larkify/rest/corehr/v2/default_cost_center.py +596 -0
  1034. larkify/rest/corehr/v2/department.py +1518 -0
  1035. larkify/rest/corehr/v2/draft.py +89 -0
  1036. larkify/rest/corehr/v2/employee.py +607 -0
  1037. larkify/rest/corehr/v2/employee_custom_org.py +563 -0
  1038. larkify/rest/corehr/v2/employees_additional_job.py +701 -0
  1039. larkify/rest/corehr/v2/employees_bp.py +149 -0
  1040. larkify/rest/corehr/v2/employees_international_assignment.py +711 -0
  1041. larkify/rest/corehr/v2/employees_job_data.py +382 -0
  1042. larkify/rest/corehr/v2/enum.py +119 -0
  1043. larkify/rest/corehr/v2/job.py +445 -0
  1044. larkify/rest/corehr/v2/job_change.py +571 -0
  1045. larkify/rest/corehr/v2/job_family.py +295 -0
  1046. larkify/rest/corehr/v2/job_grade.py +507 -0
  1047. larkify/rest/corehr/v2/job_level.py +192 -0
  1048. larkify/rest/corehr/v2/location.py +541 -0
  1049. larkify/rest/corehr/v2/location_address.py +443 -0
  1050. larkify/rest/corehr/v2/offboarding.py +424 -0
  1051. larkify/rest/corehr/v2/pathway.py +524 -0
  1052. larkify/rest/corehr/v2/person.py +630 -0
  1053. larkify/rest/corehr/v2/position.py +845 -0
  1054. larkify/rest/corehr/v2/pre_hire.py +1149 -0
  1055. larkify/rest/corehr/v2/probation.py +770 -0
  1056. larkify/rest/corehr/v2/probation_assessment.py +341 -0
  1057. larkify/rest/corehr/v2/process.py +249 -0
  1058. larkify/rest/corehr/v2/process_approver.py +211 -0
  1059. larkify/rest/corehr/v2/process_extra.py +166 -0
  1060. larkify/rest/corehr/v2/process_form_variable_data.py +101 -0
  1061. larkify/rest/corehr/v2/process_query_flow_data_template.py +161 -0
  1062. larkify/rest/corehr/v2/process_revoke.py +156 -0
  1063. larkify/rest/corehr/v2/process_start.py +193 -0
  1064. larkify/rest/corehr/v2/process_transfer.py +164 -0
  1065. larkify/rest/corehr/v2/process_withdraw.py +160 -0
  1066. larkify/rest/corehr/v2/report_detail_row.py +230 -0
  1067. larkify/rest/corehr/v2/signature_file.py +544 -0
  1068. larkify/rest/corehr/v2/signature_node.py +91 -0
  1069. larkify/rest/corehr/v2/signature_template.py +87 -0
  1070. larkify/rest/corehr/v2/signature_template_info_with_thumbnail.py +115 -0
  1071. larkify/rest/corehr/v2/workforce_plan.py +103 -0
  1072. larkify/rest/corehr/v2/workforce_plan_detail.py +304 -0
  1073. larkify/rest/corehr/v2/workforce_plan_detail_row.py +242 -0
  1074. larkify/rest/directory/__init__.py +26 -0
  1075. larkify/rest/directory/v1/__init__.py +60 -0
  1076. larkify/rest/directory/v1/collaboration_rule.py +390 -0
  1077. larkify/rest/directory/v1/collaboration_tenant.py +87 -0
  1078. larkify/rest/directory/v1/collboration_share_entity.py +103 -0
  1079. larkify/rest/directory/v1/department.py +820 -0
  1080. larkify/rest/directory/v1/employee.py +1294 -0
  1081. larkify/rest/docs/__init__.py +26 -0
  1082. larkify/rest/docs/v1/__init__.py +26 -0
  1083. larkify/rest/docs/v1/content.py +95 -0
  1084. larkify/rest/document_ai/__init__.py +26 -0
  1085. larkify/rest/document_ai/v1/__init__.py +161 -0
  1086. larkify/rest/document_ai/v1/bank_card.py +127 -0
  1087. larkify/rest/document_ai/v1/business_card.py +131 -0
  1088. larkify/rest/document_ai/v1/business_license.py +131 -0
  1089. larkify/rest/document_ai/v1/chinese_passport.py +131 -0
  1090. larkify/rest/document_ai/v1/contract.py +135 -0
  1091. larkify/rest/document_ai/v1/driving_license.py +131 -0
  1092. larkify/rest/document_ai/v1/food_manage_license.py +131 -0
  1093. larkify/rest/document_ai/v1/food_produce_license.py +131 -0
  1094. larkify/rest/document_ai/v1/health_certificate.py +131 -0
  1095. larkify/rest/document_ai/v1/hkm_mainland_travel_permit.py +135 -0
  1096. larkify/rest/document_ai/v1/id_card.py +127 -0
  1097. larkify/rest/document_ai/v1/resume.py +123 -0
  1098. larkify/rest/document_ai/v1/taxi_invoice.py +127 -0
  1099. larkify/rest/document_ai/v1/train_invoice.py +131 -0
  1100. larkify/rest/document_ai/v1/tw_mainland_travel_permit.py +135 -0
  1101. larkify/rest/document_ai/v1/vat_invoice.py +127 -0
  1102. larkify/rest/document_ai/v1/vehicle_invoice.py +131 -0
  1103. larkify/rest/document_ai/v1/vehicle_license.py +131 -0
  1104. larkify/rest/docx/__init__.py +26 -0
  1105. larkify/rest/docx/v1/__init__.py +80 -0
  1106. larkify/rest/docx/v1/chat_announcement.py +85 -0
  1107. larkify/rest/docx/v1/chat_announcement_block.py +321 -0
  1108. larkify/rest/docx/v1/chat_announcement_block_children.py +409 -0
  1109. larkify/rest/docx/v1/document.py +342 -0
  1110. larkify/rest/docx/v1/document_block.py +584 -0
  1111. larkify/rest/docx/v1/document_block_children.py +405 -0
  1112. larkify/rest/docx/v1/document_block_descendant.py +183 -0
  1113. larkify/rest/drive/__init__.py +33 -0
  1114. larkify/rest/drive/v1/__init__.py +128 -0
  1115. larkify/rest/drive/v1/export_task.py +240 -0
  1116. larkify/rest/drive/v1/file.py +1402 -0
  1117. larkify/rest/drive/v1/file_comment.py +567 -0
  1118. larkify/rest/drive/v1/file_comment_reply.py +448 -0
  1119. larkify/rest/drive/v1/file_statistics.py +88 -0
  1120. larkify/rest/drive/v1/file_subscription.py +351 -0
  1121. larkify/rest/drive/v1/file_version.py +373 -0
  1122. larkify/rest/drive/v1/file_view_record.py +101 -0
  1123. larkify/rest/drive/v1/import_task.py +180 -0
  1124. larkify/rest/drive/v1/media.py +614 -0
  1125. larkify/rest/drive/v1/meta.py +139 -0
  1126. larkify/rest/drive/v1/permission_member.py +1319 -0
  1127. larkify/rest/drive/v1/permission_public.py +320 -0
  1128. larkify/rest/drive/v1/permission_public_password.py +265 -0
  1129. larkify/rest/drive/v1/user.py +235 -0
  1130. larkify/rest/drive/v2/__init__.py +40 -0
  1131. larkify/rest/drive/v2/comment_reaction.py +154 -0
  1132. larkify/rest/drive/v2/file_like.py +97 -0
  1133. larkify/rest/drive/v2/permission_public.py +346 -0
  1134. larkify/rest/ehr/__init__.py +26 -0
  1135. larkify/rest/ehr/v1/__init__.py +33 -0
  1136. larkify/rest/ehr/v1/attachment.py +69 -0
  1137. larkify/rest/ehr/v1/employee.py +115 -0
  1138. larkify/rest/event/__init__.py +26 -0
  1139. larkify/rest/event/v1/__init__.py +33 -0
  1140. larkify/rest/event/v1/connection.py +69 -0
  1141. larkify/rest/event/v1/outbound_ip.py +87 -0
  1142. larkify/rest/face_verify/__init__.py +26 -0
  1143. larkify/rest/face_verify/legacy.py +177 -0
  1144. larkify/rest/helpdesk/__init__.py +26 -0
  1145. larkify/rest/helpdesk/v1/__init__.py +114 -0
  1146. larkify/rest/helpdesk/v1/agent.py +171 -0
  1147. larkify/rest/helpdesk/v1/agent_schedule.py +189 -0
  1148. larkify/rest/helpdesk/v1/agent_schedules.py +229 -0
  1149. larkify/rest/helpdesk/v1/agent_skill.py +379 -0
  1150. larkify/rest/helpdesk/v1/agent_skill_rule.py +69 -0
  1151. larkify/rest/helpdesk/v1/bot_message.py +141 -0
  1152. larkify/rest/helpdesk/v1/category.py +387 -0
  1153. larkify/rest/helpdesk/v1/event.py +212 -0
  1154. larkify/rest/helpdesk/v1/faq.py +514 -0
  1155. larkify/rest/helpdesk/v1/notification.py +827 -0
  1156. larkify/rest/helpdesk/v1/ticket.py +652 -0
  1157. larkify/rest/helpdesk/v1/ticket_customized_field.py +468 -0
  1158. larkify/rest/helpdesk/v1/ticket_message.py +200 -0
  1159. larkify/rest/hire/__init__.py +33 -0
  1160. larkify/rest/hire/v1/__init__.py +615 -0
  1161. larkify/rest/hire/v1/advertisement.py +124 -0
  1162. larkify/rest/hire/v1/agency.py +749 -0
  1163. larkify/rest/hire/v1/application.py +1090 -0
  1164. larkify/rest/hire/v1/application_interview.py +105 -0
  1165. larkify/rest/hire/v1/attachment.py +181 -0
  1166. larkify/rest/hire/v1/background_check_order.py +252 -0
  1167. larkify/rest/hire/v1/diversity_inclusion.py +125 -0
  1168. larkify/rest/hire/v1/eco_account_custom_field.py +346 -0
  1169. larkify/rest/hire/v1/eco_background_check.py +376 -0
  1170. larkify/rest/hire/v1/eco_background_check_custom_field.py +356 -0
  1171. larkify/rest/hire/v1/eco_background_check_package.py +382 -0
  1172. larkify/rest/hire/v1/eco_exam.py +248 -0
  1173. larkify/rest/hire/v1/eco_exam_paper.py +318 -0
  1174. larkify/rest/hire/v1/ehr_import_task.py +128 -0
  1175. larkify/rest/hire/v1/employee.py +425 -0
  1176. larkify/rest/hire/v1/evaluation.py +107 -0
  1177. larkify/rest/hire/v1/evaluation_task.py +103 -0
  1178. larkify/rest/hire/v1/exam.py +155 -0
  1179. larkify/rest/hire/v1/exam_marking_task.py +103 -0
  1180. larkify/rest/hire/v1/external_application.py +392 -0
  1181. larkify/rest/hire/v1/external_background_check.py +437 -0
  1182. larkify/rest/hire/v1/external_interview.py +439 -0
  1183. larkify/rest/hire/v1/external_interview_assessment.py +282 -0
  1184. larkify/rest/hire/v1/external_offer.py +413 -0
  1185. larkify/rest/hire/v1/external_referral_reward.py +229 -0
  1186. larkify/rest/hire/v1/interview.py +190 -0
  1187. larkify/rest/hire/v1/interview_feedback_form.py +91 -0
  1188. larkify/rest/hire/v1/interview_record.py +156 -0
  1189. larkify/rest/hire/v1/interview_record_attachment.py +91 -0
  1190. larkify/rest/hire/v1/interview_registration_schema.py +87 -0
  1191. larkify/rest/hire/v1/interview_round_type.py +83 -0
  1192. larkify/rest/hire/v1/interview_task.py +103 -0
  1193. larkify/rest/hire/v1/interviewer.py +226 -0
  1194. larkify/rest/hire/v1/job.py +1236 -0
  1195. larkify/rest/hire/v1/job_function.py +87 -0
  1196. larkify/rest/hire/v1/job_manager.py +220 -0
  1197. larkify/rest/hire/v1/job_process.py +87 -0
  1198. larkify/rest/hire/v1/job_publish_record.py +215 -0
  1199. larkify/rest/hire/v1/job_requirement.py +899 -0
  1200. larkify/rest/hire/v1/job_requirement_schema.py +87 -0
  1201. larkify/rest/hire/v1/job_schema.py +91 -0
  1202. larkify/rest/hire/v1/job_type.py +87 -0
  1203. larkify/rest/hire/v1/location.py +212 -0
  1204. larkify/rest/hire/v1/minutes.py +91 -0
  1205. larkify/rest/hire/v1/note.py +490 -0
  1206. larkify/rest/hire/v1/offer.py +869 -0
  1207. larkify/rest/hire/v1/offer_application_form.py +136 -0
  1208. larkify/rest/hire/v1/offer_approval_template.py +95 -0
  1209. larkify/rest/hire/v1/offer_custom_field.py +140 -0
  1210. larkify/rest/hire/v1/offer_schema.py +72 -0
  1211. larkify/rest/hire/v1/portal_apply_schema.py +87 -0
  1212. larkify/rest/hire/v1/questionnaire.py +103 -0
  1213. larkify/rest/hire/v1/referral.py +206 -0
  1214. larkify/rest/hire/v1/referral_account.py +596 -0
  1215. larkify/rest/hire/v1/referral_website_job_post.py +188 -0
  1216. larkify/rest/hire/v1/registration_schema.py +91 -0
  1217. larkify/rest/hire/v1/resume_source.py +87 -0
  1218. larkify/rest/hire/v1/role.py +136 -0
  1219. larkify/rest/hire/v1/subject.py +95 -0
  1220. larkify/rest/hire/v1/talent.py +1121 -0
  1221. larkify/rest/hire/v1/talent_blocklist.py +134 -0
  1222. larkify/rest/hire/v1/talent_external_info.py +232 -0
  1223. larkify/rest/hire/v1/talent_folder.py +95 -0
  1224. larkify/rest/hire/v1/talent_object.py +69 -0
  1225. larkify/rest/hire/v1/talent_operation_log.py +159 -0
  1226. larkify/rest/hire/v1/talent_pool.py +306 -0
  1227. larkify/rest/hire/v1/talent_tag.py +103 -0
  1228. larkify/rest/hire/v1/termination_reason.py +87 -0
  1229. larkify/rest/hire/v1/test.py +155 -0
  1230. larkify/rest/hire/v1/todo.py +103 -0
  1231. larkify/rest/hire/v1/tripartite_agreement.py +354 -0
  1232. larkify/rest/hire/v1/user_role.py +107 -0
  1233. larkify/rest/hire/v1/website.py +87 -0
  1234. larkify/rest/hire/v1/website_channel.py +345 -0
  1235. larkify/rest/hire/v1/website_delivery.py +294 -0
  1236. larkify/rest/hire/v1/website_delivery_task.py +74 -0
  1237. larkify/rest/hire/v1/website_job_post.py +393 -0
  1238. larkify/rest/hire/v1/website_site_user.py +137 -0
  1239. larkify/rest/hire/v2/__init__.py +33 -0
  1240. larkify/rest/hire/v2/interview_record.py +156 -0
  1241. larkify/rest/hire/v2/talent.py +89 -0
  1242. larkify/rest/human_authentication/__init__.py +26 -0
  1243. larkify/rest/human_authentication/v1/__init__.py +26 -0
  1244. larkify/rest/human_authentication/v1/identity.py +147 -0
  1245. larkify/rest/im/__init__.py +33 -0
  1246. larkify/rest/im/v1/__init__.py +138 -0
  1247. larkify/rest/im/v1/batch_message.py +169 -0
  1248. larkify/rest/im/v1/chat.py +709 -0
  1249. larkify/rest/im/v1/chat_announcement.py +191 -0
  1250. larkify/rest/im/v1/chat_managers.py +288 -0
  1251. larkify/rest/im/v1/chat_members.py +454 -0
  1252. larkify/rest/im/v1/chat_menu_item.py +139 -0
  1253. larkify/rest/im/v1/chat_menu_tree.py +374 -0
  1254. larkify/rest/im/v1/chat_moderation.py +213 -0
  1255. larkify/rest/im/v1/chat_tab.py +489 -0
  1256. larkify/rest/im/v1/chat_top_notice.py +178 -0
  1257. larkify/rest/im/v1/file.py +177 -0
  1258. larkify/rest/im/v1/image.py +173 -0
  1259. larkify/rest/im/v1/message.py +1570 -0
  1260. larkify/rest/im/v1/message_reaction.py +374 -0
  1261. larkify/rest/im/v1/message_resource.py +83 -0
  1262. larkify/rest/im/v1/pin.py +242 -0
  1263. larkify/rest/im/v1/thread.py +161 -0
  1264. larkify/rest/im/v2/__init__.py +77 -0
  1265. larkify/rest/im/v2/app_feed_card.py +141 -0
  1266. larkify/rest/im/v2/app_feed_card_batch.py +272 -0
  1267. larkify/rest/im/v2/biz_entity_tag_relation.py +289 -0
  1268. larkify/rest/im/v2/chat.py +161 -0
  1269. larkify/rest/im/v2/chat_button.py +147 -0
  1270. larkify/rest/im/v2/feed_card.py +258 -0
  1271. larkify/rest/im/v2/tag.py +222 -0
  1272. larkify/rest/im/v2/url_preview.py +124 -0
  1273. larkify/rest/im_ephemeral/__init__.py +26 -0
  1274. larkify/rest/im_ephemeral/legacy.py +125 -0
  1275. larkify/rest/im_message/__init__.py +26 -0
  1276. larkify/rest/im_message/legacy.py +73 -0
  1277. larkify/rest/lingo/__init__.py +26 -0
  1278. larkify/rest/lingo/v1/__init__.py +54 -0
  1279. larkify/rest/lingo/v1/classification.py +91 -0
  1280. larkify/rest/lingo/v1/draft.py +302 -0
  1281. larkify/rest/lingo/v1/entity.py +855 -0
  1282. larkify/rest/lingo/v1/file.py +173 -0
  1283. larkify/rest/lingo/v1/repo.py +69 -0
  1284. larkify/rest/mail/__init__.py +26 -0
  1285. larkify/rest/mail/v1/__init__.py +214 -0
  1286. larkify/rest/mail/v1/mailgroup.py +527 -0
  1287. larkify/rest/mail/v1/mailgroup_alias.py +224 -0
  1288. larkify/rest/mail/v1/mailgroup_manager.py +341 -0
  1289. larkify/rest/mail/v1/mailgroup_member.py +636 -0
  1290. larkify/rest/mail/v1/mailgroup_permission_member.py +648 -0
  1291. larkify/rest/mail/v1/multi_entity.py +137 -0
  1292. larkify/rest/mail/v1/public_mailbox.py +595 -0
  1293. larkify/rest/mail/v1/public_mailbox_alias.py +228 -0
  1294. larkify/rest/mail/v1/public_mailbox_member.py +612 -0
  1295. larkify/rest/mail/v1/user.py +119 -0
  1296. larkify/rest/mail/v1/user_mailbox.py +311 -0
  1297. larkify/rest/mail/v1/user_mailbox_alias.py +244 -0
  1298. larkify/rest/mail/v1/user_mailbox_draft.py +571 -0
  1299. larkify/rest/mail/v1/user_mailbox_event.py +279 -0
  1300. larkify/rest/mail/v1/user_mailbox_folder.py +403 -0
  1301. larkify/rest/mail/v1/user_mailbox_label.py +396 -0
  1302. larkify/rest/mail/v1/user_mailbox_mail_contact.py +380 -0
  1303. larkify/rest/mail/v1/user_mailbox_message.py +1003 -0
  1304. larkify/rest/mail/v1/user_mailbox_message_attachment.py +86 -0
  1305. larkify/rest/mail/v1/user_mailbox_rule.py +458 -0
  1306. larkify/rest/mail/v1/user_mailbox_sent_message.py +125 -0
  1307. larkify/rest/mail/v1/user_mailbox_setting.py +121 -0
  1308. larkify/rest/mail/v1/user_mailbox_template.py +390 -0
  1309. larkify/rest/mail/v1/user_mailbox_template_attachment.py +86 -0
  1310. larkify/rest/mail/v1/user_mailbox_thread.py +546 -0
  1311. larkify/rest/mdm/__init__.py +33 -0
  1312. larkify/rest/mdm/v1/__init__.py +28 -0
  1313. larkify/rest/mdm/v1/user_auth_data_relation.py +262 -0
  1314. larkify/rest/mdm/v3/__init__.py +33 -0
  1315. larkify/rest/mdm/v3/batch_country_region.py +94 -0
  1316. larkify/rest/mdm/v3/country_region.py +177 -0
  1317. larkify/rest/minutes/__init__.py +26 -0
  1318. larkify/rest/minutes/v1/__init__.py +47 -0
  1319. larkify/rest/minutes/v1/minute.py +475 -0
  1320. larkify/rest/minutes/v1/minute_media.py +72 -0
  1321. larkify/rest/minutes/v1/minute_statistics.py +85 -0
  1322. larkify/rest/minutes/v1/minute_transcript.py +90 -0
  1323. larkify/rest/moments/__init__.py +26 -0
  1324. larkify/rest/moments/v1/__init__.py +26 -0
  1325. larkify/rest/moments/v1/post.py +85 -0
  1326. larkify/rest/oauth/__init__.py +26 -0
  1327. larkify/rest/oauth/legacy.py +73 -0
  1328. larkify/rest/okr/__init__.py +33 -0
  1329. larkify/rest/okr/v1/__init__.py +68 -0
  1330. larkify/rest/okr/v1/image.py +85 -0
  1331. larkify/rest/okr/v1/okr.py +95 -0
  1332. larkify/rest/okr/v1/period.py +283 -0
  1333. larkify/rest/okr/v1/period_rule.py +69 -0
  1334. larkify/rest/okr/v1/progress_record.py +379 -0
  1335. larkify/rest/okr/v1/review.py +95 -0
  1336. larkify/rest/okr/v1/user_okr.py +105 -0
  1337. larkify/rest/okr/v2/__init__.py +122 -0
  1338. larkify/rest/okr/v2/okr_alignment.py +142 -0
  1339. larkify/rest/okr/v2/okr_category.py +91 -0
  1340. larkify/rest/okr/v2/okr_cycle.py +377 -0
  1341. larkify/rest/okr/v2/okr_cycle_objective.py +256 -0
  1342. larkify/rest/okr/v2/okr_indicator.py +175 -0
  1343. larkify/rest/okr/v2/okr_key_result.py +287 -0
  1344. larkify/rest/okr/v2/okr_key_result_indicator.py +93 -0
  1345. larkify/rest/okr/v2/okr_key_result_progress.py +101 -0
  1346. larkify/rest/okr/v2/okr_objective.py +581 -0
  1347. larkify/rest/okr/v2/okr_objective_alignment.py +212 -0
  1348. larkify/rest/okr/v2/okr_objective_indicator.py +93 -0
  1349. larkify/rest/okr/v2/okr_objective_key_result.py +250 -0
  1350. larkify/rest/okr/v2/okr_objective_progress.py +101 -0
  1351. larkify/rest/optical_char_recognition/__init__.py +28 -0
  1352. larkify/rest/optical_char_recognition/v1/__init__.py +26 -0
  1353. larkify/rest/optical_char_recognition/v1/image.py +119 -0
  1354. larkify/rest/paginator.py +122 -0
  1355. larkify/rest/passport/__init__.py +26 -0
  1356. larkify/rest/passport/v1/__init__.py +33 -0
  1357. larkify/rest/passport/v1/password.py +138 -0
  1358. larkify/rest/passport/v1/session.py +253 -0
  1359. larkify/rest/payroll/__init__.py +26 -0
  1360. larkify/rest/payroll/v1/__init__.py +103 -0
  1361. larkify/rest/payroll/v1/acct_item.py +87 -0
  1362. larkify/rest/payroll/v1/cost_allocation_detail.py +99 -0
  1363. larkify/rest/payroll/v1/cost_allocation_plan.py +91 -0
  1364. larkify/rest/payroll/v1/cost_allocation_report.py +99 -0
  1365. larkify/rest/payroll/v1/datasource.py +87 -0
  1366. larkify/rest/payroll/v1/datasource_record.py +258 -0
  1367. larkify/rest/payroll/v1/paygroup.py +87 -0
  1368. larkify/rest/payroll/v1/payment_activity.py +197 -0
  1369. larkify/rest/payroll/v1/payment_activity_detail.py +99 -0
  1370. larkify/rest/payroll/v1/payment_detail.py +133 -0
  1371. larkify/rest/performance/__init__.py +33 -0
  1372. larkify/rest/performance/v1/__init__.py +40 -0
  1373. larkify/rest/performance/v1/review_data.py +163 -0
  1374. larkify/rest/performance/v1/semester.py +169 -0
  1375. larkify/rest/performance/v1/stage_task.py +290 -0
  1376. larkify/rest/performance/v2/__init__.py +134 -0
  1377. larkify/rest/performance/v2/activity.py +137 -0
  1378. larkify/rest/performance/v2/additional_information.py +316 -0
  1379. larkify/rest/performance/v2/additional_informations_batch.py +149 -0
  1380. larkify/rest/performance/v2/indicator.py +143 -0
  1381. larkify/rest/performance/v2/metric_detail.py +284 -0
  1382. larkify/rest/performance/v2/metric_field.py +119 -0
  1383. larkify/rest/performance/v2/metric_lib.py +179 -0
  1384. larkify/rest/performance/v2/metric_tag.py +91 -0
  1385. larkify/rest/performance/v2/metric_template.py +169 -0
  1386. larkify/rest/performance/v2/question.py +143 -0
  1387. larkify/rest/performance/v2/review_data.py +209 -0
  1388. larkify/rest/performance/v2/review_template.py +143 -0
  1389. larkify/rest/performance/v2/reviewee.py +167 -0
  1390. larkify/rest/performance/v2/user_group_user_rel.py +163 -0
  1391. larkify/rest/performance/v2/user_info.py +145 -0
  1392. larkify/rest/personal_settings/__init__.py +26 -0
  1393. larkify/rest/personal_settings/v1/__init__.py +26 -0
  1394. larkify/rest/personal_settings/v1/system_status.py +673 -0
  1395. larkify/rest/report/__init__.py +26 -0
  1396. larkify/rest/report/v1/__init__.py +40 -0
  1397. larkify/rest/report/v1/rule.py +91 -0
  1398. larkify/rest/report/v1/rule_view.py +140 -0
  1399. larkify/rest/report/v1/task.py +145 -0
  1400. larkify/rest/search/__init__.py +26 -0
  1401. larkify/rest/search/v2/__init__.py +61 -0
  1402. larkify/rest/search/v2/app.py +151 -0
  1403. larkify/rest/search/v2/data_source.py +426 -0
  1404. larkify/rest/search/v2/data_source_item.py +239 -0
  1405. larkify/rest/search/v2/doc_wiki.py +131 -0
  1406. larkify/rest/search/v2/message.py +167 -0
  1407. larkify/rest/search/v2/schema.py +347 -0
  1408. larkify/rest/security_and_compliance/__init__.py +37 -0
  1409. larkify/rest/security_and_compliance/v1/__init__.py +48 -0
  1410. larkify/rest/security_and_compliance/v1/multi_geo_entity_tenant.py +69 -0
  1411. larkify/rest/security_and_compliance/v1/openapi_log.py +129 -0
  1412. larkify/rest/security_and_compliance/v1/user_migration.py +415 -0
  1413. larkify/rest/security_and_compliance/v2/__init__.py +39 -0
  1414. larkify/rest/security_and_compliance/v2/device_apply_record.py +128 -0
  1415. larkify/rest/security_and_compliance/v2/device_record.py +580 -0
  1416. larkify/rest/sheets/__init__.py +26 -0
  1417. larkify/rest/sheets/v3/__init__.py +79 -0
  1418. larkify/rest/sheets/v3/spreadsheet.py +280 -0
  1419. larkify/rest/sheets/v3/spreadsheet_sheet.py +464 -0
  1420. larkify/rest/sheets/v3/spreadsheet_sheet_filter.py +359 -0
  1421. larkify/rest/sheets/v3/spreadsheet_sheet_filter_view.py +428 -0
  1422. larkify/rest/sheets/v3/spreadsheet_sheet_filter_view_condition.py +450 -0
  1423. larkify/rest/sheets/v3/spreadsheet_sheet_float_image.py +444 -0
  1424. larkify/rest/spark/__init__.py +26 -0
  1425. larkify/rest/spark/v1/__init__.py +75 -0
  1426. larkify/rest/spark/v1/app.py +1198 -0
  1427. larkify/rest/spark/v1/app_available_scope.py +181 -0
  1428. larkify/rest/spark/v1/app_enum.py +156 -0
  1429. larkify/rest/spark/v1/app_release.py +141 -0
  1430. larkify/rest/spark/v1/app_storage.py +523 -0
  1431. larkify/rest/spark/v1/app_table.py +746 -0
  1432. larkify/rest/spark/v1/app_view.py +111 -0
  1433. larkify/rest/spark/v1/directory_user.py +125 -0
  1434. larkify/rest/speech_to_text/__init__.py +26 -0
  1435. larkify/rest/speech_to_text/v1/__init__.py +26 -0
  1436. larkify/rest/speech_to_text/v1/speech.py +226 -0
  1437. larkify/rest/task/__init__.py +33 -0
  1438. larkify/rest/task/v1/__init__.py +54 -0
  1439. larkify/rest/task/v1/task.py +802 -0
  1440. larkify/rest/task/v1/task_collaborator.py +278 -0
  1441. larkify/rest/task/v1/task_comment.py +456 -0
  1442. larkify/rest/task/v1/task_follower.py +274 -0
  1443. larkify/rest/task/v1/task_reminder.py +240 -0
  1444. larkify/rest/task/v2/__init__.py +93 -0
  1445. larkify/rest/task/v2/attachment.py +337 -0
  1446. larkify/rest/task/v2/comment.py +450 -0
  1447. larkify/rest/task/v2/custom_field.py +644 -0
  1448. larkify/rest/task/v2/custom_field_option.py +250 -0
  1449. larkify/rest/task/v2/section.py +531 -0
  1450. larkify/rest/task/v2/task.py +1726 -0
  1451. larkify/rest/task/v2/task_subtask.py +286 -0
  1452. larkify/rest/task/v2/task_v2.py +154 -0
  1453. larkify/rest/task/v2/tasklist.py +910 -0
  1454. larkify/rest/task/v2/tasklist_activity_subscription.py +488 -0
  1455. larkify/rest/tenant/__init__.py +26 -0
  1456. larkify/rest/tenant/v2/__init__.py +37 -0
  1457. larkify/rest/tenant/v2/tenant.py +69 -0
  1458. larkify/rest/tenant/v2/tenant_product_assign_info.py +69 -0
  1459. larkify/rest/translation/__init__.py +26 -0
  1460. larkify/rest/translation/v1/__init__.py +26 -0
  1461. larkify/rest/translation/v1/text.py +220 -0
  1462. larkify/rest/trust_party/__init__.py +26 -0
  1463. larkify/rest/trust_party/v1/__init__.py +56 -0
  1464. larkify/rest/trust_party/v1/collaboration_tenant.py +221 -0
  1465. larkify/rest/trust_party/v1/collaboration_tenant_collaboration_department.py +91 -0
  1466. larkify/rest/trust_party/v1/collaboration_tenant_collaboration_user.py +87 -0
  1467. larkify/rest/vc/__init__.py +26 -0
  1468. larkify/rest/vc/v1/__init__.py +169 -0
  1469. larkify/rest/vc/v1/alert.py +103 -0
  1470. larkify/rest/vc/v1/bot.py +565 -0
  1471. larkify/rest/vc/v1/export.py +615 -0
  1472. larkify/rest/vc/v1/meeting.py +880 -0
  1473. larkify/rest/vc/v1/meeting_list.py +127 -0
  1474. larkify/rest/vc/v1/meeting_recording.py +355 -0
  1475. larkify/rest/vc/v1/note.py +85 -0
  1476. larkify/rest/vc/v1/participant_list.py +119 -0
  1477. larkify/rest/vc/v1/participant_quality_list.py +115 -0
  1478. larkify/rest/vc/v1/report.py +170 -0
  1479. larkify/rest/vc/v1/reserve.py +436 -0
  1480. larkify/rest/vc/v1/reserve_config.py +223 -0
  1481. larkify/rest/vc/v1/reserve_config_admin.py +213 -0
  1482. larkify/rest/vc/v1/reserve_config_disable_inform.py +221 -0
  1483. larkify/rest/vc/v1/reserve_config_form.py +213 -0
  1484. larkify/rest/vc/v1/resource_reservation_list.py +111 -0
  1485. larkify/rest/vc/v1/room.py +695 -0
  1486. larkify/rest/vc/v1/room_config.py +459 -0
  1487. larkify/rest/vc/v1/room_level.py +587 -0
  1488. larkify/rest/vc/v1/scope_config.py +213 -0
  1489. larkify/rest/vc_meeting/__init__.py +26 -0
  1490. larkify/rest/vc_meeting/legacy.py +905 -0
  1491. larkify/rest/verification/__init__.py +26 -0
  1492. larkify/rest/verification/v1/__init__.py +26 -0
  1493. larkify/rest/verification/v1/verification.py +69 -0
  1494. larkify/rest/wiki/__init__.py +33 -0
  1495. larkify/rest/wiki/v1/__init__.py +26 -0
  1496. larkify/rest/wiki/v1/node.py +147 -0
  1497. larkify/rest/wiki/v2/__init__.py +54 -0
  1498. larkify/rest/wiki/v2/space.py +360 -0
  1499. larkify/rest/wiki/v2/space_member.py +323 -0
  1500. larkify/rest/wiki/v2/space_node.py +639 -0
  1501. larkify/rest/wiki/v2/space_setting.py +129 -0
  1502. larkify/rest/wiki/v2/task.py +84 -0
  1503. larkify/rest/workplace/__init__.py +26 -0
  1504. larkify/rest/workplace/v1/__init__.py +52 -0
  1505. larkify/rest/workplace/v1/custom_workplace_access_data.py +99 -0
  1506. larkify/rest/workplace/v1/workplace_access_data.py +95 -0
  1507. larkify/rest/workplace/v1/workplace_block_access_data.py +99 -0
  1508. larkify/retry.py +106 -0
  1509. larkify/throttling.py +63 -0
  1510. larkify/typing.py +60 -0
  1511. larkify/utils.py +101 -0
  1512. larkify/webhooks/__init__.py +17 -0
  1513. larkify/webhooks/callbacks.py +158 -0
  1514. larkify/webhooks/crypto.py +74 -0
  1515. larkify/webhooks/dispatcher.py +234 -0
  1516. larkify/webhooks/events/__init__.py +596 -0
  1517. larkify/webhooks/events/acs.py +72 -0
  1518. larkify/webhooks/events/application.py +602 -0
  1519. larkify/webhooks/events/approval.py +263 -0
  1520. larkify/webhooks/events/auth.py +38 -0
  1521. larkify/webhooks/events/calendar.py +128 -0
  1522. larkify/webhooks/events/compensation.py +38 -0
  1523. larkify/webhooks/events/contact.py +817 -0
  1524. larkify/webhooks/events/corehr.py +1622 -0
  1525. larkify/webhooks/events/drive.py +490 -0
  1526. larkify/webhooks/events/elearning.py +128 -0
  1527. larkify/webhooks/events/helpdesk.py +305 -0
  1528. larkify/webhooks/events/hire.py +486 -0
  1529. larkify/webhooks/events/im.py +511 -0
  1530. larkify/webhooks/events/im_chat.py +45 -0
  1531. larkify/webhooks/events/mail.py +52 -0
  1532. larkify/webhooks/events/meeting_room.py +89 -0
  1533. larkify/webhooks/events/moments.py +200 -0
  1534. larkify/webhooks/events/payroll.py +49 -0
  1535. larkify/webhooks/events/performance.py +89 -0
  1536. larkify/webhooks/events/security_and_compliance.py +170 -0
  1537. larkify/webhooks/events/task.py +94 -0
  1538. larkify/webhooks/events/vc.py +674 -0
  1539. larkify/webhooks/events/vc_meeting.py +73 -0
  1540. larkify/webhooks/models.py +50 -0
  1541. larkify/webhooks/parse.py +63 -0
  1542. larkify/ws/__init__.py +2 -0
  1543. larkify/ws/client.py +336 -0
  1544. larkify/ws/frame.py +177 -0
  1545. larkify-0.1.0.dist-info/METADATA +507 -0
  1546. larkify-0.1.0.dist-info/RECORD +1549 -0
  1547. larkify-0.1.0.dist-info/WHEEL +4 -0
  1548. larkify-0.1.0.dist-info/licenses/LICENSE +21 -0
  1549. larkify-0.1.0.dist-info/licenses/NOTICE +58 -0
larkify/__init__.py ADDED
@@ -0,0 +1,16 @@
1
+ from .auth import AppAuthStrategy as AppAuthStrategy
2
+ from .auth import BaseAuthStrategy as BaseAuthStrategy
3
+ from .auth import IsvAppAuthStrategy as IsvAppAuthStrategy
4
+ from .auth import OAuthToken as OAuthToken
5
+ from .auth import OAuthTokenAuthStrategy as OAuthTokenAuthStrategy
6
+ from .auth import OAuthWebAuthStrategy as OAuthWebAuthStrategy
7
+ from .auth import TokenAuthStrategy as TokenAuthStrategy
8
+ from .auth import UnauthAuthStrategy as UnauthAuthStrategy
9
+ from .config import FEISHU_BASE_URL as FEISHU_BASE_URL
10
+ from .config import LARK_BASE_URL as LARK_BASE_URL
11
+ from .config import Config as Config
12
+ from .core import FeishuCore as FeishuCore
13
+ from .feishu import Feishu as Feishu
14
+ from .model import FeishuModel as FeishuModel
15
+ from .response import Response as Response
16
+ from .utils import UNSET as UNSET
@@ -0,0 +1,8 @@
1
+ from .app import AppAuthStrategy as AppAuthStrategy
2
+ from .app import IsvAppAuthStrategy as IsvAppAuthStrategy
3
+ from .base import BaseAuthStrategy as BaseAuthStrategy
4
+ from .oauth import OAuthToken as OAuthToken
5
+ from .oauth import OAuthTokenAuthStrategy as OAuthTokenAuthStrategy
6
+ from .oauth import OAuthWebAuthStrategy as OAuthWebAuthStrategy
7
+ from .token import TokenAuthStrategy as TokenAuthStrategy
8
+ from .unauth import UnauthAuthStrategy as UnauthAuthStrategy
larkify/auth/app.py ADDED
@@ -0,0 +1,334 @@
1
+ from dataclasses import dataclass, field
2
+ from datetime import datetime, timedelta
3
+ from typing import TYPE_CHECKING, ClassVar, Literal
4
+ from urllib.parse import urlencode
5
+
6
+ import httpx2
7
+
8
+ from larkify.exception import AuthCredentialError
9
+ from larkify.typing import TokenType
10
+
11
+ from .base import (
12
+ BaseAuthStrategy,
13
+ CacheDelete,
14
+ CacheGet,
15
+ CacheSet,
16
+ FeishuAuth,
17
+ TokenFlow,
18
+ build_token_request,
19
+ parse_token_response,
20
+ )
21
+ from .oauth import OAUTH_TOKEN_PATH, OAuthTokenAuthStrategy, OAuthWebAuthStrategy
22
+
23
+ if TYPE_CHECKING:
24
+ from larkify import FeishuCore
25
+
26
+ # A token is replaced before it runs out, so that a request is never sent with a
27
+ # token that expires in flight.
28
+ EXPIRY_MARGIN = timedelta(minutes=10)
29
+
30
+ # Tickets are pushed hourly. A stale one is rejected with a clear error, so it is
31
+ # kept long enough to survive a missed delivery.
32
+ APP_TICKET_TTL = timedelta(hours=2)
33
+
34
+ TENANT_TOKEN_INTERNAL_PATH = "open-apis/auth/v3/tenant_access_token/internal"
35
+ TENANT_TOKEN_STORE_PATH = "open-apis/auth/v3/tenant_access_token"
36
+ APP_TOKEN_INTERNAL_PATH = "open-apis/auth/v3/app_access_token/internal"
37
+ APP_TOKEN_STORE_PATH = "open-apis/auth/v3/app_access_token"
38
+ APP_TICKET_RESEND_PATH = "open-apis/auth/v3/app_ticket/resend"
39
+ AUTHORIZE_PATH = "open-apis/authen/v1/authorize"
40
+
41
+
42
+ def _cache_ttl(expires_in: int) -> timedelta:
43
+ return timedelta(seconds=expires_in) - EXPIRY_MARGIN
44
+
45
+
46
+ class _AppCredentialStrategy(BaseAuthStrategy):
47
+ """User identity entry points shared by both application kinds."""
48
+
49
+ app_id: str
50
+ app_secret: str
51
+
52
+ def as_oauth_token(
53
+ self,
54
+ token: str,
55
+ *,
56
+ expire_time: datetime | None = None,
57
+ refresh_token: str | None = None,
58
+ refresh_token_expire_time: datetime | None = None,
59
+ ) -> OAuthTokenAuthStrategy:
60
+ """Act as a user, from a stored `user_access_token`."""
61
+ return OAuthTokenAuthStrategy(
62
+ self.app_id,
63
+ self.app_secret,
64
+ token,
65
+ expire_time=expire_time,
66
+ refresh_token=refresh_token,
67
+ refresh_token_expire_time=refresh_token_expire_time,
68
+ )
69
+
70
+ def as_web_user(
71
+ self,
72
+ code: str,
73
+ redirect_uri: str | None = None,
74
+ *,
75
+ code_verifier: str | None = None,
76
+ ) -> OAuthWebAuthStrategy:
77
+ """Act as a user, from the code of the authorization redirect."""
78
+ return OAuthWebAuthStrategy(
79
+ self.app_id,
80
+ self.app_secret,
81
+ code,
82
+ redirect_uri=redirect_uri,
83
+ code_verifier=code_verifier,
84
+ )
85
+
86
+ def get_authorize_url(
87
+ self,
88
+ feishu: "FeishuCore",
89
+ redirect_uri: str,
90
+ *,
91
+ scope: str | None = None,
92
+ state: str | None = None,
93
+ code_challenge: str | None = None,
94
+ code_challenge_method: str | None = None,
95
+ ) -> str:
96
+ """Build the URL to send the user to, for the authorization code flow."""
97
+ base_url = feishu.config.oauth_base_url
98
+ if base_url is None:
99
+ raise AuthCredentialError("`oauth_base_url` is not configured")
100
+ params = {
101
+ "client_id": self.app_id,
102
+ "redirect_uri": redirect_uri,
103
+ "scope": scope,
104
+ "state": state,
105
+ "code_challenge": code_challenge,
106
+ "code_challenge_method": code_challenge_method,
107
+ }
108
+ query = urlencode({k: v for k, v in params.items() if v is not None})
109
+ return str(base_url.join(AUTHORIZE_PATH)) + "?" + query
110
+
111
+
112
+ @dataclass
113
+ class AppAuth(FeishuAuth):
114
+ """Self-built application auth hook"""
115
+
116
+ feishu: "FeishuCore" = field(repr=False)
117
+ app_id: str
118
+ app_secret: str = field(repr=False)
119
+ tenant_token_api: Literal["oauth", "legacy"]
120
+
121
+ token_types: ClassVar[tuple[TokenType, ...]] = ("tenant", "app")
122
+
123
+ CACHE_KEY: ClassVar[str] = "larkify:auth:app:{app_id}:{token_type}"
124
+
125
+ def _build_oauth_tenant_token_request(
126
+ self, request: httpx2.Request, base_url: httpx2.URL
127
+ ) -> httpx2.Request:
128
+ return build_token_request(
129
+ self.feishu,
130
+ base_url.join(OAUTH_TOKEN_PATH),
131
+ request=request,
132
+ data={
133
+ "grant_type": "client_credentials",
134
+ "client_id": self.app_id,
135
+ "client_secret": self.app_secret,
136
+ },
137
+ )
138
+
139
+ def _tenant_token_flow(self, request: httpx2.Request) -> TokenFlow:
140
+ base_url = self.feishu.config.oauth_base_url
141
+ # A private deployment without an accounts host has only the legacy API.
142
+ if self.tenant_token_api == "oauth" and base_url is not None:
143
+ response = yield self._build_oauth_tenant_token_request(request, base_url)
144
+ data = parse_token_response(self.feishu, response, "tenant_access_token")
145
+ yield from self._store("tenant", data["access_token"], data["expires_in"])
146
+ return data["access_token"]
147
+
148
+ response = yield build_token_request(
149
+ self.feishu,
150
+ self.feishu.config.base_url.join(TENANT_TOKEN_INTERNAL_PATH),
151
+ request=request,
152
+ json={"app_id": self.app_id, "app_secret": self.app_secret},
153
+ )
154
+ data = parse_token_response(self.feishu, response, "tenant_access_token")
155
+ yield from self._store("tenant", data["tenant_access_token"], data["expire"])
156
+ return data["tenant_access_token"]
157
+
158
+ def _app_token_flow(self, request: httpx2.Request) -> TokenFlow:
159
+ response = yield build_token_request(
160
+ self.feishu,
161
+ self.feishu.config.base_url.join(APP_TOKEN_INTERNAL_PATH),
162
+ request=request,
163
+ json={"app_id": self.app_id, "app_secret": self.app_secret},
164
+ )
165
+ data = parse_token_response(self.feishu, response, "app_access_token")
166
+ yield from self._store("app", data["app_access_token"], data["expire"])
167
+ return data["app_access_token"]
168
+
169
+ def _cache_key(self, token_type: TokenType) -> str:
170
+ return self.CACHE_KEY.format(app_id=self.app_id, token_type=token_type)
171
+
172
+ def _store(self, token_type: TokenType, token: str, expires_in: int):
173
+ if (ttl := _cache_ttl(expires_in)) > timedelta():
174
+ yield CacheSet(self._cache_key(token_type), token, ttl)
175
+
176
+ def token_flow(
177
+ self, request: httpx2.Request, token_type: TokenType, *, refresh: bool
178
+ ) -> TokenFlow:
179
+ key = self._cache_key(token_type)
180
+ if refresh:
181
+ yield CacheDelete(key)
182
+ elif token := (yield CacheGet(key)):
183
+ return token
184
+
185
+ if token_type == "tenant":
186
+ return (yield from self._tenant_token_flow(request))
187
+ return (yield from self._app_token_flow(request))
188
+
189
+
190
+ @dataclass
191
+ class AppAuthStrategy(_AppCredentialStrategy):
192
+ """Self-built application: tenant and app access tokens are automatic.
193
+
194
+ `tenant_token_api` selects how the tenant access token is obtained:
195
+ `"oauth"` is the current `POST /oauth/v3/token` client credentials grant,
196
+ which issues JWT tokens of up to about 4 KB. `"legacy"` is the older
197
+ `/open-apis/auth/v3/tenant_access_token/internal`.
198
+ """
199
+
200
+ app_id: str
201
+ app_secret: str = field(repr=False)
202
+ tenant_token_api: Literal["oauth", "legacy"] = "oauth"
203
+
204
+ def get_auth_flow(self, feishu: "FeishuCore") -> httpx2.Auth:
205
+ return AppAuth(feishu, self.app_id, self.app_secret, self.tenant_token_api)
206
+
207
+
208
+ @dataclass
209
+ class IsvAppAuth(FeishuAuth):
210
+ """Store application auth hook"""
211
+
212
+ feishu: "FeishuCore" = field(repr=False)
213
+ app_id: str
214
+ app_secret: str = field(repr=False)
215
+ app_ticket: str | None = field(repr=False)
216
+ tenant_key: str | None
217
+
218
+ token_types: ClassVar[tuple[TokenType, ...]] = ("tenant", "app")
219
+
220
+ APP_KEY: ClassVar[str] = "larkify:auth:isv:{app_id}:app"
221
+ TENANT_KEY: ClassVar[str] = "larkify:auth:isv:{app_id}:tenant:{tenant_key}"
222
+ TICKET_KEY: ClassVar[str] = "larkify:auth:isv:{app_id}:app_ticket"
223
+
224
+ def select_token_type(
225
+ self, allowed: tuple[TokenType, ...] | None
226
+ ) -> TokenType | None:
227
+ # Without a tenant, only the application itself can be authenticated.
228
+ if self.tenant_key is None and (allowed is None or "tenant" in allowed):
229
+ if allowed is None or "app" in allowed:
230
+ return "app"
231
+ raise AuthCredentialError(
232
+ "This API needs a tenant, use `auth.as_tenant(tenant_key)`"
233
+ )
234
+ return super().select_token_type(allowed)
235
+
236
+ def _app_token_flow(self, request: httpx2.Request, *, refresh: bool) -> TokenFlow:
237
+ key = self.APP_KEY.format(app_id=self.app_id)
238
+ if refresh:
239
+ yield CacheDelete(key)
240
+ elif token := (yield CacheGet(key)):
241
+ return token
242
+
243
+ ticket = self.app_ticket or (
244
+ yield CacheGet(self.TICKET_KEY.format(app_id=self.app_id))
245
+ )
246
+ if not ticket:
247
+ raise AuthCredentialError(
248
+ "No app_ticket available. Feishu pushes it hourly as the "
249
+ "`app_ticket` event, store it with `save_app_ticket`, or ask "
250
+ "for one with `feishu.rest.auth.v3.auth.app_ticket_resend`."
251
+ )
252
+
253
+ response = yield build_token_request(
254
+ self.feishu,
255
+ self.feishu.config.base_url.join(APP_TOKEN_STORE_PATH),
256
+ request=request,
257
+ json={
258
+ "app_id": self.app_id,
259
+ "app_secret": self.app_secret,
260
+ "app_ticket": ticket,
261
+ },
262
+ )
263
+ data = parse_token_response(self.feishu, response, "app_access_token")
264
+ token = data["app_access_token"]
265
+ if (ttl := _cache_ttl(data["expire"])) > timedelta():
266
+ yield CacheSet(key, token, ttl)
267
+ return token
268
+
269
+ def _tenant_token_flow(
270
+ self, request: httpx2.Request, *, refresh: bool
271
+ ) -> TokenFlow:
272
+ key = self.TENANT_KEY.format(app_id=self.app_id, tenant_key=self.tenant_key)
273
+ if refresh:
274
+ yield CacheDelete(key)
275
+ elif token := (yield CacheGet(key)):
276
+ return token
277
+
278
+ app_token = yield from self._app_token_flow(request, refresh=False)
279
+ response = yield build_token_request(
280
+ self.feishu,
281
+ self.feishu.config.base_url.join(TENANT_TOKEN_STORE_PATH),
282
+ request=request,
283
+ json={"app_access_token": app_token, "tenant_key": self.tenant_key},
284
+ )
285
+ data = parse_token_response(self.feishu, response, "tenant_access_token")
286
+ token = data["tenant_access_token"]
287
+ if (ttl := _cache_ttl(data["expire"])) > timedelta():
288
+ yield CacheSet(key, token, ttl)
289
+ return token
290
+
291
+ def token_flow(
292
+ self, request: httpx2.Request, token_type: TokenType, *, refresh: bool
293
+ ) -> TokenFlow:
294
+ if token_type == "tenant":
295
+ return (yield from self._tenant_token_flow(request, refresh=refresh))
296
+ return (yield from self._app_token_flow(request, refresh=refresh))
297
+
298
+
299
+ @dataclass
300
+ class IsvAppAuthStrategy(_AppCredentialStrategy):
301
+ """Store application: tokens are derived from the pushed `app_ticket`.
302
+
303
+ Pass `app_ticket` directly, or persist each ticket with `save_app_ticket`
304
+ from the `app_ticket` event handler. Bind a tenant with `as_tenant`.
305
+ """
306
+
307
+ app_id: str
308
+ app_secret: str = field(repr=False)
309
+ app_ticket: str | None = field(default=None, repr=False)
310
+ tenant_key: str | None = None
311
+
312
+ def as_tenant(self, tenant_key: str) -> "IsvAppAuthStrategy":
313
+ """Act on behalf of the tenant that installed the application."""
314
+ return IsvAppAuthStrategy(
315
+ self.app_id, self.app_secret, self.app_ticket, tenant_key
316
+ )
317
+
318
+ def _ticket_key(self) -> str:
319
+ return IsvAppAuth.TICKET_KEY.format(app_id=self.app_id)
320
+
321
+ def save_app_ticket(self, feishu: "FeishuCore", app_ticket: str) -> None:
322
+ cache = feishu.config.cache_strategy.get_cache_storage()
323
+ cache.set(self._ticket_key(), app_ticket, APP_TICKET_TTL)
324
+
325
+ async def async_save_app_ticket(
326
+ self, feishu: "FeishuCore", app_ticket: str
327
+ ) -> None:
328
+ cache = await feishu.config.cache_strategy.get_async_cache_storage()
329
+ await cache.aset(self._ticket_key(), app_ticket, APP_TICKET_TTL)
330
+
331
+ def get_auth_flow(self, feishu: "FeishuCore") -> httpx2.Auth:
332
+ return IsvAppAuth(
333
+ feishu, self.app_id, self.app_secret, self.app_ticket, self.tenant_key
334
+ )
larkify/auth/base.py ADDED
@@ -0,0 +1,303 @@
1
+ """Auth flows, written once and driven from both sync and async clients.
2
+
3
+ Fetching a token needs network and cache I/O. Those are expressed as steps
4
+ yielded by a plain generator (`FeishuAuth.flow`), and `sync_auth_flow` /
5
+ `async_auth_flow` perform the steps. Strategies therefore never have to
6
+ implement anything twice.
7
+ """
8
+
9
+ import abc
10
+ from collections.abc import AsyncGenerator, Callable, Generator
11
+ from datetime import timedelta
12
+ import inspect
13
+ import json
14
+ import threading
15
+ from typing import TYPE_CHECKING, Any, ClassVar, NamedTuple, TypeAlias
16
+
17
+ import anyio
18
+ import httpx2
19
+
20
+ from larkify.exception import (
21
+ AuthCredentialError,
22
+ RateLimitExceeded,
23
+ RequestFailed,
24
+ )
25
+ from larkify.log import logger
26
+ from larkify.typing import TokenType
27
+
28
+ if TYPE_CHECKING:
29
+ from larkify import FeishuCore
30
+
31
+ # Set on each request by the generated client: the token types the API accepts.
32
+ TOKEN_TYPES_EXTENSION = "larkify.token_types"
33
+
34
+ # Rejected token, from the generic error code document.
35
+ # https://open.feishu.cn/document/server-docs/api-call-guide/generic-error-code
36
+ TOKEN_REJECTED_CODES = frozenset(
37
+ {
38
+ 4001,
39
+ 20005,
40
+ 20006,
41
+ 20013,
42
+ 20014,
43
+ 99991661,
44
+ 99991663,
45
+ 99991664,
46
+ 99991665,
47
+ 99991668,
48
+ 99991671,
49
+ 99991677,
50
+ }
51
+ )
52
+
53
+
54
+ class CacheGet(NamedTuple):
55
+ key: str
56
+
57
+
58
+ class CacheSet(NamedTuple):
59
+ key: str
60
+ value: str
61
+ ex: timedelta
62
+
63
+
64
+ class CacheDelete(NamedTuple):
65
+ key: str
66
+
67
+
68
+ class LockAcquire(NamedTuple):
69
+ pass
70
+
71
+
72
+ class LockRelease(NamedTuple):
73
+ pass
74
+
75
+
76
+ class CallHook(NamedTuple):
77
+ func: Callable[..., Any]
78
+ arg: Any
79
+
80
+
81
+ CacheStep: TypeAlias = CacheGet | CacheSet | CacheDelete
82
+ FlowStep: TypeAlias = httpx2.Request | CacheStep | LockAcquire | LockRelease | CallHook
83
+ TokenFlow: TypeAlias = Generator[FlowStep, Any, str]
84
+ AuthFlow: TypeAlias = Generator[FlowStep, Any, None]
85
+
86
+
87
+ class Locks:
88
+ """Serialises token mutation across threads or tasks.
89
+
90
+ The two locks are independent: a client is either sync or async, and a
91
+ thread lock must not be held across an `await`.
92
+ """
93
+
94
+ __slots__ = ("asynchronous", "sync")
95
+
96
+ def __init__(self) -> None:
97
+ self.sync = threading.Lock()
98
+ self.asynchronous = anyio.Lock()
99
+
100
+
101
+ class BaseAuthStrategy(abc.ABC):
102
+ @abc.abstractmethod
103
+ def get_auth_flow(self, feishu: "FeishuCore") -> httpx2.Auth:
104
+ raise NotImplementedError
105
+
106
+
107
+ def build_token_request(
108
+ feishu: "FeishuCore",
109
+ url: httpx2.URL,
110
+ *,
111
+ request: httpx2.Request | None = None,
112
+ **kwargs: Any,
113
+ ) -> httpx2.Request:
114
+ """Build a request sent from inside an auth flow.
115
+
116
+ httpx2 only sets the timeout extension on the request passed to `send`, so it
117
+ is copied from the request being authenticated.
118
+ """
119
+ timeout = (
120
+ request.extensions.get("timeout") if request is not None else None
121
+ ) or feishu.config.timeout.as_dict()
122
+ return httpx2.Request(
123
+ "POST",
124
+ url,
125
+ extensions={"timeout": timeout},
126
+ headers={"User-Agent": feishu.config.user_agent},
127
+ **kwargs,
128
+ )
129
+
130
+
131
+ def parse_token_response(
132
+ feishu: "FeishuCore", response: httpx2.Response, description: str
133
+ ) -> dict[str, Any]:
134
+ """Validate a token endpoint response.
135
+
136
+ Rate limiting and server errors stay `RequestFailed` so that the configured
137
+ retry policy applies. Everything else means the credentials are not usable.
138
+ """
139
+ try:
140
+ return feishu._check(response, Any, data_key=None).json()
141
+ except RateLimitExceeded:
142
+ raise
143
+ except RequestFailed as e:
144
+ if e.response.status_code >= 500:
145
+ raise
146
+ raise AuthCredentialError(
147
+ f"Failed to obtain {description}: code={e.code}, msg={e.msg!r}, "
148
+ f"log_id={e.log_id}"
149
+ ) from e
150
+
151
+
152
+ def is_token_rejected(response: httpx2.Response) -> bool:
153
+ if not response.is_error:
154
+ return False
155
+ try:
156
+ body = json.loads(response.content)
157
+ except ValueError:
158
+ return False
159
+ return isinstance(body, dict) and body.get("code") in TOKEN_REJECTED_CODES
160
+
161
+
162
+ class FeishuAuth(httpx2.Auth, abc.ABC):
163
+ """Authenticate a request with the token type its API accepts."""
164
+
165
+ # Token types this auth can produce, preferred first.
166
+ token_types: ClassVar[tuple[TokenType, ...]]
167
+
168
+ feishu: "FeishuCore"
169
+
170
+ @property
171
+ def refreshable(self) -> bool:
172
+ """Whether a token rejected by the server can be replaced."""
173
+ return True
174
+
175
+ @property
176
+ def locks(self) -> Locks | None:
177
+ return None
178
+
179
+ @abc.abstractmethod
180
+ def token_flow(
181
+ self, request: httpx2.Request, token_type: TokenType, *, refresh: bool
182
+ ) -> TokenFlow:
183
+ """Produce a token, replacing the current one if `refresh` is set."""
184
+ raise NotImplementedError
185
+
186
+ def select_token_type(
187
+ self, allowed: tuple[TokenType, ...] | None
188
+ ) -> TokenType | None:
189
+ # None means the API metadata has no information, an empty tuple means
190
+ # the API takes no token at all (the token endpoints themselves).
191
+ if allowed is None:
192
+ return self.token_types[0]
193
+ if not allowed:
194
+ return None
195
+ for token_type in self.token_types:
196
+ if token_type in allowed:
197
+ return token_type
198
+ raise AuthCredentialError(
199
+ f"This API accepts {', '.join(allowed)} access tokens, which "
200
+ f"{self.__class__.__name__} cannot provide. "
201
+ "Use `feishu.with_auth(...)` to switch identity."
202
+ )
203
+
204
+ def flow(self, request: httpx2.Request) -> AuthFlow:
205
+ token_type = self.select_token_type(
206
+ request.extensions.get(TOKEN_TYPES_EXTENSION)
207
+ )
208
+ if token_type is None:
209
+ yield request
210
+ return
211
+
212
+ token = yield from self.token_flow(request, token_type, refresh=False)
213
+ request.headers["Authorization"] = f"Bearer {token}"
214
+ response = yield request
215
+
216
+ # 99991663 and 99991668 also mean "this API does not take that token
217
+ # type", so a second rejection has to be surfaced instead of looping.
218
+ if self.refreshable and is_token_rejected(response):
219
+ logger.debug("%s access token rejected, replacing it", token_type)
220
+ token = yield from self.token_flow(request, token_type, refresh=True)
221
+ request.headers["Authorization"] = f"Bearer {token}"
222
+ yield request
223
+
224
+ def sync_auth_flow(
225
+ self, request: httpx2.Request
226
+ ) -> Generator[httpx2.Request, httpx2.Response, None]:
227
+ cache = self.feishu.config.cache_strategy.get_cache_storage()
228
+ locks = self.locks
229
+ flow = self.flow(request)
230
+ held = False
231
+ try:
232
+ step = next(flow)
233
+ while True:
234
+ result: Any = None
235
+ if isinstance(step, httpx2.Request):
236
+ result = yield step
237
+ # Bodies of successful API calls stay unread: they may be
238
+ # large file downloads requested with `stream=True`.
239
+ if step is not request or result.is_error:
240
+ result.read()
241
+ elif isinstance(step, CacheGet):
242
+ result = cache.get(step.key)
243
+ elif isinstance(step, CacheSet):
244
+ cache.set(step.key, step.value, step.ex)
245
+ elif isinstance(step, CacheDelete):
246
+ cache.delete(step.key)
247
+ elif isinstance(step, LockAcquire):
248
+ assert locks is not None
249
+ locks.sync.acquire()
250
+ held = True
251
+ elif isinstance(step, LockRelease):
252
+ assert locks is not None
253
+ locks.sync.release()
254
+ held = False
255
+ else:
256
+ step.func(step.arg)
257
+ step = flow.send(result)
258
+ except StopIteration:
259
+ return
260
+ finally:
261
+ if held and locks is not None:
262
+ locks.sync.release()
263
+
264
+ async def async_auth_flow(
265
+ self, request: httpx2.Request
266
+ ) -> AsyncGenerator[httpx2.Request, httpx2.Response]:
267
+ strategy = self.feishu.config.cache_strategy
268
+ cache = await strategy.get_async_cache_storage()
269
+ locks = self.locks
270
+ flow = self.flow(request)
271
+ held = False
272
+ try:
273
+ step = next(flow)
274
+ while True:
275
+ result: Any = None
276
+ if isinstance(step, httpx2.Request):
277
+ result = yield step
278
+ if step is not request or result.is_error:
279
+ await result.aread()
280
+ elif isinstance(step, CacheGet):
281
+ result = await cache.aget(step.key)
282
+ elif isinstance(step, CacheSet):
283
+ await cache.aset(step.key, step.value, step.ex)
284
+ elif isinstance(step, CacheDelete):
285
+ await cache.adelete(step.key)
286
+ elif isinstance(step, LockAcquire):
287
+ assert locks is not None
288
+ await locks.asynchronous.acquire()
289
+ held = True
290
+ elif isinstance(step, LockRelease):
291
+ assert locks is not None
292
+ locks.asynchronous.release()
293
+ held = False
294
+ else:
295
+ outcome = step.func(step.arg)
296
+ if inspect.isawaitable(outcome):
297
+ await outcome
298
+ step = flow.send(result)
299
+ except StopIteration:
300
+ return
301
+ finally:
302
+ if held and locks is not None:
303
+ locks.asynchronous.release()