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.
- larkify/__init__.py +16 -0
- larkify/auth/__init__.py +8 -0
- larkify/auth/app.py +334 -0
- larkify/auth/base.py +303 -0
- larkify/auth/oauth.py +243 -0
- larkify/auth/token.py +46 -0
- larkify/auth/unauth.py +25 -0
- larkify/cache/__init__.py +11 -0
- larkify/cache/base.py +48 -0
- larkify/cache/mem_cache.py +72 -0
- larkify/cache/redis.py +95 -0
- larkify/config.py +153 -0
- larkify/core.py +646 -0
- larkify/exception.py +131 -0
- larkify/feishu.py +40 -0
- larkify/log.py +3 -0
- larkify/model.py +33 -0
- larkify/models/__init__.py +0 -0
- larkify/models/acs/__init__.py +0 -0
- larkify/models/acs/v1/__init__.py +0 -0
- larkify/models/acs/v1/_shared.py +41 -0
- larkify/models/acs/v1/access_record.py +47 -0
- larkify/models/acs/v1/device.py +49 -0
- larkify/models/acs/v1/rule_external.py +239 -0
- larkify/models/acs/v1/user.py +79 -0
- larkify/models/acs/v1/user_face.py +36 -0
- larkify/models/acs/v1/visitor.py +40 -0
- larkify/models/admin/__init__.py +0 -0
- larkify/models/admin/v1/__init__.py +0 -0
- larkify/models/admin/v1/_shared.py +24 -0
- larkify/models/admin/v1/admin_dept_stat.py +118 -0
- larkify/models/admin/v1/admin_user_stat.py +98 -0
- larkify/models/admin/v1/audit_info.py +358 -0
- larkify/models/admin/v1/badge.py +145 -0
- larkify/models/admin/v1/badge_grant.py +176 -0
- larkify/models/admin/v1/badge_image.py +39 -0
- larkify/models/admin/v1/password.py +45 -0
- larkify/models/aily/__init__.py +0 -0
- larkify/models/aily/v1/__init__.py +0 -0
- larkify/models/aily/v1/_shared.py +20 -0
- larkify/models/aily/v1/agent_agent_artifact.py +32 -0
- larkify/models/aily/v1/agent_agent_attachment.py +42 -0
- larkify/models/aily/v1/agent_agent_chat.py +97 -0
- larkify/models/aily/v1/agent_agent_chat_session.py +93 -0
- larkify/models/aily/v1/agent_agent_visibility.py +35 -0
- larkify/models/aily/v1/aily_session.py +80 -0
- larkify/models/aily/v1/aily_session_aily_message.py +179 -0
- larkify/models/aily/v1/aily_session_run.py +104 -0
- larkify/models/aily/v1/app_data_asset.py +296 -0
- larkify/models/aily/v1/app_data_asset_tag.py +30 -0
- larkify/models/aily/v1/app_knowledge.py +94 -0
- larkify/models/aily/v1/app_skill.py +108 -0
- larkify/models/aily/v1/tenant_app_stat.py +66 -0
- larkify/models/apaas/__init__.py +0 -0
- larkify/models/apaas/v1/__init__.py +0 -0
- larkify/models/apaas/v1/_shared.py +79 -0
- larkify/models/apaas/v1/app.py +94 -0
- larkify/models/apaas/v1/application_audit_log.py +240 -0
- larkify/models/apaas/v1/application_environment_variable.py +96 -0
- larkify/models/apaas/v1/application_flow.py +55 -0
- larkify/models/apaas/v1/application_function.py +33 -0
- larkify/models/apaas/v1/application_object.py +180 -0
- larkify/models/apaas/v1/application_object_record.py +213 -0
- larkify/models/apaas/v1/application_record_permission_member.py +42 -0
- larkify/models/apaas/v1/application_role_member.py +118 -0
- larkify/models/apaas/v1/approval_instance.py +32 -0
- larkify/models/apaas/v1/approval_task.py +86 -0
- larkify/models/apaas/v1/seat_activity.py +40 -0
- larkify/models/apaas/v1/seat_assignment.py +38 -0
- larkify/models/apaas/v1/tenant_app_metrics.py +46 -0
- larkify/models/apaas/v1/user_task.py +207 -0
- larkify/models/apaas/v1/workspace.py +35 -0
- larkify/models/apaas/v1/workspace_enum.py +68 -0
- larkify/models/apaas/v1/workspace_table.py +137 -0
- larkify/models/apaas/v1/workspace_view.py +24 -0
- larkify/models/application/__init__.py +0 -0
- larkify/models/application/v5/__init__.py +0 -0
- larkify/models/application/v5/application.py +72 -0
- larkify/models/application/v6/__init__.py +0 -0
- larkify/models/application/v6/_shared.py +64 -0
- larkify/models/application/v6/app_badge.py +57 -0
- larkify/models/application/v6/app_recommend_rule.py +96 -0
- larkify/models/application/v6/application.py +186 -0
- larkify/models/application/v6/application_app_usage.py +129 -0
- larkify/models/application/v6/application_app_version.py +358 -0
- larkify/models/application/v6/application_collaborators.py +60 -0
- larkify/models/application/v6/application_contacts_range.py +54 -0
- larkify/models/application/v6/application_feedback.py +64 -0
- larkify/models/application/v6/application_management.py +27 -0
- larkify/models/application/v6/application_owner.py +29 -0
- larkify/models/application/v6/application_visibility.py +119 -0
- larkify/models/application/v6/scope.py +30 -0
- larkify/models/application/v7/__init__.py +0 -0
- larkify/models/application/v7/app_avatar_upload.py +36 -0
- larkify/models/application/v7/application_ability.py +188 -0
- larkify/models/application/v7/application_base.py +74 -0
- larkify/models/application/v7/application_config.py +250 -0
- larkify/models/application/v7/application_publish.py +49 -0
- larkify/models/approval/__init__.py +0 -0
- larkify/models/approval/v4/__init__.py +0 -0
- larkify/models/approval/v4/_shared.py +164 -0
- larkify/models/approval/v4/approval.py +378 -0
- larkify/models/approval/v4/district.py +76 -0
- larkify/models/approval/v4/external_approval.py +185 -0
- larkify/models/approval/v4/external_instance.py +587 -0
- larkify/models/approval/v4/external_task.py +76 -0
- larkify/models/approval/v4/instance.py +805 -0
- larkify/models/approval/v4/instance_comment.py +139 -0
- larkify/models/approval/v4/task.py +490 -0
- larkify/models/attendance/__init__.py +0 -0
- larkify/models/attendance/v1/__init__.py +0 -0
- larkify/models/attendance/v1/_shared.py +60 -0
- larkify/models/attendance/v1/approval_info.py +53 -0
- larkify/models/attendance/v1/archive_rule.py +174 -0
- larkify/models/attendance/v1/file.py +42 -0
- larkify/models/attendance/v1/group.py +1074 -0
- larkify/models/attendance/v1/leave_accrual_record.py +108 -0
- larkify/models/attendance/v1/leave_employ_expire_record.py +81 -0
- larkify/models/attendance/v1/shift.py +497 -0
- larkify/models/attendance/v1/user_approval.py +525 -0
- larkify/models/attendance/v1/user_daily_shift.py +182 -0
- larkify/models/attendance/v1/user_flow.py +189 -0
- larkify/models/attendance/v1/user_setting.py +83 -0
- larkify/models/attendance/v1/user_stats_data.py +106 -0
- larkify/models/attendance/v1/user_stats_field.py +76 -0
- larkify/models/attendance/v1/user_stats_view.py +150 -0
- larkify/models/attendance/v1/user_task.py +96 -0
- larkify/models/attendance/v1/user_task_remedy.py +154 -0
- larkify/models/auth/__init__.py +0 -0
- larkify/models/auth/v3/__init__.py +0 -0
- larkify/models/auth/v3/auth.py +123 -0
- larkify/models/authen/__init__.py +0 -0
- larkify/models/authen/v1/__init__.py +0 -0
- larkify/models/authen/v1/access_token.py +74 -0
- larkify/models/authen/v1/oidc_access_token.py +48 -0
- larkify/models/authen/v1/oidc_refresh_access_token.py +48 -0
- larkify/models/authen/v1/refresh_access_token.py +74 -0
- larkify/models/authen/v1/user_info.py +44 -0
- larkify/models/baike/__init__.py +0 -0
- larkify/models/baike/v1/__init__.py +0 -0
- larkify/models/baike/v1/_shared.py +305 -0
- larkify/models/baike/v1/classification.py +28 -0
- larkify/models/baike/v1/draft.py +105 -0
- larkify/models/baike/v1/entity.py +245 -0
- larkify/models/baike/v1/file.py +39 -0
- larkify/models/base/__init__.py +0 -0
- larkify/models/base/v2/__init__.py +0 -0
- larkify/models/base/v2/app_role.py +322 -0
- larkify/models/bitable/__init__.py +0 -0
- larkify/models/bitable/v1/__init__.py +0 -0
- larkify/models/bitable/v1/_shared.py +325 -0
- larkify/models/bitable/v1/app.py +159 -0
- larkify/models/bitable/v1/app_block_workflow.py +30 -0
- larkify/models/bitable/v1/app_dashboard.py +60 -0
- larkify/models/bitable/v1/app_role.py +227 -0
- larkify/models/bitable/v1/app_role_member.py +110 -0
- larkify/models/bitable/v1/app_table.py +218 -0
- larkify/models/bitable/v1/app_table_field.py +438 -0
- larkify/models/bitable/v1/app_table_field_group.py +69 -0
- larkify/models/bitable/v1/app_table_form.py +99 -0
- larkify/models/bitable/v1/app_table_form_field.py +127 -0
- larkify/models/bitable/v1/app_table_record.py +348 -0
- larkify/models/bitable/v1/app_table_view.py +230 -0
- larkify/models/bitable/v1/app_workflow.py +45 -0
- larkify/models/board/__init__.py +0 -0
- larkify/models/board/v1/__init__.py +0 -0
- larkify/models/board/v1/whiteboard.py +39 -0
- larkify/models/board/v1/whiteboard_node.py +1645 -0
- larkify/models/bot/__init__.py +0 -0
- larkify/models/bot/v3/__init__.py +0 -0
- larkify/models/bot/v3/bot_menu.py +327 -0
- larkify/models/bot/v4/__init__.py +0 -0
- larkify/models/bot/v4/bot.py +88 -0
- larkify/models/calendar/__init__.py +0 -0
- larkify/models/calendar/v4/__init__.py +0 -0
- larkify/models/calendar/v4/_shared.py +80 -0
- larkify/models/calendar/v4/calendar.py +219 -0
- larkify/models/calendar/v4/calendar_acl.py +92 -0
- larkify/models/calendar/v4/calendar_event.py +916 -0
- larkify/models/calendar/v4/calendar_event_attendee.py +215 -0
- larkify/models/calendar/v4/calendar_event_attendee_chat_member.py +44 -0
- larkify/models/calendar/v4/calendar_event_meeting_chat.py +20 -0
- larkify/models/calendar/v4/calendar_event_meeting_minute.py +18 -0
- larkify/models/calendar/v4/exchange_binding.py +61 -0
- larkify/models/calendar/v4/freebusy.py +109 -0
- larkify/models/calendar/v4/setting.py +39 -0
- larkify/models/calendar/v4/timeoff_event.py +62 -0
- larkify/models/cardkit/__init__.py +0 -0
- larkify/models/cardkit/v1/__init__.py +0 -0
- larkify/models/cardkit/v1/card.py +122 -0
- larkify/models/cardkit/v1/card_element.py +106 -0
- larkify/models/compensation/__init__.py +0 -0
- larkify/models/compensation/v1/__init__.py +0 -0
- larkify/models/compensation/v1/_shared.py +104 -0
- larkify/models/compensation/v1/archive.py +174 -0
- larkify/models/compensation/v1/change_reason.py +48 -0
- larkify/models/compensation/v1/indicator.py +46 -0
- larkify/models/compensation/v1/item.py +58 -0
- larkify/models/compensation/v1/item_category.py +42 -0
- larkify/models/compensation/v1/lump_sum_payment.py +525 -0
- larkify/models/compensation/v1/plan.py +132 -0
- larkify/models/compensation/v1/recurring_payment.py +321 -0
- larkify/models/compensation/v1/social_archive.py +50 -0
- larkify/models/compensation/v1/social_archive_adjust_record.py +54 -0
- larkify/models/compensation/v1/social_insurance.py +40 -0
- larkify/models/compensation/v1/social_plan.py +119 -0
- larkify/models/contact/__init__.py +0 -0
- larkify/models/contact/v3/__init__.py +0 -0
- larkify/models/contact/v3/_shared.py +50 -0
- larkify/models/contact/v3/custom_attr.py +66 -0
- larkify/models/contact/v3/department.py +362 -0
- larkify/models/contact/v3/employee_type_enum.py +108 -0
- larkify/models/contact/v3/functional_role.py +46 -0
- larkify/models/contact/v3/functional_role_member.py +112 -0
- larkify/models/contact/v3/group.py +128 -0
- larkify/models/contact/v3/group_member.py +129 -0
- larkify/models/contact/v3/job_family.py +128 -0
- larkify/models/contact/v3/job_level.py +128 -0
- larkify/models/contact/v3/job_title.py +52 -0
- larkify/models/contact/v3/scope.py +26 -0
- larkify/models/contact/v3/unit.py +140 -0
- larkify/models/contact/v3/user.py +1130 -0
- larkify/models/contact/v3/work_city.py +52 -0
- larkify/models/corehr/__init__.py +0 -0
- larkify/models/corehr/v1/__init__.py +0 -0
- larkify/models/corehr/v1/_shared.py +302 -0
- larkify/models/corehr/v1/assigned_user.py +85 -0
- larkify/models/corehr/v1/authorization.py +233 -0
- larkify/models/corehr/v1/common_data_id.py +43 -0
- larkify/models/corehr/v1/common_data_meta_data.py +139 -0
- larkify/models/corehr/v1/company.py +593 -0
- larkify/models/corehr/v1/compensation_standard.py +104 -0
- larkify/models/corehr/v1/contract.py +177 -0
- larkify/models/corehr/v1/country_region.py +52 -0
- larkify/models/corehr/v1/currency.py +54 -0
- larkify/models/corehr/v1/custom_field.py +204 -0
- larkify/models/corehr/v1/department.py +239 -0
- larkify/models/corehr/v1/employee_type.py +123 -0
- larkify/models/corehr/v1/employment.py +312 -0
- larkify/models/corehr/v1/job.py +179 -0
- larkify/models/corehr/v1/job_change.py +445 -0
- larkify/models/corehr/v1/job_data.py +452 -0
- larkify/models/corehr/v1/job_family.py +157 -0
- larkify/models/corehr/v1/job_level.py +155 -0
- larkify/models/corehr/v1/leave.py +405 -0
- larkify/models/corehr/v1/leave_granting_record.py +99 -0
- larkify/models/corehr/v1/location.py +204 -0
- larkify/models/corehr/v1/national_id_type.py +150 -0
- larkify/models/corehr/v1/offboarding.py +318 -0
- larkify/models/corehr/v1/person.py +1396 -0
- larkify/models/corehr/v1/pre_hire.py +146 -0
- larkify/models/corehr/v1/process_form_variable_data.py +244 -0
- larkify/models/corehr/v1/security_group.py +91 -0
- larkify/models/corehr/v1/subdivision.py +53 -0
- larkify/models/corehr/v1/subregion.py +52 -0
- larkify/models/corehr/v1/transfer_reason.py +40 -0
- larkify/models/corehr/v1/transfer_type.py +42 -0
- larkify/models/corehr/v1/working_hours_type.py +131 -0
- larkify/models/corehr/v2/__init__.py +0 -0
- larkify/models/corehr/v2/_shared.py +1218 -0
- larkify/models/corehr/v2/approval_groups.py +542 -0
- larkify/models/corehr/v2/approver.py +38 -0
- larkify/models/corehr/v2/basic_info_bank.py +75 -0
- larkify/models/corehr/v2/basic_info_bank_branch.py +89 -0
- larkify/models/corehr/v2/basic_info_city.py +67 -0
- larkify/models/corehr/v2/basic_info_country_region.py +66 -0
- larkify/models/corehr/v2/basic_info_country_region_subdivision.py +68 -0
- larkify/models/corehr/v2/basic_info_currency.py +48 -0
- larkify/models/corehr/v2/basic_info_district.py +65 -0
- larkify/models/corehr/v2/basic_info_language.py +60 -0
- larkify/models/corehr/v2/basic_info_nationality.py +69 -0
- larkify/models/corehr/v2/basic_info_time_zone.py +62 -0
- larkify/models/corehr/v2/bp.py +65 -0
- larkify/models/corehr/v2/company.py +215 -0
- larkify/models/corehr/v2/contract.py +82 -0
- larkify/models/corehr/v2/cost_allocation.py +232 -0
- larkify/models/corehr/v2/cost_center.py +270 -0
- larkify/models/corehr/v2/cost_center_version.py +111 -0
- larkify/models/corehr/v2/custom_org.py +344 -0
- larkify/models/corehr/v2/default_cost_center.py +212 -0
- larkify/models/corehr/v2/department.py +495 -0
- larkify/models/corehr/v2/draft.py +32 -0
- larkify/models/corehr/v2/employee.py +1944 -0
- larkify/models/corehr/v2/employee_custom_org.py +170 -0
- larkify/models/corehr/v2/employees_additional_job.py +309 -0
- larkify/models/corehr/v2/employees_bp.py +50 -0
- larkify/models/corehr/v2/employees_international_assignment.py +340 -0
- larkify/models/corehr/v2/employees_job_data.py +272 -0
- larkify/models/corehr/v2/enum.py +61 -0
- larkify/models/corehr/v2/job.py +179 -0
- larkify/models/corehr/v2/job_change.py +723 -0
- larkify/models/corehr/v2/job_family.py +139 -0
- larkify/models/corehr/v2/job_grade.py +132 -0
- larkify/models/corehr/v2/job_level.py +77 -0
- larkify/models/corehr/v2/location.py +216 -0
- larkify/models/corehr/v2/location_address.py +201 -0
- larkify/models/corehr/v2/offboarding.py +131 -0
- larkify/models/corehr/v2/pathway.py +123 -0
- larkify/models/corehr/v2/person.py +1396 -0
- larkify/models/corehr/v2/position.py +283 -0
- larkify/models/corehr/v2/pre_hire.py +2203 -0
- larkify/models/corehr/v2/probation.py +346 -0
- larkify/models/corehr/v2/probation_assessment.py +100 -0
- larkify/models/corehr/v2/process.py +244 -0
- larkify/models/corehr/v2/process_approver.py +54 -0
- larkify/models/corehr/v2/process_extra.py +50 -0
- larkify/models/corehr/v2/process_form_variable_data.py +24 -0
- larkify/models/corehr/v2/process_query_flow_data_template.py +108 -0
- larkify/models/corehr/v2/process_revoke.py +33 -0
- larkify/models/corehr/v2/process_start.py +49 -0
- larkify/models/corehr/v2/process_transfer.py +41 -0
- larkify/models/corehr/v2/process_withdraw.py +33 -0
- larkify/models/corehr/v2/report_detail_row.py +57 -0
- larkify/models/corehr/v2/signature_file.py +138 -0
- larkify/models/corehr/v2/signature_node.py +52 -0
- larkify/models/corehr/v2/signature_template.py +225 -0
- larkify/models/corehr/v2/signature_template_info_with_thumbnail.py +70 -0
- larkify/models/corehr/v2/workforce_plan.py +50 -0
- larkify/models/corehr/v2/workforce_plan_detail.py +225 -0
- larkify/models/corehr/v2/workforce_plan_detail_row.py +51 -0
- larkify/models/directory/__init__.py +0 -0
- larkify/models/directory/v1/__init__.py +0 -0
- larkify/models/directory/v1/_shared.py +335 -0
- larkify/models/directory/v1/collaboration_rule.py +113 -0
- larkify/models/directory/v1/collaboration_tenant.py +49 -0
- larkify/models/directory/v1/collboration_share_entity.py +65 -0
- larkify/models/directory/v1/department.py +212 -0
- larkify/models/directory/v1/employee.py +740 -0
- larkify/models/docs/__init__.py +0 -0
- larkify/models/docs/v1/__init__.py +0 -0
- larkify/models/docs/v1/content.py +18 -0
- larkify/models/document_ai/__init__.py +0 -0
- larkify/models/document_ai/v1/__init__.py +0 -0
- larkify/models/document_ai/v1/bank_card.py +52 -0
- larkify/models/document_ai/v1/business_card.py +50 -0
- larkify/models/document_ai/v1/business_license.py +52 -0
- larkify/models/document_ai/v1/chinese_passport.py +52 -0
- larkify/models/document_ai/v1/contract.py +185 -0
- larkify/models/document_ai/v1/driving_license.py +52 -0
- larkify/models/document_ai/v1/food_manage_license.py +52 -0
- larkify/models/document_ai/v1/food_produce_license.py +52 -0
- larkify/models/document_ai/v1/health_certificate.py +52 -0
- larkify/models/document_ai/v1/hkm_mainland_travel_permit.py +52 -0
- larkify/models/document_ai/v1/id_card.py +58 -0
- larkify/models/document_ai/v1/resume.py +184 -0
- larkify/models/document_ai/v1/taxi_invoice.py +50 -0
- larkify/models/document_ai/v1/train_invoice.py +50 -0
- larkify/models/document_ai/v1/tw_mainland_travel_permit.py +50 -0
- larkify/models/document_ai/v1/vat_invoice.py +60 -0
- larkify/models/document_ai/v1/vehicle_invoice.py +52 -0
- larkify/models/document_ai/v1/vehicle_license.py +52 -0
- larkify/models/docx/__init__.py +0 -0
- larkify/models/docx/v1/__init__.py +0 -0
- larkify/models/docx/v1/_shared.py +2538 -0
- larkify/models/docx/v1/chat_announcement.py +36 -0
- larkify/models/docx/v1/chat_announcement_block.py +179 -0
- larkify/models/docx/v1/chat_announcement_block_children.py +85 -0
- larkify/models/docx/v1/document.py +134 -0
- larkify/models/docx/v1/document_block.py +305 -0
- larkify/models/docx/v1/document_block_children.py +85 -0
- larkify/models/docx/v1/document_block_descendant.py +312 -0
- larkify/models/drive/__init__.py +0 -0
- larkify/models/drive/v1/__init__.py +0 -0
- larkify/models/drive/v1/_shared.py +170 -0
- larkify/models/drive/v1/export_task.py +75 -0
- larkify/models/drive/v1/file.py +327 -0
- larkify/models/drive/v1/file_comment.py +224 -0
- larkify/models/drive/v1/file_comment_reply.py +94 -0
- larkify/models/drive/v1/file_statistics.py +44 -0
- larkify/models/drive/v1/file_subscription.py +99 -0
- larkify/models/drive/v1/file_version.py +140 -0
- larkify/models/drive/v1/file_view_record.py +40 -0
- larkify/models/drive/v1/import_task.py +92 -0
- larkify/models/drive/v1/media.py +172 -0
- larkify/models/drive/v1/meta.py +109 -0
- larkify/models/drive/v1/permission_member.py +263 -0
- larkify/models/drive/v1/permission_public.py +80 -0
- larkify/models/drive/v1/permission_public_password.py +26 -0
- larkify/models/drive/v1/user.py +35 -0
- larkify/models/drive/v2/__init__.py +0 -0
- larkify/models/drive/v2/comment_reaction.py +38 -0
- larkify/models/drive/v2/file_like.py +44 -0
- larkify/models/drive/v2/permission_public.py +120 -0
- larkify/models/ehr/__init__.py +0 -0
- larkify/models/ehr/v1/__init__.py +0 -0
- larkify/models/ehr/v1/employee.py +300 -0
- larkify/models/event/__init__.py +0 -0
- larkify/models/event/v1/__init__.py +0 -0
- larkify/models/event/v1/connection.py +18 -0
- larkify/models/event/v1/outbound_ip.py +26 -0
- larkify/models/helpdesk/__init__.py +0 -0
- larkify/models/helpdesk/v1/__init__.py +0 -0
- larkify/models/helpdesk/v1/_shared.py +155 -0
- larkify/models/helpdesk/v1/agent.py +33 -0
- larkify/models/helpdesk/v1/agent_schedule.py +58 -0
- larkify/models/helpdesk/v1/agent_schedules.py +55 -0
- larkify/models/helpdesk/v1/agent_skill.py +184 -0
- larkify/models/helpdesk/v1/agent_skill_rule.py +36 -0
- larkify/models/helpdesk/v1/bot_message.py +44 -0
- larkify/models/helpdesk/v1/category.py +79 -0
- larkify/models/helpdesk/v1/event.py +54 -0
- larkify/models/helpdesk/v1/faq.py +210 -0
- larkify/models/helpdesk/v1/notification.py +330 -0
- larkify/models/helpdesk/v1/ticket.py +293 -0
- larkify/models/helpdesk/v1/ticket_customized_field.py +143 -0
- larkify/models/helpdesk/v1/ticket_message.py +66 -0
- larkify/models/hire/__init__.py +0 -0
- larkify/models/hire/v1/__init__.py +0 -0
- larkify/models/hire/v1/_shared.py +873 -0
- larkify/models/hire/v1/advertisement.py +27 -0
- larkify/models/hire/v1/agency.py +344 -0
- larkify/models/hire/v1/application.py +992 -0
- larkify/models/hire/v1/application_interview.py +48 -0
- larkify/models/hire/v1/attachment.py +48 -0
- larkify/models/hire/v1/background_check_order.py +249 -0
- larkify/models/hire/v1/diversity_inclusion.py +84 -0
- larkify/models/hire/v1/eco_account_custom_field.py +85 -0
- larkify/models/hire/v1/eco_background_check.py +107 -0
- larkify/models/hire/v1/eco_background_check_custom_field.py +114 -0
- larkify/models/hire/v1/eco_background_check_package.py +107 -0
- larkify/models/hire/v1/eco_exam.py +111 -0
- larkify/models/hire/v1/eco_exam_paper.py +86 -0
- larkify/models/hire/v1/ehr_import_task.py +35 -0
- larkify/models/hire/v1/employee.py +86 -0
- larkify/models/hire/v1/evaluation.py +30 -0
- larkify/models/hire/v1/evaluation_task.py +42 -0
- larkify/models/hire/v1/exam.py +59 -0
- larkify/models/hire/v1/exam_marking_task.py +42 -0
- larkify/models/hire/v1/external_application.py +155 -0
- larkify/models/hire/v1/external_background_check.py +130 -0
- larkify/models/hire/v1/external_interview.py +164 -0
- larkify/models/hire/v1/external_interview_assessment.py +108 -0
- larkify/models/hire/v1/external_offer.py +130 -0
- larkify/models/hire/v1/external_referral_reward.py +110 -0
- larkify/models/hire/v1/interview.py +142 -0
- larkify/models/hire/v1/interview_feedback_form.py +162 -0
- larkify/models/hire/v1/interview_record.py +38 -0
- larkify/models/hire/v1/interview_record_attachment.py +36 -0
- larkify/models/hire/v1/interview_registration_schema.py +44 -0
- larkify/models/hire/v1/interview_round_type.py +56 -0
- larkify/models/hire/v1/interview_task.py +42 -0
- larkify/models/hire/v1/interviewer.py +70 -0
- larkify/models/hire/v1/job.py +1205 -0
- larkify/models/hire/v1/job_function.py +44 -0
- larkify/models/hire/v1/job_manager.py +57 -0
- larkify/models/hire/v1/job_process.py +54 -0
- larkify/models/hire/v1/job_publish_record.py +111 -0
- larkify/models/hire/v1/job_requirement.py +469 -0
- larkify/models/hire/v1/job_requirement_schema.py +43 -0
- larkify/models/hire/v1/job_schema.py +45 -0
- larkify/models/hire/v1/job_type.py +30 -0
- larkify/models/hire/v1/location.py +159 -0
- larkify/models/hire/v1/minutes.py +48 -0
- larkify/models/hire/v1/note.py +135 -0
- larkify/models/hire/v1/offer.py +575 -0
- larkify/models/hire/v1/offer_application_form.py +178 -0
- larkify/models/hire/v1/offer_approval_template.py +58 -0
- larkify/models/hire/v1/offer_custom_field.py +61 -0
- larkify/models/hire/v1/offer_schema.py +60 -0
- larkify/models/hire/v1/portal_apply_schema.py +30 -0
- larkify/models/hire/v1/questionnaire.py +102 -0
- larkify/models/hire/v1/referral.py +79 -0
- larkify/models/hire/v1/referral_account.py +250 -0
- larkify/models/hire/v1/referral_website_job_post.py +160 -0
- larkify/models/hire/v1/registration_schema.py +30 -0
- larkify/models/hire/v1/resume_source.py +42 -0
- larkify/models/hire/v1/role.py +125 -0
- larkify/models/hire/v1/subject.py +49 -0
- larkify/models/hire/v1/talent.py +1287 -0
- larkify/models/hire/v1/talent_blocklist.py +35 -0
- larkify/models/hire/v1/talent_external_info.py +62 -0
- larkify/models/hire/v1/talent_folder.py +38 -0
- larkify/models/hire/v1/talent_object.py +22 -0
- larkify/models/hire/v1/talent_operation_log.py +69 -0
- larkify/models/hire/v1/talent_pool.py +90 -0
- larkify/models/hire/v1/talent_tag.py +48 -0
- larkify/models/hire/v1/termination_reason.py +48 -0
- larkify/models/hire/v1/test.py +113 -0
- larkify/models/hire/v1/todo.py +54 -0
- larkify/models/hire/v1/tripartite_agreement.py +89 -0
- larkify/models/hire/v1/user_role.py +58 -0
- larkify/models/hire/v1/website.py +44 -0
- larkify/models/hire/v1/website_channel.py +90 -0
- larkify/models/hire/v1/website_delivery.py +507 -0
- larkify/models/hire/v1/website_delivery_task.py +28 -0
- larkify/models/hire/v1/website_job_post.py +213 -0
- larkify/models/hire/v1/website_site_user.py +65 -0
- larkify/models/hire/v2/__init__.py +0 -0
- larkify/models/hire/v2/_shared.py +22 -0
- larkify/models/hire/v2/interview_record.py +192 -0
- larkify/models/hire/v2/talent.py +436 -0
- larkify/models/human_authentication/__init__.py +0 -0
- larkify/models/human_authentication/v1/__init__.py +0 -0
- larkify/models/human_authentication/v1/identity.py +41 -0
- larkify/models/im/__init__.py +0 -0
- larkify/models/im/v1/__init__.py +0 -0
- larkify/models/im/v1/_shared.py +183 -0
- larkify/models/im/v1/batch_message.py +60 -0
- larkify/models/im/v1/chat.py +377 -0
- larkify/models/im/v1/chat_announcement.py +52 -0
- larkify/models/im/v1/chat_managers.py +54 -0
- larkify/models/im/v1/chat_members.py +90 -0
- larkify/models/im/v1/chat_menu_item.py +44 -0
- larkify/models/im/v1/chat_menu_tree.py +174 -0
- larkify/models/im/v1/chat_moderation.py +59 -0
- larkify/models/im/v1/chat_tab.py +239 -0
- larkify/models/im/v1/chat_top_notice.py +43 -0
- larkify/models/im/v1/file.py +45 -0
- larkify/models/im/v1/image.py +39 -0
- larkify/models/im/v1/message.py +610 -0
- larkify/models/im/v1/message_reaction.py +199 -0
- larkify/models/im/v1/pin.py +65 -0
- larkify/models/im/v1/thread.py +78 -0
- larkify/models/im/v2/__init__.py +0 -0
- larkify/models/im/v2/_shared.py +204 -0
- larkify/models/im/v2/app_feed_card.py +44 -0
- larkify/models/im/v2/app_feed_card_batch.py +91 -0
- larkify/models/im/v2/biz_entity_tag_relation.py +88 -0
- larkify/models/im/v2/chat.py +120 -0
- larkify/models/im/v2/chat_button.py +47 -0
- larkify/models/im/v2/feed_card.py +62 -0
- larkify/models/im/v2/tag.py +150 -0
- larkify/models/im/v2/url_preview.py +32 -0
- larkify/models/lingo/__init__.py +0 -0
- larkify/models/lingo/v1/__init__.py +0 -0
- larkify/models/lingo/v1/_shared.py +336 -0
- larkify/models/lingo/v1/classification.py +48 -0
- larkify/models/lingo/v1/draft.py +113 -0
- larkify/models/lingo/v1/entity.py +232 -0
- larkify/models/lingo/v1/file.py +39 -0
- larkify/models/lingo/v1/repo.py +28 -0
- larkify/models/mail/__init__.py +0 -0
- larkify/models/mail/v1/__init__.py +0 -0
- larkify/models/mail/v1/_shared.py +222 -0
- larkify/models/mail/v1/mailgroup.py +196 -0
- larkify/models/mail/v1/mailgroup_alias.py +43 -0
- larkify/models/mail/v1/mailgroup_manager.py +69 -0
- larkify/models/mail/v1/mailgroup_member.py +159 -0
- larkify/models/mail/v1/mailgroup_permission_member.py +145 -0
- larkify/models/mail/v1/multi_entity.py +64 -0
- larkify/models/mail/v1/public_mailbox.py +142 -0
- larkify/models/mail/v1/public_mailbox_alias.py +43 -0
- larkify/models/mail/v1/public_mailbox_member.py +121 -0
- larkify/models/mail/v1/user.py +45 -0
- larkify/models/mail/v1/user_mailbox.py +172 -0
- larkify/models/mail/v1/user_mailbox_alias.py +43 -0
- larkify/models/mail/v1/user_mailbox_draft.py +140 -0
- larkify/models/mail/v1/user_mailbox_event.py +46 -0
- larkify/models/mail/v1/user_mailbox_folder.py +82 -0
- larkify/models/mail/v1/user_mailbox_label.py +110 -0
- larkify/models/mail/v1/user_mailbox_mail_contact.py +122 -0
- larkify/models/mail/v1/user_mailbox_message.py +273 -0
- larkify/models/mail/v1/user_mailbox_message_attachment.py +27 -0
- larkify/models/mail/v1/user_mailbox_rule.py +201 -0
- larkify/models/mail/v1/user_mailbox_sent_message.py +58 -0
- larkify/models/mail/v1/user_mailbox_setting.py +90 -0
- larkify/models/mail/v1/user_mailbox_template.py +177 -0
- larkify/models/mail/v1/user_mailbox_template_attachment.py +25 -0
- larkify/models/mail/v1/user_mailbox_thread.py +108 -0
- larkify/models/mdm/__init__.py +0 -0
- larkify/models/mdm/v1/__init__.py +0 -0
- larkify/models/mdm/v1/user_auth_data_relation.py +58 -0
- larkify/models/mdm/v3/__init__.py +0 -0
- larkify/models/mdm/v3/_shared.py +60 -0
- larkify/models/mdm/v3/batch_country_region.py +22 -0
- larkify/models/mdm/v3/country_region.py +105 -0
- larkify/models/minutes/__init__.py +0 -0
- larkify/models/minutes/v1/__init__.py +0 -0
- larkify/models/minutes/v1/minute.py +255 -0
- larkify/models/minutes/v1/minute_media.py +18 -0
- larkify/models/minutes/v1/minute_statistics.py +40 -0
- larkify/models/moments/__init__.py +0 -0
- larkify/models/moments/v1/__init__.py +0 -0
- larkify/models/moments/v1/post.py +70 -0
- larkify/models/okr/__init__.py +0 -0
- larkify/models/okr/v1/__init__.py +0 -0
- larkify/models/okr/v1/_shared.py +136 -0
- larkify/models/okr/v1/image.py +44 -0
- larkify/models/okr/v1/okr.py +22 -0
- larkify/models/okr/v1/period.py +91 -0
- larkify/models/okr/v1/period_rule.py +32 -0
- larkify/models/okr/v1/progress_record.py +509 -0
- larkify/models/okr/v1/review.py +50 -0
- larkify/models/okr/v1/user_okr.py +24 -0
- larkify/models/okr/v2/__init__.py +0 -0
- larkify/models/okr/v2/_shared.py +560 -0
- larkify/models/okr/v2/okr_alignment.py +30 -0
- larkify/models/okr/v2/okr_category.py +58 -0
- larkify/models/okr/v2/okr_cycle.py +109 -0
- larkify/models/okr/v2/okr_cycle_objective.py +68 -0
- larkify/models/okr/v2/okr_indicator.py +73 -0
- larkify/models/okr/v2/okr_key_result.py +57 -0
- larkify/models/okr/v2/okr_key_result_indicator.py +22 -0
- larkify/models/okr/v2/okr_key_result_progress.py +30 -0
- larkify/models/okr/v2/okr_objective.py +116 -0
- larkify/models/okr/v2/okr_objective_alignment.py +56 -0
- larkify/models/okr/v2/okr_objective_indicator.py +22 -0
- larkify/models/okr/v2/okr_objective_key_result.py +59 -0
- larkify/models/okr/v2/okr_objective_progress.py +30 -0
- larkify/models/optical_char_recognition/__init__.py +0 -0
- larkify/models/optical_char_recognition/v1/__init__.py +0 -0
- larkify/models/optical_char_recognition/v1/image.py +33 -0
- larkify/models/passport/__init__.py +0 -0
- larkify/models/passport/v1/__init__.py +0 -0
- larkify/models/passport/v1/password.py +35 -0
- larkify/models/passport/v1/session.py +73 -0
- larkify/models/payroll/__init__.py +0 -0
- larkify/models/payroll/v1/__init__.py +0 -0
- larkify/models/payroll/v1/_shared.py +116 -0
- larkify/models/payroll/v1/acct_item.py +48 -0
- larkify/models/payroll/v1/cost_allocation_detail.py +54 -0
- larkify/models/payroll/v1/cost_allocation_plan.py +67 -0
- larkify/models/payroll/v1/cost_allocation_report.py +59 -0
- larkify/models/payroll/v1/datasource.py +64 -0
- larkify/models/payroll/v1/datasource_record.py +135 -0
- larkify/models/payroll/v1/paygroup.py +64 -0
- larkify/models/payroll/v1/payment_activity.py +73 -0
- larkify/models/payroll/v1/payment_activity_detail.py +34 -0
- larkify/models/payroll/v1/payment_detail.py +72 -0
- larkify/models/performance/__init__.py +0 -0
- larkify/models/performance/v1/__init__.py +0 -0
- larkify/models/performance/v1/_shared.py +54 -0
- larkify/models/performance/v1/review_data.py +190 -0
- larkify/models/performance/v1/semester.py +22 -0
- larkify/models/performance/v1/stage_task.py +147 -0
- larkify/models/performance/v2/__init__.py +0 -0
- larkify/models/performance/v2/_shared.py +34 -0
- larkify/models/performance/v2/activity.py +64 -0
- larkify/models/performance/v2/additional_information.py +119 -0
- larkify/models/performance/v2/additional_informations_batch.py +38 -0
- larkify/models/performance/v2/indicator.py +67 -0
- larkify/models/performance/v2/metric_detail.py +156 -0
- larkify/models/performance/v2/metric_field.py +47 -0
- larkify/models/performance/v2/metric_lib.py +114 -0
- larkify/models/performance/v2/metric_tag.py +46 -0
- larkify/models/performance/v2/metric_template.py +159 -0
- larkify/models/performance/v2/question.py +63 -0
- larkify/models/performance/v2/review_data.py +299 -0
- larkify/models/performance/v2/review_template.py +105 -0
- larkify/models/performance/v2/reviewee.py +65 -0
- larkify/models/performance/v2/user_group_user_rel.py +59 -0
- larkify/models/performance/v2/user_info.py +89 -0
- larkify/models/personal_settings/__init__.py +0 -0
- larkify/models/personal_settings/v1/__init__.py +0 -0
- larkify/models/personal_settings/v1/system_status.py +406 -0
- larkify/models/report/__init__.py +0 -0
- larkify/models/report/v1/__init__.py +0 -0
- larkify/models/report/v1/rule.py +74 -0
- larkify/models/report/v1/rule_view.py +27 -0
- larkify/models/report/v1/task.py +94 -0
- larkify/models/search/__init__.py +0 -0
- larkify/models/search/v2/__init__.py +0 -0
- larkify/models/search/v2/_shared.py +47 -0
- larkify/models/search/v2/app.py +43 -0
- larkify/models/search/v2/data_source.py +201 -0
- larkify/models/search/v2/data_source_item.py +167 -0
- larkify/models/search/v2/doc_wiki.py +271 -0
- larkify/models/search/v2/message.py +67 -0
- larkify/models/search/v2/schema.py +470 -0
- larkify/models/security_and_compliance/__init__.py +0 -0
- larkify/models/security_and_compliance/v1/__init__.py +0 -0
- larkify/models/security_and_compliance/v1/multi_geo_entity_tenant.py +28 -0
- larkify/models/security_and_compliance/v1/openapi_log.py +90 -0
- larkify/models/security_and_compliance/v1/user_migration.py +86 -0
- larkify/models/security_and_compliance/v2/__init__.py +0 -0
- larkify/models/security_and_compliance/v2/device_apply_record.py +29 -0
- larkify/models/security_and_compliance/v2/device_record.py +178 -0
- larkify/models/sheets/__init__.py +0 -0
- larkify/models/sheets/v3/__init__.py +0 -0
- larkify/models/sheets/v3/spreadsheet.py +81 -0
- larkify/models/sheets/v3/spreadsheet_sheet.py +189 -0
- larkify/models/sheets/v3/spreadsheet_sheet_filter.py +104 -0
- larkify/models/sheets/v3/spreadsheet_sheet_filter_view.py +83 -0
- larkify/models/sheets/v3/spreadsheet_sheet_filter_view_condition.py +91 -0
- larkify/models/sheets/v3/spreadsheet_sheet_float_image.py +115 -0
- larkify/models/spark/__init__.py +0 -0
- larkify/models/spark/v1/__init__.py +0 -0
- larkify/models/spark/v1/app.py +425 -0
- larkify/models/spark/v1/app_available_scope.py +49 -0
- larkify/models/spark/v1/app_enum.py +52 -0
- larkify/models/spark/v1/app_release.py +82 -0
- larkify/models/spark/v1/app_storage.py +128 -0
- larkify/models/spark/v1/app_table.py +181 -0
- larkify/models/spark/v1/app_view.py +24 -0
- larkify/models/spark/v1/directory_user.py +46 -0
- larkify/models/speech_to_text/__init__.py +0 -0
- larkify/models/speech_to_text/v1/__init__.py +0 -0
- larkify/models/speech_to_text/v1/speech.py +119 -0
- larkify/models/task/__init__.py +0 -0
- larkify/models/task/v1/__init__.py +0 -0
- larkify/models/task/v1/_shared.py +30 -0
- larkify/models/task/v1/task.py +400 -0
- larkify/models/task/v1/task_collaborator.py +54 -0
- larkify/models/task/v1/task_comment.py +100 -0
- larkify/models/task/v1/task_follower.py +54 -0
- larkify/models/task/v1/task_reminder.py +59 -0
- larkify/models/task/v2/__init__.py +0 -0
- larkify/models/task/v2/_shared.py +658 -0
- larkify/models/task/v2/attachment.py +70 -0
- larkify/models/task/v2/comment.py +126 -0
- larkify/models/task/v2/custom_field.py +349 -0
- larkify/models/task/v2/custom_field_option.py +96 -0
- larkify/models/task/v2/section.py +167 -0
- larkify/models/task/v2/task.py +513 -0
- larkify/models/task/v2/task_subtask.py +159 -0
- larkify/models/task/v2/task_v2.py +122 -0
- larkify/models/task/v2/tasklist.py +256 -0
- larkify/models/task/v2/tasklist_activity_subscription.py +122 -0
- larkify/models/tenant/__init__.py +0 -0
- larkify/models/tenant/v2/__init__.py +0 -0
- larkify/models/tenant/v2/tenant.py +52 -0
- larkify/models/tenant/v2/tenant_product_assign_info.py +52 -0
- larkify/models/translation/__init__.py +0 -0
- larkify/models/translation/v1/__init__.py +0 -0
- larkify/models/translation/v1/text.py +81 -0
- larkify/models/trust_party/__init__.py +0 -0
- larkify/models/trust_party/v1/__init__.py +0 -0
- larkify/models/trust_party/v1/_shared.py +62 -0
- larkify/models/trust_party/v1/collaboration_tenant.py +115 -0
- larkify/models/trust_party/v1/collaboration_tenant_collaboration_department.py +54 -0
- larkify/models/trust_party/v1/collaboration_tenant_collaboration_user.py +119 -0
- larkify/models/vc/__init__.py +0 -0
- larkify/models/vc/v1/__init__.py +0 -0
- larkify/models/vc/v1/_shared.py +261 -0
- larkify/models/vc/v1/alert.py +72 -0
- larkify/models/vc/v1/bot.py +421 -0
- larkify/models/vc/v1/export.py +161 -0
- larkify/models/vc/v1/meeting.py +326 -0
- larkify/models/vc/v1/meeting_list.py +92 -0
- larkify/models/vc/v1/meeting_recording.py +76 -0
- larkify/models/vc/v1/note.py +66 -0
- larkify/models/vc/v1/participant_list.py +88 -0
- larkify/models/vc/v1/participant_quality_list.py +132 -0
- larkify/models/vc/v1/report.py +66 -0
- larkify/models/vc/v1/reserve.py +402 -0
- larkify/models/vc/v1/reserve_config.py +180 -0
- larkify/models/vc/v1/reserve_config_admin.py +73 -0
- larkify/models/vc/v1/reserve_config_disable_inform.py +83 -0
- larkify/models/vc/v1/reserve_config_form.py +85 -0
- larkify/models/vc/v1/resource_reservation_list.py +68 -0
- larkify/models/vc/v1/room.py +208 -0
- larkify/models/vc/v1/room_config.py +194 -0
- larkify/models/vc/v1/room_level.py +133 -0
- larkify/models/vc/v1/scope_config.py +105 -0
- larkify/models/verification/__init__.py +0 -0
- larkify/models/verification/v1/__init__.py +0 -0
- larkify/models/verification/v1/verification.py +30 -0
- larkify/models/wiki/__init__.py +0 -0
- larkify/models/wiki/v1/__init__.py +0 -0
- larkify/models/wiki/v1/node.py +77 -0
- larkify/models/wiki/v2/__init__.py +0 -0
- larkify/models/wiki/v2/_shared.py +52 -0
- larkify/models/wiki/v2/space.py +87 -0
- larkify/models/wiki/v2/space_member.py +100 -0
- larkify/models/wiki/v2/space_node.py +153 -0
- larkify/models/wiki/v2/space_setting.py +51 -0
- larkify/models/wiki/v2/task.py +76 -0
- larkify/models/workplace/__init__.py +0 -0
- larkify/models/workplace/v1/__init__.py +0 -0
- larkify/models/workplace/v1/_shared.py +22 -0
- larkify/models/workplace/v1/custom_workplace_access_data.py +52 -0
- larkify/models/workplace/v1/workplace_access_data.py +42 -0
- larkify/models/workplace/v1/workplace_block_access_data.py +42 -0
- larkify/response.py +208 -0
- larkify/rest/__init__.py +488 -0
- larkify/rest/_base.py +66 -0
- larkify/rest/acs/__init__.py +26 -0
- larkify/rest/acs/v1/__init__.py +72 -0
- larkify/rest/acs/v1/access_record.py +103 -0
- larkify/rest/acs/v1/access_record_access_photo.py +69 -0
- larkify/rest/acs/v1/device.py +69 -0
- larkify/rest/acs/v1/rule_external.py +364 -0
- larkify/rest/acs/v1/user.py +270 -0
- larkify/rest/acs/v1/user_face.py +216 -0
- larkify/rest/acs/v1/visitor.py +199 -0
- larkify/rest/admin/__init__.py +26 -0
- larkify/rest/admin/v1/__init__.py +68 -0
- larkify/rest/admin/v1/admin_dept_stat.py +115 -0
- larkify/rest/admin/v1/admin_user_stat.py +119 -0
- larkify/rest/admin/v1/audit_info.py +131 -0
- larkify/rest/admin/v1/badge.py +356 -0
- larkify/rest/admin/v1/badge_grant.py +534 -0
- larkify/rest/admin/v1/badge_image.py +129 -0
- larkify/rest/admin/v1/password.py +138 -0
- larkify/rest/aily/__init__.py +26 -0
- larkify/rest/aily/v1/__init__.py +122 -0
- larkify/rest/aily/v1/agent_agent_artifact.py +74 -0
- larkify/rest/aily/v1/agent_agent_attachment.py +141 -0
- larkify/rest/aily/v1/agent_agent_chat.py +180 -0
- larkify/rest/aily/v1/agent_agent_chat_session.py +295 -0
- larkify/rest/aily/v1/agent_agent_visibility.py +129 -0
- larkify/rest/aily/v1/aily_session.py +319 -0
- larkify/rest/aily/v1/aily_session_aily_message.py +269 -0
- larkify/rest/aily/v1/aily_session_run.py +298 -0
- larkify/rest/aily/v1/app_data_asset.py +501 -0
- larkify/rest/aily/v1/app_data_asset_tag.py +97 -0
- larkify/rest/aily/v1/app_knowledge.py +131 -0
- larkify/rest/aily/v1/app_skill.py +255 -0
- larkify/rest/aily/v1/tenant_app_stat.py +99 -0
- larkify/rest/apaas/__init__.py +26 -0
- larkify/rest/apaas/v1/__init__.py +174 -0
- larkify/rest/apaas/v1/app.py +87 -0
- larkify/rest/apaas/v1/application_audit_log.py +348 -0
- larkify/rest/apaas/v1/application_environment_variable.py +198 -0
- larkify/rest/apaas/v1/application_flow.py +141 -0
- larkify/rest/apaas/v1/application_function.py +89 -0
- larkify/rest/apaas/v1/application_object.py +250 -0
- larkify/rest/apaas/v1/application_object_record.py +924 -0
- larkify/rest/apaas/v1/application_record_permission_member.py +266 -0
- larkify/rest/apaas/v1/application_role_member.py +329 -0
- larkify/rest/apaas/v1/approval_instance.py +130 -0
- larkify/rest/apaas/v1/approval_task.py +438 -0
- larkify/rest/apaas/v1/seat_activity.py +91 -0
- larkify/rest/apaas/v1/seat_assignment.py +91 -0
- larkify/rest/apaas/v1/tenant_app_metrics.py +125 -0
- larkify/rest/apaas/v1/user_task.py +645 -0
- larkify/rest/apaas/v1/workspace.py +125 -0
- larkify/rest/apaas/v1/workspace_enum.py +140 -0
- larkify/rest/apaas/v1/workspace_table.py +658 -0
- larkify/rest/apaas/v1/workspace_view.py +103 -0
- larkify/rest/application/__init__.py +47 -0
- larkify/rest/application/legacy.py +437 -0
- larkify/rest/application/v5/__init__.py +26 -0
- larkify/rest/application/v5/application.py +154 -0
- larkify/rest/application/v6/__init__.py +133 -0
- larkify/rest/application/v6/app_badge.py +144 -0
- larkify/rest/application/v6/app_recommend_rule.py +91 -0
- larkify/rest/application/v6/application.py +442 -0
- larkify/rest/application/v6/application_app_usage.py +455 -0
- larkify/rest/application/v6/application_app_version.py +381 -0
- larkify/rest/application/v6/application_collaborators.py +219 -0
- larkify/rest/application/v6/application_contacts_range.py +182 -0
- larkify/rest/application/v6/application_feedback.py +179 -0
- larkify/rest/application/v6/application_management.py +128 -0
- larkify/rest/application/v6/application_owner.py +144 -0
- larkify/rest/application/v6/application_visibility.py +341 -0
- larkify/rest/application/v6/scope.py +115 -0
- larkify/rest/application/v7/__init__.py +60 -0
- larkify/rest/application/v7/app_avatar_upload.py +131 -0
- larkify/rest/application/v7/application_ability.py +134 -0
- larkify/rest/application/v7/application_base.py +130 -0
- larkify/rest/application/v7/application_config.py +204 -0
- larkify/rest/application/v7/application_publish.py +137 -0
- larkify/rest/approval/__init__.py +33 -0
- larkify/rest/approval/legacy.py +1269 -0
- larkify/rest/approval/v4/__init__.py +75 -0
- larkify/rest/approval/v4/approval.py +507 -0
- larkify/rest/approval/v4/district.py +212 -0
- larkify/rest/approval/v4/external_approval.py +252 -0
- larkify/rest/approval/v4/external_instance.py +328 -0
- larkify/rest/approval/v4/external_task.py +153 -0
- larkify/rest/approval/v4/instance.py +1882 -0
- larkify/rest/approval/v4/instance_comment.py +374 -0
- larkify/rest/approval/v4/task.py +1513 -0
- larkify/rest/attendance/__init__.py +26 -0
- larkify/rest/attendance/v1/__init__.py +137 -0
- larkify/rest/attendance/v1/approval_info.py +123 -0
- larkify/rest/attendance/v1/archive_rule.py +455 -0
- larkify/rest/attendance/v1/file.py +187 -0
- larkify/rest/attendance/v1/group.py +493 -0
- larkify/rest/attendance/v1/leave_accrual_record.py +173 -0
- larkify/rest/attendance/v1/leave_employ_expire_record.py +165 -0
- larkify/rest/attendance/v1/shift.py +440 -0
- larkify/rest/attendance/v1/user_approval.py +262 -0
- larkify/rest/attendance/v1/user_daily_shift.py +381 -0
- larkify/rest/attendance/v1/user_flow.py +412 -0
- larkify/rest/attendance/v1/user_setting.py +246 -0
- larkify/rest/attendance/v1/user_stats_data.py +149 -0
- larkify/rest/attendance/v1/user_stats_field.py +141 -0
- larkify/rest/attendance/v1/user_stats_view.py +256 -0
- larkify/rest/attendance/v1/user_task.py +157 -0
- larkify/rest/attendance/v1/user_task_remedy.py +391 -0
- larkify/rest/auth/__init__.py +26 -0
- larkify/rest/auth/v3/__init__.py +26 -0
- larkify/rest/auth/v3/auth.py +526 -0
- larkify/rest/authen/__init__.py +26 -0
- larkify/rest/authen/v1/__init__.py +58 -0
- larkify/rest/authen/v1/access_token.py +121 -0
- larkify/rest/authen/v1/oidc_access_token.py +125 -0
- larkify/rest/authen/v1/oidc_refresh_access_token.py +129 -0
- larkify/rest/authen/v1/refresh_access_token.py +125 -0
- larkify/rest/authen/v1/user_info.py +69 -0
- larkify/rest/baike/__init__.py +26 -0
- larkify/rest/baike/v1/__init__.py +47 -0
- larkify/rest/baike/v1/classification.py +87 -0
- larkify/rest/baike/v1/draft.py +280 -0
- larkify/rest/baike/v1/entity.py +834 -0
- larkify/rest/baike/v1/file.py +173 -0
- larkify/rest/base/__init__.py +26 -0
- larkify/rest/base/v2/__init__.py +26 -0
- larkify/rest/base/v2/app_role.py +311 -0
- larkify/rest/bitable/__init__.py +26 -0
- larkify/rest/bitable/v1/__init__.py +112 -0
- larkify/rest/bitable/v1/app.py +378 -0
- larkify/rest/bitable/v1/app_block_workflow.py +72 -0
- larkify/rest/bitable/v1/app_dashboard.py +200 -0
- larkify/rest/bitable/v1/app_role.py +365 -0
- larkify/rest/bitable/v1/app_role_member.py +567 -0
- larkify/rest/bitable/v1/app_table.py +560 -0
- larkify/rest/bitable/v1/app_table_field.py +646 -0
- larkify/rest/bitable/v1/app_table_field_group.py +137 -0
- larkify/rest/bitable/v1/app_table_form.py +315 -0
- larkify/rest/bitable/v1/app_table_form_field.py +236 -0
- larkify/rest/bitable/v1/app_table_record.py +1240 -0
- larkify/rest/bitable/v1/app_table_view.py +460 -0
- larkify/rest/bitable/v1/app_workflow.py +179 -0
- larkify/rest/board/__init__.py +26 -0
- larkify/rest/board/v1/__init__.py +33 -0
- larkify/rest/board/v1/whiteboard.py +226 -0
- larkify/rest/board/v1/whiteboard_node.py +456 -0
- larkify/rest/bot/__init__.py +33 -0
- larkify/rest/bot/v3/__init__.py +26 -0
- larkify/rest/bot/v3/bot_menu.py +310 -0
- larkify/rest/bot/v4/__init__.py +26 -0
- larkify/rest/bot/v4/bot.py +155 -0
- larkify/rest/calendar/__init__.py +26 -0
- larkify/rest/calendar/v4/__init__.py +114 -0
- larkify/rest/calendar/v4/calendar.py +973 -0
- larkify/rest/calendar/v4/calendar_acl.py +360 -0
- larkify/rest/calendar/v4/calendar_event.py +1111 -0
- larkify/rest/calendar/v4/calendar_event_attendee.py +386 -0
- larkify/rest/calendar/v4/calendar_event_attendee_chat_member.py +97 -0
- larkify/rest/calendar/v4/calendar_event_meeting_chat.py +136 -0
- larkify/rest/calendar/v4/calendar_event_meeting_minute.py +74 -0
- larkify/rest/calendar/v4/exchange_binding.py +252 -0
- larkify/rest/calendar/v4/freebusy.py +266 -0
- larkify/rest/calendar/v4/setting.py +123 -0
- larkify/rest/calendar/v4/timeoff_event.py +193 -0
- larkify/rest/card/__init__.py +26 -0
- larkify/rest/card/legacy.py +73 -0
- larkify/rest/cardkit/__init__.py +26 -0
- larkify/rest/cardkit/v1/__init__.py +33 -0
- larkify/rest/cardkit/v1/card.py +482 -0
- larkify/rest/cardkit/v1/card_element.py +562 -0
- larkify/rest/ccm_doc/__init__.py +26 -0
- larkify/rest/ccm_doc/legacy.py +343 -0
- larkify/rest/ccm_docs/__init__.py +26 -0
- larkify/rest/ccm_docs/legacy.py +125 -0
- larkify/rest/ccm_drive_explorer/__init__.py +26 -0
- larkify/rest/ccm_drive_explorer/legacy.py +451 -0
- larkify/rest/ccm_sheet/__init__.py +26 -0
- larkify/rest/ccm_sheet/legacy.py +1751 -0
- larkify/rest/compensation/__init__.py +26 -0
- larkify/rest/compensation/v1/__init__.py +109 -0
- larkify/rest/compensation/v1/archive.py +288 -0
- larkify/rest/compensation/v1/change_reason.py +87 -0
- larkify/rest/compensation/v1/indicator.py +87 -0
- larkify/rest/compensation/v1/item.py +91 -0
- larkify/rest/compensation/v1/item_category.py +87 -0
- larkify/rest/compensation/v1/lump_sum_payment.py +705 -0
- larkify/rest/compensation/v1/plan.py +87 -0
- larkify/rest/compensation/v1/recurring_payment.py +562 -0
- larkify/rest/compensation/v1/social_archive.py +137 -0
- larkify/rest/compensation/v1/social_archive_adjust_record.py +147 -0
- larkify/rest/compensation/v1/social_insurance.py +69 -0
- larkify/rest/compensation/v1/social_plan.py +192 -0
- larkify/rest/contact/__init__.py +33 -0
- larkify/rest/contact/legacy.py +281 -0
- larkify/rest/contact/v3/__init__.py +121 -0
- larkify/rest/contact/v3/custom_attr.py +87 -0
- larkify/rest/contact/v3/department.py +1365 -0
- larkify/rest/contact/v3/employee_type_enum.py +361 -0
- larkify/rest/contact/v3/functional_role.py +265 -0
- larkify/rest/contact/v3/functional_role_member.py +569 -0
- larkify/rest/contact/v3/group.py +556 -0
- larkify/rest/contact/v3/group_member.py +510 -0
- larkify/rest/contact/v3/job_family.py +414 -0
- larkify/rest/contact/v3/job_level.py +414 -0
- larkify/rest/contact/v3/job_title.py +136 -0
- larkify/rest/contact/v3/scope.py +99 -0
- larkify/rest/contact/v3/unit.py +656 -0
- larkify/rest/contact/v3/user.py +1499 -0
- larkify/rest/contact/v3/work_city.py +136 -0
- larkify/rest/contact_search/__init__.py +26 -0
- larkify/rest/contact_search/legacy.py +73 -0
- larkify/rest/contact_user/__init__.py +26 -0
- larkify/rest/contact_user/legacy.py +73 -0
- larkify/rest/corehr/__init__.py +33 -0
- larkify/rest/corehr/v1/__init__.py +260 -0
- larkify/rest/corehr/v1/assigned_user.py +161 -0
- larkify/rest/corehr/v1/authorization.py +559 -0
- larkify/rest/corehr/v1/common_data_id.py +207 -0
- larkify/rest/corehr/v1/common_data_meta_data.py +288 -0
- larkify/rest/corehr/v1/company.py +558 -0
- larkify/rest/corehr/v1/compensation_standard.py +211 -0
- larkify/rest/corehr/v1/contract.py +484 -0
- larkify/rest/corehr/v1/country_region.py +136 -0
- larkify/rest/corehr/v1/currency.py +136 -0
- larkify/rest/corehr/v1/custom_field.py +209 -0
- larkify/rest/corehr/v1/department.py +644 -0
- larkify/rest/corehr/v1/employee_type.py +440 -0
- larkify/rest/corehr/v1/employment.py +468 -0
- larkify/rest/corehr/v1/file.py +69 -0
- larkify/rest/corehr/v1/job.py +476 -0
- larkify/rest/corehr/v1/job_change.py +207 -0
- larkify/rest/corehr/v1/job_data.py +736 -0
- larkify/rest/corehr/v1/job_family.py +456 -0
- larkify/rest/corehr/v1/job_level.py +456 -0
- larkify/rest/corehr/v1/leave.py +636 -0
- larkify/rest/corehr/v1/leave_granting_record.py +219 -0
- larkify/rest/corehr/v1/location.py +337 -0
- larkify/rest/corehr/v1/national_id_type.py +480 -0
- larkify/rest/corehr/v1/offboarding.py +487 -0
- larkify/rest/corehr/v1/person.py +666 -0
- larkify/rest/corehr/v1/pre_hire.py +341 -0
- larkify/rest/corehr/v1/process_form_variable_data.py +72 -0
- larkify/rest/corehr/v1/security_group.py +228 -0
- larkify/rest/corehr/v1/subdivision.py +140 -0
- larkify/rest/corehr/v1/subregion.py +140 -0
- larkify/rest/corehr/v1/transfer_reason.py +87 -0
- larkify/rest/corehr/v1/transfer_type.py +87 -0
- larkify/rest/corehr/v1/working_hours_type.py +452 -0
- larkify/rest/corehr/v2/__init__.py +485 -0
- larkify/rest/corehr/v2/approval_groups.py +616 -0
- larkify/rest/corehr/v2/approver.py +107 -0
- larkify/rest/corehr/v2/basic_info_bank.py +151 -0
- larkify/rest/corehr/v2/basic_info_bank_branch.py +159 -0
- larkify/rest/corehr/v2/basic_info_city.py +147 -0
- larkify/rest/corehr/v2/basic_info_country_region.py +153 -0
- larkify/rest/corehr/v2/basic_info_country_region_subdivision.py +159 -0
- larkify/rest/corehr/v2/basic_info_currency.py +149 -0
- larkify/rest/corehr/v2/basic_info_district.py +151 -0
- larkify/rest/corehr/v2/basic_info_language.py +149 -0
- larkify/rest/corehr/v2/basic_info_nationality.py +151 -0
- larkify/rest/corehr/v2/basic_info_time_zone.py +149 -0
- larkify/rest/corehr/v2/bp.py +262 -0
- larkify/rest/corehr/v2/company.py +391 -0
- larkify/rest/corehr/v2/contract.py +165 -0
- larkify/rest/corehr/v2/cost_allocation.py +578 -0
- larkify/rest/corehr/v2/cost_center.py +900 -0
- larkify/rest/corehr/v2/cost_center_version.py +434 -0
- larkify/rest/corehr/v2/custom_org.py +889 -0
- larkify/rest/corehr/v2/default_cost_center.py +596 -0
- larkify/rest/corehr/v2/department.py +1518 -0
- larkify/rest/corehr/v2/draft.py +89 -0
- larkify/rest/corehr/v2/employee.py +607 -0
- larkify/rest/corehr/v2/employee_custom_org.py +563 -0
- larkify/rest/corehr/v2/employees_additional_job.py +701 -0
- larkify/rest/corehr/v2/employees_bp.py +149 -0
- larkify/rest/corehr/v2/employees_international_assignment.py +711 -0
- larkify/rest/corehr/v2/employees_job_data.py +382 -0
- larkify/rest/corehr/v2/enum.py +119 -0
- larkify/rest/corehr/v2/job.py +445 -0
- larkify/rest/corehr/v2/job_change.py +571 -0
- larkify/rest/corehr/v2/job_family.py +295 -0
- larkify/rest/corehr/v2/job_grade.py +507 -0
- larkify/rest/corehr/v2/job_level.py +192 -0
- larkify/rest/corehr/v2/location.py +541 -0
- larkify/rest/corehr/v2/location_address.py +443 -0
- larkify/rest/corehr/v2/offboarding.py +424 -0
- larkify/rest/corehr/v2/pathway.py +524 -0
- larkify/rest/corehr/v2/person.py +630 -0
- larkify/rest/corehr/v2/position.py +845 -0
- larkify/rest/corehr/v2/pre_hire.py +1149 -0
- larkify/rest/corehr/v2/probation.py +770 -0
- larkify/rest/corehr/v2/probation_assessment.py +341 -0
- larkify/rest/corehr/v2/process.py +249 -0
- larkify/rest/corehr/v2/process_approver.py +211 -0
- larkify/rest/corehr/v2/process_extra.py +166 -0
- larkify/rest/corehr/v2/process_form_variable_data.py +101 -0
- larkify/rest/corehr/v2/process_query_flow_data_template.py +161 -0
- larkify/rest/corehr/v2/process_revoke.py +156 -0
- larkify/rest/corehr/v2/process_start.py +193 -0
- larkify/rest/corehr/v2/process_transfer.py +164 -0
- larkify/rest/corehr/v2/process_withdraw.py +160 -0
- larkify/rest/corehr/v2/report_detail_row.py +230 -0
- larkify/rest/corehr/v2/signature_file.py +544 -0
- larkify/rest/corehr/v2/signature_node.py +91 -0
- larkify/rest/corehr/v2/signature_template.py +87 -0
- larkify/rest/corehr/v2/signature_template_info_with_thumbnail.py +115 -0
- larkify/rest/corehr/v2/workforce_plan.py +103 -0
- larkify/rest/corehr/v2/workforce_plan_detail.py +304 -0
- larkify/rest/corehr/v2/workforce_plan_detail_row.py +242 -0
- larkify/rest/directory/__init__.py +26 -0
- larkify/rest/directory/v1/__init__.py +60 -0
- larkify/rest/directory/v1/collaboration_rule.py +390 -0
- larkify/rest/directory/v1/collaboration_tenant.py +87 -0
- larkify/rest/directory/v1/collboration_share_entity.py +103 -0
- larkify/rest/directory/v1/department.py +820 -0
- larkify/rest/directory/v1/employee.py +1294 -0
- larkify/rest/docs/__init__.py +26 -0
- larkify/rest/docs/v1/__init__.py +26 -0
- larkify/rest/docs/v1/content.py +95 -0
- larkify/rest/document_ai/__init__.py +26 -0
- larkify/rest/document_ai/v1/__init__.py +161 -0
- larkify/rest/document_ai/v1/bank_card.py +127 -0
- larkify/rest/document_ai/v1/business_card.py +131 -0
- larkify/rest/document_ai/v1/business_license.py +131 -0
- larkify/rest/document_ai/v1/chinese_passport.py +131 -0
- larkify/rest/document_ai/v1/contract.py +135 -0
- larkify/rest/document_ai/v1/driving_license.py +131 -0
- larkify/rest/document_ai/v1/food_manage_license.py +131 -0
- larkify/rest/document_ai/v1/food_produce_license.py +131 -0
- larkify/rest/document_ai/v1/health_certificate.py +131 -0
- larkify/rest/document_ai/v1/hkm_mainland_travel_permit.py +135 -0
- larkify/rest/document_ai/v1/id_card.py +127 -0
- larkify/rest/document_ai/v1/resume.py +123 -0
- larkify/rest/document_ai/v1/taxi_invoice.py +127 -0
- larkify/rest/document_ai/v1/train_invoice.py +131 -0
- larkify/rest/document_ai/v1/tw_mainland_travel_permit.py +135 -0
- larkify/rest/document_ai/v1/vat_invoice.py +127 -0
- larkify/rest/document_ai/v1/vehicle_invoice.py +131 -0
- larkify/rest/document_ai/v1/vehicle_license.py +131 -0
- larkify/rest/docx/__init__.py +26 -0
- larkify/rest/docx/v1/__init__.py +80 -0
- larkify/rest/docx/v1/chat_announcement.py +85 -0
- larkify/rest/docx/v1/chat_announcement_block.py +321 -0
- larkify/rest/docx/v1/chat_announcement_block_children.py +409 -0
- larkify/rest/docx/v1/document.py +342 -0
- larkify/rest/docx/v1/document_block.py +584 -0
- larkify/rest/docx/v1/document_block_children.py +405 -0
- larkify/rest/docx/v1/document_block_descendant.py +183 -0
- larkify/rest/drive/__init__.py +33 -0
- larkify/rest/drive/v1/__init__.py +128 -0
- larkify/rest/drive/v1/export_task.py +240 -0
- larkify/rest/drive/v1/file.py +1402 -0
- larkify/rest/drive/v1/file_comment.py +567 -0
- larkify/rest/drive/v1/file_comment_reply.py +448 -0
- larkify/rest/drive/v1/file_statistics.py +88 -0
- larkify/rest/drive/v1/file_subscription.py +351 -0
- larkify/rest/drive/v1/file_version.py +373 -0
- larkify/rest/drive/v1/file_view_record.py +101 -0
- larkify/rest/drive/v1/import_task.py +180 -0
- larkify/rest/drive/v1/media.py +614 -0
- larkify/rest/drive/v1/meta.py +139 -0
- larkify/rest/drive/v1/permission_member.py +1319 -0
- larkify/rest/drive/v1/permission_public.py +320 -0
- larkify/rest/drive/v1/permission_public_password.py +265 -0
- larkify/rest/drive/v1/user.py +235 -0
- larkify/rest/drive/v2/__init__.py +40 -0
- larkify/rest/drive/v2/comment_reaction.py +154 -0
- larkify/rest/drive/v2/file_like.py +97 -0
- larkify/rest/drive/v2/permission_public.py +346 -0
- larkify/rest/ehr/__init__.py +26 -0
- larkify/rest/ehr/v1/__init__.py +33 -0
- larkify/rest/ehr/v1/attachment.py +69 -0
- larkify/rest/ehr/v1/employee.py +115 -0
- larkify/rest/event/__init__.py +26 -0
- larkify/rest/event/v1/__init__.py +33 -0
- larkify/rest/event/v1/connection.py +69 -0
- larkify/rest/event/v1/outbound_ip.py +87 -0
- larkify/rest/face_verify/__init__.py +26 -0
- larkify/rest/face_verify/legacy.py +177 -0
- larkify/rest/helpdesk/__init__.py +26 -0
- larkify/rest/helpdesk/v1/__init__.py +114 -0
- larkify/rest/helpdesk/v1/agent.py +171 -0
- larkify/rest/helpdesk/v1/agent_schedule.py +189 -0
- larkify/rest/helpdesk/v1/agent_schedules.py +229 -0
- larkify/rest/helpdesk/v1/agent_skill.py +379 -0
- larkify/rest/helpdesk/v1/agent_skill_rule.py +69 -0
- larkify/rest/helpdesk/v1/bot_message.py +141 -0
- larkify/rest/helpdesk/v1/category.py +387 -0
- larkify/rest/helpdesk/v1/event.py +212 -0
- larkify/rest/helpdesk/v1/faq.py +514 -0
- larkify/rest/helpdesk/v1/notification.py +827 -0
- larkify/rest/helpdesk/v1/ticket.py +652 -0
- larkify/rest/helpdesk/v1/ticket_customized_field.py +468 -0
- larkify/rest/helpdesk/v1/ticket_message.py +200 -0
- larkify/rest/hire/__init__.py +33 -0
- larkify/rest/hire/v1/__init__.py +615 -0
- larkify/rest/hire/v1/advertisement.py +124 -0
- larkify/rest/hire/v1/agency.py +749 -0
- larkify/rest/hire/v1/application.py +1090 -0
- larkify/rest/hire/v1/application_interview.py +105 -0
- larkify/rest/hire/v1/attachment.py +181 -0
- larkify/rest/hire/v1/background_check_order.py +252 -0
- larkify/rest/hire/v1/diversity_inclusion.py +125 -0
- larkify/rest/hire/v1/eco_account_custom_field.py +346 -0
- larkify/rest/hire/v1/eco_background_check.py +376 -0
- larkify/rest/hire/v1/eco_background_check_custom_field.py +356 -0
- larkify/rest/hire/v1/eco_background_check_package.py +382 -0
- larkify/rest/hire/v1/eco_exam.py +248 -0
- larkify/rest/hire/v1/eco_exam_paper.py +318 -0
- larkify/rest/hire/v1/ehr_import_task.py +128 -0
- larkify/rest/hire/v1/employee.py +425 -0
- larkify/rest/hire/v1/evaluation.py +107 -0
- larkify/rest/hire/v1/evaluation_task.py +103 -0
- larkify/rest/hire/v1/exam.py +155 -0
- larkify/rest/hire/v1/exam_marking_task.py +103 -0
- larkify/rest/hire/v1/external_application.py +392 -0
- larkify/rest/hire/v1/external_background_check.py +437 -0
- larkify/rest/hire/v1/external_interview.py +439 -0
- larkify/rest/hire/v1/external_interview_assessment.py +282 -0
- larkify/rest/hire/v1/external_offer.py +413 -0
- larkify/rest/hire/v1/external_referral_reward.py +229 -0
- larkify/rest/hire/v1/interview.py +190 -0
- larkify/rest/hire/v1/interview_feedback_form.py +91 -0
- larkify/rest/hire/v1/interview_record.py +156 -0
- larkify/rest/hire/v1/interview_record_attachment.py +91 -0
- larkify/rest/hire/v1/interview_registration_schema.py +87 -0
- larkify/rest/hire/v1/interview_round_type.py +83 -0
- larkify/rest/hire/v1/interview_task.py +103 -0
- larkify/rest/hire/v1/interviewer.py +226 -0
- larkify/rest/hire/v1/job.py +1236 -0
- larkify/rest/hire/v1/job_function.py +87 -0
- larkify/rest/hire/v1/job_manager.py +220 -0
- larkify/rest/hire/v1/job_process.py +87 -0
- larkify/rest/hire/v1/job_publish_record.py +215 -0
- larkify/rest/hire/v1/job_requirement.py +899 -0
- larkify/rest/hire/v1/job_requirement_schema.py +87 -0
- larkify/rest/hire/v1/job_schema.py +91 -0
- larkify/rest/hire/v1/job_type.py +87 -0
- larkify/rest/hire/v1/location.py +212 -0
- larkify/rest/hire/v1/minutes.py +91 -0
- larkify/rest/hire/v1/note.py +490 -0
- larkify/rest/hire/v1/offer.py +869 -0
- larkify/rest/hire/v1/offer_application_form.py +136 -0
- larkify/rest/hire/v1/offer_approval_template.py +95 -0
- larkify/rest/hire/v1/offer_custom_field.py +140 -0
- larkify/rest/hire/v1/offer_schema.py +72 -0
- larkify/rest/hire/v1/portal_apply_schema.py +87 -0
- larkify/rest/hire/v1/questionnaire.py +103 -0
- larkify/rest/hire/v1/referral.py +206 -0
- larkify/rest/hire/v1/referral_account.py +596 -0
- larkify/rest/hire/v1/referral_website_job_post.py +188 -0
- larkify/rest/hire/v1/registration_schema.py +91 -0
- larkify/rest/hire/v1/resume_source.py +87 -0
- larkify/rest/hire/v1/role.py +136 -0
- larkify/rest/hire/v1/subject.py +95 -0
- larkify/rest/hire/v1/talent.py +1121 -0
- larkify/rest/hire/v1/talent_blocklist.py +134 -0
- larkify/rest/hire/v1/talent_external_info.py +232 -0
- larkify/rest/hire/v1/talent_folder.py +95 -0
- larkify/rest/hire/v1/talent_object.py +69 -0
- larkify/rest/hire/v1/talent_operation_log.py +159 -0
- larkify/rest/hire/v1/talent_pool.py +306 -0
- larkify/rest/hire/v1/talent_tag.py +103 -0
- larkify/rest/hire/v1/termination_reason.py +87 -0
- larkify/rest/hire/v1/test.py +155 -0
- larkify/rest/hire/v1/todo.py +103 -0
- larkify/rest/hire/v1/tripartite_agreement.py +354 -0
- larkify/rest/hire/v1/user_role.py +107 -0
- larkify/rest/hire/v1/website.py +87 -0
- larkify/rest/hire/v1/website_channel.py +345 -0
- larkify/rest/hire/v1/website_delivery.py +294 -0
- larkify/rest/hire/v1/website_delivery_task.py +74 -0
- larkify/rest/hire/v1/website_job_post.py +393 -0
- larkify/rest/hire/v1/website_site_user.py +137 -0
- larkify/rest/hire/v2/__init__.py +33 -0
- larkify/rest/hire/v2/interview_record.py +156 -0
- larkify/rest/hire/v2/talent.py +89 -0
- larkify/rest/human_authentication/__init__.py +26 -0
- larkify/rest/human_authentication/v1/__init__.py +26 -0
- larkify/rest/human_authentication/v1/identity.py +147 -0
- larkify/rest/im/__init__.py +33 -0
- larkify/rest/im/v1/__init__.py +138 -0
- larkify/rest/im/v1/batch_message.py +169 -0
- larkify/rest/im/v1/chat.py +709 -0
- larkify/rest/im/v1/chat_announcement.py +191 -0
- larkify/rest/im/v1/chat_managers.py +288 -0
- larkify/rest/im/v1/chat_members.py +454 -0
- larkify/rest/im/v1/chat_menu_item.py +139 -0
- larkify/rest/im/v1/chat_menu_tree.py +374 -0
- larkify/rest/im/v1/chat_moderation.py +213 -0
- larkify/rest/im/v1/chat_tab.py +489 -0
- larkify/rest/im/v1/chat_top_notice.py +178 -0
- larkify/rest/im/v1/file.py +177 -0
- larkify/rest/im/v1/image.py +173 -0
- larkify/rest/im/v1/message.py +1570 -0
- larkify/rest/im/v1/message_reaction.py +374 -0
- larkify/rest/im/v1/message_resource.py +83 -0
- larkify/rest/im/v1/pin.py +242 -0
- larkify/rest/im/v1/thread.py +161 -0
- larkify/rest/im/v2/__init__.py +77 -0
- larkify/rest/im/v2/app_feed_card.py +141 -0
- larkify/rest/im/v2/app_feed_card_batch.py +272 -0
- larkify/rest/im/v2/biz_entity_tag_relation.py +289 -0
- larkify/rest/im/v2/chat.py +161 -0
- larkify/rest/im/v2/chat_button.py +147 -0
- larkify/rest/im/v2/feed_card.py +258 -0
- larkify/rest/im/v2/tag.py +222 -0
- larkify/rest/im/v2/url_preview.py +124 -0
- larkify/rest/im_ephemeral/__init__.py +26 -0
- larkify/rest/im_ephemeral/legacy.py +125 -0
- larkify/rest/im_message/__init__.py +26 -0
- larkify/rest/im_message/legacy.py +73 -0
- larkify/rest/lingo/__init__.py +26 -0
- larkify/rest/lingo/v1/__init__.py +54 -0
- larkify/rest/lingo/v1/classification.py +91 -0
- larkify/rest/lingo/v1/draft.py +302 -0
- larkify/rest/lingo/v1/entity.py +855 -0
- larkify/rest/lingo/v1/file.py +173 -0
- larkify/rest/lingo/v1/repo.py +69 -0
- larkify/rest/mail/__init__.py +26 -0
- larkify/rest/mail/v1/__init__.py +214 -0
- larkify/rest/mail/v1/mailgroup.py +527 -0
- larkify/rest/mail/v1/mailgroup_alias.py +224 -0
- larkify/rest/mail/v1/mailgroup_manager.py +341 -0
- larkify/rest/mail/v1/mailgroup_member.py +636 -0
- larkify/rest/mail/v1/mailgroup_permission_member.py +648 -0
- larkify/rest/mail/v1/multi_entity.py +137 -0
- larkify/rest/mail/v1/public_mailbox.py +595 -0
- larkify/rest/mail/v1/public_mailbox_alias.py +228 -0
- larkify/rest/mail/v1/public_mailbox_member.py +612 -0
- larkify/rest/mail/v1/user.py +119 -0
- larkify/rest/mail/v1/user_mailbox.py +311 -0
- larkify/rest/mail/v1/user_mailbox_alias.py +244 -0
- larkify/rest/mail/v1/user_mailbox_draft.py +571 -0
- larkify/rest/mail/v1/user_mailbox_event.py +279 -0
- larkify/rest/mail/v1/user_mailbox_folder.py +403 -0
- larkify/rest/mail/v1/user_mailbox_label.py +396 -0
- larkify/rest/mail/v1/user_mailbox_mail_contact.py +380 -0
- larkify/rest/mail/v1/user_mailbox_message.py +1003 -0
- larkify/rest/mail/v1/user_mailbox_message_attachment.py +86 -0
- larkify/rest/mail/v1/user_mailbox_rule.py +458 -0
- larkify/rest/mail/v1/user_mailbox_sent_message.py +125 -0
- larkify/rest/mail/v1/user_mailbox_setting.py +121 -0
- larkify/rest/mail/v1/user_mailbox_template.py +390 -0
- larkify/rest/mail/v1/user_mailbox_template_attachment.py +86 -0
- larkify/rest/mail/v1/user_mailbox_thread.py +546 -0
- larkify/rest/mdm/__init__.py +33 -0
- larkify/rest/mdm/v1/__init__.py +28 -0
- larkify/rest/mdm/v1/user_auth_data_relation.py +262 -0
- larkify/rest/mdm/v3/__init__.py +33 -0
- larkify/rest/mdm/v3/batch_country_region.py +94 -0
- larkify/rest/mdm/v3/country_region.py +177 -0
- larkify/rest/minutes/__init__.py +26 -0
- larkify/rest/minutes/v1/__init__.py +47 -0
- larkify/rest/minutes/v1/minute.py +475 -0
- larkify/rest/minutes/v1/minute_media.py +72 -0
- larkify/rest/minutes/v1/minute_statistics.py +85 -0
- larkify/rest/minutes/v1/minute_transcript.py +90 -0
- larkify/rest/moments/__init__.py +26 -0
- larkify/rest/moments/v1/__init__.py +26 -0
- larkify/rest/moments/v1/post.py +85 -0
- larkify/rest/oauth/__init__.py +26 -0
- larkify/rest/oauth/legacy.py +73 -0
- larkify/rest/okr/__init__.py +33 -0
- larkify/rest/okr/v1/__init__.py +68 -0
- larkify/rest/okr/v1/image.py +85 -0
- larkify/rest/okr/v1/okr.py +95 -0
- larkify/rest/okr/v1/period.py +283 -0
- larkify/rest/okr/v1/period_rule.py +69 -0
- larkify/rest/okr/v1/progress_record.py +379 -0
- larkify/rest/okr/v1/review.py +95 -0
- larkify/rest/okr/v1/user_okr.py +105 -0
- larkify/rest/okr/v2/__init__.py +122 -0
- larkify/rest/okr/v2/okr_alignment.py +142 -0
- larkify/rest/okr/v2/okr_category.py +91 -0
- larkify/rest/okr/v2/okr_cycle.py +377 -0
- larkify/rest/okr/v2/okr_cycle_objective.py +256 -0
- larkify/rest/okr/v2/okr_indicator.py +175 -0
- larkify/rest/okr/v2/okr_key_result.py +287 -0
- larkify/rest/okr/v2/okr_key_result_indicator.py +93 -0
- larkify/rest/okr/v2/okr_key_result_progress.py +101 -0
- larkify/rest/okr/v2/okr_objective.py +581 -0
- larkify/rest/okr/v2/okr_objective_alignment.py +212 -0
- larkify/rest/okr/v2/okr_objective_indicator.py +93 -0
- larkify/rest/okr/v2/okr_objective_key_result.py +250 -0
- larkify/rest/okr/v2/okr_objective_progress.py +101 -0
- larkify/rest/optical_char_recognition/__init__.py +28 -0
- larkify/rest/optical_char_recognition/v1/__init__.py +26 -0
- larkify/rest/optical_char_recognition/v1/image.py +119 -0
- larkify/rest/paginator.py +122 -0
- larkify/rest/passport/__init__.py +26 -0
- larkify/rest/passport/v1/__init__.py +33 -0
- larkify/rest/passport/v1/password.py +138 -0
- larkify/rest/passport/v1/session.py +253 -0
- larkify/rest/payroll/__init__.py +26 -0
- larkify/rest/payroll/v1/__init__.py +103 -0
- larkify/rest/payroll/v1/acct_item.py +87 -0
- larkify/rest/payroll/v1/cost_allocation_detail.py +99 -0
- larkify/rest/payroll/v1/cost_allocation_plan.py +91 -0
- larkify/rest/payroll/v1/cost_allocation_report.py +99 -0
- larkify/rest/payroll/v1/datasource.py +87 -0
- larkify/rest/payroll/v1/datasource_record.py +258 -0
- larkify/rest/payroll/v1/paygroup.py +87 -0
- larkify/rest/payroll/v1/payment_activity.py +197 -0
- larkify/rest/payroll/v1/payment_activity_detail.py +99 -0
- larkify/rest/payroll/v1/payment_detail.py +133 -0
- larkify/rest/performance/__init__.py +33 -0
- larkify/rest/performance/v1/__init__.py +40 -0
- larkify/rest/performance/v1/review_data.py +163 -0
- larkify/rest/performance/v1/semester.py +169 -0
- larkify/rest/performance/v1/stage_task.py +290 -0
- larkify/rest/performance/v2/__init__.py +134 -0
- larkify/rest/performance/v2/activity.py +137 -0
- larkify/rest/performance/v2/additional_information.py +316 -0
- larkify/rest/performance/v2/additional_informations_batch.py +149 -0
- larkify/rest/performance/v2/indicator.py +143 -0
- larkify/rest/performance/v2/metric_detail.py +284 -0
- larkify/rest/performance/v2/metric_field.py +119 -0
- larkify/rest/performance/v2/metric_lib.py +179 -0
- larkify/rest/performance/v2/metric_tag.py +91 -0
- larkify/rest/performance/v2/metric_template.py +169 -0
- larkify/rest/performance/v2/question.py +143 -0
- larkify/rest/performance/v2/review_data.py +209 -0
- larkify/rest/performance/v2/review_template.py +143 -0
- larkify/rest/performance/v2/reviewee.py +167 -0
- larkify/rest/performance/v2/user_group_user_rel.py +163 -0
- larkify/rest/performance/v2/user_info.py +145 -0
- larkify/rest/personal_settings/__init__.py +26 -0
- larkify/rest/personal_settings/v1/__init__.py +26 -0
- larkify/rest/personal_settings/v1/system_status.py +673 -0
- larkify/rest/report/__init__.py +26 -0
- larkify/rest/report/v1/__init__.py +40 -0
- larkify/rest/report/v1/rule.py +91 -0
- larkify/rest/report/v1/rule_view.py +140 -0
- larkify/rest/report/v1/task.py +145 -0
- larkify/rest/search/__init__.py +26 -0
- larkify/rest/search/v2/__init__.py +61 -0
- larkify/rest/search/v2/app.py +151 -0
- larkify/rest/search/v2/data_source.py +426 -0
- larkify/rest/search/v2/data_source_item.py +239 -0
- larkify/rest/search/v2/doc_wiki.py +131 -0
- larkify/rest/search/v2/message.py +167 -0
- larkify/rest/search/v2/schema.py +347 -0
- larkify/rest/security_and_compliance/__init__.py +37 -0
- larkify/rest/security_and_compliance/v1/__init__.py +48 -0
- larkify/rest/security_and_compliance/v1/multi_geo_entity_tenant.py +69 -0
- larkify/rest/security_and_compliance/v1/openapi_log.py +129 -0
- larkify/rest/security_and_compliance/v1/user_migration.py +415 -0
- larkify/rest/security_and_compliance/v2/__init__.py +39 -0
- larkify/rest/security_and_compliance/v2/device_apply_record.py +128 -0
- larkify/rest/security_and_compliance/v2/device_record.py +580 -0
- larkify/rest/sheets/__init__.py +26 -0
- larkify/rest/sheets/v3/__init__.py +79 -0
- larkify/rest/sheets/v3/spreadsheet.py +280 -0
- larkify/rest/sheets/v3/spreadsheet_sheet.py +464 -0
- larkify/rest/sheets/v3/spreadsheet_sheet_filter.py +359 -0
- larkify/rest/sheets/v3/spreadsheet_sheet_filter_view.py +428 -0
- larkify/rest/sheets/v3/spreadsheet_sheet_filter_view_condition.py +450 -0
- larkify/rest/sheets/v3/spreadsheet_sheet_float_image.py +444 -0
- larkify/rest/spark/__init__.py +26 -0
- larkify/rest/spark/v1/__init__.py +75 -0
- larkify/rest/spark/v1/app.py +1198 -0
- larkify/rest/spark/v1/app_available_scope.py +181 -0
- larkify/rest/spark/v1/app_enum.py +156 -0
- larkify/rest/spark/v1/app_release.py +141 -0
- larkify/rest/spark/v1/app_storage.py +523 -0
- larkify/rest/spark/v1/app_table.py +746 -0
- larkify/rest/spark/v1/app_view.py +111 -0
- larkify/rest/spark/v1/directory_user.py +125 -0
- larkify/rest/speech_to_text/__init__.py +26 -0
- larkify/rest/speech_to_text/v1/__init__.py +26 -0
- larkify/rest/speech_to_text/v1/speech.py +226 -0
- larkify/rest/task/__init__.py +33 -0
- larkify/rest/task/v1/__init__.py +54 -0
- larkify/rest/task/v1/task.py +802 -0
- larkify/rest/task/v1/task_collaborator.py +278 -0
- larkify/rest/task/v1/task_comment.py +456 -0
- larkify/rest/task/v1/task_follower.py +274 -0
- larkify/rest/task/v1/task_reminder.py +240 -0
- larkify/rest/task/v2/__init__.py +93 -0
- larkify/rest/task/v2/attachment.py +337 -0
- larkify/rest/task/v2/comment.py +450 -0
- larkify/rest/task/v2/custom_field.py +644 -0
- larkify/rest/task/v2/custom_field_option.py +250 -0
- larkify/rest/task/v2/section.py +531 -0
- larkify/rest/task/v2/task.py +1726 -0
- larkify/rest/task/v2/task_subtask.py +286 -0
- larkify/rest/task/v2/task_v2.py +154 -0
- larkify/rest/task/v2/tasklist.py +910 -0
- larkify/rest/task/v2/tasklist_activity_subscription.py +488 -0
- larkify/rest/tenant/__init__.py +26 -0
- larkify/rest/tenant/v2/__init__.py +37 -0
- larkify/rest/tenant/v2/tenant.py +69 -0
- larkify/rest/tenant/v2/tenant_product_assign_info.py +69 -0
- larkify/rest/translation/__init__.py +26 -0
- larkify/rest/translation/v1/__init__.py +26 -0
- larkify/rest/translation/v1/text.py +220 -0
- larkify/rest/trust_party/__init__.py +26 -0
- larkify/rest/trust_party/v1/__init__.py +56 -0
- larkify/rest/trust_party/v1/collaboration_tenant.py +221 -0
- larkify/rest/trust_party/v1/collaboration_tenant_collaboration_department.py +91 -0
- larkify/rest/trust_party/v1/collaboration_tenant_collaboration_user.py +87 -0
- larkify/rest/vc/__init__.py +26 -0
- larkify/rest/vc/v1/__init__.py +169 -0
- larkify/rest/vc/v1/alert.py +103 -0
- larkify/rest/vc/v1/bot.py +565 -0
- larkify/rest/vc/v1/export.py +615 -0
- larkify/rest/vc/v1/meeting.py +880 -0
- larkify/rest/vc/v1/meeting_list.py +127 -0
- larkify/rest/vc/v1/meeting_recording.py +355 -0
- larkify/rest/vc/v1/note.py +85 -0
- larkify/rest/vc/v1/participant_list.py +119 -0
- larkify/rest/vc/v1/participant_quality_list.py +115 -0
- larkify/rest/vc/v1/report.py +170 -0
- larkify/rest/vc/v1/reserve.py +436 -0
- larkify/rest/vc/v1/reserve_config.py +223 -0
- larkify/rest/vc/v1/reserve_config_admin.py +213 -0
- larkify/rest/vc/v1/reserve_config_disable_inform.py +221 -0
- larkify/rest/vc/v1/reserve_config_form.py +213 -0
- larkify/rest/vc/v1/resource_reservation_list.py +111 -0
- larkify/rest/vc/v1/room.py +695 -0
- larkify/rest/vc/v1/room_config.py +459 -0
- larkify/rest/vc/v1/room_level.py +587 -0
- larkify/rest/vc/v1/scope_config.py +213 -0
- larkify/rest/vc_meeting/__init__.py +26 -0
- larkify/rest/vc_meeting/legacy.py +905 -0
- larkify/rest/verification/__init__.py +26 -0
- larkify/rest/verification/v1/__init__.py +26 -0
- larkify/rest/verification/v1/verification.py +69 -0
- larkify/rest/wiki/__init__.py +33 -0
- larkify/rest/wiki/v1/__init__.py +26 -0
- larkify/rest/wiki/v1/node.py +147 -0
- larkify/rest/wiki/v2/__init__.py +54 -0
- larkify/rest/wiki/v2/space.py +360 -0
- larkify/rest/wiki/v2/space_member.py +323 -0
- larkify/rest/wiki/v2/space_node.py +639 -0
- larkify/rest/wiki/v2/space_setting.py +129 -0
- larkify/rest/wiki/v2/task.py +84 -0
- larkify/rest/workplace/__init__.py +26 -0
- larkify/rest/workplace/v1/__init__.py +52 -0
- larkify/rest/workplace/v1/custom_workplace_access_data.py +99 -0
- larkify/rest/workplace/v1/workplace_access_data.py +95 -0
- larkify/rest/workplace/v1/workplace_block_access_data.py +99 -0
- larkify/retry.py +106 -0
- larkify/throttling.py +63 -0
- larkify/typing.py +60 -0
- larkify/utils.py +101 -0
- larkify/webhooks/__init__.py +17 -0
- larkify/webhooks/callbacks.py +158 -0
- larkify/webhooks/crypto.py +74 -0
- larkify/webhooks/dispatcher.py +234 -0
- larkify/webhooks/events/__init__.py +596 -0
- larkify/webhooks/events/acs.py +72 -0
- larkify/webhooks/events/application.py +602 -0
- larkify/webhooks/events/approval.py +263 -0
- larkify/webhooks/events/auth.py +38 -0
- larkify/webhooks/events/calendar.py +128 -0
- larkify/webhooks/events/compensation.py +38 -0
- larkify/webhooks/events/contact.py +817 -0
- larkify/webhooks/events/corehr.py +1622 -0
- larkify/webhooks/events/drive.py +490 -0
- larkify/webhooks/events/elearning.py +128 -0
- larkify/webhooks/events/helpdesk.py +305 -0
- larkify/webhooks/events/hire.py +486 -0
- larkify/webhooks/events/im.py +511 -0
- larkify/webhooks/events/im_chat.py +45 -0
- larkify/webhooks/events/mail.py +52 -0
- larkify/webhooks/events/meeting_room.py +89 -0
- larkify/webhooks/events/moments.py +200 -0
- larkify/webhooks/events/payroll.py +49 -0
- larkify/webhooks/events/performance.py +89 -0
- larkify/webhooks/events/security_and_compliance.py +170 -0
- larkify/webhooks/events/task.py +94 -0
- larkify/webhooks/events/vc.py +674 -0
- larkify/webhooks/events/vc_meeting.py +73 -0
- larkify/webhooks/models.py +50 -0
- larkify/webhooks/parse.py +63 -0
- larkify/ws/__init__.py +2 -0
- larkify/ws/client.py +336 -0
- larkify/ws/frame.py +177 -0
- larkify-0.1.0.dist-info/METADATA +507 -0
- larkify-0.1.0.dist-info/RECORD +1549 -0
- larkify-0.1.0.dist-info/WHEEL +4 -0
- larkify-0.1.0.dist-info/licenses/LICENSE +21 -0
- 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
|
larkify/auth/__init__.py
ADDED
|
@@ -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()
|