From c5dfd26014ff2c4d2723b216780f011d938bed7e Mon Sep 17 00:00:00 2001
From: ljmwkx <1340053001@qq.com>
Date: Sun, 30 Jun 2024 09:08:39 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=20?=
=?UTF-8?q?=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
web_widgets/__init__.py | 4 -
web_widgets/__manifest__.py | 43 -
web_widgets/controllers/__init__.py | 3 -
web_widgets/controllers/binary.py | 61 -
web_widgets/i18n/zh_CN.po | 93 -
web_widgets/models/__init__.py | 3 -
web_widgets/models/ir_module.py | 37 -
web_widgets/readme.md | 106 -
web_widgets/static/audio/beep.mp3 | Bin 6736 -> 0 bytes
web_widgets/static/description/icon.png | Bin 10110 -> 0 bytes
web_widgets/static/fonts/fonts.scss | 4 -
web_widgets/static/fonts/password.ttf | Bin 18708 -> 0 bytes
.../static/src/views/fields/fields.scss | 13 -
.../views/fields/onlyoffice_editor/.gitkeep | 0
.../views/fields/onlyoffice_viewer/.gitkeep | 0
.../password_char/password_char copy.bak | 26 -
.../fields/password_char/password_char.js | 103 -
.../fields/password_char/password_char.scss | 51 -
.../fields/password_char/password_char.xml | 15 -
.../api_error_dialog/api_error_dialog.js | 26 -
.../api_error_dialog/api_error_dialog.xml | 25 -
.../api_error_dialog/client_actions.js | 12 -
.../open_list_action/client_actions.js | 25 -
wecom_api/__init__.py | 19 -
wecom_api/__manifest__.py | 46 -
wecom_api/api/__init__.py | 6 -
wecom_api/api/wecom_abstract_api.py | 198 --
wecom_api/api/wecom_client_api.py | 96 -
wecom_api/api/wecom_message_api.py | 260 --
wecom_api/api/wecom_msg_crtpt.py | 301 --
wecom_api/api/wecom_server_api.py | 100 -
wecom_api/controllers/__init__.py | 3 -
wecom_api/controllers/main.py | 131 -
wecom_api/data/ir_config_parameter.xml | 24 -
wecom_api/data/ir_cron_data.xml | 8 -
wecom_api/data/reptile.py | 98 -
wecom_api/data/service_api_list_data.xml | 3021 -----------------
.../data/wecom_server_api_error_data.xml | 15 -
wecom_api/i18n/zh_CN.po | 371 --
wecom_api/models/__init__.py | 5 -
wecom_api/models/res_config_settings.py | 8 -
wecom_api/models/temp.py | 64 -
wecom_api/models/wecom_server_api_error.py | 175 -
wecom_api/models/wecom_server_api_list.py | 67 -
wecom_api/security/ir.model.access.csv | 7 -
wecom_api/static/description/icon.png | Bin 10172 -> 0 bytes
wecom_api/tools/__init__.py | 15 -
wecom_api/tools/action.py | 125 -
wecom_api/tools/convert.py | 47 -
wecom_api/tools/data.py | 42 -
wecom_api/tools/datetime.py | 82 -
wecom_api/tools/dictionary.py | 18 -
wecom_api/tools/file.py | 52 -
wecom_api/tools/message.py | 14 -
wecom_api/tools/security.py | 83 -
wecom_api/tools/string.py | 42 -
wecom_api/tools/wx_tools.py | 105 -
wecom_auth_oauth/__init__.py | 4 -
wecom_auth_oauth/__manifest__.py | 42 -
wecom_auth_oauth/controllers/__init__.py | 3 -
wecom_auth_oauth/controllers/main.py | 110 -
.../data/wecom_app_config_data.xml | 40 -
wecom_auth_oauth/data/wecom_apps_data.xml | 19 -
wecom_auth_oauth/data/wecom_oauth_data.xml | 41 -
wecom_auth_oauth/i18n/zh_CN.po | 287 --
wecom_auth_oauth/models/__init__.py | 8 -
wecom_auth_oauth/models/auth_oauth.py | 10 -
wecom_auth_oauth/models/res_company.py | 82 -
.../models/res_config_settings.py | 149 -
wecom_auth_oauth/models/res_users.py | 59 -
wecom_auth_oauth/models/wecom_apps.py | 152 -
wecom_auth_oauth/static/description/icon.png | Bin 11816 -> 0 bytes
.../static/src/js/wecom_join/wecom_join.js | 21 -
.../static/src/js/wecom_join/wecom_join.xml | 4 -
.../static/src/js/wecom_login/wecom_login.js | 20 -
.../static/src/js/wecom_login/wecom_login.xml | 4 -
wecom_auth_oauth/views/auth_oauth_views.xml | 33 -
.../views/res_config_settings_views.xml | 130 -
wecom_base/__init__.py | 10 -
wecom_base/__manifest__.py | 49 -
wecom_base/data/ir_config_parameter.xml | 12 -
wecom_base/data/ir_cron_data.xml | 33 -
wecom_base/data/ir_module_category_data.xml | 11 -
wecom_base/data/res_company_data.xml | 8 -
wecom_base/data/wecom_app_type_data.xml | 186 -
wecom_base/i18n/zh_CN.po | 1318 -------
wecom_base/models/__init__.py | 19 -
wecom_base/models/ir_http.py | 25 -
wecom_base/models/ir_module.py | 15 -
wecom_base/models/res_company.py | 23 -
wecom_base/models/res_config_settings.py | 167 -
wecom_base/models/res_partner.py | 7 -
.../models/wecom_app_callback_service.py | 103 -
wecom_base/models/wecom_app_config.py | 161 -
wecom_base/models/wecom_app_event_type.py | 152 -
wecom_base/models/wecom_app_subtype.py | 24 -
wecom_base/models/wecom_app_type.py | 35 -
wecom_base/models/wecom_apps.py | 432 ---
wecom_base/models/wecom_server_api.py | 7 -
wecom_base/models/wecom_server_api_error.py | 20 -
wecom_base/models/wecom_server_api_list.py | 9 -
wecom_base/security/ir.model.access.csv | 17 -
wecom_base/security/wecom_security.xml | 30 -
wecom_base/static/description/icon.png | Bin 17306 -> 0 bytes
wecom_base/views/assets_templates.xml | 13 -
wecom_base/views/ir_cron_views.xml | 20 -
wecom_base/views/menu_views.xml | 64 -
wecom_base/views/res_company_views.xml | 54 -
.../views/res_config_settings_views.xml | 207 --
wecom_base/views/res_users_views.xml | 29 -
.../wecom_app_callback_service_views.xml | 48 -
wecom_base/views/wecom_app_config_views.xml | 54 -
.../views/wecom_app_event_type_views.xml | 59 -
wecom_base/views/wecom_app_subtype_views.xml | 54 -
wecom_base/views/wecom_app_type_views.xml | 38 -
wecom_base/views/wecom_apps_views.xml | 258 --
wecom_base/views/wecom_base_views.xml | 26 -
.../views/wecom_service_api_error_views.xml | 55 -
.../views/wecom_service_api_list_views.xml | 64 -
wecom_contacts/__init__.py | 11 -
wecom_contacts/__manifest__.py | 48 -
wecom_contacts/data/ir_cron_data.xml | 57 -
wecom_contacts/data/wecom_apps_data.xml | 33 -
wecom_contacts/i18n/zh_CN.po | 622 ----
wecom_contacts/models/__init__.py | 10 -
wecom_contacts/models/hr_employee.py | 8 -
wecom_contacts/models/res_company.py | 170 -
wecom_contacts/models/res_config_settings.py | 244 --
wecom_contacts/models/res_partner.py | 61 -
wecom_contacts/models/res_partner_category.py | 297 --
wecom_contacts/models/res_users.py | 34 -
wecom_contacts/models/wecom_apps.py | 74 -
wecom_contacts/security/ir.model.access.csv | 1 -
wecom_contacts/static/description/icon.png | Bin 13681 -> 0 bytes
.../settings_form_view/widgets/navigation.xml | 31 -
wecom_contacts/views/ir_cron_views.xml | 34 -
wecom_contacts/views/menu_views.xml | 16 -
wecom_contacts/views/res_company_views.xml | 32 -
.../views/res_config_settings_views.xml | 233 --
.../views/res_partner_category_views.xml | 71 -
wecom_contacts/views/res_partner_views.xml | 69 -
wecom_contacts/views/res_users_views.xml | 69 -
wecom_contacts_sync/__init__.py | 4 -
wecom_contacts_sync/__manifest__.py | 61 -
wecom_contacts_sync/data/hr_data.xml | 26 -
wecom_contacts_sync/data/ir_cron_data.xml | 19 -
.../data/wecom_app_config_data.xml | 165 -
.../data/wecom_app_event_type_data.xml | 74 -
wecom_contacts_sync/i18n/zh_CN.po | 1515 ---------
wecom_contacts_sync/models/__init__.py | 13 -
wecom_contacts_sync/models/res_company.py | 21 -
.../models/res_config_settings.py | 71 -
wecom_contacts_sync/models/res_users.py | 663 ----
wecom_contacts_sync/models/wecom_apps.py | 505 ---
.../models/wecom_contacts_block.py | 63 -
.../models/wecom_department.py | 478 ---
wecom_contacts_sync/models/wecom_tag.py | 481 ---
wecom_contacts_sync/models/wecom_user.py | 783 -----
.../security/ir.model.access.csv | 12 -
.../static/description/icon.png | Bin 10365 -> 0 bytes
wecom_contacts_sync/views/ir_cron_views.xml | 13 -
wecom_contacts_sync/views/menu_views.xml | 21 -
.../views/res_company_views.xml | 25 -
.../views/res_config_settings_views.xml | 131 -
wecom_contacts_sync/views/res_users_views.xml | 43 -
.../views/wecom_department_views.xml | 65 -
wecom_contacts_sync/views/wecom_tag_views.xml | 67 -
.../views/wecom_user_views.xml | 233 --
wecom_contacts_sync/wizard/__init__.py | 3 -
.../wizard/wecom_contacts_sync_wizard.py | 359 --
.../wecom_contacts_sync_wizard_views.xml | 101 -
wecom_l10n/__init__.py | 1 -
wecom_l10n/__manifest__.py | 20 -
wecom_l10n/i18n_extra/ zh_CN.po | 439 ---
wecom_l10n/static/description/icon.png | Bin 12441 -> 0 bytes
wecom_material/__init__.py | 23 -
wecom_material/__manifest__.py | 57 -
wecom_material/data/material_data.xml | 70 -
wecom_material/data/wecom_apps_data.xml | 11 -
wecom_material/i18n/zh_CN.po | 388 ---
wecom_material/models/__init__.py | 5 -
wecom_material/models/res_company.py | 22 -
wecom_material/models/res_config_settings.py | 35 -
wecom_material/models/wecom_material.py | 409 ---
wecom_material/security/ir.model.access.csv | 2 -
.../security/wecom_material_security.xml | 30 -
wecom_material/static/description/icon.png | Bin 4782 -> 0 bytes
.../static/src/img/account_created.png | Bin 7260 -> 0 bytes
.../static/src/img/gamification.png | Bin 20151 -> 0 bytes
wecom_material/static/src/img/kpi.png | Bin 19335 -> 0 bytes
wecom_material/static/src/img/logo.png | Bin 9598 -> 0 bytes
wecom_material/static/src/img/message.png | Bin 6989 -> 0 bytes
.../static/src/img/reset_password.png | Bin 6296 -> 0 bytes
wecom_material/static/src/img/warn.png | Bin 5885 -> 0 bytes
wecom_material/static/src/img/welcome.png | Bin 6614 -> 0 bytes
wecom_material/views/material_views.xml | 102 -
wecom_material/views/menu_views.xml | 9 -
wecom_material/views/res_company_views.xml | 21 -
.../views/res_config_settings_views.xml | 75 -
wecom_widget/__init__.py | 3 -
wecom_widget/__manifest__.py | 30 -
wecom_widget/i18n/zh_CN.po | 55 -
wecom_widget/models/__init__.py | 6 -
wecom_widget/models/ir_module.py | 31 -
wecom_widget/models/ir_qweb_fields.py | 14 -
wecom_widget/static/description/icon.png | Bin 11505 -> 0 bytes
.../settings_form_view/widgets/navigation.js | 24 -
.../widgets/navigation.scss | 10 -
.../settings_form_view/widgets/navigation.xml | 19 -
209 files changed, 21583 deletions(-)
delete mode 100644 web_widgets/__init__.py
delete mode 100644 web_widgets/__manifest__.py
delete mode 100644 web_widgets/controllers/__init__.py
delete mode 100644 web_widgets/controllers/binary.py
delete mode 100644 web_widgets/i18n/zh_CN.po
delete mode 100644 web_widgets/models/__init__.py
delete mode 100644 web_widgets/models/ir_module.py
delete mode 100644 web_widgets/readme.md
delete mode 100644 web_widgets/static/audio/beep.mp3
delete mode 100644 web_widgets/static/description/icon.png
delete mode 100644 web_widgets/static/fonts/fonts.scss
delete mode 100644 web_widgets/static/fonts/password.ttf
delete mode 100644 web_widgets/static/src/views/fields/fields.scss
delete mode 100644 web_widgets/static/src/views/fields/onlyoffice_editor/.gitkeep
delete mode 100644 web_widgets/static/src/views/fields/onlyoffice_viewer/.gitkeep
delete mode 100644 web_widgets/static/src/views/fields/password_char/password_char copy.bak
delete mode 100644 web_widgets/static/src/views/fields/password_char/password_char.js
delete mode 100644 web_widgets/static/src/views/fields/password_char/password_char.scss
delete mode 100644 web_widgets/static/src/views/fields/password_char/password_char.xml
delete mode 100644 web_widgets/static/src/webclient/actions/api_error_dialog/api_error_dialog.js
delete mode 100644 web_widgets/static/src/webclient/actions/api_error_dialog/api_error_dialog.xml
delete mode 100644 web_widgets/static/src/webclient/actions/api_error_dialog/client_actions.js
delete mode 100644 web_widgets/static/src/webclient/actions/open_list_action/client_actions.js
delete mode 100644 wecom_api/__init__.py
delete mode 100644 wecom_api/__manifest__.py
delete mode 100644 wecom_api/api/__init__.py
delete mode 100644 wecom_api/api/wecom_abstract_api.py
delete mode 100644 wecom_api/api/wecom_client_api.py
delete mode 100644 wecom_api/api/wecom_message_api.py
delete mode 100644 wecom_api/api/wecom_msg_crtpt.py
delete mode 100644 wecom_api/api/wecom_server_api.py
delete mode 100644 wecom_api/controllers/__init__.py
delete mode 100644 wecom_api/controllers/main.py
delete mode 100644 wecom_api/data/ir_config_parameter.xml
delete mode 100644 wecom_api/data/ir_cron_data.xml
delete mode 100644 wecom_api/data/reptile.py
delete mode 100644 wecom_api/data/service_api_list_data.xml
delete mode 100644 wecom_api/data/wecom_server_api_error_data.xml
delete mode 100644 wecom_api/i18n/zh_CN.po
delete mode 100644 wecom_api/models/__init__.py
delete mode 100644 wecom_api/models/res_config_settings.py
delete mode 100644 wecom_api/models/temp.py
delete mode 100644 wecom_api/models/wecom_server_api_error.py
delete mode 100644 wecom_api/models/wecom_server_api_list.py
delete mode 100644 wecom_api/security/ir.model.access.csv
delete mode 100644 wecom_api/static/description/icon.png
delete mode 100644 wecom_api/tools/__init__.py
delete mode 100644 wecom_api/tools/action.py
delete mode 100644 wecom_api/tools/convert.py
delete mode 100644 wecom_api/tools/data.py
delete mode 100644 wecom_api/tools/datetime.py
delete mode 100644 wecom_api/tools/dictionary.py
delete mode 100644 wecom_api/tools/file.py
delete mode 100644 wecom_api/tools/message.py
delete mode 100644 wecom_api/tools/security.py
delete mode 100644 wecom_api/tools/string.py
delete mode 100644 wecom_api/tools/wx_tools.py
delete mode 100644 wecom_auth_oauth/__init__.py
delete mode 100644 wecom_auth_oauth/__manifest__.py
delete mode 100644 wecom_auth_oauth/controllers/__init__.py
delete mode 100644 wecom_auth_oauth/controllers/main.py
delete mode 100644 wecom_auth_oauth/data/wecom_app_config_data.xml
delete mode 100644 wecom_auth_oauth/data/wecom_apps_data.xml
delete mode 100644 wecom_auth_oauth/data/wecom_oauth_data.xml
delete mode 100644 wecom_auth_oauth/i18n/zh_CN.po
delete mode 100644 wecom_auth_oauth/models/__init__.py
delete mode 100644 wecom_auth_oauth/models/auth_oauth.py
delete mode 100644 wecom_auth_oauth/models/res_company.py
delete mode 100644 wecom_auth_oauth/models/res_config_settings.py
delete mode 100644 wecom_auth_oauth/models/res_users.py
delete mode 100644 wecom_auth_oauth/models/wecom_apps.py
delete mode 100644 wecom_auth_oauth/static/description/icon.png
delete mode 100644 wecom_auth_oauth/static/src/js/wecom_join/wecom_join.js
delete mode 100644 wecom_auth_oauth/static/src/js/wecom_join/wecom_join.xml
delete mode 100644 wecom_auth_oauth/static/src/js/wecom_login/wecom_login.js
delete mode 100644 wecom_auth_oauth/static/src/js/wecom_login/wecom_login.xml
delete mode 100644 wecom_auth_oauth/views/auth_oauth_views.xml
delete mode 100644 wecom_auth_oauth/views/res_config_settings_views.xml
delete mode 100644 wecom_base/__init__.py
delete mode 100644 wecom_base/__manifest__.py
delete mode 100644 wecom_base/data/ir_config_parameter.xml
delete mode 100644 wecom_base/data/ir_cron_data.xml
delete mode 100644 wecom_base/data/ir_module_category_data.xml
delete mode 100644 wecom_base/data/res_company_data.xml
delete mode 100644 wecom_base/data/wecom_app_type_data.xml
delete mode 100644 wecom_base/i18n/zh_CN.po
delete mode 100644 wecom_base/models/__init__.py
delete mode 100644 wecom_base/models/ir_http.py
delete mode 100644 wecom_base/models/ir_module.py
delete mode 100644 wecom_base/models/res_company.py
delete mode 100644 wecom_base/models/res_config_settings.py
delete mode 100644 wecom_base/models/res_partner.py
delete mode 100644 wecom_base/models/wecom_app_callback_service.py
delete mode 100644 wecom_base/models/wecom_app_config.py
delete mode 100644 wecom_base/models/wecom_app_event_type.py
delete mode 100644 wecom_base/models/wecom_app_subtype.py
delete mode 100644 wecom_base/models/wecom_app_type.py
delete mode 100644 wecom_base/models/wecom_apps.py
delete mode 100644 wecom_base/models/wecom_server_api.py
delete mode 100644 wecom_base/models/wecom_server_api_error.py
delete mode 100644 wecom_base/models/wecom_server_api_list.py
delete mode 100644 wecom_base/security/ir.model.access.csv
delete mode 100644 wecom_base/security/wecom_security.xml
delete mode 100644 wecom_base/static/description/icon.png
delete mode 100644 wecom_base/views/assets_templates.xml
delete mode 100644 wecom_base/views/ir_cron_views.xml
delete mode 100644 wecom_base/views/menu_views.xml
delete mode 100644 wecom_base/views/res_company_views.xml
delete mode 100644 wecom_base/views/res_config_settings_views.xml
delete mode 100644 wecom_base/views/res_users_views.xml
delete mode 100644 wecom_base/views/wecom_app_callback_service_views.xml
delete mode 100644 wecom_base/views/wecom_app_config_views.xml
delete mode 100644 wecom_base/views/wecom_app_event_type_views.xml
delete mode 100644 wecom_base/views/wecom_app_subtype_views.xml
delete mode 100644 wecom_base/views/wecom_app_type_views.xml
delete mode 100644 wecom_base/views/wecom_apps_views.xml
delete mode 100644 wecom_base/views/wecom_base_views.xml
delete mode 100644 wecom_base/views/wecom_service_api_error_views.xml
delete mode 100644 wecom_base/views/wecom_service_api_list_views.xml
delete mode 100644 wecom_contacts/__init__.py
delete mode 100644 wecom_contacts/__manifest__.py
delete mode 100644 wecom_contacts/data/ir_cron_data.xml
delete mode 100644 wecom_contacts/data/wecom_apps_data.xml
delete mode 100644 wecom_contacts/i18n/zh_CN.po
delete mode 100644 wecom_contacts/models/__init__.py
delete mode 100644 wecom_contacts/models/hr_employee.py
delete mode 100644 wecom_contacts/models/res_company.py
delete mode 100644 wecom_contacts/models/res_config_settings.py
delete mode 100644 wecom_contacts/models/res_partner.py
delete mode 100644 wecom_contacts/models/res_partner_category.py
delete mode 100644 wecom_contacts/models/res_users.py
delete mode 100644 wecom_contacts/models/wecom_apps.py
delete mode 100644 wecom_contacts/security/ir.model.access.csv
delete mode 100644 wecom_contacts/static/description/icon.png
delete mode 100644 wecom_contacts/static/src/webclient/settings_form_view/widgets/navigation.xml
delete mode 100644 wecom_contacts/views/ir_cron_views.xml
delete mode 100644 wecom_contacts/views/menu_views.xml
delete mode 100644 wecom_contacts/views/res_company_views.xml
delete mode 100644 wecom_contacts/views/res_config_settings_views.xml
delete mode 100644 wecom_contacts/views/res_partner_category_views.xml
delete mode 100644 wecom_contacts/views/res_partner_views.xml
delete mode 100644 wecom_contacts/views/res_users_views.xml
delete mode 100644 wecom_contacts_sync/__init__.py
delete mode 100644 wecom_contacts_sync/__manifest__.py
delete mode 100644 wecom_contacts_sync/data/hr_data.xml
delete mode 100644 wecom_contacts_sync/data/ir_cron_data.xml
delete mode 100644 wecom_contacts_sync/data/wecom_app_config_data.xml
delete mode 100644 wecom_contacts_sync/data/wecom_app_event_type_data.xml
delete mode 100644 wecom_contacts_sync/i18n/zh_CN.po
delete mode 100644 wecom_contacts_sync/models/__init__.py
delete mode 100644 wecom_contacts_sync/models/res_company.py
delete mode 100644 wecom_contacts_sync/models/res_config_settings.py
delete mode 100644 wecom_contacts_sync/models/res_users.py
delete mode 100644 wecom_contacts_sync/models/wecom_apps.py
delete mode 100644 wecom_contacts_sync/models/wecom_contacts_block.py
delete mode 100644 wecom_contacts_sync/models/wecom_department.py
delete mode 100644 wecom_contacts_sync/models/wecom_tag.py
delete mode 100644 wecom_contacts_sync/models/wecom_user.py
delete mode 100644 wecom_contacts_sync/security/ir.model.access.csv
delete mode 100644 wecom_contacts_sync/static/description/icon.png
delete mode 100644 wecom_contacts_sync/views/ir_cron_views.xml
delete mode 100644 wecom_contacts_sync/views/menu_views.xml
delete mode 100644 wecom_contacts_sync/views/res_company_views.xml
delete mode 100644 wecom_contacts_sync/views/res_config_settings_views.xml
delete mode 100644 wecom_contacts_sync/views/res_users_views.xml
delete mode 100644 wecom_contacts_sync/views/wecom_department_views.xml
delete mode 100644 wecom_contacts_sync/views/wecom_tag_views.xml
delete mode 100644 wecom_contacts_sync/views/wecom_user_views.xml
delete mode 100644 wecom_contacts_sync/wizard/__init__.py
delete mode 100644 wecom_contacts_sync/wizard/wecom_contacts_sync_wizard.py
delete mode 100644 wecom_contacts_sync/wizard/wecom_contacts_sync_wizard_views.xml
delete mode 100644 wecom_l10n/__init__.py
delete mode 100644 wecom_l10n/__manifest__.py
delete mode 100644 wecom_l10n/i18n_extra/ zh_CN.po
delete mode 100644 wecom_l10n/static/description/icon.png
delete mode 100644 wecom_material/__init__.py
delete mode 100644 wecom_material/__manifest__.py
delete mode 100644 wecom_material/data/material_data.xml
delete mode 100644 wecom_material/data/wecom_apps_data.xml
delete mode 100644 wecom_material/i18n/zh_CN.po
delete mode 100644 wecom_material/models/__init__.py
delete mode 100644 wecom_material/models/res_company.py
delete mode 100644 wecom_material/models/res_config_settings.py
delete mode 100644 wecom_material/models/wecom_material.py
delete mode 100644 wecom_material/security/ir.model.access.csv
delete mode 100644 wecom_material/security/wecom_material_security.xml
delete mode 100644 wecom_material/static/description/icon.png
delete mode 100644 wecom_material/static/src/img/account_created.png
delete mode 100644 wecom_material/static/src/img/gamification.png
delete mode 100644 wecom_material/static/src/img/kpi.png
delete mode 100644 wecom_material/static/src/img/logo.png
delete mode 100644 wecom_material/static/src/img/message.png
delete mode 100644 wecom_material/static/src/img/reset_password.png
delete mode 100644 wecom_material/static/src/img/warn.png
delete mode 100644 wecom_material/static/src/img/welcome.png
delete mode 100644 wecom_material/views/material_views.xml
delete mode 100644 wecom_material/views/menu_views.xml
delete mode 100644 wecom_material/views/res_company_views.xml
delete mode 100644 wecom_material/views/res_config_settings_views.xml
delete mode 100644 wecom_widget/__init__.py
delete mode 100644 wecom_widget/__manifest__.py
delete mode 100644 wecom_widget/i18n/zh_CN.po
delete mode 100644 wecom_widget/models/__init__.py
delete mode 100644 wecom_widget/models/ir_module.py
delete mode 100644 wecom_widget/models/ir_qweb_fields.py
delete mode 100644 wecom_widget/static/description/icon.png
delete mode 100644 wecom_widget/static/src/webclient/settings_form_view/widgets/navigation.js
delete mode 100644 wecom_widget/static/src/webclient/settings_form_view/widgets/navigation.scss
delete mode 100644 wecom_widget/static/src/webclient/settings_form_view/widgets/navigation.xml
diff --git a/web_widgets/__init__.py b/web_widgets/__init__.py
deleted file mode 100644
index e89927ca6..000000000
--- a/web_widgets/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from . import models
-from . import controllers
\ No newline at end of file
diff --git a/web_widgets/__manifest__.py b/web_widgets/__manifest__.py
deleted file mode 100644
index cc07e503c..000000000
--- a/web_widgets/__manifest__.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# -*- coding: utf-8 -*-
-
-{
- "name": "iErp Web Widgets",
- "author": "RStudio",
- "category": "iErp Suites/Widget",
- "summary": "iErp Widgets",
- "website": "https://eis-solution.coding.net/public/odoo/oec/git",
- "version": "17.0.0.1",
- "description": """
-
-""",
- "depends": [
- "web",
- "attachment_indexation",
- ],
- "external_dependencies": {
- "python": [
- # "pyzbar",
- ],
- },
- "data": [],
- "assets": {
- # "web.assets_common": [
- # "web_widgets/static/fonts/fonts.scss",
- # ],
- "web.assets_backend": [
- "web_widgets/static/fonts/fonts.scss",
- "web_widgets/static/src/views/**/*.js",
- "web_widgets/static/src/views/**/*.xml",
- "web_widgets/static/src/views/**/*.scss",
- "web_widgets/static/src/webclient/**/*",
- ],
- "web.assets_frontend": [
- # "web_widgets/static/lib/officetohtml/**/*",
- ],
- },
- "sequence": 500,
- "installable": True,
- "auto_install": True,
- "application": False,
- "license": "AGPL-3",
-}
diff --git a/web_widgets/controllers/__init__.py b/web_widgets/controllers/__init__.py
deleted file mode 100644
index abae753cb..000000000
--- a/web_widgets/controllers/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from . import binary
diff --git a/web_widgets/controllers/binary.py b/web_widgets/controllers/binary.py
deleted file mode 100644
index 6bc6c565e..000000000
--- a/web_widgets/controllers/binary.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import os
-import logging
-
-from odoo import SUPERUSER_ID, _, http
-from odoo.exceptions import AccessError, MissingError, ValidationError
-from odoo.fields import Command
-from odoo.http import request
-
-from odoo.addons.web.controllers.binary import Binary
-from odoo.exceptions import AccessError, UserError
-from odoo.tools import file_open, file_path, replace_exceptions
-
-
-_logger = logging.getLogger(__name__)
-
-
-class WebWidgetBinary(Binary):
-
- @http.route(
- ["/ 获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。 生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是H5应用调用企业微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限(一小时内,一个企业最多可获取400次,且单个应用不能超过100次),频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket。
- API域名IP即qyapi.weixin.qq.com的解析地址,由开发者调用企业微信端的接入IP。如果企业需要做防火墙配置,那么可以通过这个接口获取到所有相关的IP段。IP段有变更可能,当IP段变更时,新旧IP段会同时保留一段时间。建议企业每天定时拉取IP段,更新防火墙设置,避免因IP段变更导致网络不通。 在通讯录同步助手中此接口可以读取企业通讯录的所有成员的信息,而自建应用可以读取该应用设置的可见范围内的成员信息。 应用只能获取可见范围内的成员信息,且每种应用获取的字段有所不同,在返回结果说明中会逐个说明。企业通讯录安全特别重要,企业微信将持续升级加固通讯录接口的安全机制,以下是关键的变更点: 仅通讯录同步助手或第三方通讯录应用可调用。
- 企业通讯录安全特别重要,企业微信将持续升级加固通讯录接口的安全机制,以下是关键的变更点:: 应用只能获取可见范围内的成员信息,且每种应用获取的字段有所不同,在返回结果说明中会逐个说明。企业通讯录安全特别重要,企业微信持续升级加固通讯录接口的安全机制,以下是关键的变更点: 该接口使用场景为企业支付,在使用企业红包和向员工付款时,需要自行将企业微信的userid转成openid。 该接口主要应用于使用企业支付之后的结果查询。
- 企业可通过接口批量邀请成员使用企业微信,邀请后将通过短信或邮件下发通知。 支持企业用户获取实时成员加入二维码。 通过手机号获取其所对应的userid。 当企业当前授权模式为成员授权时,可调用该接口获取成员授权列表。 当企业当前授权模式为成员授权时,可调用该接口查询成员用户是否已授权。 当企业以成员授权的方式安装了第三方应用,成员在企业微信终端通过选人jsapi选择通讯录,应用获取到selectedTicket后,可调用该接口获取SelectedTicket对应的用户open_userid列表。 将自建应用或代开发应用获取的userid转换为第三方应用的userid 通过邮箱获取其所对应的userid。 获取企业成员的open_userid与对应的部门ID列表。 企业通讯录安全特别重要,企业微信将持续升级加固通讯录接口的安全机制,以下是关键的变更点: 企业通讯录安全特别重要,企业微信将持续升级加固通讯录接口的安全机制,以下是关键的变更点:
-本接口以userid(帐号)为主键,增量更新企业微信通讯录成员。请先下载CSV模板(下载增量更新成员模版),根据需求填写文件内容。^~t{&&bIn+r0E?q?y0~GyG|V0ZQb1!o4ZdHc2tT~R-&YhA?=9@vEn$w=o@9t
z09v`txgq%BRQlc7cd75*puo3^{#oa<5K|>y
Q>@
z^0Rv!<)4x-5}8{(Ljvyl%H3^#Q5-G!O!6Ke>XdoLmoFe;(`KoJihQ+}7_hDw0T
zoL1Phps0QD>&^H@(0La!uwKl7^zDUWdEtH@jb*~q4@2QU75#z&=MIfy-vQf{-tc}(
zs(2#~04(rhi?!a6;gBWI0AsP|p
z9pO@}p~;BTG@6cTHuZR#NO!YWmSYYUP%pfMZFqo3M;(<>7ER&WMDTSQ%5)L$ZvGj6
zz*!z6{i%RG_;$+259l7eMP3?7chYbgK{M!H8iFPsMT2MQWQlNI|n%G5ZeG90gLtgDWM<{6vP_-SeU{Qu|0>2iG+q=;d9n}Zk@w6Wrpns|_%
zut_FU
因此开发者,在使用业务接口前,要明确access_token的颁发来源,使用正确的access_token。
-
-
若是绑定了腾讯企业邮,则会同时删除邮箱帐号。
-
-
-
-
-
-
- 注:需要成员使用微信登录企业微信或者关注微信插件(原企业号)才能转成openid;
- 如果是外部联系人,请使用 外部联系人openid转换转换openid
-
开发者需要知道某个结果事件的openid对应企业微信内成员的信息时,可以通过调用该接口进行转换查询。
-
-
-
-
-
注意事项:
-
-
-
-
-本接口以userid为主键,全量覆盖企业的通讯录成员,任务完成后企业的通讯录成员与提交的文件完全保持一致。请先下载CSV文件(下载全量覆盖成员模版),根据需求填写文件内容。
-
注意事项:
-
-
-本接口以partyid为键,全量覆盖企业的通讯录组织架构,任务完成后企业的通讯录组织架构与提交的文件完全保持一致。请先下载CSV文件(下载全量覆盖部门模版),根据需求填写文件内容。
-
注意事项:
-
-
本接口只返回互联企业中非本企业内的成员和部门的信息,如果要获取本企业的可见范围,请调用“获取应用”接口
-企业和第三方服务商可通过此接口获取配置了客户联系功能的成员列表。
-企业可以在管理后台-客户联系-加客户中配置成员的「联系我」的二维码或者小程序按钮,客户通过扫描二维码或点击小程序上的按钮,即可获取成员联系方式,主动联系到成员。
- 企业可通过此接口为具有客户联系功能的成员生成专属的「联系我」二维码或者「联系我」按钮。
如果配置的是「联系我」按钮,需要开发者的小程序接入小程序插件。
-
注意:
- 通过API添加的「联系我」不会在管理端进行展示,每个企业可通过API最多配置50万个「联系我」。
- 用户需要妥善存储返回的config_id,config_id丢失可能导致用户无法编辑或删除「联系我」。
- 临时会话模式不占用「联系我」数量,但每日最多添加10万个,并且仅支持单人。
- 临时会话模式的二维码,添加好友完成后该二维码即刻失效。
-
获取企业配置的「联系我」二维码和「联系我」小程序按钮。
-获取企业配置的「联系我」二维码和「联系我」小程序插件列表。不包含临时会话。
-注意,该接口仅可获取2021年7月10日以后创建的「联系我」
-更新企业配置的「联系我」二维码和「联系我」小程序按钮中的信息,如使用人员和备注等。
-删除一个已配置的「联系我」二维码或者「联系我」小程序按钮。
-将指定的企业成员和客户之前的临时会话断开,断开前会自动下发已配置的结束语。
-企业可通过此接口获取指定成员添加的客户列表。客户是指配置了客户联系功能的成员所添加的外部联系人。没有配置客户联系功能的成员,所添加的外部联系人将不会作为客户返回。
-企业可通过此接口,根据外部联系人的userid,拉取客户详情。
-企业/第三方可通过此接口获取指定成员添加的客户信息列表。
-企业可通过此接口修改指定用户添加的客户的备注信息。
-企业可通过此接口获取企业配置的所有客户规则组id列表。
-企业可以通过此接口获取某个客户规则组的详细信息。
-企业可通过此接口获取某个客户规则组管理的成员和部门列表
-企业可通过此接口创建一个新的客户规则组。该接口仅支持串行调用,请勿并发创建规则组。
-企业可通过此接口编辑规则组的基本信息和修改客户规则组管理范围。该接口仅支持串行调用,请勿并发修改规则组。
-企业可通过此接口删除某个规则组。
-企业可通过此接口获取企业客户标签详情。
-企业可通过此接口向客户标签库中添加新的标签组和标签,每个企业最多可配置3000个企业标签。
-企业可通过此接口编辑客户标签/标签组的名称或次序值。
-企业可通过此接口删除客户标签库中的标签,或删除整个标签组。
-企业可通过此接口获取某个规则组内的企业客户标签详情
-企业可通过此接口向规则组中添加新的标签组和标签, 每个企业的企业标签和规则组标签合计最多可配置3000个。注意, 仅可在一级规则组下添加标签。 -
-企业可通过此接口编辑指定规则组下的客户标签/标签组的名称或次序值,但不可重新指定标签/标签组所属规则组。 -
-企业可通过此接口删除某个规则组下的标签,或删除整个标签组。
-企业可通过此接口为指定成员的客户添加上由企业统一配置的标签
-企业可通过此接口,转接在职成员的客户给其他成员。
-企业和第三方可通过此接口查询在职成员的客户转接情况。
-企业和第三方可通过此接口,获取所有离职成员的客户列表,并可进一步调用分配离职成员的客户接口将这些客户重新分配给其他企业成员。
-企业可通过此接口,分配离职成员的客户给其他成员
-企业和第三方可通过此接口查询离职成员的客户分配情况
-企业可通过此接口,将已离职成员为群主的群,分配给另一个客服成员。
-该接口用于获取配置过客户群管理的客户群列表。
-通过客户群ID,获取详情。包括群名、群成员列表、群成员入群时间、入群方式。(客户群是由具有客户群使用权限的成员创建的外部群)
-需注意的是,如果发生群信息变动,会立即收到群变更事件,但是部分信息是异步处理,可能需要等一段时间调此接口才能得到最新结果
-用户在微信里的客户群里打开小程序时,某些场景下可以获取到群的opengid,如果该群是企业微信的客户群,则企业或第三方可以调用此接口将一个opengid转换为客户群chat_id
-企业可以在管理后台-客户联系-加客户中配置成员的「联系我」的二维码或者小程序按钮,客户通过扫描二维码或点击小程序上的按钮,即可获取成员联系方式,主动联系到成员。
-企业可通过此接口为具有客户联系功能的成员生成专属的「联系我」二维码或者「联系我」按钮。
-如果配置的是「联系我」按钮,需要开发者的小程序接入小程序插件。
- -注意:
-通过API添加的「联系我」不会在管理端进行展示,每个企业可通过API最多配置50万个「联系我」。 -
-用户需要妥善存储返回的config_id,config_id丢失可能导致用户无法编辑或删除「联系我」。 -
-临时会话模式不占用「联系我」数量,但每日最多添加 10万个,并且仅支持单人。 -
-临时会话模式的二维码,添加好友完成后该二维码即刻失效。
-获取企业配置的「联系我」二维码和「联系我」小程序按钮。
-获取企业配置的「联系我」二维码和「联系我」小程序插件列表。不包含临时会话。
-注意, 该接口仅可获取2021年7月10日以后创建的「联系我」 -
-更新企业配置的「联系我」二维码和「联系我」小程序按钮中的信息,如使用人员和备注等。
-删除一个已配置的「联系我」二维码或者「联系我」小程序按钮。
-将指定的企业成员和客户之前的临时会话断开,断开前会自动下发已配置的结束语。
-企业可以在管理后台-客户联系中配置「加入群聊」的二维码或者小程序按钮,客户通过扫描二维码或点击小程序上的按钮,即可加入特定的客户群
-企业可以在管理后台-企业可通过此接口为具有客户联系功能的成员生成专属的二维码或者小程序按钮。
-企业可以在管理后台-如果配置的是小程序按钮,需要开发者的小程序接入小程序插件。
-- 注意: -
-- 通过API添加的配置不会在管理端进行展示,每个企业可通过API最多配置50万个「加入群聊」(与「联系我」共用50万的额度)。 -
-获取企业配置的群二维码或小程序按钮。
-更新进群方式配置信息。注意:使用覆盖的方式更新。
-删除一个进群方式配置。
-企业和第三方应用可通过该接口创建客户朋友圈的发表任务。
-由于发表任务的创建是异步执行的,应用需要再调用该接口以获取创建的结果。
-企业和第三方应用可通过该接口获取企业全部的发表内容。
-企业和第三方应用可通过该接口获取企业发表的朋友圈成员执行情况
-企业和第三方应用可通过该接口获取客户朋友圈创建时,选择的客户可见范围
-企业和第三方应用可通过该接口获取客户朋友圈发表后,可在微信朋友圈中查看的客户列表
-企业和第三方应用可通过此接口获取客户朋友圈的互动数据。
-企业可通过此接口获取企业配置的所有客户朋友圈规则组id列表。
-企业可以通过此接口获取某个客户朋友圈规则组的详细信息。
-企业可通过此接口获取某个朋友圈规则组管理的成员和部门列表
-企业可通过此接口创建一个新的客户朋友圈规则组。该接口仅支持串行调用,请勿并发创建规则组。
-企业可通过此接口编辑规则组的基本信息和修改客户朋友圈规则组管理范围。该接口仅支持串行调用,请勿并发修改规则组。
-企业可通过此接口删除某个客户朋友圈规则组。
-企业跟第三方应用可通过此接口添加企业群发消息的任务并通知成员发送给相关客户或客户群。(注:企业微信终端需升级到2.7.5版本及以上
-- 注意:调用该接口并不会直接发送消息给客户/客户群,需要成员确认后才会执行发送(客服人员的企业微信需要升级到2.7.5及以上版本 -
-- 旧接口创建企业群发已经废弃,接口升级后支持发送视频文件,并且支持最多同时发送9个附件。 -
-- 仅会推送给最后跟客户进行聊天互动的企业成员。 -
-每位客户/每个客户群每天可接收1条群发消息,可以是企业统一创建发送的,也可以是成员自己创建发送的;超过接收上限的客户/客户群将无法再收到群发消息。
-企业和第三方应用可通过此接口获取企业与成员的群发记录。
--
企业可通过此API向企业的入群欢迎语素材库中添加素材。每个企业的入群欢迎语素材库中,最多容纳100个素材。
-企业可通过此API编辑入群欢迎语素材库中的素材,且仅能够编辑调用方自己创建的入群欢迎语素材
-企业可通过此API获取入群欢迎语素材。
-企业可通过此API删除入群欢迎语素材,且仅能删除调用方自己创建的入群欢迎语素材。
-企业可通过此接口获取成员联系客户的数据,包括发起申请数、新增客户数、聊天数、发送消息数和删除/拉黑成员的客户数等指标。
-按群主聚合的方式获取指定日期的统计数据。注意,企业微信仅存储180天的数据。
-按自然日聚合的方式获取指定日期的统计数据。注意,企业微信仅存储180天的数据。
-企业和第三方应用可以通过此接口增加商品
-企业和第三方应用可以通过此接口获取商品信息
-企业和第三方应用可以通过此接口导出商品
-企业和第三方应用可以通过此接口修改商品信息
-企业和第三方应用可以通过此接口删除商品信息
-企业和第三方应用可以通过此接口新建敏感词规则
-企业和第三方应用可以通过此接口获取敏感词规则列表
-企业和第三方应用可以通过此接口获取敏感词规则详情
-企业和第三方应用可以通过此接口修改敏感词规则
-企业和第三方应用可以通过此接口修改敏感词规则
-素材上传得到media_id,该media_id仅三天内有效
-media_id在同一企业内应用之间可以共享
-添加客服帐号,并可设置客服名称和头像。目前一家企业最多可添加 5000个客服帐号。 -
-删除已有的客服帐号
-修改已有的客服帐号,可修改客服名称和头像。
-获取客服帐号列表,包括所有的客服帐号的客服ID、名称和头像。
-企业可通过此接口获取带有不同参数的客服链接,不同客服帐号对应不同的客服链接。获取后,企业可将链接嵌入到网页等场景中,微信用户点击链接即可向对应的客服帐号发起咨询。企业可依据参数来识别用户的咨询来源等。
-添加指定客服帐号的接待人员,每个客服帐号目前最多可添加 2000个接待人员, 20个部门。 -
-从客服帐号删除接待人员
-获取某个客服帐号的接待人员列表
-微信客户发送的消息、接待人员在企业微信回复的消息、发送消息接口发送失败事件(如被用户拒收)、客户点击菜单消息的回复消息,可以通过该接口获取具体的消息内容和事件。不支持读取通过发送消息接口发送的消息。
-支持的消息类型:文本、图片、语音、视频、文件、位置、链接、名片、小程序、菜单、事件。
-当微信客户处于“新接入待处理”或“由智能助手接待”状态下,可调用该接口给用户发送消息。
-注意仅当微信客户在主动发送消息给客服后的48小时内,企业可发送消息给客户,最多可发送5条消息;若用户继续发送消息,企业可再次下发消息。
-支持发送消息类型:文本、图片、语音、视频、文件、图文、小程序、菜单消息、地理位置。
-目前该接口允许下发消息条数和下发时限如下:
--
| 用户动作 | -允许下发条数限制 | -下发时限 | -
|---|---|---|
| 用户发送消息 | -5条 | -48 小时 | -
当特定的事件回调消息包含code字段,或通过接口变更到特定的会话状态,会返回code字段
-开发者可以此code为凭证,调用该接口给用户发送相应事件场景下的消息,如客服欢迎语、客服提示语和会话结束语等。
-除"用户进入会话事件"以外,响应消息仅支持会话处于获取该code的会话状态时发送,如将会话转入待接入池时获得的code仅能在会话状态为”待接入池排队中“时发送。
- -目前支持的事件场景和相关约束如下:
--
| 事件场景 | -允许下发条数 | -code有效期 | -支持的消息类型 | -获取code途径 | -
|---|---|---|---|---|
| 用户进入会话,用于发送客服欢迎语 | -1条 | -20秒 | -文本、菜单 | -事件回调 | -
| 进入接待池,用于发送排队提示语等 | -1条 | -48小时 | -文本 | -转接会话接口 | -
| 从接待池接入会话,用于发送非工作时间的提示语或超时未回复的提示语等 | -1条 | -48小时 | -文本 | -事件回调、转接会话接口 | -
| 结束会话,用于发送结束会话提示语或满意度评价等 | -1条 | -20秒 | -文本、菜单 | -事件回调、转接会话接口 | -
企业需要在管理后台或移动端中的「微信客服」-「升级服务」中,配置专员和客户群。该接口提供获取配置的专员与客户群列表的能力。
-企业可通过其他接口获知客户的 external_userid 以及客户与接待人员的聊天内容,因此可以结合实际业务场景,为客户推荐指定的服务专员或客户群。
-通过该 API 为客户指定专员或客户群后,接待人员可在企业微信中,见到特殊的状态提示(Windows 为 icon 样式变化,移动端为出现一条 bar ),便于接待人员知晓企业的指定动作。
-
-
-
当企业通过 API 为客户指定了专员或客户群后,如果客户已经完成服务升级,或是企业需要取消推荐,则可调用该接口清空之前为客户指定的专员或客户群。清空后,企业微信中的特殊状态提示也会同步消失。
-通过此接口,可以获取咨询会话数、咨询客户数等企业汇总统计数据
-通过此接口,可获取接入人工会话数、咨询会话数等与接待人员相关的统计信息
-该接口用于根据code获取成员信息
-自建应用与代开发应用可通过该接口获取成员授权的敏感字段
-应用的jsapi_ticket用于计算agentConfig(参见“通过agentConfig注入应用的权限”)的签名,签名计算方法与上述介绍的config的签名算法完全相同,但需要注意以下区别:
-正常情况下, 应用的jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限(一小时内,每个应用不能超过100次),频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存应用的jsapi_ticket。 -
-对于互联企业的应用,如果需要获取应用可见范围内其他互联企业的部门与成员,请调用互联企业-获取应用可见范围接口
-自定义菜单接口可实现多种类型按钮,如下:
--
| 字段值 | -功能名称 | -说明 | -
|---|---|---|
| click | -点击推事件 | -成员点击click类型按钮后,企业微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与成员进行交互; | -
| view | -跳转URL | -成员点击view类型按钮后,企业微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取成员基本信息接口结合,获得成员基本信息。 - | -
| scancode_push | -扫码推事件 | -成员点击按钮后,企业微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可用于下发消息。 | -
| scancode_waitmsg | -扫码推事件 且弹出“消息接收中”提示框 | -成员点击按钮后,企业微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息。 | -
| pic_sysphoto | -弹出系统拍照发图 | -弹出系统拍照发图 成员点击按钮后,企业微信客户端将调起系统相机,完成拍照操作后,会将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息。 | -
| pic_photo_or_album | -弹出拍照或者相册发图 | -成员点击按钮后,企业微信客户端将弹出选择器供成员选择“拍照”或者“从手机相册选择”。成员选择后即走其他两种流程。 | -
| pic_weixin | -弹出企业微信相册发图器 | -成员点击按钮后,企业微信客户端将调起企业微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息。 | -
| location_select | -弹出地理位置选择器 | -成员点击按钮后,企业微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息。 | -
| view_miniprogram | -跳转到小程序 | -成员点击按钮后,企业微信客户端将会打开开发者在按钮中配置的小程序 | -
请求说明:该接口指定应用自定义模版类型。同时也支持设置企业默认模版数据。若type指定为 "normal" 则为取消自定义模式,改为普通展示模式
-应用支持推送文本、图片、视频、文件、图文等类型。
-应用可以发送模板卡片消息,发送之后可再通过接口更新可回调的用户任务卡片消息的替换文案信息(仅原卡片为 按钮交互型、投票选择型、多项选择型的卡片以及填写了action_menu字段的文本通知型、图文展示型可以调用本接口更新)。
-请注意,当应用调用发送模版卡片消息后,接口会返回一个response_code,通过response_code用户可以调用本接口一次。后续如果有用户点击任务卡片,回调接口也会带上response_code,开发者通过该code也可以调用本接口一次,注意response_code的有效期是24小时,超过24小时后将无法使用。
-应用支持推送文本、图片、视频、文件、图文等类型。
-互联企业是企业微信提供的满足集团与子公司、企业与上下游供应商进行连接的功能,企业可以共享通讯录以及应用给互联企业,如需要,你可以前往管理后台-通讯录创建互联企业,之后你可以在自建应用的可见范围设置互联企业的通讯录;此接口主要满足开发者给互联企业成员推送消息的诉求。
-学校可以通过此接口来给家长发送不同类型的学校通知,来满足多种场景下的学校通知需求。目前支持的消息类型为文本、图片、语音、视频、文件、图文。。
-素材上传得到media_id,该media_id仅三天内有效
-media_id在同一企业内应用之间可以共享
-上传图片得到图片URL,该URL永久有效
-返回的图片URL,仅能用于图文消息正文中的图片展示,或者给客户发送欢迎语等;若用于非企业微信环境下的页面,图片将被屏蔽。
-每个企业每月最多可上传3000张图片,每天最多可上传1000张图片
-可以使用本接口获取从JSSDK的uploadVoice接口上传的临时语音素材,格式为speex,16K采样率。该音频比上文的临时素材获取接口(格式为amr,8K采样率)更加清晰,适合用作语音识别等对音质要求较高的业务。
-企业可通过打卡应用Secret调用本接口,获取企业内所有打卡规则数据。
-企业可通过打卡应用Secret获取的token,获取指定员工指定日期的打卡规则
-第三方应用可获取应用可见范围内指定员工指定日期的打卡规则
-企业可通过打卡应用Secret调用本接口,获取指定员工指定时间段内的打卡记录数据。
-第三方应用可获取应用可见范围内指定员工指定日期的打卡记录数据。
-企业可通过打卡应用Secret调用本接口,获取指定员工指定时间段内的打卡日报统计数据。
-第三方应用可获取应用可见范围内指定员工指定日期内的打卡日报统计数据。
-企业可通过打卡应用Secret调用本接口,获取指定员工指定时间段内的打卡月报统计数据
-第三方应用可获取应用可见范围内指定员工指定日期内的打卡月报统计数据。
-企业可通过打卡应用Secret调用本接口,获取打卡规则为“按班次上下班”规则的指定员工指定时间段内的排班信息。
-第三方应用获取应用可见范围内、打卡规则为“按班次上下班”规则的指定员工指定时间段内的排班信息。
-企业可通过打卡应用Secret调用本接口,为打卡规则为“按班次上下班”规则的指定员工排班。
-第三方应用可通过本接口为应用可见范围内、打卡规则为“按班次上下班”规则的指定员工排班。
-企业可通过打卡应用Secret调用本接口,为企业打卡人员录入人脸信息,人脸信息仅用于人脸打卡
-可通过此接口,获取考勤设备上产生的所有原始打卡记录,包括未被打卡应用记录的不符合打卡规则的记录。
-第三方应用可获取应用可见范围内员工在考勤设备上产生的所有原始打卡记录,包括未被打卡应用记录的不符合打卡规则的记录。
-企业可通过审批应用或自建应用Secret调用本接口,获取企业微信“审批应用”内指定审批模板的详情。
-企业可通过审批应用或自建应用Secret调用本接口,代应用可见范围内员工在企业微信“审批应用”内提交指定类型的审批申请。
-审批应用及有权限的自建应用,可通过Secret调用本接口,以获取企业一段时间内企业微信“审批应用”单据的审批编号,支持按模板类型、申请人、部门、申请单审批状态等条件筛选。
-自建应用调用此接口,需在“管理后台-应用管理-审批-API-审批数据权限”中,授权应用允许提交审批单据。
- -一次拉取调用最多拉取100个审批记录,可以通过多次拉取的方式来满足需求,但调用频率不可超过600次/分。
-推荐使用此接口获取审批数据,旧接口后续将不再维护。
-企业可通过审批应用或自建应用Secret调用本接口,根据审批单号查询企业微信“审批应用”的审批申请详情。
-企业可通过审批应用或自建应用Secret调用本接口,获取可见范围内员工的“假期管理”配置,包括:各个假期的id、名称、请假单位、时长计算方式、发放规则等。
-第三方应用可获取应用可见范围内员工的“假期管理”配置,包括:各个假期的id、名称、请假单位、时长计算方式、发放规则等。
-企业可通过审批应用或自建应用Secret调用本接口,获取可见范围内各个员工的假期余额数据。
-第三方应用可获取应用可见范围内各个员工的假期余额数据。
-企业可通过审批应用或自建应用Secret调用本接口,修改可见范围内员工的“假期余额”。
-第三方应用可通过应本接口修改应用可见范围内指定员工的“假期余额”。
-企业可通过access_token调用本接口,以获取企业一段时间内企业微信“汇报应用”汇报记录编号,支持按汇报表单ID、申请人、部门等条件筛选。
- -一次拉取调用最多拉取100个汇报记录,可以通过多次拉取的方式来满足需求,但调用频率不可超过600次/分。
-表单ID的获取方式:
-管理后台--汇报应用--某个汇报的内容设置页--点击“汇报名称”,即可获取
-
-
-
企业可通过access_token调用本接口,根据汇报记录单号查询企业微信“汇报应用”的汇报详情。
-企业可通过access_token调用本接口,根据汇报表单id查询企业微信“汇报应用”的汇报统计汇总信息。该接口只能拉取到已经汇总的统计数据,对于尚未完成汇总的周期不会返回。
-开发者也可主动查询审批单的当前审批状态。
-企业可通过此接口添加一个会议室。
-企业可通过此接口查询满足条件的会议室。
-企业可通过此接口编辑相关会议室的基本信息。
-企业可通过此接口删除指定的会议室。
-企业可通过此接口查询相关会议室在指定时间段的预定情况,如是否已被预定,预定者的userid等信息,不支持跨天查询。 -
-企业可通过此接口预定会议室并自动关联日程。
-企业可通过此接口按照会议ID查询相关会议室的预定情况
-通过此接口发起语音电话,提醒员工查看应用推送的重要消息。
-通过此接口,了解员工是否已接听语音电话。
-该接口用于在微盘内新建空间,可以指定人创建空间。
-该接口用于重命名已有空间,接收userid参数,以空间管理员身份来重命名。
-该接口用于解散已有空间,需要以空间管理员身份来解散。
-该接口用于获取空间成员列表、信息、权限等信息。
-该接口用于对指定空间添加成员/部门,可一次性添加多个。
-该接口用于对指定空间移除成员/部门,操作者需要有移除权限。
-该接口用于修改空间权限,需要传入userid,修改权限范围继承传入用户的权限范围。
-该接口用于获取空间邀请分享链接。
-该接口用于获取指定地址下的文件列表。
-该接口用于向微盘中的指定位置上传文件。
-该接口用于下载文件,请求的userid需有下载权限
-该接口用于在微盘指定位置新建文件、微文档。
-该接口用于对指定文件进行重命名。
-该接口用于将文件移动到指定位置。
-该接口用于删除指定文件。
-该接口用于获取指定文件的信息。
-该接口用于对指定文件添加指定人/部门。
-该接口用于删除指定文件的指定人/部门。
-该接口用于文件的分享设置。
-该接口用于获取文件的分享链接
-企业可通过此接口,按时间范围拉取成功接通的公费电话拨打记录。
-使用该接口时需要开通对外收款能力并绑定第一个商户号。(说明:第一个商户号的绑定需要由企业管理员手动绑定,绑定入口在:手机端工作台-对外收款,或管理后台-应用管理-对外收款-启用)
-通过该接口可以导入其他商户号,同一个企业最多绑定5000个商户号。
-通过该接口可以查询已绑定商户号信息以及商户号使用范围
-通过该接口可以删除未绑定的商户号
-通过该接口可以设置已绑定商户号的使用范围
-企业和服务商可通过此接口获取企业的对外收款记录。
-上级/上游企业通过该接口可以获取某个应用分享给的所有企业列表。
-对于有敏感权限的应用,需要下级/下游企业确认后才能共享成功,若下级/下游企业未确认,则不会存在于该接口的返回列表
-获取应用可见范围内下级/下游企业的access_token,该access_token可用于调用下级/下游企业通讯录的只读接口。
-上级/上游企业通过该接口转换为下级/下游企业的小程序session
-企业可通过下述接口,获取会话中外部成员的同意情况
-企业可通过下述接口,获取会话中外部成员的同意情况
-企业可通过此接口,获取会话内容存档本企业的内部群信息,包括群名称、群主id、公告、群创建时间以及所有群成员的id与加入时间
-V^^xf;
zCBa?wT0&)&nT-R5T?R3oPZsJUGN0xd@rB
- Fill in the "Corp ID", "AgentId" and "Secret" that require authentication and authorization, and use the domain name to access,
-
- Click the button "One-click to set up WeCom OAuth"
-
-
- Fill in the "Corp ID", "AgentId" and "Secret" that require authentication and authorization, and use the domain name to access,
-
- Click the button "One-click to set up WeCom OAuth"
-
-
- Click to add a new user.
-
-
- }p@!#ArIdkt_)EiD!T`4wYo7WS1P5*eu_7Mzv+H`28
zUgdTzr2y-Npb~DZYCJofLu2XVNfo!LY$NsRD*_EdUi?6bB=)3tqsj4&3#J}}t+(vR
z0X{aoBYX4omB695b06~`UiR2aJ{1_Is24hXFE%yG)wg_tYON^$6j+4E<895y4JyF6
zSVnSg2Ni&zY-Bt7mg9-f!S0(tD4niEP
\n"
-" For debugging"
-msgstr ""
-"启用, 在IED和Odoo日志中显示日志;\n"
-"
\n"
-" 于调试"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_subtype__code
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_type__code
-msgid "Code"
-msgstr "代码"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_app_event_type_form
-msgid "Code and Command"
-msgstr "代码和指令"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_app_subtype.py:0
-#: code:addons/wecom_base/models/wecom_app_type.py:0
-#: model:ir.model.constraint,message:wecom_base.constraint_wecom_app_subtype_code_uniq
-#: model:ir.model.constraint,message:wecom_base.constraint_wecom_app_type_code_uniq
-#, python-format
-msgid "Code must be unique !"
-msgstr "代码必须是唯一的!"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__command
-msgid "Command"
-msgstr "指令"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_res_company
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "Companies"
-msgstr "公司"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__company_id
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__company_id
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_filter
-msgid "Company"
-msgstr "公司"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__company_name
-msgid "Company Name"
-msgstr "公司名称"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_res_config_settings
-msgid "Config Settings"
-msgstr "配置设置"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_res_partner
-msgid "Contact"
-msgstr "通讯录"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_contacts_management
-msgid "Contacts management"
-msgstr "通讯录管理"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_company__corpid
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__corpid
-msgid "Corp ID"
-msgstr "企业Id"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_company__corp_jsapi_ticket
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__corp_jsapi_ticket
-msgid "Corp JSAPI Ticket"
-msgstr "公司JSAPI临时凭证"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_callback_service__create_uid
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__create_uid
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__create_uid
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_subtype__create_uid
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_type__create_uid
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__create_uid
-msgid "Created by"
-msgstr "创建者"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_callback_service__create_date
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__create_date
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__create_date
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_subtype__create_date
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_type__create_date
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__create_date
-msgid "Created on"
-msgstr "创建时间"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_customer_contact
-msgid "Customer contact"
-msgstr "客户联系"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_callback_service__description
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__description
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__description
-msgid "Description"
-msgstr "应用详情"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid ""
-"Developers need to cache access_token for subsequent interface calls (note: gettoken "
-"interfaces cannot be called frequently or are frequently blocked). When access_token "
-"expires or expires, it needs to be re-acquired."
-msgstr ""
-"开发者需要缓存access_token,用于后续接口的调用(注意:不能频繁调用gettoken接口,否则会受"
-"到频率拦截)。当access_token失效或过期时,需要重新获取。"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__close
-msgid "Disabled"
-msgstr "停用"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_callback_service__display_name
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__display_name
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__display_name
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_subtype__display_name
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_type__display_name
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__display_name
-msgid "Display Name"
-msgstr "显示名称"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid ""
-"Each app has a separate access_token can only be used by this app, so the access_token "
-"for each app should be obtained separately"
-msgstr ""
-"每个应用有独立的secret,获取到的access_token只能本应用使用,所以每个应用的access_token应"
-"该分开来获取"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_efficiency_tools_calendar
-msgid "Efficiency tools:Calendar"
-msgstr "效率工具:日程"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_efficiency_tools_exmail
-msgid "Efficiency tools:Corporate email"
-msgstr "效率工具:企业邮箱"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_efficiency_tools_living
-msgid "Efficiency tools:Living"
-msgstr "效率工具:直播"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_efficiency_tools_dial
-msgid "Efficiency tools:Public telephone"
-msgstr "效率工具:公费电话"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_efficiency_tools_wedrive
-msgid "Efficiency tools:We Drive"
-msgstr "效率工具:微盘"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.wecom_service_api_error_tree
-msgid "Error"
-msgstr "错误"
-
-#. module: wecom_base
-#: model:ir.actions.act_window,name:wecom_base.action_view_wecom_service_api_error
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_service_api_error
-msgid "Error Code"
-msgstr "错误代码"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_service_api_error_filter
-msgid "Errors"
-msgstr "错误"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__event
-msgid "Event Code"
-msgstr "事件代码"
-
-#. module: wecom_base
-#: model:ir.actions.act_window,name:wecom_base.action_view_wecom_app_event_type_list
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_agent_event_type
-msgid "Event Type"
-msgstr "事件类型"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_company__corp_jsapi_ticket_expiration_time
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__corp_jsapi_ticket_expiration_time
-msgid "Expiration time of Corp JSAPI ticket"
-msgstr "企微JSAPI临时凭证的有效时间"
-
-#. module: wecom_base
-#: model:wecom.app.type,name:wecom_base.wecom_app_type_external_contact
-msgid "External contact"
-msgstr "外部联系"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__ttype
-msgid "Field Type"
-msgstr "字段类型"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_app_event_type.py:0
-#, python-format
-msgid "Function [%s] does not exist in model [%s]"
-msgstr "模型[%s]中不存在函数[%s]"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_app_callback_service_form
-msgid "Generate contact service"
-msgstr "生成通讯录服务"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid "Generate parameters"
-msgstr "生成参数"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid "Generate service"
-msgstr "生成服务"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid "Get Access Token"
-msgstr "获取访问令牌"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid "Get JSAPI Ticket"
-msgstr "获取JSAPI临时凭证"
-
-#. module: wecom_base
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_app_get_token
-msgid "Get app token"
-msgstr "获取应用令牌"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid "Get application"
-msgstr "获取应用"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid ""
-"Get the [Code Name] and [Troubleshooting Method] of the global error code through the "
-"code"
-msgstr "通过路径代码获取全局错误代码的[代码号]和[排查方法]"
-
-#. module: wecom_base
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_service_api_error_get
-msgid "Get the global error code"
-msgstr "获取全局错误代码"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid ""
-"Getting access_token is the first step in calling the Wecom API interface, which is "
-"equivalent to creating a login credential, and other business API interfaces all need to "
-"rely on access_token to authentice the caller's identity."
-msgstr ""
-"获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接"
-"口,都需要依赖于access_token来鉴权调用者身份。"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__global_error_code_item_selection_code
-msgid "Global error code item selection code"
-msgstr "全局错误代码项路径选择代码"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__global_error_code_url
-msgid "Global error code page URL"
-msgstr "全局错误代码页URL"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_filter
-msgid "Group By"
-msgstr "分组"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_ir_http
-msgid "HTTP Routing"
-msgstr "HTTP 路由"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__home_url
-msgid "Home page"
-msgstr "首页"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_callback_service__id
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__id
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__id
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_subtype__id
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_type__id
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__id
-msgid "ID"
-msgstr ""
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__jsapi_ticket
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid "JSAPI Ticket"
-msgstr "JSAPI临时凭证"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__jsapi_ticket_expiration_time
-msgid "JSAPI Ticket Expiration Time"
-msgstr "JSAPI临时凭证有效时间"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__key
-msgid "Key"
-msgstr "键"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_callback_service__write_uid
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__write_uid
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__write_uid
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_subtype__write_uid
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_type__write_uid
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__write_uid
-msgid "Last Updated by"
-msgstr "最后更新人"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_callback_service__write_date
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__write_date
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__write_date
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_subtype__write_date
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_type__write_date
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__write_date
-msgid "Last Updated on"
-msgstr "最后修改时间"
-
-#. module: wecom_base
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_service_api_list
-msgid "List"
-msgstr "列表"
-
-#. module: wecom_base
-#: model:wecom.app.type,name:wecom_base.wecom_app_type_manage
-msgid "Manage Tools"
-msgstr "管理工具"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "Manage all companies"
-msgstr "管理所有公司"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_material_management
-msgid "Material management"
-msgstr "素材管理"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__msg_type
-msgid "Message Type"
-msgstr "消息的类型"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_message_push
-msgid "Message push"
-msgstr "消息推送"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_app_event_type.py:0
-#, python-format
-msgid "Method [%s] to execute model [%s]"
-msgstr "执行模型 [%s] 的方法 [%s]"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_ir_module_module
-msgid "Module"
-msgstr "模块"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__name
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__name
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_subtype__name
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_type__name
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__name
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_app_subtype_filter
-msgid "Name"
-msgstr "名称"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid ""
-"Normally, the app's jsapi_ticket is valid for 7200 seconds and is obtained by "
-"access_token. Since the number of API calls to get jsapi_ticket is very limited (each "
-"application cannot exceed 100 times in an hour), frequent refresh jsapi_ticket will "
-"cause the API call to be limited, affecting their own business, and developers must "
-"globally cache the jsapi_ticket of the application in their own services."
-msgstr ""
-"正常情况下,应用的jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取"
-"jsapi_ticket的api调用次数非常有限(一小时内,每个应用不能超过100次),频繁刷新"
-"jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存应用的"
-"jsapi_ticket。"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_oa_approval
-msgid "OA:Approval"
-msgstr "OA:审批"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_oa_checkin
-msgid "OA:Checkin"
-msgstr "OA:打卡"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_oa_journal
-msgid "OA:Journal"
-msgstr "OA:汇报"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_oa_meetingroom
-msgid "OA:Meeting room"
-msgstr "OA:会议室"
-
-#. module: wecom_base
-#: model:res.groups,name:wecom_base.group_wecom_settings_user
-msgid "Officer"
-msgstr "主管"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_apps.py:0
-#, python-format
-msgid "Only one subtype can be selected for the current app type!"
-msgstr "当前应用类型只能选择一个子类型!"
-
-#. module: wecom_base
-#: model:ir.actions.client,name:wecom_base.action_open_wecom_configurator
-msgid "Open Wecom Configurator"
-msgstr "打开企微配置"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__report_location_flag
-msgid "Open the geographic location and report"
-msgstr "打开地理位置上报"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid "Option"
-msgstr "选项"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid "Parameter"
-msgstr "参数"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_subtype__parent_id
-msgid "Parent"
-msgstr "上级"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_app_subtype_filter
-msgid "Parent type"
-msgstr "上级类型"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_app_callback_service.py:0
-#, python-format
-msgid "Please bind contact app!"
-msgstr "请绑定通讯录应用!"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "Please enter the enterprise id"
-msgstr "请输入企微企业ID"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__code
-msgid "Python Code"
-msgstr "Python代码"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__module_web_theme
-msgid "Rainbow Theme"
-msgstr "彩虹主题"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__app_callback_service_ids
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_agent_event_service
-msgid "Receive event service"
-msgstr "接收事件服务"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_app_event_type.py:0
-#, python-format
-msgid "Received the callback notification of Wecom, event [%s], change type [%s]."
-msgstr "已收到企业微信的回调通知,事件[%s],更改类型[%s]。"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_event_type__model_ids
-msgid "Related Model"
-msgstr "关联模型"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__isreportenter
-msgid "Report user entry event"
-msgstr "打开进入会话上报"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__secret
-msgid "Secret"
-msgstr "密钥"
-
-#. module: wecom_base
-#: model:wecom.app.type,name:wecom_base.wecom_app_type_self
-msgid "Self built application"
-msgstr "自建应用"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_subtype__sequence
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_type__sequence
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__sequence
-msgid "Sequence"
-msgstr "排序"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_callback_service__code
-msgid "Service Code"
-msgstr "服务代码"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_callback_service__name
-msgid "Service Name"
-msgstr "服务名称"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_msgaudit
-msgid "Session content archiving"
-msgstr "会话内容存档"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid "Setting method"
-msgstr "设置方法"
-
-#. module: wecom_base
-#: model:ir.actions.act_window,name:wecom_base.wecom_config_settings_action
-msgid "Settings"
-msgstr "设置"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "Settings on this page will apply to this company."
-msgstr "此页面上的设置将应用于此公司。"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_company__short_name
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__short_name
-msgid "Short Name"
-msgstr "公司简称"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__square_logo_url
-msgid "Square Logo"
-msgstr "方形Logo"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_apps.py:0
-#, python-format
-msgid "Start getting app [%s] ticket for company [%s]"
-msgstr "开始获取应用 [%s] 的临时凭证,公司 [%s]"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_apps.py:0
-#, python-format
-msgid "Start getting app [%s] token for company [%s]"
-msgstr "开始为应用 [%s] 的令牌,公司 [%s]"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/res_config_settings.py:0
-#, python-format
-msgid "Start getting ticket for company [%s]"
-msgstr "开始获取公司 [%s] 的临时凭证"
-
-#. module: wecom_base
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_agent_subtype_list
-msgid "SubType"
-msgstr "子类型"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_apps.py:0
-#, python-format
-msgid "Successfully obtained application ticket!"
-msgstr "成功获取到了应用的临时凭证!"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/res_config_settings.py:0
-#, python-format
-msgid "Successfully obtained ticket!"
-msgstr "成功获取到了临时凭证!"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "The URL of the Wecom API global error code page for automatic crawling."
-msgstr "用于自动爬取的企业微信API全局错误代码页面的URL。"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_apps.py:0
-#: model:ir.model.constraint,message:wecom_base.constraint_wecom_apps_company_id_key_uniq
-#, python-format
-msgid "The application name of each company must be unique !"
-msgstr "每个公司的应用程序名称必须是唯一的!"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_app_callback_service.py:0
-#: model:ir.model.constraint,message:wecom_base.constraint_wecom_app_callback_service_app_code_uniq
-#, python-format
-msgid "The code of each application must be unique !"
-msgstr "每个应用的代码必须是唯一的!"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_app_config.py:0
-#: model:ir.model.constraint,message:wecom_base.constraint_wecom_app_config_app_id_key_uniq
-#, python-format
-msgid "The key of each application must be unique !"
-msgstr "每个应用的密钥必须是唯一的!"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid ""
-"The path used to save WeCom resources,Need to have read and "
-"write permissions on the path.\n"
-"
\n"
-" reference:Windows: D:\\\\resources\\\\
\n"
-" Linux or Docker: /var/lib/odoo/resources/"
-msgstr ""
-"用于存储企微资源的路径,需要对路径具有读写权"
-"限。\n"
-"
\n"
-" reference:Windows: D:\\\\resources\\\\
\n"
-" Linux or Docker: /var/lib/odoo/resources/"
-
-#. module: wecom_base
-#: model:res.groups,comment:wecom_base.group_wecom_settings_user
-msgid "The user will be able to approve document created by employees."
-msgstr "用户将能够批准员工创建的文档。"
-
-#. module: wecom_base
-#: model:res.groups,comment:wecom_base.group_wecom_settings_manager
-msgid "The user will have access to the wecom configuration as well as statistic reports."
-msgstr "用户可以访问企微配置以及统计报告。"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_apps_form
-msgid ""
-"Therefore, developers should identify the source of the issuance of access_token and use "
-"the correct access_token before using the business interface."
-msgstr ""
-"因此开发者,在使用业务接口前,要明确access_token的颁发来源,使用正确的access_token。"
-
-#. module: wecom_base
-#: model:wecom.app.type,name:wecom_base.wecom_app_type_third
-msgid "Third party application"
-msgstr "第三方应用"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "This company is an WeCom organization"
-msgstr "此公司为企业微信组织"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/res_config_settings.py:0
-#: code:addons/wecom_base/models/wecom_apps.py:0
-#, python-format
-msgid "Ticket is still valid, and no update is required!"
-msgstr "临时凭证仍然有效,不需要更新!"
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/res_config_settings.py:0
-#: code:addons/wecom_base/models/wecom_apps.py:0
-#, python-format
-msgid "Tips"
-msgstr "提示"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_callback_service__callback_url_token
-msgid "Token"
-msgstr "令牌"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__token_expiration_time
-msgid "Token Expiration Time"
-msgstr "Token有效时间"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__redirect_domain
-msgid "Trusted domain name"
-msgstr "可信域名"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__debug_enabled
-msgid "Turn on debug mode"
-msgstr "开启调试模式"
-
-#. module: wecom_base
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_agent_type_list
-msgid "Type"
-msgstr "类型"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_callback_service__callback_url
-msgid "URL"
-msgstr ""
-
-#. module: wecom_base
-#. odoo-python
-#: code:addons/wecom_base/models/wecom_app_event_type.py:0
-#, python-format
-msgid "Unable to execute [%s] change type for company [%s], ignoring it. reason: %s"
-msgstr "无法为公司 [%s] 执行 [%s] 变更类型,将忽略它。原因:%s"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "Update Info"
-msgstr "更新信息"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid ""
-"Used for event triggered synchronization of address book information, such as "
-"departments, members, tags, etc."
-msgstr "用于事件触发的通讯录信息同步,如部门、成员、标签等。"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_app_config__value
-msgid "Value"
-msgstr "值"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__allow_partys
-msgid "Visible range (Department)"
-msgstr "可见范围(部门)"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__allow_tags
-msgid "Visible range (Tag))"
-msgstr "可见范围(标签)"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_wecom_apps__allow_userinfos
-msgid "Visible range (personnel)"
-msgstr "可见范围(人员)"
-
-#. module: wecom_base
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_root
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "WeCom"
-msgstr "企业微信"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__module_wecom_contacts
-msgid "WeCom Contacts"
-msgstr "企微通讯录"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__module_wecom_contacts_sync
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "WeCom Contacts Synchronized"
-msgstr "企微通讯录同步"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_company_form
-msgid "WeCom Information"
-msgstr "企业微信信息"
-
-#. module: wecom_base
-#: model:ir.module.category,name:wecom_base.module_category_wecom_settings
-msgid "WeCom Settings"
-msgstr "企微设置"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_company__is_wecom_organization
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__is_wecom_organization
-msgid "WeCom organization"
-msgstr "企业微信组织"
-
-#. module: wecom_base
-#: model:ir.model.fields,field_description:wecom_base.field_res_config_settings__resources_path
-msgid "WeCom resources storage path"
-msgstr "企业微信资源存储路径"
-
-#. module: wecom_base
-#: model:ir.actions.server,name:wecom_base.ir_cron_get_app_token_ir_actions_server
-msgid "WeCom: Get app token"
-msgstr "企微:获取应用令牌"
-
-#. module: wecom_base
-#: model:ir.actions.act_window,name:wecom_base.ir_cron_act_get_app_token
-msgid "WeCom: Get app token."
-msgstr "企微:获取应用令牌。"
-
-#. module: wecom_base
-#: model:ir.actions.act_window,name:wecom_base.ir_cron_act_pull_wecom_service_api_error
-#: model:ir.actions.server,name:wecom_base.ir_cron_pull_wecom_service_api_error_ir_actions_server
-msgid "WeCom: Get the global error code of WeCom."
-msgstr "企微: 获取企微的全局错误代码。"
-
-#. module: wecom_base
-#: model:wecom.app.subtype,name:wecom_base.wecom_app_subtype_kf
-msgid "Wechat customer service"
-msgstr "微信客服"
-
-#. module: wecom_base
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_api
-msgid "Wecom API"
-msgstr "企微API"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_wecom_apps
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_agent
-msgid "Wecom Application"
-msgstr "企微应用"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_wecom_app_config
-msgid "Wecom Application Configuration"
-msgstr "企微应用配置"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_wecom_app_event_type
-msgid "Wecom Application Event"
-msgstr "企微应用事件"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_app_config_form
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_app_config_list
-msgid "Wecom Application Parameters"
-msgstr "企微应用参数"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_wecom_app_subtype
-msgid "Wecom Application Subtype"
-msgstr "企微应用子类型"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_wecom_app_type
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_app_subtype_form
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_app_subtype_list
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_app_type_form
-#: model_terms:ir.ui.view,arch_db:wecom_base.view_wecom_app_type_list
-msgid "Wecom Application Type"
-msgstr "企微应用类型"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_wecom_app_callback_service
-msgid "Wecom Application receive event service"
-msgstr "msgstr \"企微应用接收事件服务\""
-
-#. module: wecom_base
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_attendance
-msgid "Wecom Attendances"
-msgstr "企微出勤"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "Wecom Companies Settings"
-msgstr "企微公司设置"
-
-#. module: wecom_base
-#: model:ir.actions.act_window,name:wecom_base.wecom_configurator
-msgid "Wecom Configurator"
-msgstr "企微配置"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "Wecom Contact Settings"
-msgstr "企微通讯录设置"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "Wecom Contact Synchronization Settings"
-msgstr "企微通讯录同步设置"
-
-#. module: wecom_base
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_contacts
-msgid "Wecom Contacts"
-msgstr "企微通讯录"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid "Wecom Global Settings"
-msgstr "企微全局设置"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_wecom_service_api
-msgid "Wecom Server API"
-msgstr "企微服务端API"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_wecom_service_api_error
-msgid "Wecom Server API Error"
-msgstr "企微服务端API错误"
-
-#. module: wecom_base
-#: model:ir.model,name:wecom_base.model_wecom_service_api_list
-msgid "Wecom Server API List"
-msgstr "企微服务端API列表"
-
-#. module: wecom_base
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_configuration
-msgid "Wecom Settings"
-msgstr "企微设置"
-
-#. module: wecom_base
-#: model_terms:ir.ui.view,arch_db:wecom_base.res_config_settings_view_form
-msgid ""
-"Wecom address book can be read through API interface,Synchronize with the Wecom address "
-"book to avoid maintaining multiple sets of address books at the same time."
-msgstr "企微通讯录可以通过API接口读取,与企微通讯簿同步,避免同时维护多套通讯录。"
-
-#. module: wecom_base
-#: model:ir.ui.menu,name:wecom_base.menu_wecom_cron
-msgid "Wecom tasks"
-msgstr "企微任务"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__binary
-msgid "binary"
-msgstr "二进制"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__boolean
-msgid "boolean"
-msgstr "布尔型"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__char
-msgid "char"
-msgstr "字符"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__date
-msgid "date"
-msgstr "日期"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__datetime
-msgid "datetime"
-msgstr "日期时间"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__float
-msgid "float"
-msgstr "浮点型"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__html
-msgid "html"
-msgstr ""
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__integer
-msgid "integer"
-msgstr "整数"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__json
-msgid "json"
-msgstr ""
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__many2many
-msgid "many2many"
-msgstr "多对多"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__many2one
-msgid "many2one"
-msgstr "多对一"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__many2one_reference
-msgid "many2one_reference"
-msgstr "多对一参考"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__monetary
-msgid "monetary"
-msgstr "货币"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__one2many
-msgid "one2many"
-msgstr "一对多"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__properties
-msgid "properties"
-msgstr "属性"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__properties_definition
-msgid "properties_definition"
-msgstr ""
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__reference
-msgid "reference"
-msgstr "参考"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__selection
-msgid "selection"
-msgstr "选择项"
-
-#. module: wecom_base
-#: model:ir.model.fields.selection,name:wecom_base.selection__wecom_app_config__ttype__text
-msgid "text"
-msgstr "文本"
diff --git a/wecom_base/models/__init__.py b/wecom_base/models/__init__.py
deleted file mode 100644
index fb72a8891..000000000
--- a/wecom_base/models/__init__.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from . import ir_http
-
-from . import wecom_server_api
-from . import wecom_server_api_error
-from . import wecom_server_api_list
-
-from . import ir_module
-from . import res_company
-from . import res_config_settings
-from . import res_partner
-
-from . import wecom_app_type
-from . import wecom_app_subtype
-from . import wecom_apps
-from . import wecom_app_callback_service
-from . import wecom_app_config
-from . import wecom_app_event_type
diff --git a/wecom_base/models/ir_http.py b/wecom_base/models/ir_http.py
deleted file mode 100644
index 748e16808..000000000
--- a/wecom_base/models/ir_http.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from odoo import models
-from odoo.http import request
-
-class Http(models.AbstractModel):
- _inherit = 'ir.http'
-
- def session_info(self):
- session_info = super(Http, self).session_info() # type: ignore
- user = request.env.user # type: ignore
- if self.env.user.has_group('base.group_user'):
- allowed_companies = session_info["user_companies"]["allowed_companies"]
-
- allowed_companies = {
- comp.id: {
- 'id': comp.id,
- 'name': comp.name,
- 'is_wecom_organization': comp.is_wecom_organization,
- 'sequence': comp.sequence,
- } for comp in user.company_ids
- }
- session_info["user_companies"]["allowed_companies"] = allowed_companies
-
- return session_info
\ No newline at end of file
diff --git a/wecom_base/models/ir_module.py b/wecom_base/models/ir_module.py
deleted file mode 100644
index 333d211b4..000000000
--- a/wecom_base/models/ir_module.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from odoo import api, fields, models, tools, _
-
-
-class Module(models.Model):
- _inherit = "ir.module.module"
-
- def wecom_check_module_installed(self, modules_name):
- # modules 输入参数是个 list,如 ['base', 'sale']
- module = self.sudo().search([("name", "=", modules_name)])
- if not module or module.state != "installed": # type: ignore
- return False
- else:
- return True
diff --git a/wecom_base/models/res_company.py b/wecom_base/models/res_company.py
deleted file mode 100644
index 8fa572fe2..000000000
--- a/wecom_base/models/res_company.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-
-
-import io
-import logging
-import os
-
-from odoo import api, fields, models, tools, _
-
-
-class Company(models.Model):
- _inherit = "res.company"
-
- # 基础
- short_name = fields.Char("Short Name", translate=True)
- is_wecom_organization = fields.Boolean("WeCom organization", default=False)
- corpid = fields.Char("Corp ID")
-
- # 企业的jsapi_ticket
- corp_jsapi_ticket = fields.Char(string="Corp JSAPI Ticket", copy=False)
- corp_jsapi_ticket_expiration_time = fields.Datetime(
- string="Expiration time of Corp JSAPI ticket", copy=False
- )
diff --git a/wecom_base/models/res_config_settings.py b/wecom_base/models/res_config_settings.py
deleted file mode 100644
index ed2798bcf..000000000
--- a/wecom_base/models/res_config_settings.py
+++ /dev/null
@@ -1,167 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from datetime import datetime, timedelta
-from random import weibullvariate
-from odoo import models, fields, api, _
-from odoo.addons.wecom_api.api.wecom_abstract_api import ApiException # type: ignore
-
-import logging
-
-_logger = logging.getLogger(__name__)
-
-
-class ResConfigSettings(models.TransientModel):
- _inherit = "res.config.settings"
-
- # 基础
- is_wecom_organization = fields.Boolean(
- related="company_id.is_wecom_organization", readonly=False
- )
- company_name = fields.Char(
- related="company_id.name", string="Company Name", readonly=False
- )
- short_name = fields.Char(related="company_id.short_name", readonly=False)
- corpid = fields.Char(string="Corp ID", related="company_id.corpid", readonly=False)
-
- corp_jsapi_ticket = fields.Char(
- related="company_id.corp_jsapi_ticket",
- readonly=False,
- )
- corp_jsapi_ticket_expiration_time = fields.Datetime(
- related="company_id.corp_jsapi_ticket_expiration_time",
- readonly=False,
- )
-
- debug_enabled = fields.Boolean("Turn on debug mode", default=True)
-
- resources_path = fields.Char(
- "WeCom resources storage path",
- config_parameter="wecom.resources_path",
- )
-
- global_error_code_url = fields.Char(
- "Global error code page URL",
- config_parameter="wecom.global_error_code_url",
- )
-
- global_error_code_item_selection_code = fields.Char(
- "Global error code item selection code",
- config_parameter="wecom.global_error_code_item_selection_code",
- ) # 错误码排查方法的选取属性。
-
- module_web_theme = fields.Boolean("Rainbow Theme")
- module_wecom_contacts = fields.Boolean("WeCom Contacts")
- module_wecom_contacts_sync = fields.Boolean("WeCom Contacts Synchronized")
-
- @api.model
- def get_values(self):
- res = super(ResConfigSettings, self).get_values() # type: ignore
- ir_config = self.env["ir.config_parameter"].sudo()
-
- debug_enabled = (
- True if ir_config.get_param("wecom.debug_enabled") == "True" else False
- )
-
- res.update(
- debug_enabled=debug_enabled,
- )
- return res
-
- def set_values(self):
- super(ResConfigSettings, self).set_values() # type: ignore
- ir_config = self.env["ir.config_parameter"].sudo()
- ir_config.set_param("wecom.debug_enabled", self.debug_enabled or "False")
-
- def open_wecom_company(self):
- return {
- "type": "ir.actions.act_window",
- "name": "My Company",
- "view_mode": "form",
- "res_model": "res.company",
- "res_id": self.env.company.id,
- "target": "current",
- "context": {
- "form_view_initial_mode": "edit",
- },
- }
-
- @api.depends("company_id")
- def _compute_wecom_company_corpid(self):
- company_corpid = self.company_id.corpid if self.company_id.corpid else "" # type: ignore
-
- for record in self:
- record.wecom_company_corpid = company_corpid # type: ignore
-
- @api.model
- def open_wecom_settings(self):
- action = self.env["ir.actions.actions"]._for_xml_id(
- "wecom_base.res_config_settings_view_form"
- )
- action["target"] = "new"
-
- return action
-
- def get_app_info(self):
- """
- 获取企业应用信息
- :param agentid:
- :return:
- """
-
- def get_corp_jsapi_ticket(self):
- """
- 获取企业的jsapi_ticket
- :return:
- """
- ir_config = self.env["ir.config_parameter"].sudo()
- debug = ir_config.get_param("wecom.debug_enabled")
- if debug:
- _logger.info(
- _("Start getting ticket for company [%s]") % (self.company_id.name) # type: ignore
- )
- try:
- if (
- self.corp_jsapi_ticket_expiration_time
- and self.corp_jsapi_ticket_expiration_time > datetime.now()
- ):
- # 未过期,
- # print("未过期")
- msg = {
- "title": _("Tips"),
- "message": _("Ticket is still valid, and no update is required!"),
- "sticky": False,
- }
- return self.env["wecomapi.tools.action"].WecomInfoNotification(msg)
- else:
- # print("过期")
- wecom_api = self.env["wecom.service_api"].InitServiceApi(self.company_id.corpid, self.contacts_app_id.secret) # type: ignore
- response = wecom_api.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "GET_JSAPI_TICKET"
- ),
- {},
- )
- # print(response)
- except ApiException as ex:
- return self.env["wecomapi.tools.action"].ApiExceptionDialog(
- ex, raise_exception=True
- )
- else:
- if response["errcode"] == 0:
- self.write(
- {
- "corp_jsapi_ticket": response["ticket"],
- "corp_jsapi_ticket_expiration_time": datetime.now()
- + timedelta(seconds=response["expires_in"]),
- }
- )
- msg = {
- "title": _("Tips"),
- "message": _("Successfully obtained ticket!"),
- "sticky": False,
- "next": {
- "type": "ir.actions.client",
- "tag": "reload",
- },
- }
- return self.env["wecomapi.tools.action"].WecomSuccessNotification(msg)
diff --git a/wecom_base/models/res_partner.py b/wecom_base/models/res_partner.py
deleted file mode 100644
index afe498446..000000000
--- a/wecom_base/models/res_partner.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from odoo import fields, models, _
-
-
-class Partner(models.Model):
- _inherit = "res.partner"
diff --git a/wecom_base/models/wecom_app_callback_service.py b/wecom_base/models/wecom_app_callback_service.py
deleted file mode 100644
index 2f66a44ac..000000000
--- a/wecom_base/models/wecom_app_callback_service.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from datetime import datetime, timedelta
-from odoo import _, api, fields, models
-from odoo.exceptions import ValidationError
-
-
-class WeComAppCallbackService(models.Model):
- """
- 接收事件服务器配置
- https://work.weixin.qq.com/api/doc/90000/90135/90930
- """
-
- _name = "wecom.app_callback_service"
- _description = "Wecom Application receive event service"
-
- app_id = fields.Many2one(
- "wecom.apps",
- string="Application",
- copy=False,
- ondelete="cascade",
- default=lambda self: self.env["wecom.apps"].id,
- # domain="[('company_id', '=', company_id)]",
- required=True,
- )
-
- name = fields.Char(string="Service Name", required=True, translate=True)
- code = fields.Char(
- string="Service Code",
- copy=False,
- required=True,
- )
-
- callback_url = fields.Char(
- string="URL",
- store=True,
- readonly=True,
- compute="_default_callback_url",
- copy=False,
- ) # 回调服务地址
- callback_url_token = fields.Char(string="Token", copy=False) # Token用于计算签名
- callback_aeskey = fields.Char(string="AES Key", copy=False) # 用于消息内容加密
-
- description = fields.Text(string="Description", translate=True, copy=True)
- active = fields.Boolean("Active", default=False)
-
- _sql_constraints = [
- (
- "app_code_uniq",
- "unique (app_id,code)",
- _("The code of each application must be unique !"),
- )
- ]
-
- @api.depends("app_id", "code")
- def _default_callback_url(self):
- """
- 默认回调地址
- :return:"""
- params = self.env["ir.config_parameter"].sudo()
- base_url = params.get_param("web.base.url")
- callback_url = ""
- for server in self:
- if server.app_id.company_id and server.code: # type: ignore
- callback_url = base_url + "/wecom_callback/%s/%s" % ( # type: ignore
- server.app_id.company_id.id, # type: ignore
- server.code, # type: ignore
- )
-
- server.callback_url = callback_url # type: ignore
-
- @api.onchange("app_id", "code")
- def _onchange_callback_url(self):
- """
- 当应用发生变化时,更新回调服务地址
- :return:
- """
- params = self.env["ir.config_parameter"].sudo()
- base_url = params.get_param("web.base.url")
-
- if self.app_id:
- self.callback_url = base_url + "/wecom_callback/%s/%s" % (
- self.app_id.company_id.id, # type: ignore
- self.code,
- )
- else:
- self.callback_url = ""
-
- def generate_contact_service(self):
- """
- 生成通讯录回调服务
- :return:
- """
- params = self.env["ir.config_parameter"].sudo()
- base_url = params.get_param("web.base.url")
- if not self.app_id:
- raise ValidationError(_("Please bind contact app!"))
- else:
- callback_url = base_url + "/wecom_callback/%s/%s" % (
- self.app_id.company_id.id, # type: ignore
- self.code,
- )
- return callback_url
diff --git a/wecom_base/models/wecom_app_config.py b/wecom_base/models/wecom_app_config.py
deleted file mode 100644
index 0f48e2d7d..000000000
--- a/wecom_base/models/wecom_app_config.py
+++ /dev/null
@@ -1,161 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from odoo import fields, models, api, _
-from odoo.tools import config, ormcache, mute_logger
-
-FIELD_TYPES = [(key, key) for key in sorted(fields.Field.by_type)]
-
-
-class WeComAppConfig(models.Model):
- _name = "wecom.app_config"
- _description = "Wecom Application Configuration"
- _table = "wecom_app_config"
- # _rec_name = "key"
- _order = "id"
-
- app_id = fields.Many2one( # type: ignore
- "wecom.apps",
- string="Application",
- copy=False,
- ondelete="cascade",
- default=lambda self: self.env["wecom.apps"].id,
- # domain="[('company_id', '=', company_id)]",
- required=True,
- )
- company_id = fields.Many2one(related="app_id.company_id", store=True)
- name = fields.Char(string="Name", translate=True, required=True, copy=True)
- key = fields.Char(
- required=True,
- )
- ttype = fields.Selection(
- selection=FIELD_TYPES, string="Field Type", required=True, copy=True
- )
- value = fields.Text(required=True)
- description = fields.Html(string="Description", translate=True, copy=True)
-
- _sql_constraints = [
- (
- "app_id_key_uniq",
- "unique (app_id,key)",
- _("The key of each application must be unique !"),
- )
- ]
-
- def get_format_field_value_and_type(self, res_id=False, field_name=""):
- """
- JS 获取需要格式化的字段的类型和值
- :return:
- """
- res = self.browse(res_id)
- return res.ttype # type: ignore
- # return {
- # "id": res_id,
- # "value_type": res.ttype,
- # "value": res.value,
- # }
-
- def update_config(self, res_id=False, value=""):
- """
- 更新参数
- """
- # res = self.browse(res_id)
- app_config = (
- self.env["wecom.app_config"]
- .sudo()
- .search(
- [
- ("id", "=", res_id),
- ]
- )
- )
-
- app_config.sudo().write({"value": value})
- print(app_config.value)
- return app_config.value
-
- @api.model
- def get_param(self, app_id, key, default=False):
- """检索给定key的value
-
- :param string key: 要检索的参数值的键。
- :param string default: 如果缺少参数,则为默认值。
- :return: 参数的值, 如果不存在,则为 ``default``.
- :rtype: string
- """
- return self._get_param(app_id, key) or default
-
- def _get_param(self, app_id, key):
- params = self.search_read(
- [("app_id", "=", app_id), ("key", "=", key)],
- fields=["ttype", "value"],
- limit=1,
- )
- value = None
- ttype = None
- if not params:
- # 如果没有找到,搜索其他公司相同应用配置参数 进行复制
- copy_app_config = self.search([("key", "=", key)], limit=1)
- if copy_app_config:
- new_app_config = self.create(
- {
- "app_id": app_id,
- "name": copy_app_config.name, # type: ignore
- "key": copy_app_config.key, # type: ignore
- "ttype": copy_app_config.ttype, # type: ignore
- "value": copy_app_config.value, # type: ignore
- "description": copy_app_config.description, # type: ignore
- }
- )
- value = new_app_config.value
- ttype = new_app_config.ttype
- else:
- pass
- else:
- value = params[0]["value"]
- ttype = params[0]["ttype"]
-
- if ttype == "boolean":
- boolean_value = str(value).lower()
- if boolean_value in ["true", "yes", "t", "1"]:
- return True
- elif boolean_value in ["false", "no", "f", "0"]:
- return False
- else:
- return False
- return value if params else None
-
- @api.model
- def set_param(self, app_id, key, value):
- """设置参数的值。
-
- :param string key: 要设置的参数值的键。
- :param string value: 要设置的值。
- :return: 参数的上一个值,如果不存在,则为False。
- :rtype: string
- """
- param = self.search([("app_id", "=", app_id), ("key", "=", key)])
- if param:
- old = param.value # type: ignore
- if value is not False and value is not None:
- if str(value) != old:
- param.write({"value": value}) # type: ignore
- else:
- param.unlink() # type: ignore
- return old
- else:
- if value is not False and value is not None:
- self.create({"app_id": app_id, "key": key, "value": value})
- return False
-
- @api.model_create_multi
- def create(self, vals_list):
- self._invalidate_cache()
- return super(WeComAppConfig, self).create(vals_list)
-
- def write(self, vals):
- self._invalidate_cache()
- return super(WeComAppConfig, self).write(vals)
-
- def unlink(self):
- self._invalidate_cache()
- return super(WeComAppConfig, self).unlink()
diff --git a/wecom_base/models/wecom_app_event_type.py b/wecom_base/models/wecom_app_event_type.py
deleted file mode 100644
index 019b8738f..000000000
--- a/wecom_base/models/wecom_app_event_type.py
+++ /dev/null
@@ -1,152 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import logging
-import base64
-from odoo import _, api, fields, models
-from odoo.exceptions import MissingError, UserError, ValidationError, AccessError
-from odoo.tools.safe_eval import safe_eval, test_python_expr
-from lxml import etree
-from lxml import etree as ET
-from odoo.http import Response
-
-# from lxml_to_dict import lxml_to_dict
-# from xmltodict import lxml_to_dict
-import xmltodict, json
-
-_logger = logging.getLogger(__name__)
-
-
-class WeComAppEventType(models.Model):
-
- _name = "wecom.app.event_type"
- _description = "Wecom Application Event"
- _order = "id"
-
- DEFAULT_PYTHON_CODE = """# Available variables:
-# - env: Odoo Environment on which the action is triggered
-# - model: Odoo Model of the record on which the action is triggered; is a void recordset
-# - record: record on which the action is triggered; may be void
-# - records: recordset of all records on which the action is triggered in multi-mode; may be void
-# - time, datetime, dateutil, timezone: useful Python libraries
-# - float_compare: Odoo function to compare floats based on specific precisions
-# - log: log(message, level='info'): logging function to record debug information in ir.logging table
-# - UserError: Warning Exception to use with raise
-# To return an action, assign: action = {...}\n\n\n\n"""
-
- name = fields.Char(
- string="Name",
- translate=True,
- copy=False,
- required=True,
- )
- model_ids = fields.Many2many(
- "ir.model",
- string="Related Model",
- )
- msg_type = fields.Char(
- string="Message Type", copy=False, required=True, default="event"
- )
- event = fields.Char(
- string="Event Code",
- copy=False,
- required=True,
- )
- change_type = fields.Char(string="Change Type", copy=False)
- code = fields.Char(
- string="Python Code",
- default="",
- )
- command = fields.Char(string="Command", copy=False)
-
- def handle_event(self):
- """
- 处理事件
- """
- xml_tree = self.env.context.get("xml_tree")
- company_id = self.env.context.get("company_id")
- event_str = etree.fromstring(xml_tree).find("Event").text # type: ignore
- changetype_str = etree.fromstring(xml_tree).find("ChangeType").text # type: ignore
-
- _logger.info(
- _(
- "Received the callback notification of Wecom, event [%s], change type [%s]."
- )
- % (
- event_str,
- changetype_str,
- )
- )
- event = (
- self.env["wecom.app.event_type"]
- .sudo()
- .search(
- [
- ("event", "=", event_str),
- ("change_type", "=", changetype_str),
- ]
- )
- )
- if not event:
- _logger.warning(
- _(
- "Cannot find [%s] change type for executing company [%s], ignoring it."
- )
- % (
- event.name,
- company_id.name,
- )
- )
- return
-
- if event.code:
- # ^ 正确响应企业微信本次的POST请求,企业微信将不会再次发送请求
- # ^ ·企业微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次
- # ^ ·当接收成功后,http头部返回200表示接收ok,其他错误码企业微信后台会一律当做失败并发起重试
- try:
- event.with_context(
- xml_tree=xml_tree, company_id=company_id
- ).sudo().run()
- except Exception as e:
- _logger.warning(
- _(
- "Unable to execute [%s] change type for company [%s], ignoring it. reason: %s"
- )
- % (event.name, company_id.name, str(e))
- )
- return Response("success", status=200)
- else:
- return Response("success", status=200)
-
- def run(self):
- """
- 执行事件
- """
- xml_tree = self.env.context.get("xml_tree")
- company_id = self.env.context.get("company_id")
- func_name = self.code.split("model.")[1]
- cmd = self.command
-
- for m in self.model_ids:
- model_obj = self.env.get(m.model) # type: ignore
- if hasattr(model_obj, func_name):
- # 存在函数
- func = getattr(
- model_obj.with_context(xml_tree=xml_tree, company_id=company_id),
- func_name,
- )
- func(cmd)
- _logger.info(
- _("Method [%s] to execute model [%s]")
- % (
- func_name,
- model_obj,
- )
- )
- else:
- _logger.warning(
- _("Function [%s] does not exist in model [%s]")
- % (
- func_name,
- model_obj,
- )
- )
diff --git a/wecom_base/models/wecom_app_subtype.py b/wecom_base/models/wecom_app_subtype.py
deleted file mode 100644
index e14030530..000000000
--- a/wecom_base/models/wecom_app_subtype.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from odoo import _, api, fields, models
-
-
-class WeComAppType(models.Model):
- _name = "wecom.app.subtype"
- _description = "Wecom Application Subtype"
- _order = "parent_id,sequence"
-
- name = fields.Char(string="Name", translate=True, copy=False, required=True,)
-
- parent_id = fields.Many2one(
- "wecom.app.type",
- ondelete="cascade",
- string="Parent",
- index=True,
- copy=False,
- required=True,
- )
- code = fields.Char(string="Code", copy=False, required=True,)
- sequence = fields.Integer(default=0, copy=True)
-
- _sql_constraints = [("code_uniq", "unique (code)", _("Code must be unique !"),)]
diff --git a/wecom_base/models/wecom_app_type.py b/wecom_base/models/wecom_app_type.py
deleted file mode 100644
index c5840a900..000000000
--- a/wecom_base/models/wecom_app_type.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from odoo import _, api, fields, models
-
-
-class WeComAppType(models.Model):
- _name = "wecom.app.type"
- _description = "Wecom Application Type"
- _order = "sequence"
-
- name = fields.Char(
- string="Name",
- translate=True,
- copy=False,
- required=True,
- )
- code = fields.Char(
- string="Code",
- copy=False,
- required=True,
- )
- subtype_ids = fields.One2many(
- "wecom.app.subtype",
- "parent_id",
- string="Application Subtype",
- )
- sequence = fields.Integer(default=0, copy=True)
-
- _sql_constraints = [
- (
- "code_uniq",
- "unique (code)",
- _("Code must be unique !"),
- )
- ]
diff --git a/wecom_base/models/wecom_apps.py b/wecom_base/models/wecom_apps.py
deleted file mode 100644
index 15fe0f4de..000000000
--- a/wecom_base/models/wecom_apps.py
+++ /dev/null
@@ -1,432 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import logging
-import time
-from datetime import datetime, timedelta
-from odoo import _, api, fields, models
-from odoo.exceptions import UserError
-from odoo.addons.wecom_api.api.wecom_abstract_api import ApiException # type: ignore
-
-_logger = logging.getLogger(__name__)
-
-
-class WeComApps(models.Model):
- _name = "wecom.apps"
- _description = "Wecom Application"
- _order = "sequence"
-
- name = fields.Char(
- string="Name",
- copy=False,
- compute="_compute_name",
- store=True,
- index=True,
- ) # 企业应用名称
- app_name = fields.Char(
- string="Application Name",
- translate=True,
- copy=True,
- ) # 应用名称
-
- company_id = fields.Many2one(
- "res.company",
- string="Company",
- domain="[('is_wecom_organization', '=', True)]",
- copy=False,
- store=True,
- )
- # model_ids = fields.Many2many("ir.model", string="Related Model",)
- # 应用类型 required=True
- type = fields.Selection(
- selection=lambda self: self._type_selection_values(),
- string="Application Type",
- required=True,
- copy=True,
- default="manage",
- )
- type_id = fields.Many2one("wecom.app.type", string="Application Types", store=True)
-
- subtype_ids = fields.Many2many(
- "wecom.app.subtype",
- string="Application Subtype",
- )
- type_code = fields.Char(
- string="Application type code",
- store=True,
- readonly=True,
- compute="_computet_type_code",
- )
-
- def write(self, vals):
- for app in self:
- labels = dict(self.fields_get(allfields=["type"])["type"]["selection"])[app.type] # type: ignore
- if "company_id" in vals:
- company = app.company_id # type: ignore
- vals["name"] = "%s/%s/%s" % (
- company.short_name,
- labels,
- app.app_name, # type: ignore
- )
- else:
- vals["name"] = "%s/%s" % (labels, app.app_name) # type: ignore
- result = super(WeComApps, self).write(vals)
-
- return result
-
- @api.depends("subtype_ids")
- def _computet_type_code(self):
- """
- 计算应用类型代码
- """
- if self.subtype_ids:
- self.type_code = str(self.subtype_ids.mapped("code")) # type: ignore
- else:
- self.type_code = "[]"
-
- def get_type_code(self):
- """
- 测试代码
- """
- type_code = str(self.subtype_ids.mapped("code")) # type: ignore
- print(type_code, type(type_code))
-
- @api.onchange("subtype_ids")
- def _onchange_subtype_ids(self):
- """
- 变更子类型
- :return:
- """
- if self.type_id.code == "manage" or self.type_id.code == "base": # type: ignore
- if len(self.subtype_ids) > 1:
- raise UserError(
- _("Only one subtype can be selected for the current app type!")
- )
-
- @api.model
- def _type_selection_values(self):
- models = self.env["wecom.app.type"].sudo().search([]).sorted("sequence")
- return [(model.code, model.name) for model in models]
-
- @api.onchange("type")
- def _onchange_type(self):
- # self.subtype_ids = False
- # self.type_code = ""
- # if self.type:
- # type = self.env["wecom.app.type"].sudo().search([("code", "=", self.type)])
- # self.type_id = type
- # return {"domain": {"subtype_ids": [("parent_id", "=", type.id)]}}
- # else:
- # self.type_id = False
- # return {"domain": {"subtype": []}}
- if self.subtype_ids:
- self.type_code = str(self.subtype_ids.mapped("code")) # type: ignore
- else:
- self.type_code = "[]"
-
- agentid = fields.Integer(string="Agent ID", copy=False) # 企业应用id
- secret = fields.Char("Secret", default="", copy=False)
- square_logo_url = fields.Char(string="Square Logo", copy=True) # 企业应用方形头像
- description = fields.Text(string="Description", translate=True, copy=True) # 企业应用详情
- allow_userinfos = fields.Char(
- string="Visible range (personnel)", copy=False
- ) # 企业应用可见范围(人员),其中包括userid
- allow_partys = fields.Char(
- string="Visible range (Department)", copy=False
- ) # 企业应用可见范围(部门)
- allow_tags = fields.Char(string="Visible range (Tag))", copy=False) # 企业应用可见范围(标签)
- close = fields.Boolean(string="Disabled", copy=False) # 企业应用是否被停用
- redirect_domain = fields.Char(string="Trusted domain name", copy=True) # 企业应用可信域名
- report_location_flag = fields.Boolean(
- string="Open the geographic location and report", copy=False
- ) # 企业应用是否打开地理位置上报 0:不上报;1:进入会话上报;
- isreportenter = fields.Boolean(
- string="Report user entry event", copy=False
- ) # 企业应用是否打开进入会话上报 0:不上报;1:进入会话上报;
- home_url = fields.Char(string="Home page", copy=True) # 企业应用主页url
-
- sequence = fields.Integer(default=0, copy=True)
- menu_body = fields.Text(
- "Application menu data",
- translate=True,
- default="{}",
- copy=False,
- )
-
- # 访问令牌
- access_token = fields.Char(string="Access Token", readonly=True, copy=False)
- token_expiration_time = fields.Datetime(
- string="Token Expiration Time", readonly=True, copy=False
- )
-
- # 应用的jsapi_ticket
- jsapi_ticket = fields.Char(string="JSAPI Ticket", readonly=True, copy=False)
- jsapi_ticket_expiration_time = fields.Datetime(
- string="JSAPI Ticket Expiration Time", readonly=True, copy=False
- )
-
- _sql_constraints = [
- (
- "company_id_key_uniq",
- "unique (company_id,app_name)",
- _("The application name of each company must be unique !"),
- )
- ]
-
- @api.model_create_multi
- def create(self, values):
- res = super(WeComApps, self).create(values)
- if res.subtype_ids:
- res.type_code = str(res.subtype_ids.mapped("code"))
- else:
- res.type_code = "[]"
- return res
-
- @api.depends("company_id", "app_name", "type")
- def _compute_name(self):
- for app in self:
- labels = dict(self.fields_get(allfields=["type"])["type"]["selection"])[app.type] # type: ignore
- if app.company_id: # type: ignore
- app.name = "%s/%s/%s" % (app.company_id.short_name,labels,app.app_name,) # type: ignore
- else:
- app.name = "%s/%s" % (labels, app.app_name) # type: ignore
-
- # 回调服务
- app_callback_service_ids = fields.One2many(
- "wecom.app_callback_service",
- "app_id",
- string="Receive event service",
- domain="['|', ('active', '=', True), ('active', '=', False)]",
- context={"active_test": False},
- )
-
- # 应用参数配置
- app_config_ids = fields.One2many(
- "wecom.app_config",
- "app_id",
- string="Application Configuration",
- # context={
- # "default_company_id": lambda self: self.company_id,
- # },
- ) # 应用参数配置
-
- # ————————————————————————————————————
- # 应用回调服务
- # ————————————————————————————————————
- def generate_service(self):
- """
- 生成回调服务
- :return:
- """
- code = self.env.context.get("code") # 按钮的传递值
- if bool(code):
- # 存在按钮的传递值,通过按钮的传递值生成回调服务
- self.generate_service_by_code(code)
- else:
- # 不存在按钮的传递值,通过子类型生成生成回调服务
- self.generate_service_by_subtype()
-
- def generate_service_by_subtype(self):
- """
- 通过子类型生成生成回调服务
- """
- for record in self.subtype_ids:
- self.generate_service_by_code(record.code) # type: ignore
-
- def generate_service_by_code(self, code):
- """
- 根据code生成回调服务
- :param code:
- :return:
- """
-
- # ————————————————————————————————————
- # 应用参数配置
- # ————————————————————————————————————
- def generate_parameters(self):
- """
- 生成参数
- :return:
- """
- code = self.env.context.get("code") # 按钮的传递值
- if bool(code):
- # 存在按钮的传递值,通过按钮的传递值生成回调服务
- self.generate_parameters_by_code(code)
- else:
- # 不存在按钮的传递值,通过子类型生成生成回调服务
- self.generate_parameters_by_subtype()
-
- def generate_parameters_by_subtype(self):
- """
- 通过子类型生成生成参数
- """
- for record in self.subtype_ids:
- self.generate_parameters_by_code(record.code) # type: ignore
-
- def generate_parameters_by_code(self, code):
- """
- 根据code生成参数
- :param code:
- :retur
- """
-
- # ————————————————————————————————————
- # 应用信息
- # ————————————————————————————————————
- def get_app_info(self):
- """
- 获取企业应用信息
- :param agentid:
- :return:
- """
- for record in self:
- try:
- wecomapi = self.env["wecom.service_api"].InitServiceApi(record.company_id.corpid, record.secret) # type: ignore
- response = wecomapi.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call("AGENT_GET"),
- {"agentid": str(record.agentid)}, # type: ignore
- )
- except ApiException as e:
- return self.env["wecomapi.tools.action"].ApiExceptionDialog(
- e, raise_exception=True
- )
- else:
- if response["errcode"] == 0:
- record.write(
- {
- "app_name": response["name"],
- "square_logo_url": response["square_logo_url"],
- "description": response["description"],
- "allow_userinfos": response["allow_userinfos"]
- if "allow_userinfos" in response
- else "{}",
- "allow_partys": response["allow_partys"]
- if "allow_partys" in response
- else "{}",
- "allow_tags": response["allow_tags"]
- if "allow_tags" in response
- else "{}",
- "close": response["close"],
- "redirect_domain": response["redirect_domain"],
- "report_location_flag": response["report_location_flag"],
- "isreportenter": response["isreportenter"],
- "home_url": response["home_url"],
- }
- )
- # msg = {
- # "title": _("Tips"),
- # "message": _("Successfully obtained application information!"),
- # "sticky": False,
- # }
- # return self.env["wecomapi.tools.action"].WecomSuccessNotification(msg)
-
- def set_app_info(self):
- """
- 设置企业应用信息
- :param agentid:
- :return:
- """
-
- # ————————————————————————————————————
- # 应用令牌
- # ————————————————————————————————————
- def get_access_token(self):
- """获取企业应用接口调用凭据(令牌)
- :return:
- """
- ir_config = self.env["ir.config_parameter"].sudo()
- debug = ir_config.get_param("wecom.debug_enabled")
- if debug:
- _logger.info(
- _("Start getting app [%s] token for company [%s]")% (self.name, self.company_id.name) # type: ignore
- )
- try:
- wecom_api = self.env["wecom.service_api"].InitServiceApi(self.company_id.corpid, self.secret) # type: ignore
- except ApiException as ex:
- return self.env["wecomapi.tools.action"].ApiExceptionDialog(
- ex, raise_exception=True
- )
- # finally:
- # if self.token_expiration_time and self.token_expiration_time > datetime.now():
- # # 令牌未过期,则直接返回 提示信息
- # msg = {
- # "title": _("Tips"),
- # "message": _("Token is still valid, and no update is required!"),
- # "sticky": False,
- # }
- # return self.env["wecomapi.tools.action"].WecomInfoNotification(msg)
-
- def cron_get_app_token(self):
- """
- 自动任务定时获取应用token
- """
- for app in self.search([("company_id", "!=", False)]): # type: ignore
- _logger.info(
- _(
- "Automatic task: start to get the application [%s] token of company [%s]"
- )
- % (app.name, app.company_id.name)
- )
- app.get_access_token()
-
- # ————————————————————————————————————
- # 应用 jsapi_ticket
- # ————————————————————————————————————
- def get_app_jsapi_ticket(self):
- """
- 获取应用的jsapi_ticket
- """
- ir_config = self.env["ir.config_parameter"].sudo()
- debug = ir_config.get_param("wecom.debug_enabled")
- if debug:
- _logger.info(
- _("Start getting app [%s] ticket for company [%s]")
- % (self.name, self.company_id.name) # type: ignore
- )
- try:
- if (
- self.jsapi_ticket_expiration_time
- and self.jsapi_ticket_expiration_time > datetime.now()
- ):
- # 未过期,
- # print("未过期")
- msg = {
- "title": _("Tips"),
- "message": _("Ticket is still valid, and no update is required!"),
- "sticky": False,
- }
- return self.env["wecomapi.tools.action"].WecomInfoNotification(msg)
- else:
- # print("过期")
- wecom_api = self.env["wecom.service_api"].InitServiceApi(
- self.company_id.corpid, self.secret # type: ignore
- )
- response = wecom_api.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "AGENT_GET_TICKET"
- ),
- {"type": "agent_config"},
- )
- except ApiException as ex:
- return self.env["wecomapi.tools.action"].ApiExceptionDialog(
- ex, raise_exception=True
- )
- else:
- if response["errcode"] == 0:
- self.write(
- {
- "jsapi_ticket": response["ticket"],
- "jsapi_ticket_expiration_time": datetime.now()
- + timedelta(seconds=response["expires_in"]),
- }
- )
- msg = {
- "title": _("Tips"),
- "message": _("Successfully obtained application ticket!"),
- "sticky": False,
- "next": {
- "type": "ir.actions.client",
- "tag": "reload",
- },
- }
- finally:
- return self.env["wecomapi.tools.action"].WecomSuccessNotification(msg) # type: ignore
diff --git a/wecom_base/models/wecom_server_api.py b/wecom_base/models/wecom_server_api.py
deleted file mode 100644
index 03ed52780..000000000
--- a/wecom_base/models/wecom_server_api.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from datetime import datetime, timedelta
-from odoo import api, fields, models, SUPERUSER_ID, _
-
-class WecomServerApi(models.TransientModel):
- _inherit = "wecom.service_api"
\ No newline at end of file
diff --git a/wecom_base/models/wecom_server_api_error.py b/wecom_base/models/wecom_server_api_error.py
deleted file mode 100644
index b02078ce2..000000000
--- a/wecom_base/models/wecom_server_api_error.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# -*- coding: utf-8 -*-
-
-
-import requests
-import logging
-from urllib.parse import quote, unquote
-import pandas as pd
-
-pd.set_option("max_colwidth", 4096)
-
-from lxml import etree
-import requests
-from odoo import api, fields, models, SUPERUSER_ID, _
-
-_logger = logging.getLogger(__name__)
-
-
-class WecomServerApiError(models.Model):
- _inherit = "wecom.service_api_error"
-
diff --git a/wecom_base/models/wecom_server_api_list.py b/wecom_base/models/wecom_server_api_list.py
deleted file mode 100644
index b6aca56b2..000000000
--- a/wecom_base/models/wecom_server_api_list.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import re
-from odoo import api, fields, models, SUPERUSER_ID, _
-
-
-class WecomServerApiList(models.Model):
- _inherit = "wecom.service_api_list"
-
\ No newline at end of file
diff --git a/wecom_base/security/ir.model.access.csv b/wecom_base/security/ir.model.access.csv
deleted file mode 100644
index 0d0376f1f..000000000
--- a/wecom_base/security/ir.model.access.csv
+++ /dev/null
@@ -1,17 +0,0 @@
-id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-wecom_service_api_access_right,access.wecom.service_api,model_wecom_service_api,group_wecom_settings_manager,1,1,1,1
-wecom_service_api_access_right_user,access.wecom.service_api,model_wecom_service_api,group_wecom_settings_user,1,0,0,0
-
-wecom_service_api_list_access_right,access.wecom.service_api_list,model_wecom_service_api_list,group_wecom_settings_manager,1,1,1,1
-wecom_service_api_list_access_right_user,access.wecom.service_api_list,model_wecom_service_api_list,group_wecom_settings_user,1,0,0,0
-
-wecom_service_api_error_access_right,access.wecom.service_api_error,model_wecom_service_api_error,group_wecom_settings_manager,1,1,1,1
-wecom_service_api_error_access_right_user,access.wecom.service_api_error,model_wecom_service_api_error,group_wecom_settings_user,1,0,0,0
-wecom_service_api_error_access_right_public,access.wecom.service_api_error,model_wecom_service_api_error,base.group_public,1,0,0,0
-
-wecom_app_type_access_right,access.wecom.app.type,model_wecom_app_type,group_wecom_settings_manager,1,1,1,1
-wecom_app_subtype_access_right,access.wecom.app.subtype,model_wecom_app_subtype,group_wecom_settings_manager,1,1,1,1
-wecom_apps_access_right,access.wecom.apps,model_wecom_apps,group_wecom_settings_manager,1,1,1,1
-wecom_app_callback_service_access_right,access.wecom.app.callback_service_right,model_wecom_app_callback_service,group_wecom_settings_manager,1,1,1,1
-wecom_app_config_access_right,access.wecom.app.config,model_wecom_app_config,group_wecom_settings_manager,1,1,1,1
-wecom_app_event_type_access_right,access.wecom.app.event_type_right,model_wecom_app_event_type,group_wecom_settings_manager,1,1,1,1
\ No newline at end of file
diff --git a/wecom_base/security/wecom_security.xml b/wecom_base/security/wecom_security.xml
deleted file mode 100644
index 23a53db91..000000000
--- a/wecom_base/security/wecom_security.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-9KMa2p!`^#ndL
R6qaP
z!*s6X^loU!4mtQH={gpI@r|o&A2BZK@zF~N9YZ=n7V3ksn>Do$(209vOsV1=RoHdC
zTlNF?mIQ!vr1sVt-;t9ad;Y2Hao
-
-
-
- For debugging
-
- reference:Windows: D:\\resources\\
- Linux or Docker: /var/lib/odoo/resources/
-
-
-
-
-
-
\n"
-" Wecom provides OAuth code scanning login authorization method, which can guide members to use Wecom code scanning login authorization when the enterprise website is opened in the browser, so as to obtain the identity information of members and avoid the login link."
-msgstr ""
-"企业微信提供了OAuth的授权登录方式,可以让从企业微信终端打开的网页获取成员的身份信息,从而免去登录的环节。\n"
-"
\n"
-" 企业微信提供了OAuth的扫码登录授权方式,可以让企业的网站在浏览器内打开时,引导成员使用企业微信扫码登录授权,从而获取成员的身份信息,免去登录的环节。"
-
-#. module: wecom_contacts
-#: model_terms:ir.ui.view,arch_db:wecom_contacts.res_partner_kanban_view
-msgid "Wecom user"
-msgstr "企微用户"
-
-#. module: wecom_contacts
-#: model_terms:ir.ui.view,arch_db:wecom_contacts.res_config_settings_view_form
-msgid ""
-"When using the Wecom API interface, developers often need to use custom resources, such as sending local picture messages, setting address book custom avatars, etc.
\n"
-" In order to realize the same resource file, one upload can be used multiple times. Here is a material management interface: media_ ID to identify resource files and realize file upload and download."
-msgstr ""
-"在使用企业微信API接口中,往往开发者需要使用自定义的资源,比如发送本地图片消息,设置通讯录自定义头像等。
\n"
-" 为了实现同一资源文件,一次上传可以多次使用,这里提供了素材管理接口:以media_id来标识资源文件,实现文件的上传与下载。"
-
-#. module: wecom_contacts
-#: model_terms:ir.ui.view,arch_db:wecom_contacts.view_partner_category_form
-msgid "e.g. \"Consulting Services\""
-msgstr "例如:咨询服务"
-
-#. module: wecom_contacts
-#: model:wecom.apps,app_name:wecom_contacts.wecom_app_first_self_app
-msgid "iERP"
-msgstr ""
diff --git a/wecom_contacts/models/__init__.py b/wecom_contacts/models/__init__.py
deleted file mode 100644
index 7413b85cd..000000000
--- a/wecom_contacts/models/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- coding: utf-8 -*-
-
-
-from . import res_users
-from . import res_partner
-from . import res_partner_category
-from . import res_company
-from . import res_config_settings
-from . import wecom_apps
-
diff --git a/wecom_contacts/models/hr_employee.py b/wecom_contacts/models/hr_employee.py
deleted file mode 100644
index ecd05ed17..000000000
--- a/wecom_contacts/models/hr_employee.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from odoo import api, fields, models
-
-class HrEmployeePrivate(models.Model):
- _inherit = "hr.employee"
-
-
\ No newline at end of file
diff --git a/wecom_contacts/models/res_company.py b/wecom_contacts/models/res_company.py
deleted file mode 100644
index 307dca4df..000000000
--- a/wecom_contacts/models/res_company.py
+++ /dev/null
@@ -1,170 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from ast import literal_eval
-from collections import defaultdict
-
-from odoo.exceptions import UserError, ValidationError
-from datetime import datetime, timedelta
-from odoo.http import request
-from odoo import api, fields, models, tools, _
-from odoo.addons.wecom_api.api.wecom_abstract_api import ApiException # type: ignore
-import logging
-
-_logger = logging.getLogger(__name__)
-
-
-class Company(models.Model):
- _inherit = "res.company"
-
- # 通讯录
- contacts_app_id = fields.Many2one(
- "wecom.apps",
- string="Contacts Application",
- # required=True,
- # default=lambda self: self.env.company,
- domain="[('company_id', '=', current_company_id)]",
- )
-
- # contacts_app_event_service_state = fields.Boolean(
- # string="Contacts Application Event Service State",
- # )
- # contacts_app_event_service_url = fields.Char(
- # string="Contacts Application Event Service URL",
- # )
- # contacts_app_event_service_token = fields.Char(
- # string="Contacts Application Event Service Token",
- # )
- # contacts_app_event_service_key = fields.Char(
- # string="Contacts Application Event Service AES Key",
- # )
-
- wecom_contacts_join_qrcode_enabled = fields.Boolean(
- string="Enable to join the enterprise QR code",
- default=True,
- copy=False,
- )
- wecom_contacts_join_qrcode = fields.Char(
- string="Join Wecom QR code",
- copy=False,
- readonly=True,
- )
- wecom_contacts_join_qrcode_size_type = fields.Selection(
- [
- ("1", "171px x 171px"),
- ("2", "399px x 399px"),
- ("3", "741px x 741px"),
- ("4", "2052px x 2052px"),
- ],
- string="Join Wecom QR code size type",
- default="2",
- required=True,
- )
- wecom_contacts_join_qrcode_last_time = fields.Datetime(
- string="Get the last time of QR code (UTC)",
- copy=False,
- )
-
- def generate_contacts_app_event_service_url(self):
- """
- 生产通讯录事件服务的URL
- """
- ICP = self.env["ir.config_parameter"].sudo()
- base_url = ICP.get_param("web.base.url")
- if not self.contacts_app_id:
- raise ValidationError(_("Please bind contact app!"))
- else:
- callback_url = base_url + "/wecom_callback/%s/contacts" % self.id
- self.write({"contacts_app_event_service_url": callback_url})
- # return callback_url
-
- def cron_get_corp_jsapi_ticket(self):
- """
- 定时任务,每隔两小时更新企业的jsapi_ticket
- """
- for company in self:
- if company.is_wecom_organization and company.corpid and company.contacts_app_id: # type: ignore
- _logger.info(
- _("Automatic tasks:Start getting JSAPI ticket for company [%s]")
- % (company.name) # type: ignore
- )
- if (
- company.corp_jsapi_ticket_expiration_time # type: ignore
- and company.corp_jsapi_ticket_expiration_time > datetime.now() # type: ignore
- ):
- _logger.info(
- _(
- "The company [%s] ticket is still valid and does not need to be updated!"
- )
- % (company.name) # type: ignore
- )
- else:
- try:
- wecom_api = self.env["wecom.service_api"].InitServiceApi(
- self.company_id.corpid, self.contacts_app_id.secret # type: ignore
- )
- response = wecom_api.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "GET_JSAPI_TICKET"
- ),
- {},
- )
- except ApiException as ex:
- _logger.error(
- _("Error in obtaining company [%s] ticket, reason: %s")
- % (company.name, ex) # type: ignore
- )
- else:
- if response["errcode"] == 0:
- company.write(
- {
- "corp_jsapi_ticket": response["ticket"],
- "corp_jsapi_ticket_expiration_time": datetime.now()
- + timedelta(seconds=response["expires_in"]),
- }
- )
- finally:
- _logger.info(
- _("Automatic tasks:End of company [%s] JSAPI ticket update")
- % (company.name) # type: ignore
- )
-
- # TODO: 使用任务 获取IP
-
- # def cron_get_wecom_api_domain_ip(self):
- def get_wecom_api_domain_ip(self):
- """
- 获取企业微信API域名IP段
- """
- ir_config = self.env["ir.config_parameter"].sudo()
- debug = ir_config.get_param("wecom.debug_enabled")
- companies = self.search([])
-
- for company in companies: # type: ignore
- if not company.contacts_app_id: # type: ignore
- raise ValidationError(_("Please bind contact app!"))
-
- if debug:
- _logger.info(_("Start to get Wecom API domain name IP segment"))
- try:
- wecomapi = self.env["wecom.service_api"].InitServiceApi(company.corpid, company.contacts_app_id.secret) # type: ignore
-
- response = wecomapi.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "GET_API_DOMAIN_IP"
- ),
- {},
- )
- if response["errcode"] == 0:
- self.env["ir.config_parameter"].set_param(
- "wecom.api_domain_ip", response["ip_list"]
- )
- return {"type": "ir.actions.client", "tag": "reload"} # 刷新页面
-
- except ApiException as ex:
- return self.env["wecomapi.tools.action"].ApiExceptionDialog(
- ex, raise_exception=True
- )
-
- finally:
- if debug:
- _logger.info(_("End obtaining Wecom API domain name IP segment"))
diff --git a/wecom_contacts/models/res_config_settings.py b/wecom_contacts/models/res_config_settings.py
deleted file mode 100644
index 7222cff39..000000000
--- a/wecom_contacts/models/res_config_settings.py
+++ /dev/null
@@ -1,244 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import datetime
-from odoo import models, fields, api, _
-from odoo.exceptions import UserError, ValidationError
-import time
-
-from odoo.addons.wecom_api.api.wecom_abstract_api import ApiException # type: ignore
-
-import logging
-
-_logger = logging.getLogger(__name__)
-
-
-class ResConfigSettings(models.TransientModel):
- _inherit = "res.config.settings"
-
- company_id = fields.Many2one(
- "res.company",
- string="Company",
- required=True,
- default=lambda self: self.env.company,
- )
-
- wecom_api_domain_ip = fields.Char(
- "Wecom API Domain IP",
- config_parameter="wecom.api_domain_ip",
- )
-
- # 加入企微微信二维码
- contacts_join_qrcode_enabled = fields.Boolean(
- related="company_id.wecom_contacts_join_qrcode_enabled", readonly=False
- )
- contacts_join_qrcode = fields.Char(
- related="company_id.wecom_contacts_join_qrcode", readonly=False
- )
- contacts_join_qrcode_size_type = fields.Selection(
- related="company_id.wecom_contacts_join_qrcode_size_type", readonly=False
- )
- contacts_join_qrcode_last_time = fields.Datetime(
- related="company_id.wecom_contacts_join_qrcode_last_time", readonly=False
- )
-
- # 通讯录应用
- contacts_app_id = fields.Many2one(
- related="company_id.contacts_app_id", readonly=False, store=True
- )
-
- contacts_secret = fields.Char(related="contacts_app_id.secret", readonly=False)
-
- # contacts_access_token = fields.Char(related="contacts_app_id.access_token")
-
- # contacts_app_config_ids = fields.One2many(
- # related="contacts_app_id.app_config_ids",
- # readonly=False,
- # )
-
- contacts_app_callback_service_ids = fields.One2many(
- related="contacts_app_id.app_callback_service_ids", readonly=False
- )
-
- # 其他应用
-
- module_wecom_material = fields.Boolean("WeCom Material")
- module_wecom_auth_oauth = fields.Boolean("WeCom Authentication")
- module_wecom_message = fields.Boolean("WeCom Message")
- module_wecom_portal = fields.Boolean("Wecom Portal")
- module_wecom_msgaudit = fields.Boolean("Wecom Session Content Archive")
- module_wecom_attendance = fields.Boolean("WeCom Attendances")
- module_wecom_approval = fields.Boolean("WeCom Approvals")
-
- def cron_get_join_qrcode(self):
- """
- 自动任务获取加入企业二维码
- """
- companies = self.env["res.company"].search(
- [
- ("is_wecom_organization", "=", True),
- ("wecom_contacts_join_qrcode_enabled", "=", True),
- ]
- )
- for company in companies:
- _logger.info(
- _("Automatic task:Start to get join enterprise QR code of company [%s]")
- % (company.name)
- )
- if not company.contacts_app_id:
- _logger.info(
- _("Automatic task:Please bind the contact app of company [%s]!")
- % (company.name)
- )
- elif not company.wecom_contacts_join_qrcode_enabled:
- _logger.info(
- _(
- "Automatic task:Please enable the company [%s] to join the Wecom QR code function!"
- )
- % (company.name)
- )
- else:
- try:
- wecomapi = self.env["wecom.service_api"].InitServiceApi(
- company.corpid, company.contacts_app_id.secret
- )
-
- last_time = company.wecom_contacts_join_qrcode_last_time
- size_type = company.wecom_contacts_join_qrcode_size_type
- # 超期
- overdue = False
- if last_time:
- overdue = self.env[
- "wecomapi.tools.datetime"
- ].cheeck_days_overdue(last_time, 7)
- if not last_time or overdue:
- response = wecomapi.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "GET_JOIN_QRCODE"
- ),
- {"size_type": size_type},
- )
- if response["errcode"] == 0:
- company.write(
- {
- "wecom_contacts_join_qrcode": response[
- "join_qrcode"
- ],
- "wecom_contacts_join_qrcode_last_time": datetime.datetime.now(),
- }
- )
- except ApiException as ex:
- error = self.env["wecom.service_api_error"].get_error_by_code(
- ex.errCode
- )
- _logger.warning(
- _(
- "Automatic task:Error in obtaining the QR code of joining company [%s],error code: %s, error name: %s, error message: %s"
- )
- % (company.name, str(ex.errCode), error["name"], ex.errMsg)
- )
- _logger.info(
- _(
- "Automatic task:End obtaining joining enterprise QR code of company [%s]"
- )
- % (company.name)
- )
-
- def get_join_qrcode(self):
- """
- 获取加入企业二维码
- """
- # self.contacts_app_id.get_join_qrcode()
- ir_config = self.env["ir.config_parameter"].sudo()
- debug = ir_config.get_param("wecom.debug_enabled")
-
- if not self.contacts_app_id:
- raise ValidationError(_("Please bind contact app!"))
-
- if not self.contacts_join_qrcode_enabled:
- raise ValidationError(
- _("Please enable the function of join enterprise QR code!")
- )
-
- if debug:
- _logger.info(
- _("Start getting join enterprise QR code of company [%s]")
- % (self.company_id.name) # type: ignore
- )
- try:
- wecomapi = self.env["wecom.service_api"].InitServiceApi(
- self.company_id.corpid, self.contacts_app_id.secret # type: ignore
- )
-
- last_time = self.contacts_join_qrcode_last_time
- size_type = self.contacts_join_qrcode_size_type
- # 超期
- overdue = False
- if last_time:
- overdue = self.env["wecomapi.tools.datetime"].cheeck_days_overdue(
- last_time, 7
- )
- if not last_time or overdue:
- response = wecomapi.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "GET_JOIN_QRCODE"
- ),
- {"size_type": size_type},
- )
- if response["errcode"] == 0:
- self.company_id.write( # type: ignore
- {
- "wecom_contacts_join_qrcode": response["join_qrcode"],
- "wecom_contacts_join_qrcode_last_time": datetime.datetime.now(),
- }
- )
- return {"type": "ir.actions.client", "tag": "reload"} # 刷新页面
- # self.contacts_join_qrcode=response["join_qrcode"]
- # self.contacts_join_qrcode_last_time = datetime.datetime.now()
-
- except ApiException as ex:
- return self.env["wecomapi.tools.action"].ApiExceptionDialog(
- ex, raise_exception=True
- )
-
- finally:
- if debug:
- _logger.info(
- _("End getting join enterprise QR code of company [%s]")
- % (self.company_id.name) # type: ignore
- )
-
- def get_wecom_api_domain_ip(self):
- """
- 获取企业微信API域名IP段
- """
- ir_config = self.env["ir.config_parameter"].sudo()
- debug = ir_config.get_param("wecom.debug_enabled")
-
- if not self.company_id.contacts_app_id: # type: ignore
- raise ValidationError(_("Please bind contact app!"))
-
- if debug:
- _logger.info(_("Start to get Wecom API domain name IP segment"))
- try:
- wecomapi = self.env["wecom.service_api"].InitServiceApi(self.company_id.corpid, self.company_id.contacts_app_id.secret) # type: ignore
-
- response = wecomapi.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "GET_API_DOMAIN_IP"
- ),
- {},
- )
- if response["errcode"] == 0:
- self.env["ir.config_parameter"].set_param(
- "wecom.api_domain_ip", response["ip_list"]
- )
- return {"type": "ir.actions.client", "tag": "reload"} # 刷新页面
-
- except ApiException as ex:
- return self.env["wecomapi.tools.action"].ApiExceptionDialog(
- ex, raise_exception=True
- )
-
- finally:
- if debug:
- _logger.info(_("End obtaining Wecom API domain name IP segment"))
diff --git a/wecom_contacts/models/res_partner.py b/wecom_contacts/models/res_partner.py
deleted file mode 100644
index 187471d8f..000000000
--- a/wecom_contacts/models/res_partner.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import logging
-from odoo import api, fields, models, Command, _
-
-from odoo.addons.wecom_api.api.wecom_abstract_api import ApiException # type: ignore
-
-_logger = logging.getLogger(__name__)
-
-
-class Partner(models.Model):
- _inherit = "res.partner"
-
- wecom_userid = fields.Char(
- string="WeCom User ID",
- readonly=True,
- )
- wecom_openid = fields.Char(
- string="WeCom OpenID",
- readonly=True,
- )
-
- is_wecom_user = fields.Boolean(
- "Is WeCom user",
- readonly=True,
- )
- qr_code = fields.Char(
- string="Personal QR code",
- readonly=True,
- )
- wecom_user_order = fields.Char(
- "WeCom User sequence",
- default="0",
- readonly=True,
- )
-
- def get_wecom_openid(self):
- """
- 获取企微OpenID
- """
- for partner in self:
- print(partner.company_id) # type: ignore
- try:
- wxapi = self.env["wecom.service_api"].InitServiceApi(
- partner.company_id.corpid, # type: ignore
- partner.company_id.contacts_app_id.secret, # type: ignore
- )
- response = wxapi.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "USERID_TO_OPENID"
- ),
- {
- "userid": partner.wecom_userid, # type: ignore
- },
- )
- except ApiException as ex:
- self.env["wecomapi.tools.action"].ApiExceptionDialog(
- ex, raise_exception=True
- )
- else:
- partner.wecom_openid = response["openid"] # type: ignore
diff --git a/wecom_contacts/models/res_partner_category.py b/wecom_contacts/models/res_partner_category.py
deleted file mode 100644
index 3bafba3f1..000000000
--- a/wecom_contacts/models/res_partner_category.py
+++ /dev/null
@@ -1,297 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import logging
-import base64
-import time
-from lxml import etree
-from odoo import api, fields, models, _
-
-# from lxml_to_dict import lxml_to_dict
-import xmltodict
-from odoo.addons.wecom_api.api.wecom_abstract_api import ApiException # type: ignore
-
-_logger = logging.getLogger(__name__)
-
-WECOM_USER_MAPPING_ODOO_PARTNER_CATEGORY = {
- "TagId": "tagid", # 标签Id
- "AddUserItems": "add_partner_ids", # 标签中新增的成员userid列表,用逗号分隔
- "DelUserItems": "del_partner_ids", # 标签中删除的成员userid列表,用逗号分隔
- "AddPartyItems": "", # 标签中新增的部门id列表,用逗号分隔
- "DelPartyItems": "", # 标签中删除的部门id列表,用逗号分隔
-}
-
-
-class PartnerCategory(models.Model):
- _inherit = "res.partner.category"
-
- company_id = fields.Many2one(
- "res.company",
- string="Company",
- index=True,
- default=lambda self: self.env.company,
- readonly=True,
- )
-
- display_name = fields.Char(string="Display Name", compute="_compute_display_name")
- tagid = fields.Integer(
- string="WeCom Tag ID",
- readonly=True,
- default=0,
- )
- is_wecom_tag = fields.Boolean(
- string="WeCom Tag",
- default=False,
- )
-
- @api.depends("is_wecom_tag")
- def _compute_display_name(self):
- tag = _("WeCom Tag")
- for rec in self:
- if rec.is_wecom_tag: # type: ignore
- rec.display_name = "%s:%s" % (tag, rec.name) # type: ignore
- else:
- rec.display_name = rec.name # type: ignore
-
- @api.model
- def download_wecom_contact_tags(self):
- """
- 下载企微标签列表 res.partner.category
- """
- start_time = time.time()
- company = self.env.context.get("company_id")
-
- tasks = []
- if not company:
- company = self.env.company
- if company.is_wecom_organization:
- try:
- wxapi = self.env["wecom.service_api"].InitServiceApi(
- company.corpid, company.contacts_app_id.secret
- )
- response = wxapi.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "TAG_GET_LIST"
- )
- )
-
- except ApiException as ex:
- end_time = time.time()
- self.env["wecomapi.tools.action"].ApiExceptionDialog(
- ex, raise_exception=False
- )
- tasks = [
- {
- "name": "download_tag_data",
- "state": False,
- "time": end_time - start_time,
- "msg": str(ex),
- }
- ]
- except Exception as e:
- end_time = time.time()
- tasks = [
- {
- "name": "download_tag_data",
- "state": False,
- "time": end_time - start_time,
- "msg": str(e),
- }
- ]
- else:
- tags = response["taglist"]
- for tag in tags:
- category = self.search(
- [
- ("tagid", "=", tag["tagid"]),
- ("company_id", "=", company.id),
- ],
- limit=1,
- )
-
- if not category:
- category.create( # type: ignore
- {
- "name": tag["tagname"],
- "tagid": tag["tagid"],
- "is_wecom_tag": True,
- }
- )
- else:
- category.write( # type: ignore
- {
- "name": tag["tagname"],
- "is_wecom_tag": True,
- }
- )
- result = self.download_wecom_tag_member(
- category, wxapi, tag["tagid"], company
- )
- if result:
- tasks.append(
- {
- "name": "download_tag_members",
- "state": False,
- "time": 0,
- "msg": _(
- "Failed to download tag [%s] member of company [%s]!"
- )
- % (tag["tagname"], company.name),
- }
- )
- finally:
- end_time = time.time()
- task = {
- "name": "download_tag_data",
- "state": True,
- "time": end_time - start_time,
- "msg": _("Tag list downloaded successfully."),
- }
- tasks.append(task)
- else:
- end_time = time.time()
- tasks = [
- {
- "name": "download_tag_data",
- "state": False,
- "time": end_time - start_time,
- "msg": _(
- "The current company does not identify the Wecom organization. Please configure or switch the company."
- ),
- }
- ]
- return tasks
-
- def download_wecom_tag_member(self, category, wxapi, tagid, company):
- """
- 下载企微标签成员
- """
- res = {}
- try:
- response = wxapi.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "TAG_GET_MEMBER"
- ),
- {"tagid": str(tagid)},
- )
- except ApiException as ex:
- self.env["wecomapi.tools.action"].ApiExceptionDialog(
- ex, raise_exception=False
- )
- res = {
- "name": "download_tag_members",
- "state": False,
- "time": 0,
- "msg": repr(ex),
- }
- except Exception as e:
- res = {
- "name": "download_tag_members",
- "state": False,
- "time": 0,
- "msg": repr(e),
- }
- else:
- partner_ids = []
- for user in response["userlist"]:
- partner = (
- self.env["res.partner"]
- .sudo()
- .search(
- [
- ("wecom_userid", "=", user["userid"].lower()),
- ("company_id", "=", company.id),
- ("is_wecom_user", "=", True),
- "|",
- ("active", "=", True),
- ("active", "=", False),
- ],
- limit=1,
- )
- )
- if partner:
- partner_ids.append(partner.id)
- if len(partner_ids) > 0:
- category.write({"partner_ids": [(6, 0, partner_ids)]})
-
- finally:
- return res # 返回失败的结果
-
- # ------------------------------------------------------------
- # 企微通讯录事件
- # ------------------------------------------------------------
- # def wecom_event_change_contact_tag(self, cmd):
- # """
- # 通讯录事件更新标签
- # """
- # xml_tree = self.env.context.get("xml_tree")
- # company_id = self.env.context.get("company_id")
- # xml_tree_str = etree.fromstring(bytes.decode(xml_tree))
- # dic = lxml_to_dict(xml_tree_str)["xml"]
-
- # callback_tag = self.sudo().search(
- # [("company_id", "=", company_id.id), ("tagid", "=", dic["TagId"])],
- # limit=1,
- # )
-
- # domain = [
- # "|",
- # ("active", "=", True),
- # ("active", "=", False),
- # ]
- # partner = (
- # self.env["res.partner"]
- # .sudo()
- # .search([("company_id", "=", company_id.id)] + domain)
- # )
- # update_dict = {}
-
- # for key, value in dic.items():
- # if (
- # key == "ToUserName"
- # or key == "FromUserName"
- # or key == "CreateTime"
- # or key == "Event"
- # or key == "MsgType"
- # or key == "ChangeType"
- # ):
- # # 忽略掉 不需要的key
- # pass
- # else:
- # if key in WECOM_USER_MAPPING_ODOO_PARTNER_CATEGORY.keys():
- # if WECOM_USER_MAPPING_ODOO_PARTNER_CATEGORY[key] != "":
- # update_dict[
- # WECOM_USER_MAPPING_ODOO_PARTNER_CATEGORY[key]
- # ] = value
- # else:
- # _logger.info(
- # _(
- # "There is no mapping for field [%s], please contact the developer."
- # )
- # % key
- # )
-
- # add_partner_list = []
- # del_partner_list = []
-
- # if "add_partner_ids" in update_dict.keys():
- # for wecom_userid in update_dict["add_partner_ids"].split(","):
- # add_partner_list.append(
- # partner.search(
- # [("wecom_userid", "=", wecom_userid.lower())], limit=1
- # ).id
- # )
- # elif "del_partner_ids" in update_dict.keys():
- # for wecom_userid in update_dict["del_partner_ids"].split(","):
- # del_partner_list.append(
- # partner.search(
- # [("wecom_userid", "=", wecom_userid.lower())], limit=1
- # ).id
- # )
- # if len(add_partner_list) > 0:
- # callback_tag.write(
- # {"partner_ids": [(4, res, False) for res in add_partner_list]}
- # )
- # if len(del_partner_list) > 0:
- # callback_tag.write(
- # {"partner_ids": [(3, res, False) for res in del_partner_list]}
- # )
diff --git a/wecom_contacts/models/res_users.py b/wecom_contacts/models/res_users.py
deleted file mode 100644
index 01db7227a..000000000
--- a/wecom_contacts/models/res_users.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# -*- coding: utf-8 -*-
-
-
-from odoo import models, _
-from odoo.addons.wecom_api.api.wecom_abstract_api import ApiException # type: ignore
-
-
-class User(models.Model):
- _inherit = ["res.users"]
-
- def get_wecom_openid(self):
- """
- 获取企微OpenID
- """
- for user in self:
- try:
- wxapi = self.env["wecom.service_api"].InitServiceApi(
- user.company_id.corpid, # type: ignore
- user.company_id.contacts_app_id.secret, # type: ignore
- )
- response = wxapi.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "USERID_TO_OPENID"
- ),
- {
- "userid": user.wecom_userid, # type: ignore
- },
- )
- except ApiException as ex:
- self.env["wecomapi.tools.action"].ApiExceptionDialog(
- ex, raise_exception=True
- )
- else:
- user.wecom_openid = response["openid"] # type: ignore
diff --git a/wecom_contacts/models/wecom_apps.py b/wecom_contacts/models/wecom_apps.py
deleted file mode 100644
index 654f37ada..000000000
--- a/wecom_contacts/models/wecom_apps.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import logging
-import time
-from datetime import datetime, timedelta
-from odoo import _, api, fields, models
-from odoo.exceptions import UserError
-from odoo.addons.wecom_api.api.wecom_abstract_api import ApiException # type: ignore
-
-_logger = logging.getLogger(__name__)
-
-
-class WeComApps(models.Model):
- _inherit = "wecom.apps"
-
- def cron_get_app_jsapi_ticket(self):
- """
- 定时任务,每隔两小时更新应用的jsapi_ticket
- """
- for app in self:
- if (
- app.company_id.is_wecom_organization # type: ignore
- and app.company_id.corpid # type: ignore
- and app.secret # type: ignore
- ):
- _logger.info(
- _("Automatic tasks:Start getting JSAPI ticket for app [%s]")
- % (app.name) # type: ignore
- )
- if (
- app.jsapi_ticket_expiration_time # type: ignore
- and app.jsapi_ticket_expiration_time > datetime.now() # type: ignore
- ):
- _logger.info(
- _(
- "Automatic tasks:JSAPI ticket for app [%s] is not expired, no need to update"
- )
- % (app.name) # type: ignore
- )
- else:
- try:
- wecom_api = self.env["wecom.service_api"].InitServiceApi(
- app.company_id.corpid, app.secret # type: ignore
- )
- response = wecom_api.httpCall(
- self.env["wecom.service_api_list"].get_server_api_call(
- "AGENT_GET_TICKET"
- ),
- {"type": "agent_config"},
- )
- except ApiException as e:
- _logger.error(
- _(
- "Automatic tasks:Failed to get JSAPI ticket for app [%s], error: %s"
- )
- % (app.name, e) # type: ignore
- )
- else:
- if response["errcode"] == 0:
- app.write(
- {
- "jsapi_ticket": response["ticket"],
- "jsapi_ticket_expiration_time": datetime.now()
- + timedelta(seconds=response["expires_in"]),
- }
- )
- _logger.info(
- _("Automatic tasks:Successfully get JSAPI ticket for app [%s]")
- % (app.name) # type: ignore
- )
- _logger.info(
- _("Automatic tasks:Start getting app [%s] ticket for company [%s]")
- % (app.name, app.company_id.name) # type: ignore
- )
diff --git a/wecom_contacts/security/ir.model.access.csv b/wecom_contacts/security/ir.model.access.csv
deleted file mode 100644
index 97dd8b917..000000000
--- a/wecom_contacts/security/ir.model.access.csv
+++ /dev/null
@@ -1 +0,0 @@
-id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
diff --git a/wecom_contacts/static/description/icon.png b/wecom_contacts/static/description/icon.png
deleted file mode 100644
index 90ed3eee753f3b743d27aee7e73ffdd8cbd8c7f7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 13681
zcmc(G2{@E(-*=l-wuI~vA