educommon 3.10.1__tar.gz → 3.11.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {educommon-3.10.1/src/educommon.egg-info → educommon-3.11.1}/PKG-INFO +9 -3
- {educommon-3.10.1 → educommon-3.11.1}/setup.py +1 -1
- educommon-3.11.1/src/educommon/async_task/migrations/0003_alter_runningtask_options.py +18 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/models.py +1 -3
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/fields.py +5 -1
- educommon-3.11.1/src/educommon/utils/phone_number/enums.py +47 -0
- educommon-3.11.1/src/educommon/utils/phone_number/modelfields.py +91 -0
- educommon-3.11.1/src/educommon/utils/phone_number/phone_number.py +273 -0
- educommon-3.11.1/src/educommon/utils/phone_number/validators.py +92 -0
- educommon-3.11.1/src/educommon/utils/system_app/management/commands/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/version.conf +5 -5
- {educommon-3.10.1 → educommon-3.11.1/src/educommon.egg-info}/PKG-INFO +9 -3
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon.egg-info/SOURCES.txt +7 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon.egg-info/requires.txt +1 -1
- educommon-3.11.1/tests/test_phone_number.py +120 -0
- {educommon-3.10.1 → educommon-3.11.1}/MANIFEST.in +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/README.rst +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/UPGRADE.rst +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/setup.cfg +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/README.rst +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/apps.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/static/edu_about/barsgroup.png +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/ui/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/ui/about-window.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/ui/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/ui/common-tab.html +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/ui/packages-tab.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/ui/postgresql-extensions-tab.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/ui/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/about/utils.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/apps.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/consts.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/exceptions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/helpers.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/locker.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/migrations/0001_initial.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/migrations/0002_task_type_and_status_data.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/migrations/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/tasks.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/templates/ui-js/async-task-list-win.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/templates/ui-js/async-task-revoke.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/templates/ui-js/async-task-view-win.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_task/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_tasks/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_tasks/apps.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_tasks/exceptions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_tasks/fixtures/initial_data.json +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_tasks/locks.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_tasks/migrations/0001_initial.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_tasks/migrations/0002_load_initial_data.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_tasks/migrations/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_tasks/models.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_tasks/statuses.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/async_tasks/tasks.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/app_meta.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/apps.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/constants.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/error_log/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/error_log/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/helpers.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/management/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/management/commands/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/management/commands/reinstall_audit_log.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/middleware.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/migrations/0001_initial.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/migrations/0002_install_audit_log.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/migrations/0003_logproxy.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/migrations/0004_reinstall_audit_log.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/migrations/0005_postgresql_error.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/migrations/0006_auto_20200806_1707.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/migrations/0007_create_selective_tables_function.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/migrations/0008_table_logged.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/migrations/0009_reinstall_audit_log.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/migrations/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/models.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/permissions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/proxies.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/routers.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/sql/configure_audit_log.sql +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/sql/install_audit_log.sql +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/utils/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/audit_log/utils/operations.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/app_meta.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/backends/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/backends/base.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/backends/caching.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/backends/simple.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/checker.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/config.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/constants.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/management/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/management/commands/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/management/commands/rbac.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/manager.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/migrations/0001_initial.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/migrations/0002_model_modifier_metaclass_fix.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/migrations/0003_permission_hidden.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/migrations/0004_auto_20171024_1245.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/migrations/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/models.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/permissions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/templates/rbac/role-add-window.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/templates/rbac/role-edit-window.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/templates/rbac/roles-list-window.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/templates/rbac/roles-view-list-window.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/utils.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/rbac/validators.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/app_meta.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/checkers.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/const.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/migrations/0001_initial.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/migrations/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/models.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/static/simple_auth/simple_auth.css +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/templates/simple_auth/change_reset_password_page.html +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/templates/simple_auth/email/reset_password.html +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/templates/simple_auth/login_page.html +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/templates/simple_auth/reset_password_page.html +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/auth/simple_auth/validators.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/app_meta.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/base.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/catalogs.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/apps.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/migrations/0001_initial.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/migrations/0002_add_contingent_model_deleted.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/migrations/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/model_views.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/models.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/observer.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/plugin_meta.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/storage.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/contingent_plugin/utils.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/json_data/icao.json +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/json_data/okogu.json +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/contingent/json_data/oksm.json +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/migration/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/migration/operations.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/mixins/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/mixins/date_interval.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/mixins/validation.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/model_view/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/model_view/table-view.html +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/models.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/observer.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/partitioning/README.md +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/partitioning/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/partitioning/const.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/partitioning/management/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/partitioning/management/commands/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/partitioning/management/commands/apply_partitioning.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/partitioning/management/commands/clear_table.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/partitioning/management/commands/split_table.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/partitioning/partitioning.sql +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/partitioning/partitioning_set_search_path.sql +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/partitioning/triggers.sql +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/routers.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/signals.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/utils.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/validators/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/db/validators/simple.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/README.rst +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/api.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/app_meta.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/exceptions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/management/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/management/commands/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/management/commands/atcfs_migrate.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/models.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/monkey_patching.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/settings.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/storage.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/django/storages/atcfs/templates/atcfs_unavailable.html +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/extjs/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/extjs/fields/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/extjs/fields/input_params.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/XLSReader.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/api.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/constants.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/loggers.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/proxy.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/proxy_import.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/refactoring-notes.txt +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/report.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/test_file.xls +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/importer/validators.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/integration_entities/README.rst +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/integration_entities/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/integration_entities/consts.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/integration_entities/entities.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/integration_entities/enums.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/integration_entities/helpers.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/integration_entities/mixins.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ioc/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/logger/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/logger/app_settings.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/logger/apps.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/logger/consts.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/logger/formatters.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/logger/helpers.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/logger/loggers.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/logger/records.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/extensions/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/extensions/listeners/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/extensions/listeners/delete_check/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/extensions/listeners/delete_check/cancel-confirm-window.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/extensions/listeners/delete_check/listeners.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/extensions/listeners/delete_check/mixins.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/extensions/listeners/delete_check/related-objects-window.html +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/extensions/listeners/delete_check/signals.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/extensions/listeners/delete_check/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/extensions/listeners/delete_check/utils.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/extensions/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/m3/transaction_context.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/objectpack/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/objectpack/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/objectpack/apps.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/objectpack/filters.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/objectpack/templates/base-grid-window.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/objectpack/templates/filter-panel.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/objectpack/templates/grid-panel.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/objectpack/templates/multiSelectWindow.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/objectpack/templates/multiselect-page-fix.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/objectpack/templates/relations-check-mixin-template.html +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/objectpack/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/README.rst +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/app_meta.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/apps.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/base.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/builders/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/builders/excel/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/builders/excel/_base.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/builders/excel/_header.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/builders/excel/constants.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/builders/excel/product.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/builders/excel/with_merged_cells.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/config.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/constants.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/editor/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/editor/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/editor/edit-window.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/editor/list-window.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/editor/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/exceptions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/migrations/0001_initial.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/migrations/0002_report_filters.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/migrations/0003_reportfilter_exclude.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/migrations/0004_reportfilter_fields.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/migrations/0005_reportcolumn_visible.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/migrations/0006_reportsorting.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/migrations/0007_include_available_units.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/migrations/0008_auto_20170407_1318.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/migrations/0009_auto_20180405_0642.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/migrations/0010_add_aggregate_fields.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/migrations/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/mixins.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/models.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/plugin_meta.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/registries.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/utils.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/constructor/validators.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/reporter.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/report/utils.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/rest/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/rest/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/rest/context.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/rest/controllers.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/rest/misc.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/rest/mixins.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/secure_media/README.rst +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/secure_media/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/secure_media/app_meta.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/thread_data.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/caching.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/conversion.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/crypto.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/date.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/db/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/db/postgresql.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/fonts/Arial.ttf +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/fonts/Calibri.ttf +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/fonts/Tahoma.ttf +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/fonts/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/licence/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/licence/converters.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/misc.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/object_grid.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/patches.py +0 -0
- {educommon-3.10.1/src/educommon/utils/system_app → educommon-3.11.1/src/educommon/utils/phone_number}/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/plugins.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/registry.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/seqtools.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/serializer.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/storage.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/system.py +0 -0
- {educommon-3.10.1/src/educommon/utils/system_app/management → educommon-3.11.1/src/educommon/utils/system_app}/__init__.py +0 -0
- {educommon-3.10.1/src/educommon/utils/system_app/management/commands → educommon-3.11.1/src/educommon/utils/system_app/management}/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/system_app/management/commands/delete_objects.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/system_app/templatetags/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/system_app/templatetags/educommon.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/xml/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/xml/catalog.json +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/xml/resolver.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/xml/saml-schema-assertion-2.0.xsd +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/xml/saml-schema-protocol-2.0.xsd +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/xml/xenc-schema.xsd +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/utils/xml/xmldsig-core-schema.xsd +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/README.rst +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/actions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/app_meta.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/base.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/migrations/0001_initial.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/migrations/0002_auto_20160628_1334.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/migrations/0003_add_fields_to_smev_logs.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/migrations/0004_auto_20160727_1600.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/migrations/0005_auto_20161130_1615.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/migrations/0006_auto_20170327_1027.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/migrations/0007_auto_20180607_1040.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/migrations/0008_auto_20180713_1445.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/migrations/0009_auto_20201130_1553.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/migrations/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/models.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/provider.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/report.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/smev/__init__.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/smev/applications.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/smev/exceptions.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/templates/report/smev_logs.xlsx +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/templates/ui-js/smev-logs-list-window.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/templates/ui-js/smev-logs-report-setting-window.js +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/ui.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon/ws_log/utils.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon.egg-info/dependency_links.txt +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/src/educommon.egg-info/top_level.txt +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_contingent_plugin_utils.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_dates_splitter.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_delete_check.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_delete_objects.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_django_db_utils.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_interval_mixins.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_patches.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_personal_data_fields.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_report.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_service_db_router.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_utils.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_utils_plugins.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/test_validators.py +0 -0
- {educommon-3.10.1 → educommon-3.11.1}/tests/tests_rbac.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: educommon
|
3
|
-
Version: 3.
|
3
|
+
Version: 3.11.1
|
4
4
|
Summary: Общая кодовая база для проектов БЦ Образование
|
5
5
|
Home-page: https://stash.bars-open.ru/projects/EDUBASE/repos/educommon
|
6
6
|
Author: BARS Group
|
@@ -20,7 +20,7 @@ Classifier: Framework :: Django :: 3.0
|
|
20
20
|
Classifier: Framework :: Django :: 3.1
|
21
21
|
Classifier: Framework :: Django :: 3.2
|
22
22
|
Requires-Dist: packaging<24,>=21.3
|
23
|
-
Requires-Dist: Django<4,>=
|
23
|
+
Requires-Dist: Django<4,>=3.1
|
24
24
|
Requires-Dist: django-mptt
|
25
25
|
Requires-Dist: python-dateutil
|
26
26
|
Requires-Dist: termcolor
|
@@ -39,3 +39,9 @@ Requires-Dist: m3-simple-report<2,>=1.4.1
|
|
39
39
|
Requires-Dist: m3-spyne-smev<2,>=0.2.4
|
40
40
|
Requires-Dist: python-magic==0.4.15
|
41
41
|
Requires-Dist: distro<2,>=1.3.0
|
42
|
+
Dynamic: author
|
43
|
+
Dynamic: author-email
|
44
|
+
Dynamic: classifier
|
45
|
+
Dynamic: home-page
|
46
|
+
Dynamic: requires-dist
|
47
|
+
Dynamic: summary
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Generated by Django 3.2.23 on 2025-02-04 13:16
|
2
|
+
|
3
|
+
from django.db import migrations, models
|
4
|
+
|
5
|
+
|
6
|
+
class Migration(migrations.Migration):
|
7
|
+
|
8
|
+
dependencies = [
|
9
|
+
('async_task', '0002_task_type_and_status_data'),
|
10
|
+
]
|
11
|
+
|
12
|
+
operations = [
|
13
|
+
migrations.AlterField(
|
14
|
+
model_name='runningtask',
|
15
|
+
name='options',
|
16
|
+
field=models.JSONField(blank=True, null=True, verbose_name='Дополнительные опции задачи'),
|
17
|
+
),
|
18
|
+
]
|
@@ -9,9 +9,6 @@ from celery import (
|
|
9
9
|
from django.contrib.contenttypes.models import (
|
10
10
|
ContentType,
|
11
11
|
)
|
12
|
-
from django.contrib.postgres.fields import (
|
13
|
-
JSONField,
|
14
|
-
)
|
15
12
|
from django.db.models import (
|
16
13
|
PROTECT,
|
17
14
|
SET_NULL,
|
@@ -22,6 +19,7 @@ from django.db.models import (
|
|
22
19
|
Index,
|
23
20
|
PositiveIntegerField,
|
24
21
|
UUIDField,
|
22
|
+
JSONField,
|
25
23
|
)
|
26
24
|
from m3.db import (
|
27
25
|
BaseObjectModel,
|
@@ -24,6 +24,9 @@ from educommon.django.db.validators import (
|
|
24
24
|
from educommon.utils.misc import (
|
25
25
|
cached_property,
|
26
26
|
)
|
27
|
+
from educommon.utils.phone_number.modelfields import (
|
28
|
+
PhoneField,
|
29
|
+
)
|
27
30
|
|
28
31
|
|
29
32
|
__all__ = [
|
@@ -41,7 +44,8 @@ __all__ = [
|
|
41
44
|
'PassportNumberField',
|
42
45
|
'INNField',
|
43
46
|
'KPPField',
|
44
|
-
'OGRNField'
|
47
|
+
'OGRNField',
|
48
|
+
'PhoneField',
|
45
49
|
]
|
46
50
|
|
47
51
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
from enum import (
|
2
|
+
Enum,
|
3
|
+
)
|
4
|
+
|
5
|
+
|
6
|
+
class PhoneFieldType(Enum):
|
7
|
+
"""Тип номера телефона для поля модели."""
|
8
|
+
|
9
|
+
COMMON = 'COMMON'
|
10
|
+
E164 = 'E164'
|
11
|
+
RU = 'RU'
|
12
|
+
RU_E164 = 'RU_E164'
|
13
|
+
RU_LOCAL = 'RU_LOCAL'
|
14
|
+
RU_MOBILE = 'RU_MOBILE'
|
15
|
+
|
16
|
+
values = {
|
17
|
+
COMMON: 'Общий формат телефона',
|
18
|
+
E164: 'Международный формат телефона',
|
19
|
+
RU: 'Общий формат российского номера',
|
20
|
+
RU_E164: 'Российский номер в международном формате',
|
21
|
+
RU_LOCAL: 'Российский городской номер',
|
22
|
+
RU_MOBILE: 'Российский мобильный номер',
|
23
|
+
}
|
24
|
+
|
25
|
+
@classmethod
|
26
|
+
def get_choices(cls):
|
27
|
+
return list(cls.values.items())
|
28
|
+
|
29
|
+
|
30
|
+
class PhoneNumberType(Enum):
|
31
|
+
"""Тип формата номера телефона."""
|
32
|
+
|
33
|
+
E164 = 'E164'
|
34
|
+
RU_E164 = 'RU_E164'
|
35
|
+
RU_LOCAL = 'RU_LOCAL'
|
36
|
+
UNKNOWN = 'UNKNOWN'
|
37
|
+
|
38
|
+
values = {
|
39
|
+
E164: 'Международный формат телефона',
|
40
|
+
RU_E164: 'Российский номер в международном формате',
|
41
|
+
RU_LOCAL: 'Российский городской номер',
|
42
|
+
UNKNOWN: 'Неизвестный формат',
|
43
|
+
}
|
44
|
+
|
45
|
+
@classmethod
|
46
|
+
def get_choices(cls):
|
47
|
+
return list(cls.values.items())
|
@@ -0,0 +1,91 @@
|
|
1
|
+
from django.db.models import (
|
2
|
+
CharField,
|
3
|
+
)
|
4
|
+
|
5
|
+
from educommon.utils.phone_number.enums import (
|
6
|
+
PhoneFieldType,
|
7
|
+
)
|
8
|
+
from educommon.utils.phone_number.phone_number import (
|
9
|
+
PhoneNumber,
|
10
|
+
to_python,
|
11
|
+
)
|
12
|
+
from educommon.utils.phone_number.validators import (
|
13
|
+
validate_common_phone_number,
|
14
|
+
validate_e164_phone_number,
|
15
|
+
validate_ru_e164_phone_number,
|
16
|
+
validate_ru_mobile_phone_number,
|
17
|
+
validate_ru_phone_number,
|
18
|
+
)
|
19
|
+
|
20
|
+
|
21
|
+
PHONE_FIELD_TYPE_TO_VALIDATOR = {
|
22
|
+
PhoneFieldType.COMMON: validate_common_phone_number,
|
23
|
+
PhoneFieldType.E164: validate_e164_phone_number,
|
24
|
+
PhoneFieldType.RU: validate_ru_phone_number,
|
25
|
+
PhoneFieldType.RU_E164: validate_ru_e164_phone_number,
|
26
|
+
PhoneFieldType.RU_MOBILE: validate_ru_mobile_phone_number,
|
27
|
+
}
|
28
|
+
|
29
|
+
|
30
|
+
class PhoneNumberDescriptor:
|
31
|
+
"""Дескриптор для поля с номером телефона инстанса модели.
|
32
|
+
|
33
|
+
Возвращает PhoneNumber при доступе к полю телефона.
|
34
|
+
|
35
|
+
Позволяет для поля задавать номер телефона как:
|
36
|
+
instance.phone = PhoneNumber(...)
|
37
|
+
либо
|
38
|
+
instance.phone = '+7 (900) 555-55-55'
|
39
|
+
"""
|
40
|
+
|
41
|
+
def __init__(self, field):
|
42
|
+
self.field = field
|
43
|
+
|
44
|
+
def __get__(self, instance, owner):
|
45
|
+
if instance is None:
|
46
|
+
return self
|
47
|
+
|
48
|
+
if self.field.name in instance.__dict__:
|
49
|
+
value = instance.__dict__[self.field.name]
|
50
|
+
else:
|
51
|
+
instance.refresh_from_db(fields=[self.field.name])
|
52
|
+
value = getattr(instance, self.field.name)
|
53
|
+
|
54
|
+
return value
|
55
|
+
|
56
|
+
def __set__(self, instance, value):
|
57
|
+
instance.__dict__[self.field.name] = to_python(value)
|
58
|
+
|
59
|
+
|
60
|
+
class PhoneField(CharField):
|
61
|
+
"""Поле с номером телефона."""
|
62
|
+
|
63
|
+
attr_class = PhoneNumber
|
64
|
+
descriptor_class = PhoneNumberDescriptor
|
65
|
+
|
66
|
+
empty_values = [*CharField.empty_values, PhoneNumber('')]
|
67
|
+
|
68
|
+
def __init__(self, *args, phone_type: PhoneFieldType = PhoneFieldType.COMMON, **kwargs):
|
69
|
+
kwargs.setdefault('max_length', 31)
|
70
|
+
super().__init__(*args, **kwargs)
|
71
|
+
|
72
|
+
self.validators.append(
|
73
|
+
PHONE_FIELD_TYPE_TO_VALIDATOR.get(phone_type, validate_common_phone_number)
|
74
|
+
)
|
75
|
+
|
76
|
+
def to_python(self, value):
|
77
|
+
"""Преобразование входящего значения в ожидаемый тип Python."""
|
78
|
+
return to_python(value)
|
79
|
+
|
80
|
+
def from_db_value(self, value, expression, connection):
|
81
|
+
"""Преобразование значения полученного из БД."""
|
82
|
+
return self.to_python(value)
|
83
|
+
|
84
|
+
def get_prep_value(self, value):
|
85
|
+
"""Подготовка значения перед сохранением в БД."""
|
86
|
+
if isinstance(value, PhoneNumber):
|
87
|
+
value = value.cleaned
|
88
|
+
elif value:
|
89
|
+
value = to_python(value).cleaned
|
90
|
+
|
91
|
+
return value or super().get_prep_value(value)
|
@@ -0,0 +1,273 @@
|
|
1
|
+
import re
|
2
|
+
from typing import (
|
3
|
+
Any,
|
4
|
+
Optional,
|
5
|
+
Union,
|
6
|
+
)
|
7
|
+
|
8
|
+
from educommon.utils.phone_number.enums import (
|
9
|
+
PhoneNumberType,
|
10
|
+
)
|
11
|
+
|
12
|
+
|
13
|
+
PHONE_REGEX = re.compile(
|
14
|
+
r'^(?:' # группа с кодом страны и кодом региона
|
15
|
+
r'(\+[1-6,90]{1,3}|\+?7|\+?8)?-?\s*' # опциональный код страны (+XXX, для России может быть +7, 7, 8)
|
16
|
+
r'\(?(\d{3}(?:[-\s]?\d{0,2}(?=[)-.\s]))?)\)?[-.\s]*' # оцпиональный код региона/города в необязательных скобках
|
17
|
+
r')?' # группа с кодом страны и кодом региона может отсутствовать
|
18
|
+
r'(\d{1,2}[-.\s]*\d?)[-.\s]*(\d[-.\s]*\d)[-.\s]*(\d[-.\s]*\d)$' # абонентский номер в формате XXX-XX-XX
|
19
|
+
# первая группа может состоять от 1 до 3 цифр
|
20
|
+
)
|
21
|
+
|
22
|
+
# российский мобильный номер вида +7 (9XX) XXX-XX-XX
|
23
|
+
RU_MOBILE_PHONE_REGEX = re.compile(r'^(\+?7|8)?-?\s*\(?(9\d{2})\)?[-.\s]*(\d{3})[-.\s]*(\d{2})[-.\s]*(\d{2})$')
|
24
|
+
|
25
|
+
# местный номер в формате: XXX-XX-XX, XX-XX-XX, X-XX-XX
|
26
|
+
LOCAL_PHONE_REGEX = re.compile(r'^(\d{1,3})[-.\s]*(\d{2})[-.\s]*(\d{2})$')
|
27
|
+
|
28
|
+
RU_PHONE_CODE = '+7'
|
29
|
+
|
30
|
+
|
31
|
+
class PhoneNumber:
|
32
|
+
"""Телефонный номер.
|
33
|
+
|
34
|
+
В качестве параметра принимает строку с номером телефона в различных форматах,
|
35
|
+
производит разбор и валидацию номера, приводит его к единому формату.
|
36
|
+
|
37
|
+
Поддерживаемые форматы:
|
38
|
+
+XXX (XXX) XXX-XX-XX - в общем виде
|
39
|
+
+7 (XXX) XXX-XX-XX - российский формат
|
40
|
+
8 (XXX) XXX-XX-XX, (XXX-XX) X-XX-XX - российский формат городских номеров
|
41
|
+
XXX-XX-XX, XX-XX-XX, X-XX-X - местные российские номера
|
42
|
+
|
43
|
+
Свойство cleaned возвращает номер в очищенном виде для возможности сохранения в БД.
|
44
|
+
Примеры входной строки и её преобразования в cleaned:
|
45
|
+
+12 (555) 888-77-66 -> +12(555)8887766
|
46
|
+
+7 (900) 555-44-33 -> +79005554433
|
47
|
+
8 800 555-44-33 -> +78005554433
|
48
|
+
(818) 222-11-00 -> +78182221100
|
49
|
+
(818-53) 2-11-00 -> +7(81853)21100
|
50
|
+
222 44 55 -> 2224455
|
51
|
+
2-44-55 -> 24455
|
52
|
+
|
53
|
+
Возвращаемое текстовое представление номера в формате:
|
54
|
+
+XXX (XXX) XXX-XX-XX
|
55
|
+
"""
|
56
|
+
|
57
|
+
def __init__(
|
58
|
+
self,
|
59
|
+
phone: Optional[str],
|
60
|
+
*,
|
61
|
+
need_sanitize: bool = False,
|
62
|
+
) -> None:
|
63
|
+
"""Инициализация.
|
64
|
+
|
65
|
+
Args:
|
66
|
+
need_sanitize: Признак необходимости дополнительной очистки номера перед выполнением парсинга
|
67
|
+
"""
|
68
|
+
self.raw_phone = phone or ''
|
69
|
+
self._need_sanitize = need_sanitize
|
70
|
+
|
71
|
+
self._cleaned = ''
|
72
|
+
|
73
|
+
self.country_code = ''
|
74
|
+
self.region_code = ''
|
75
|
+
self.subscriber_part_1 = ''
|
76
|
+
self.subscriber_part_2 = ''
|
77
|
+
self.subscriber_part_3 = ''
|
78
|
+
|
79
|
+
self._is_parsed = False
|
80
|
+
self._is_e164 = False
|
81
|
+
|
82
|
+
self.parse()
|
83
|
+
|
84
|
+
@staticmethod
|
85
|
+
def _sanitize(value: str) -> str:
|
86
|
+
"""Очистка значения от незначащих символов."""
|
87
|
+
return value.replace(' ', '').replace('-', '')
|
88
|
+
|
89
|
+
@staticmethod
|
90
|
+
def _only_digits(value: str) -> str:
|
91
|
+
"""Возвращает из строки только цифры."""
|
92
|
+
return ''.join(ch for ch in value if ch.isdigit())
|
93
|
+
|
94
|
+
@property
|
95
|
+
def _sanitized(self) -> str:
|
96
|
+
"""Возвращает введенный номер в очищенном виде."""
|
97
|
+
return self._sanitize(self.raw_phone)
|
98
|
+
|
99
|
+
def parse(self):
|
100
|
+
"""Разбор номера."""
|
101
|
+
if self._is_parsed or not self.raw_phone:
|
102
|
+
return
|
103
|
+
|
104
|
+
raw_phone = self._sanitized if self._need_sanitize else self.raw_phone.strip()
|
105
|
+
regex_match = PHONE_REGEX.search(raw_phone)
|
106
|
+
|
107
|
+
self._is_parsed = True
|
108
|
+
|
109
|
+
if regex_match:
|
110
|
+
self.subscriber_part_1 = self._only_digits(regex_match.group(3))
|
111
|
+
self.subscriber_part_2 = self._only_digits(regex_match.group(4))
|
112
|
+
self.subscriber_part_3 = self._only_digits(regex_match.group(5))
|
113
|
+
|
114
|
+
self.region_code = regex_match.group(2)
|
115
|
+
if self.region_code:
|
116
|
+
self.region_code = self._sanitize(self.region_code)
|
117
|
+
|
118
|
+
country_code = regex_match.group(1)
|
119
|
+
|
120
|
+
if country_code in ('8', '7') or (not country_code and self.region_code):
|
121
|
+
self.country_code = RU_PHONE_CODE
|
122
|
+
else:
|
123
|
+
self.country_code = country_code
|
124
|
+
|
125
|
+
if self.country_code == RU_PHONE_CODE and (len(self.region_code) + len(self.subscriber_part_1)) != 6:
|
126
|
+
# у российских номеров код региона и первый блок абонентского номера в сумме должны быть 6 цифр
|
127
|
+
return
|
128
|
+
|
129
|
+
if self.region_code:
|
130
|
+
self._is_e164 = True
|
131
|
+
|
132
|
+
if len(self.region_code) != 3 or len(self.country_code) > 2:
|
133
|
+
cleaned_template = '{0}({1}){2}{3}{4}'
|
134
|
+
else:
|
135
|
+
cleaned_template = '{0}{1}{2}{3}{4}'
|
136
|
+
|
137
|
+
self._cleaned = cleaned_template.format(
|
138
|
+
self.country_code,
|
139
|
+
self.region_code,
|
140
|
+
self.subscriber_part_1,
|
141
|
+
self.subscriber_part_2,
|
142
|
+
self.subscriber_part_3,
|
143
|
+
)
|
144
|
+
|
145
|
+
else:
|
146
|
+
self._cleaned = '{0}{1}{2}'.format(
|
147
|
+
self.subscriber_part_1,
|
148
|
+
self.subscriber_part_2,
|
149
|
+
self.subscriber_part_3,
|
150
|
+
)
|
151
|
+
|
152
|
+
@property
|
153
|
+
def type(self) -> PhoneNumberType:
|
154
|
+
"""Тип номера."""
|
155
|
+
if self.is_valid:
|
156
|
+
if self.country_code == RU_PHONE_CODE:
|
157
|
+
return PhoneNumberType.RU_E164
|
158
|
+
|
159
|
+
elif self.country_code:
|
160
|
+
return PhoneNumberType.E164
|
161
|
+
|
162
|
+
elif not self.country_code:
|
163
|
+
return PhoneNumberType.RU_LOCAL
|
164
|
+
|
165
|
+
return PhoneNumberType.UNKNOWN
|
166
|
+
|
167
|
+
@property
|
168
|
+
def is_valid(self) -> bool:
|
169
|
+
"""Признак корректности введенного номера."""
|
170
|
+
return True if self._is_parsed and self._cleaned else False
|
171
|
+
|
172
|
+
@property
|
173
|
+
def is_e164(self):
|
174
|
+
"""Признак, что номер в международном формате."""
|
175
|
+
return self._is_e164
|
176
|
+
|
177
|
+
@property
|
178
|
+
def is_russia(self) -> bool:
|
179
|
+
"""Признак, что номер российский."""
|
180
|
+
return (
|
181
|
+
self._cleaned.startswith(RU_PHONE_CODE)
|
182
|
+
or (self.is_valid and not self.region_code)
|
183
|
+
)
|
184
|
+
|
185
|
+
@property
|
186
|
+
def cleaned(self) -> str:
|
187
|
+
"""Очищенный номер.
|
188
|
+
|
189
|
+
Используется для сохранения в БД.
|
190
|
+
"""
|
191
|
+
return self._cleaned
|
192
|
+
|
193
|
+
@property
|
194
|
+
def formatted(self) -> str:
|
195
|
+
"""Отформатированный номер для отображения пользователю."""
|
196
|
+
if not self.is_valid:
|
197
|
+
return ''
|
198
|
+
|
199
|
+
formatted_number = '{0}-{1}-{2}'.format(
|
200
|
+
self.subscriber_part_1,
|
201
|
+
self.subscriber_part_2,
|
202
|
+
self.subscriber_part_3,
|
203
|
+
)
|
204
|
+
|
205
|
+
if self._is_e164:
|
206
|
+
formatted_number = '{0} ({1}) {2}'.format(
|
207
|
+
self.country_code,
|
208
|
+
self.region_code,
|
209
|
+
formatted_number,
|
210
|
+
)
|
211
|
+
|
212
|
+
return formatted_number
|
213
|
+
|
214
|
+
def __str__(self) -> str:
|
215
|
+
"""Текстовое представление."""
|
216
|
+
if self.is_valid:
|
217
|
+
return self.formatted
|
218
|
+
else:
|
219
|
+
return self.raw_phone
|
220
|
+
|
221
|
+
def __repr__(self) -> str:
|
222
|
+
"""Представление объекта."""
|
223
|
+
if self.is_valid or not self.raw_phone:
|
224
|
+
return '<{0}: {1}>'.format(type(self).__name__, str(self) or "''")
|
225
|
+
|
226
|
+
else:
|
227
|
+
return '<Invalid {0}: raw_phone="{1}">'.format(type(self).__name__, self.raw_phone)
|
228
|
+
|
229
|
+
def __len__(self):
|
230
|
+
return len(self.cleaned)
|
231
|
+
|
232
|
+
def __bool__(self):
|
233
|
+
return bool(self.cleaned)
|
234
|
+
|
235
|
+
def __hash__(self):
|
236
|
+
return hash(self.cleaned)
|
237
|
+
|
238
|
+
def __eq__(self, other_phone) -> bool:
|
239
|
+
if isinstance(other_phone, str):
|
240
|
+
other_phone = PhoneNumber(other_phone)
|
241
|
+
|
242
|
+
elif not isinstance(other_phone, PhoneNumber):
|
243
|
+
return False
|
244
|
+
|
245
|
+
self_str = self.formatted if self.is_valid else self.raw_phone
|
246
|
+
other_str = other_phone.formatted if other_phone.is_valid else other_phone.raw_phone
|
247
|
+
|
248
|
+
return self_str == other_str
|
249
|
+
|
250
|
+
def __add__(self, other: str) -> str:
|
251
|
+
"""Конкатенация со строкой."""
|
252
|
+
return str(self) + other
|
253
|
+
|
254
|
+
def __radd__(self, other: str) -> str:
|
255
|
+
"""Конкатенация со строкой."""
|
256
|
+
return other + str(self)
|
257
|
+
|
258
|
+
|
259
|
+
def to_python(value: Any) -> Union[PhoneNumber, str, None]:
|
260
|
+
"""Преобразование значения к объекту номера телефона."""
|
261
|
+
if value in (None, ''):
|
262
|
+
phone_number = value
|
263
|
+
|
264
|
+
elif isinstance(value, str):
|
265
|
+
phone_number = PhoneNumber(value)
|
266
|
+
|
267
|
+
elif isinstance(value, PhoneNumber):
|
268
|
+
phone_number = value
|
269
|
+
|
270
|
+
else:
|
271
|
+
raise TypeError(f'Невозможно преобразовать {type(value).__name__} к PhoneNumber.')
|
272
|
+
|
273
|
+
return phone_number
|
@@ -0,0 +1,92 @@
|
|
1
|
+
from typing import (
|
2
|
+
Union,
|
3
|
+
)
|
4
|
+
|
5
|
+
from django.core.exceptions import (
|
6
|
+
ValidationError,
|
7
|
+
)
|
8
|
+
|
9
|
+
from educommon.utils.phone_number.phone_number import (
|
10
|
+
PhoneNumber,
|
11
|
+
to_python,
|
12
|
+
)
|
13
|
+
|
14
|
+
|
15
|
+
def validate_common_phone_number(phone_number: Union[str, PhoneNumber]):
|
16
|
+
"""Валидация номера телефона в общем формате."""
|
17
|
+
phone_number = to_python(phone_number)
|
18
|
+
|
19
|
+
if isinstance(phone_number, PhoneNumber) and not phone_number.is_valid:
|
20
|
+
raise ValidationError(
|
21
|
+
'Неверный формат! Примеры допустимых форматов: '
|
22
|
+
'+XXX (XXX) XXX XX XX, 8 (XXXXX) X-XX-XX, XXX-XX-XX',
|
23
|
+
code='invalid',
|
24
|
+
)
|
25
|
+
|
26
|
+
|
27
|
+
def validate_e164_phone_number(phone_number: Union[str, PhoneNumber]):
|
28
|
+
"""Валидация номера телефона в международном формате."""
|
29
|
+
phone_number = to_python(phone_number)
|
30
|
+
|
31
|
+
if (
|
32
|
+
isinstance(phone_number, PhoneNumber)
|
33
|
+
and not phone_number.is_valid
|
34
|
+
or not phone_number.is_e164
|
35
|
+
):
|
36
|
+
raise ValidationError(
|
37
|
+
'Неверный формат! Примеры допустимых форматов: '
|
38
|
+
'+XXX (XXX) XXX XX XX, +7 (XXX) XXX-XX-XX, 8 (XXXXX) X-XX-XX',
|
39
|
+
code='invalid',
|
40
|
+
)
|
41
|
+
|
42
|
+
|
43
|
+
def validate_ru_phone_number(phone_number: Union[str, PhoneNumber]):
|
44
|
+
"""Валидация российского номера телефона в общем формате."""
|
45
|
+
phone_number = to_python(phone_number)
|
46
|
+
|
47
|
+
if (
|
48
|
+
isinstance(phone_number, PhoneNumber)
|
49
|
+
and not phone_number.is_valid
|
50
|
+
or not phone_number.is_russia
|
51
|
+
):
|
52
|
+
raise ValidationError(
|
53
|
+
'Неверный формат! Примеры допустимых форматов: '
|
54
|
+
'+7 (XXX) XXX-XX-XX, 8 (XXXXX) X-XX-XX, XXX-XX-XX',
|
55
|
+
code='invalid',
|
56
|
+
)
|
57
|
+
|
58
|
+
|
59
|
+
def validate_ru_e164_phone_number(phone_number: Union[str, PhoneNumber]):
|
60
|
+
"""Валидация российского номера телефона в международном формате."""
|
61
|
+
phone_number = to_python(phone_number)
|
62
|
+
|
63
|
+
if (
|
64
|
+
isinstance(phone_number, PhoneNumber)
|
65
|
+
and not phone_number.is_valid
|
66
|
+
or not (phone_number.is_russia and phone_number.is_e164)
|
67
|
+
):
|
68
|
+
raise ValidationError(
|
69
|
+
'Неверный формат! Примеры допустимых форматов: '
|
70
|
+
'+7 (XXX) XXX-XX-XX, 8 (XXXXX) X-XX-XX, (XXX) XXX-XX-XX',
|
71
|
+
code='invalid',
|
72
|
+
)
|
73
|
+
|
74
|
+
|
75
|
+
def validate_ru_mobile_phone_number(phone_number: Union[str, PhoneNumber]):
|
76
|
+
"""Валидация российского мобильного номера телефона."""
|
77
|
+
phone_number = to_python(phone_number)
|
78
|
+
|
79
|
+
if (
|
80
|
+
isinstance(phone_number, PhoneNumber)
|
81
|
+
and not phone_number.is_valid
|
82
|
+
or not (
|
83
|
+
phone_number.region_code
|
84
|
+
and len(phone_number.region_code) == 3
|
85
|
+
and phone_number.region_code.startswith('9')
|
86
|
+
)
|
87
|
+
):
|
88
|
+
raise ValidationError(
|
89
|
+
'Неверный формат! Примеры допустимых форматов: '
|
90
|
+
'+7 (9XX) XXX-XX-XX, 7 (9XX) XXX XX XX, 89XXXXXXXXX',
|
91
|
+
code='invalid',
|
92
|
+
)
|
File without changes
|
@@ -4,8 +4,8 @@
|
|
4
4
|
# нормальной установки обновлений.
|
5
5
|
|
6
6
|
[version]
|
7
|
-
BRANCH = tags/3.
|
8
|
-
VERSION = 3.
|
9
|
-
REVISION =
|
10
|
-
VERSION_DATE =
|
11
|
-
REVISION_DATE =
|
7
|
+
BRANCH = tags/3.11.1
|
8
|
+
VERSION = 3.11.1
|
9
|
+
REVISION = e5d97ae13ca313d7f2354fff33f7c666c9ed1bad
|
10
|
+
VERSION_DATE = 04.02.2025
|
11
|
+
REVISION_DATE = 04.02.2025
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: educommon
|
3
|
-
Version: 3.
|
3
|
+
Version: 3.11.1
|
4
4
|
Summary: Общая кодовая база для проектов БЦ Образование
|
5
5
|
Home-page: https://stash.bars-open.ru/projects/EDUBASE/repos/educommon
|
6
6
|
Author: BARS Group
|
@@ -20,7 +20,7 @@ Classifier: Framework :: Django :: 3.0
|
|
20
20
|
Classifier: Framework :: Django :: 3.1
|
21
21
|
Classifier: Framework :: Django :: 3.2
|
22
22
|
Requires-Dist: packaging<24,>=21.3
|
23
|
-
Requires-Dist: Django<4,>=
|
23
|
+
Requires-Dist: Django<4,>=3.1
|
24
24
|
Requires-Dist: django-mptt
|
25
25
|
Requires-Dist: python-dateutil
|
26
26
|
Requires-Dist: termcolor
|
@@ -39,3 +39,9 @@ Requires-Dist: m3-simple-report<2,>=1.4.1
|
|
39
39
|
Requires-Dist: m3-spyne-smev<2,>=0.2.4
|
40
40
|
Requires-Dist: python-magic==0.4.15
|
41
41
|
Requires-Dist: distro<2,>=1.3.0
|
42
|
+
Dynamic: author
|
43
|
+
Dynamic: author-email
|
44
|
+
Dynamic: classifier
|
45
|
+
Dynamic: home-page
|
46
|
+
Dynamic: requires-dist
|
47
|
+
Dynamic: summary
|
@@ -34,6 +34,7 @@ src/educommon/async_task/tasks.py
|
|
34
34
|
src/educommon/async_task/ui.py
|
35
35
|
src/educommon/async_task/migrations/0001_initial.py
|
36
36
|
src/educommon/async_task/migrations/0002_task_type_and_status_data.py
|
37
|
+
src/educommon/async_task/migrations/0003_alter_runningtask_options.py
|
37
38
|
src/educommon/async_task/migrations/__init__.py
|
38
39
|
src/educommon/async_task/templates/ui-js/async-task-list-win.js
|
39
40
|
src/educommon/async_task/templates/ui-js/async-task-revoke.js
|
@@ -314,6 +315,11 @@ src/educommon/utils/fonts/Tahoma.ttf
|
|
314
315
|
src/educommon/utils/fonts/__init__.py
|
315
316
|
src/educommon/utils/licence/__init__.py
|
316
317
|
src/educommon/utils/licence/converters.py
|
318
|
+
src/educommon/utils/phone_number/__init__.py
|
319
|
+
src/educommon/utils/phone_number/enums.py
|
320
|
+
src/educommon/utils/phone_number/modelfields.py
|
321
|
+
src/educommon/utils/phone_number/phone_number.py
|
322
|
+
src/educommon/utils/phone_number/validators.py
|
317
323
|
src/educommon/utils/system_app/__init__.py
|
318
324
|
src/educommon/utils/system_app/management/__init__.py
|
319
325
|
src/educommon/utils/system_app/management/commands/__init__.py
|
@@ -361,6 +367,7 @@ tests/test_django_db_utils.py
|
|
361
367
|
tests/test_interval_mixins.py
|
362
368
|
tests/test_patches.py
|
363
369
|
tests/test_personal_data_fields.py
|
370
|
+
tests/test_phone_number.py
|
364
371
|
tests/test_report.py
|
365
372
|
tests/test_service_db_router.py
|
366
373
|
tests/test_utils.py
|