edu-rdm-integration 3.5.10__tar.gz → 3.6.0__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.
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/CHANGELOG.md +21 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/PKG-INFO +88 -3
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/README.md +87 -2
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/app_settings.py +13 -0
- edu_rdm_integration-3.6.0/src/edu_rdm_integration/base.py +147 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/consts.py +2 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/enums.py +31 -0
- edu_rdm_integration-3.6.0/src/edu_rdm_integration/migrations/0016_transferredentity_queue_level.py +22 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/models.py +6 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/registry/actions.py +23 -4
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/registry/ui.py +44 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/tasks.py +105 -113
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration.egg-info/PKG-INFO +88 -3
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration.egg-info/SOURCES.txt +1 -0
- edu_rdm_integration-3.5.10/src/edu_rdm_integration/base.py +0 -41
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/CONDUCT.md +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/LICENSE +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/MANIFEST.in +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/pyproject.toml +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/setup.cfg +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/apps.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/caches.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/consts.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/enums.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/errors.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/functions.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/helpers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/managers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/presenters.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/receivers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/results.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/runners.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/strategies.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/strings.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/tests.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/adapters/validators.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/app_meta.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/apps.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_and_export_data/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_and_export_data/apps.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_and_export_data/migrations/0001_initial.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_and_export_data/migrations/0002_auto_20250204_1413.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_and_export_data/migrations/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_and_export_data/models.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_and_export_data/utils.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/base/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/base/caches.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/base/functions.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/base/helpers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/base/managers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/base/mixins.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/base/runners.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/caches.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/consts.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/enums.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/errors.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/functions.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/helpers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/managers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/presenters.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/results.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/runners.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/strings.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/tests.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/base/validators.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/calculated/strategies.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/collect.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/generators.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/helpers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/caches.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/consts.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/enums.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/errors.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/functions.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/helpers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/managers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/presenters.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/results.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/runners.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/strings.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/tests.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/base/validators.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/non_calculated/strategies.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/collect_data/tests.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/entities.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/enum_register/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/enum_register/mixins.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/enum_register/register.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/caches.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/consts.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/enums.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/errors.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/functions.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/helpers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/managers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/presenters.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/requests.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/results.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/runners.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/strings.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/tests.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/base/validators.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/consts.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/dataclasses.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/export.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/export_manager.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/generators.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/helpers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/queue.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/export_data/strategies.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/__init__.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/apps.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/caches.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/consts.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/enums.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/errors.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/functions.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/helpers.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/managers.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/presenters.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/results.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/runners.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/strings.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/tests.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_collect_data_template/validators.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/__init__.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/apps.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/caches.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/consts.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/enums.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/errors.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/functions.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/helpers.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/managers.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/presenters.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/results.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/runners.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/strings.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/tests.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/function_templates/function_export_data_template/validators.py-tpl +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/helpers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/management/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/management/commands/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/management/commands/async_fix_attachment_size.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/management/commands/check_upload_status.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/management/commands/collect_latest_models_data.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/management/commands/collect_models_data.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/management/commands/datamart_status.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/management/commands/datamart_upload.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/management/commands/export_entities_data.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/management/commands/export_latest_entities_data.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/management/general.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/mapping.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0001_initial.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0002_init_data_uploadstatus.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0003_create_index_file_upload_status.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0004_uploaderclientlog.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0005_auto_20231204_1224.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0006_request_status_data.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0007_delete_upload_status.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0008_transferredentity.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0009_auto_20240522_1619.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0010_transferredentity_export_enabled.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0011_exportingdatasubstageentity.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0012_exportingdatasubstageattachment_attachment_size.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0013_set_attachment_size.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0014_uploaddatacommand.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/0015_set_exporting_sub_stage_status.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/migrations/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/redis_cache.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/registry/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/signals.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/storages.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/templates/ui-js/transferred-entity-list.js +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/typing.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/uploader_log/__init__.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/uploader_log/actions.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/uploader_log/apps.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/uploader_log/enums.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/uploader_log/managers.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/uploader_log/templates/ui-js/object-grid-buttons.js +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/uploader_log/ui.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/utils.py +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration.egg-info/dependency_links.txt +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration.egg-info/requires.txt +0 -0
- {edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration.egg-info/top_level.txt +0 -0
@@ -28,6 +28,27 @@
|
|
28
28
|
|
29
29
|
### Удалено
|
30
30
|
|
31
|
+
## [3.6.0] - 2025-04-19
|
32
|
+
|
33
|
+
Вводится две новые очереди и соответсвущие этим очередям периодические задачи
|
34
|
+
сбора и выгрузки данных. Очередь для сущности указывается в реестре "Сущности для сбора и экспорта данных"
|
35
|
+
- по умолчанию все сущности относятся к основной очереди.
|
36
|
+
Итого - нужно настроить три очереди для работы.
|
37
|
+
|
38
|
+
- "Быстрая" очередь - RDM_FAST - для сущностей, по которым данные должны отдаваться каждые 5/10/15 минут по требованиям
|
39
|
+
витрины. Периодическая задача - TransferLatestEntitiesDataFastPeriodicTask.
|
40
|
+
- Основная очередь (та которая была до версии 3.6) - RDM- ля всех сущностей по умолчанию.
|
41
|
+
Периодическая задача - TransferLatestEntitiesDataFastPeriodicTask.
|
42
|
+
- "Долгая" очередь - RDM_LONG - для сущностей по которым идет долгий сбор, например для расчетных сущностей.
|
43
|
+
Периодическая задача - TransferLatestEntitiesDataLongPeriodicTask.
|
44
|
+
|
45
|
+
### Добавлено
|
46
|
+
|
47
|
+
- [EDUSCHL-23348](https://jira.bars.group/browse/EDUSCHL-23348)
|
48
|
+
MINOR Добавлено две дополнительные очереди для сбора и выгрузки данных РВД и соответствующие периодические
|
49
|
+
задачи TransferLatestEntitiesDataFastPeriodicTask и TransferLatestEntitiesDataLongPeriodicTask. Доработан реестр
|
50
|
+
Сущности для сбора и экспорта данных - добавлено окно редактирования для возможности выбора очереди.
|
51
|
+
|
31
52
|
|
32
53
|
## [3.5.10] - 2025-03-24
|
33
54
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: edu-rdm-integration
|
3
|
-
Version: 3.
|
3
|
+
Version: 3.6.0
|
4
4
|
Summary: Интеграция с Региональной витриной данных
|
5
5
|
Author-email: BARS Group <education_dev@bars.group>
|
6
6
|
Project-URL: Homepage, https://stash.bars-open.ru/projects/EDUBASE/repos/edu_rdm_integration/browse
|
@@ -78,6 +78,19 @@ Dynamic: license-file
|
|
78
78
|
|
79
79
|
Стоит обратить внимание, что сущности РВД могут содержать в себе данные из нескольких моделей РВД.
|
80
80
|
|
81
|
+
Очереди для периодических задач сборки и выгрузки данных
|
82
|
+
: Важно учитывать, что с версии пакета 3.6 вводится две новые очереди и соответсвущие этим очередям периодические задачи
|
83
|
+
сбора и выгрузки данных. Очередь для сущности указывается в реестре "Сущности для сбора и экспорта данных" - по умолчанию все
|
84
|
+
сущности относятся к основной очереди.
|
85
|
+
Итого - нужно настроить три очереди для работы.
|
86
|
+
|
87
|
+
- "Быстрая" очередь - RDM_FAST - для сущностей, по которым данные должны отдаваться каждые 5/10/15 минут по требованиям
|
88
|
+
витрины. Периодическая задача - TransferLatestEntitiesDataFastPeriodicTask.
|
89
|
+
- Основная очередь (та которая была до версии 3.6) - RDM- ля всех сущностей по умолчанию.
|
90
|
+
Периодическая задача - TransferLatestEntitiesDataFastPeriodicTask.
|
91
|
+
- "Долгая" очередь - RDM_LONG - для сущностей по которым идет долгий сбор, например для расчетных сущностей.
|
92
|
+
Периодическая задача - TransferLatestEntitiesDataLongPeriodicTask.
|
93
|
+
|
81
94
|
## Требования к окружению
|
82
95
|
|
83
96
|
Для работы требуется Python >=3.9. Так же в зависимостях есть внутренние пакеты:
|
@@ -129,6 +142,39 @@ Dynamic: license-file
|
|
129
142
|
('uploader_client', 'ENABLE_REQUEST_EMULATION'): False,
|
130
143
|
})
|
131
144
|
```
|
145
|
+
С версии пакета 3.6 добавляются новые настройки для двух периодических задач разных очередей сбора и выгрузки данных
|
146
|
+
```
|
147
|
+
PROJECT_DEFAULT_CONFIG.update({
|
148
|
+
# Настройки РВД
|
149
|
+
('rdm_general', 'EXPORT_ENTITY_ID_PREFIX'): '', # Дефолтное значение нужно изменить на специфическое системе
|
150
|
+
('rdm_general', 'COLLECT_CHUNK_SIZE'): 500,
|
151
|
+
('rdm_general', 'EXPORT_CHUNK_SIZE'): 500,
|
152
|
+
('rdm_transfer_task', 'MINUTE'): '0',
|
153
|
+
('rdm_transfer_task', 'HOUR'): '*/4',
|
154
|
+
('rdm_transfer_task', 'DAY_OF_WEEK'): '*',
|
155
|
+
('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS'): 21600,
|
156
|
+
('rdm_transfer_task', 'TIMEDELTA'): 3600,
|
157
|
+
('rdm_transfer_task', 'ENTITIES'): '',
|
158
|
+
('rdm_transfer_task_fast', 'MINUTE'): '*/5',
|
159
|
+
('rdm_transfer_task_fast', 'HOUR'): '*',
|
160
|
+
('rdm_transfer_task_fast', 'DAY_OF_WEEK'): '*',
|
161
|
+
('rdm_transfer_task_fast', 'LOCK_EXPIRE_SECONDS'): 1800,
|
162
|
+
('rdm_transfer_task_long', 'MINUTE'): '0',
|
163
|
+
('rdm_transfer_task_long', 'HOUR'): '*/6',
|
164
|
+
('rdm_transfer_task_long', 'DAY_OF_WEEK'): '*',
|
165
|
+
('rdm_transfer_task_long', 'LOCK_EXPIRE_SECONDS'): 28800,
|
166
|
+
('rdm_upload_status_task', 'MINUTE'): '*/30',
|
167
|
+
('rdm_upload_status_task', 'HOUR'): '*',
|
168
|
+
('rdm_upload_status_task', 'DAY_OF_WEEK'): '*',
|
169
|
+
('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS'): 7200,
|
170
|
+
('uploader_client', 'URL'): 'http://localhost:8090',
|
171
|
+
('uploader_client', 'DATAMART_NAME'): '',
|
172
|
+
('uploader_client', 'REQUEST_RETRIES'): 10,
|
173
|
+
('uploader_client', 'REQUEST_TIMEOUT'): 10,
|
174
|
+
('uploader_client', 'ENABLE_REQUEST_EMULATION'): False,
|
175
|
+
})
|
176
|
+
|
177
|
+
```
|
132
178
|
- Получение значений настроек из конфигурационного файла в settings.py:
|
133
179
|
|
134
180
|
```
|
@@ -187,7 +233,21 @@ Dynamic: license-file
|
|
187
233
|
RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION = conf.get_bool('uploader_client', 'ENABLE_REQUEST_EMULATION')
|
188
234
|
|
189
235
|
```
|
190
|
-
|
236
|
+
С версии пакета 3.6 добавляются настройки для двух новых периодических задач
|
237
|
+
```
|
238
|
+
# Настройка запуска периодической задачи выгрузки данных - быстрая очередь:
|
239
|
+
RDM_FAST_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task_fast', 'MINUTE')
|
240
|
+
RDM_FAST_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task_fast', 'HOUR')
|
241
|
+
RDM_FAST_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task_fast', 'DAY_OF_WEEK')
|
242
|
+
RDM_FAST_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_transfer_task_fast', 'LOCK_EXPIRE_SECONDS')
|
243
|
+
|
244
|
+
# Настройка запуска периодической задачи выгрузки данных - долгая очередь расчетных моделей:
|
245
|
+
RDM_LONG_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task_long', 'MINUTE')
|
246
|
+
RDM_LONG_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task_long', 'HOUR')
|
247
|
+
RDM_LONG_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task_long', 'DAY_OF_WEEK')
|
248
|
+
RDM_LONG_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_transfer_task_long', 'LOCK_EXPIRE_SECONDS')
|
249
|
+
|
250
|
+
```
|
191
251
|
Перечень настроек в settings.py указан в таблице ниже.
|
192
252
|
|
193
253
|
| Название настройки в settings | Описание | Значение по умолчанию |
|
@@ -211,7 +271,18 @@ Dynamic: license-file
|
|
211
271
|
| RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секунадх) | 3600 |
|
212
272
|
| RDM_CHECK_SUSPEND_TASK_STAGE_TIMEOUT | Дельта для определения зависшего подэтапа. Минута | 120 |
|
213
273
|
|
214
|
-
|
274
|
+
С версии пакета 3.6 добавляются новые настройки
|
275
|
+
|
276
|
+
| Название настройки в settings | Описание | Значение по умолчанию |
|
277
|
+
|--------------------------------------------|----------------------------------------------------------------------------------------|-----------------------|
|
278
|
+
| RDM_FAST_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. Минута | '*/5' |
|
279
|
+
| RDM_FAST_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. Час | '*' |
|
280
|
+
| RDM_FAST_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. День недели | '*' |
|
281
|
+
| RDM_FAST_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секунадх) | 1800 |
|
282
|
+
| RDM_LONG_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. Минута | 0 |
|
283
|
+
| RDM_LONG_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. Час | '*/6' |
|
284
|
+
| RDM_LONG_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. День недели | '*' |
|
285
|
+
| RDM_LONG_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секунадх) | 28800 |
|
215
286
|
|
216
287
|
- В дефолтный конфиг проекта необходимо добавить:
|
217
288
|
|
@@ -267,7 +338,21 @@ Dynamic: license-file
|
|
267
338
|
# Включить эмуляцию отправки запросов
|
268
339
|
ENABLE_REQUEST_EMULATION = True
|
269
340
|
```
|
341
|
+
- С версии 3.6 в деволтный конфиг также нужно добавить два дополнительных раздела
|
342
|
+
```
|
343
|
+
|
344
|
+
[rdm_transfer_task_fast]
|
345
|
+
MINUTE=*/2
|
346
|
+
HOUR=*
|
347
|
+
DAY_OF_WEEK=*
|
348
|
+
LOCK_EXPIRE_SECONDS = 1800
|
270
349
|
|
350
|
+
[rdm_transfer_task_long]
|
351
|
+
MINUTE=*/15
|
352
|
+
HOUR=*
|
353
|
+
DAY_OF_WEEK=*
|
354
|
+
LOCK_EXPIRE_SECONDS = 21600
|
355
|
+
```
|
271
356
|
На основе дефолтного конфига произвести конфигурирование приложений.
|
272
357
|
|
273
358
|
## Сборка и распространение
|
@@ -34,6 +34,19 @@
|
|
34
34
|
|
35
35
|
Стоит обратить внимание, что сущности РВД могут содержать в себе данные из нескольких моделей РВД.
|
36
36
|
|
37
|
+
Очереди для периодических задач сборки и выгрузки данных
|
38
|
+
: Важно учитывать, что с версии пакета 3.6 вводится две новые очереди и соответсвущие этим очередям периодические задачи
|
39
|
+
сбора и выгрузки данных. Очередь для сущности указывается в реестре "Сущности для сбора и экспорта данных" - по умолчанию все
|
40
|
+
сущности относятся к основной очереди.
|
41
|
+
Итого - нужно настроить три очереди для работы.
|
42
|
+
|
43
|
+
- "Быстрая" очередь - RDM_FAST - для сущностей, по которым данные должны отдаваться каждые 5/10/15 минут по требованиям
|
44
|
+
витрины. Периодическая задача - TransferLatestEntitiesDataFastPeriodicTask.
|
45
|
+
- Основная очередь (та которая была до версии 3.6) - RDM- ля всех сущностей по умолчанию.
|
46
|
+
Периодическая задача - TransferLatestEntitiesDataFastPeriodicTask.
|
47
|
+
- "Долгая" очередь - RDM_LONG - для сущностей по которым идет долгий сбор, например для расчетных сущностей.
|
48
|
+
Периодическая задача - TransferLatestEntitiesDataLongPeriodicTask.
|
49
|
+
|
37
50
|
## Требования к окружению
|
38
51
|
|
39
52
|
Для работы требуется Python >=3.9. Так же в зависимостях есть внутренние пакеты:
|
@@ -85,6 +98,39 @@
|
|
85
98
|
('uploader_client', 'ENABLE_REQUEST_EMULATION'): False,
|
86
99
|
})
|
87
100
|
```
|
101
|
+
С версии пакета 3.6 добавляются новые настройки для двух периодических задач разных очередей сбора и выгрузки данных
|
102
|
+
```
|
103
|
+
PROJECT_DEFAULT_CONFIG.update({
|
104
|
+
# Настройки РВД
|
105
|
+
('rdm_general', 'EXPORT_ENTITY_ID_PREFIX'): '', # Дефолтное значение нужно изменить на специфическое системе
|
106
|
+
('rdm_general', 'COLLECT_CHUNK_SIZE'): 500,
|
107
|
+
('rdm_general', 'EXPORT_CHUNK_SIZE'): 500,
|
108
|
+
('rdm_transfer_task', 'MINUTE'): '0',
|
109
|
+
('rdm_transfer_task', 'HOUR'): '*/4',
|
110
|
+
('rdm_transfer_task', 'DAY_OF_WEEK'): '*',
|
111
|
+
('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS'): 21600,
|
112
|
+
('rdm_transfer_task', 'TIMEDELTA'): 3600,
|
113
|
+
('rdm_transfer_task', 'ENTITIES'): '',
|
114
|
+
('rdm_transfer_task_fast', 'MINUTE'): '*/5',
|
115
|
+
('rdm_transfer_task_fast', 'HOUR'): '*',
|
116
|
+
('rdm_transfer_task_fast', 'DAY_OF_WEEK'): '*',
|
117
|
+
('rdm_transfer_task_fast', 'LOCK_EXPIRE_SECONDS'): 1800,
|
118
|
+
('rdm_transfer_task_long', 'MINUTE'): '0',
|
119
|
+
('rdm_transfer_task_long', 'HOUR'): '*/6',
|
120
|
+
('rdm_transfer_task_long', 'DAY_OF_WEEK'): '*',
|
121
|
+
('rdm_transfer_task_long', 'LOCK_EXPIRE_SECONDS'): 28800,
|
122
|
+
('rdm_upload_status_task', 'MINUTE'): '*/30',
|
123
|
+
('rdm_upload_status_task', 'HOUR'): '*',
|
124
|
+
('rdm_upload_status_task', 'DAY_OF_WEEK'): '*',
|
125
|
+
('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS'): 7200,
|
126
|
+
('uploader_client', 'URL'): 'http://localhost:8090',
|
127
|
+
('uploader_client', 'DATAMART_NAME'): '',
|
128
|
+
('uploader_client', 'REQUEST_RETRIES'): 10,
|
129
|
+
('uploader_client', 'REQUEST_TIMEOUT'): 10,
|
130
|
+
('uploader_client', 'ENABLE_REQUEST_EMULATION'): False,
|
131
|
+
})
|
132
|
+
|
133
|
+
```
|
88
134
|
- Получение значений настроек из конфигурационного файла в settings.py:
|
89
135
|
|
90
136
|
```
|
@@ -143,7 +189,21 @@
|
|
143
189
|
RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION = conf.get_bool('uploader_client', 'ENABLE_REQUEST_EMULATION')
|
144
190
|
|
145
191
|
```
|
146
|
-
|
192
|
+
С версии пакета 3.6 добавляются настройки для двух новых периодических задач
|
193
|
+
```
|
194
|
+
# Настройка запуска периодической задачи выгрузки данных - быстрая очередь:
|
195
|
+
RDM_FAST_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task_fast', 'MINUTE')
|
196
|
+
RDM_FAST_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task_fast', 'HOUR')
|
197
|
+
RDM_FAST_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task_fast', 'DAY_OF_WEEK')
|
198
|
+
RDM_FAST_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_transfer_task_fast', 'LOCK_EXPIRE_SECONDS')
|
199
|
+
|
200
|
+
# Настройка запуска периодической задачи выгрузки данных - долгая очередь расчетных моделей:
|
201
|
+
RDM_LONG_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task_long', 'MINUTE')
|
202
|
+
RDM_LONG_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task_long', 'HOUR')
|
203
|
+
RDM_LONG_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task_long', 'DAY_OF_WEEK')
|
204
|
+
RDM_LONG_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_transfer_task_long', 'LOCK_EXPIRE_SECONDS')
|
205
|
+
|
206
|
+
```
|
147
207
|
Перечень настроек в settings.py указан в таблице ниже.
|
148
208
|
|
149
209
|
| Название настройки в settings | Описание | Значение по умолчанию |
|
@@ -167,7 +227,18 @@
|
|
167
227
|
| RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секунадх) | 3600 |
|
168
228
|
| RDM_CHECK_SUSPEND_TASK_STAGE_TIMEOUT | Дельта для определения зависшего подэтапа. Минута | 120 |
|
169
229
|
|
170
|
-
|
230
|
+
С версии пакета 3.6 добавляются новые настройки
|
231
|
+
|
232
|
+
| Название настройки в settings | Описание | Значение по умолчанию |
|
233
|
+
|--------------------------------------------|----------------------------------------------------------------------------------------|-----------------------|
|
234
|
+
| RDM_FAST_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. Минута | '*/5' |
|
235
|
+
| RDM_FAST_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. Час | '*' |
|
236
|
+
| RDM_FAST_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. День недели | '*' |
|
237
|
+
| RDM_FAST_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секунадх) | 1800 |
|
238
|
+
| RDM_LONG_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. Минута | 0 |
|
239
|
+
| RDM_LONG_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. Час | '*/6' |
|
240
|
+
| RDM_LONG_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. День недели | '*' |
|
241
|
+
| RDM_LONG_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секунадх) | 28800 |
|
171
242
|
|
172
243
|
- В дефолтный конфиг проекта необходимо добавить:
|
173
244
|
|
@@ -223,7 +294,21 @@
|
|
223
294
|
# Включить эмуляцию отправки запросов
|
224
295
|
ENABLE_REQUEST_EMULATION = True
|
225
296
|
```
|
297
|
+
- С версии 3.6 в деволтный конфиг также нужно добавить два дополнительных раздела
|
298
|
+
```
|
299
|
+
|
300
|
+
[rdm_transfer_task_fast]
|
301
|
+
MINUTE=*/2
|
302
|
+
HOUR=*
|
303
|
+
DAY_OF_WEEK=*
|
304
|
+
LOCK_EXPIRE_SECONDS = 1800
|
226
305
|
|
306
|
+
[rdm_transfer_task_long]
|
307
|
+
MINUTE=*/15
|
308
|
+
HOUR=*
|
309
|
+
DAY_OF_WEEK=*
|
310
|
+
LOCK_EXPIRE_SECONDS = 21600
|
311
|
+
```
|
227
312
|
На основе дефолтного конфига произвести конфигурирование приложений.
|
228
313
|
|
229
314
|
## Сборка и распространение
|
{edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/app_settings.py
RENAMED
@@ -41,6 +41,19 @@ RDM_TRANSFER_TASK_HOUR = '*/4'
|
|
41
41
|
RDM_TRANSFER_TASK_DAY_OF_WEEK = '*'
|
42
42
|
RDM_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = 60 * 60 * 6
|
43
43
|
|
44
|
+
# Настройка запуска периодической задачи выгрузки данных - очередь быстрого уровня
|
45
|
+
RDM_FAST_TRANSFER_TASK_MINUTE = '*/5'
|
46
|
+
RDM_FAST_TRANSFER_TASK_HOUR = '*'
|
47
|
+
RDM_FAST_TRANSFER_TASK_DAY_OF_WEEK = '*'
|
48
|
+
RDM_FAST_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = 60 * 30
|
49
|
+
|
50
|
+
# Настройка запуска периодической задачи выгрузки данных - очередь медленного уровня
|
51
|
+
RDM_LONG_TRANSFER_TASK_MINUTE = '0'
|
52
|
+
RDM_LONG_TRANSFER_TASK_HOUR = '*/6'
|
53
|
+
RDM_LONG_TRANSFER_TASK_DAY_OF_WEEK = '*'
|
54
|
+
RDM_LONG_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = 60 * 60 * 6
|
55
|
+
|
56
|
+
|
44
57
|
# Настройка запуска периодической задачи статуса загрузки данных в витрину:
|
45
58
|
RDM_UPLOAD_STATUS_TASK_MINUTE = '*/30'
|
46
59
|
RDM_UPLOAD_STATUS_TASK_HOUR = '*'
|
@@ -0,0 +1,147 @@
|
|
1
|
+
import logging
|
2
|
+
from abc import (
|
3
|
+
ABC,
|
4
|
+
abstractmethod,
|
5
|
+
)
|
6
|
+
from collections import (
|
7
|
+
defaultdict,
|
8
|
+
)
|
9
|
+
from typing import (
|
10
|
+
Optional,
|
11
|
+
)
|
12
|
+
|
13
|
+
from django.db.models import (
|
14
|
+
Q,
|
15
|
+
)
|
16
|
+
|
17
|
+
from m3_db_utils.consts import (
|
18
|
+
DEFAULT_ORDER_NUMBER,
|
19
|
+
)
|
20
|
+
|
21
|
+
from edu_rdm_integration.consts import (
|
22
|
+
REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA,
|
23
|
+
REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA,
|
24
|
+
)
|
25
|
+
from edu_rdm_integration.helpers import (
|
26
|
+
UploadStatusHelper,
|
27
|
+
get_collecting_managers_max_period_ended_dates,
|
28
|
+
get_exporting_managers_max_period_ended_dates,
|
29
|
+
save_command_log_link,
|
30
|
+
)
|
31
|
+
from edu_rdm_integration.models import (
|
32
|
+
ExportingDataSubStageUploaderClientLog,
|
33
|
+
RegionalDataMartEntityEnum,
|
34
|
+
TransferredEntity,
|
35
|
+
)
|
36
|
+
from edu_rdm_integration.storages import (
|
37
|
+
RegionalDataMartEntityStorage,
|
38
|
+
)
|
39
|
+
|
40
|
+
|
41
|
+
class BaseOperationData(ABC):
|
42
|
+
"""Базовый класс операций с данными."""
|
43
|
+
|
44
|
+
def __init__(self, **kwargs):
|
45
|
+
# Идентификатор команды для передачи сигналу manager_created
|
46
|
+
self.command_id: Optional[int] = kwargs.get('command_id')
|
47
|
+
|
48
|
+
self._file_handler: Optional[logging.FileHandler] = None
|
49
|
+
|
50
|
+
self._add_file_handler()
|
51
|
+
|
52
|
+
@property
|
53
|
+
@abstractmethod
|
54
|
+
def _log_file_path(self) -> str:
|
55
|
+
"""Путь до лог файла."""
|
56
|
+
|
57
|
+
def _add_file_handler(self) -> None:
|
58
|
+
"""Добавляет обработчик логов."""
|
59
|
+
if self.command_id:
|
60
|
+
self._file_handler = logging.FileHandler(self._log_file_path)
|
61
|
+
|
62
|
+
logging.getLogger('info_logger').addHandler(self._file_handler)
|
63
|
+
logging.getLogger('exception_logger').addHandler(self._file_handler)
|
64
|
+
|
65
|
+
def _remove_file_handler(self) -> None:
|
66
|
+
"""Удаляет обработчик логов."""
|
67
|
+
if self._file_handler:
|
68
|
+
logging.getLogger('info_logger').removeHandler(self._file_handler)
|
69
|
+
logging.getLogger('exception_logger').removeHandler(self._file_handler)
|
70
|
+
|
71
|
+
self._file_handler.close()
|
72
|
+
|
73
|
+
|
74
|
+
class BaseTransferLatestEntitiesDataMixin:
|
75
|
+
"""Миксин сбора и выгрузки данных."""
|
76
|
+
|
77
|
+
def __init__(self) -> None:
|
78
|
+
super().__init__()
|
79
|
+
|
80
|
+
self._collecting_data_managers: dict[str, type['RunnerManager']] = {}
|
81
|
+
self._collecting_data_manager_to_logs_period_end: dict[str, 'datetime'] = {}
|
82
|
+
|
83
|
+
self._exporting_data_managers: dict[str, type['RunnerManager']] = {}
|
84
|
+
self._exporting_data_manager_to_period_end: dict[str, 'datetime'] = {}
|
85
|
+
|
86
|
+
self._transferred_entities = []
|
87
|
+
self._entites_models_map = defaultdict(list)
|
88
|
+
|
89
|
+
def get_entity_qs(self) -> 'QuerySet[TransferredEntity]':
|
90
|
+
"""Возвращает сущностей сбора и выгрузки."""
|
91
|
+
raise NotImplementedError
|
92
|
+
|
93
|
+
def _collect_transferred_entities(self) -> None:
|
94
|
+
"""Собирает сущности РВД, по которым будет произведен сбор и экспорт данных."""
|
95
|
+
|
96
|
+
self._transferred_entities = [
|
97
|
+
(RegionalDataMartEntityEnum.get_model_enum_value(key=entity), export_enabled)
|
98
|
+
for entity, export_enabled in self.get_entity_qs().values_list('entity', 'export_enabled')
|
99
|
+
]
|
100
|
+
|
101
|
+
# Собираем словарь по сущностям с моделями для сборки
|
102
|
+
for entity, _ in self._transferred_entities:
|
103
|
+
self._entites_models_map[entity.key].extend(
|
104
|
+
(model_enum for model_enum in (*entity.additional_model_enums, entity.main_model_enum)
|
105
|
+
if model_enum.order_number != DEFAULT_ORDER_NUMBER)
|
106
|
+
)
|
107
|
+
|
108
|
+
def _collect_managers(self) -> None:
|
109
|
+
"""Собирает менеджеры Функций для сбора и выгрузки данных."""
|
110
|
+
entity_storage = RegionalDataMartEntityStorage()
|
111
|
+
entity_storage.prepare()
|
112
|
+
|
113
|
+
collecting_models_data_managers_map = entity_storage.prepare_entities_manager_map(
|
114
|
+
tags={REGIONAL_DATA_MART_INTEGRATION_COLLECTING_DATA},
|
115
|
+
)
|
116
|
+
exporting_entities_data_managers_map = entity_storage.prepare_entities_manager_map(
|
117
|
+
tags={REGIONAL_DATA_MART_INTEGRATION_EXPORTING_DATA},
|
118
|
+
)
|
119
|
+
|
120
|
+
for entity_key, entity_models in self._entites_models_map.items():
|
121
|
+
for entity_model in entity_models:
|
122
|
+
collect_manager_class = collecting_models_data_managers_map.get(entity_model.key)
|
123
|
+
if collect_manager_class:
|
124
|
+
self._collecting_data_managers[entity_model.key] = collect_manager_class
|
125
|
+
|
126
|
+
export_manager_class = exporting_entities_data_managers_map.get(entity_key)
|
127
|
+
if export_manager_class:
|
128
|
+
self._exporting_data_managers[entity_key] = export_manager_class
|
129
|
+
|
130
|
+
def _calculate_collecting_managers_logs_period_ended_at(self) -> None:
|
131
|
+
"""Определяет дату последнего успешного этапа сбора у менеджеров Функций сбора."""
|
132
|
+
self._collecting_data_manager_to_logs_period_end = get_collecting_managers_max_period_ended_dates(
|
133
|
+
self._collecting_data_managers.values()
|
134
|
+
)
|
135
|
+
|
136
|
+
def _calculate_exporting_managers_ended_at(self) -> None:
|
137
|
+
"""Определяет дату последнего успешного подэтапа экспорта у менеджеров Функций экспорта."""
|
138
|
+
self._exporting_data_manager_to_period_end = get_exporting_managers_max_period_ended_dates(
|
139
|
+
self._exporting_data_managers.values()
|
140
|
+
)
|
141
|
+
|
142
|
+
def prepare_collect_export_managers(self) -> None:
|
143
|
+
"""Подготовка менджеров сбора и экспорта."""
|
144
|
+
self._collect_transferred_entities()
|
145
|
+
self._collect_managers()
|
146
|
+
self._calculate_collecting_managers_logs_period_ended_at()
|
147
|
+
self._calculate_exporting_managers_ended_at()
|
@@ -6,6 +6,12 @@ from m3.db import (
|
|
6
6
|
BaseEnumerate,
|
7
7
|
)
|
8
8
|
|
9
|
+
from edu_rdm_integration.consts import (
|
10
|
+
FAST_TRANSFER_TASK_QUEUE_NAME,
|
11
|
+
LONG_TRANSFER_TASK_QUEUE_NAME,
|
12
|
+
TASK_QUEUE_NAME,
|
13
|
+
)
|
14
|
+
|
9
15
|
|
10
16
|
class ValueCodeEnumerate(BaseEnumerate):
|
11
17
|
"""
|
@@ -166,3 +172,28 @@ class CommandType(BaseEnumerate):
|
|
166
172
|
AUTO: 'Автоматический',
|
167
173
|
MANUAL: 'Ручной',
|
168
174
|
}
|
175
|
+
|
176
|
+
|
177
|
+
class EntityLevelQueueTypeEnum(BaseEnumerate):
|
178
|
+
"""Тип уровня очереди сущности."""
|
179
|
+
|
180
|
+
FAST = 1
|
181
|
+
BASE = 2
|
182
|
+
LONG = 3
|
183
|
+
|
184
|
+
values = {
|
185
|
+
FAST: 'Быстрая',
|
186
|
+
BASE: 'Основная',
|
187
|
+
LONG: 'Долгая'
|
188
|
+
}
|
189
|
+
|
190
|
+
celery_queue_maps = {
|
191
|
+
FAST: FAST_TRANSFER_TASK_QUEUE_NAME,
|
192
|
+
BASE: TASK_QUEUE_NAME,
|
193
|
+
LONG: LONG_TRANSFER_TASK_QUEUE_NAME
|
194
|
+
}
|
195
|
+
|
196
|
+
@classmethod
|
197
|
+
def get_queue_name(cls, level: int) -> Optional[str]:
|
198
|
+
"""Возвращает очередь."""
|
199
|
+
return cls.celery_queue_maps.get(level)
|
edu_rdm_integration-3.6.0/src/edu_rdm_integration/migrations/0016_transferredentity_queue_level.py
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Generated by Django 3.2.24 on 2025-04-17 12:43
|
2
|
+
|
3
|
+
from django.db import (
|
4
|
+
migrations,
|
5
|
+
models,
|
6
|
+
)
|
7
|
+
|
8
|
+
|
9
|
+
class Migration(migrations.Migration):
|
10
|
+
|
11
|
+
dependencies = [
|
12
|
+
('edu_rdm_integration', '0015_set_exporting_sub_stage_status'),
|
13
|
+
]
|
14
|
+
|
15
|
+
operations = [
|
16
|
+
migrations.AddField(
|
17
|
+
model_name='transferredentity',
|
18
|
+
name='queue_level',
|
19
|
+
field=models.PositiveIntegerField(
|
20
|
+
choices=[(1, 'Быстрая'), (2, 'Основная'), (3, 'Долгая')], default=2, verbose_name='Уровень очереди'),
|
21
|
+
),
|
22
|
+
]
|
@@ -63,6 +63,7 @@ from m3_db_utils.models import (
|
|
63
63
|
|
64
64
|
from edu_rdm_integration.enums import (
|
65
65
|
CommandType,
|
66
|
+
EntityLevelQueueTypeEnum,
|
66
67
|
FileUploadStatusEnum,
|
67
68
|
)
|
68
69
|
from edu_rdm_integration.uploader_log.managers import (
|
@@ -932,6 +933,11 @@ class TransferredEntity(BaseObjectModel):
|
|
932
933
|
verbose_name='Включение экспорта для сущности',
|
933
934
|
default=True,
|
934
935
|
)
|
936
|
+
queue_level = PositiveIntegerField(
|
937
|
+
choices=EntityLevelQueueTypeEnum.get_choices(),
|
938
|
+
default=EntityLevelQueueTypeEnum.BASE,
|
939
|
+
verbose_name='Уровень очереди',
|
940
|
+
)
|
935
941
|
|
936
942
|
class Meta:
|
937
943
|
db_table = 'rdm_transferred_entity'
|
{edu_rdm_integration-3.5.10 → edu_rdm_integration-3.6.0}/src/edu_rdm_integration/registry/actions.py
RENAMED
@@ -21,6 +21,7 @@ from edu_rdm_integration.models import (
|
|
21
21
|
TransferredEntity,
|
22
22
|
)
|
23
23
|
from edu_rdm_integration.registry.ui import (
|
24
|
+
TransferredEntityEditWindow,
|
24
25
|
TransferredEntityListWindow,
|
25
26
|
)
|
26
27
|
|
@@ -97,14 +98,27 @@ class TransferredEntitySaveAction(BaseAction):
|
|
97
98
|
"""Объявляет контекст экшна."""
|
98
99
|
return {
|
99
100
|
'id': {'type': 'str_list', 'default': []},
|
101
|
+
self.parent.id_param_name: {'type': 'int'}
|
100
102
|
}
|
101
103
|
|
102
104
|
def run(self, request, context):
|
103
105
|
"""Обеспечивает выполнение запроса."""
|
104
|
-
self.parent.
|
105
|
-
|
106
|
-
|
107
|
-
|
106
|
+
obj_id = getattr(context, self.parent.id_param_name)
|
107
|
+
if obj_id:
|
108
|
+
queue_level = getattr(context, 'queue_level', None)
|
109
|
+
if queue_level:
|
110
|
+
self.parent.model.objects.filter(
|
111
|
+
id=obj_id
|
112
|
+
).exclude(
|
113
|
+
queue_level=queue_level
|
114
|
+
).update(
|
115
|
+
queue_level=queue_level
|
116
|
+
)
|
117
|
+
else:
|
118
|
+
self.parent.model.objects.bulk_create([
|
119
|
+
self.parent.model(entity_id=key)
|
120
|
+
for key in context.id
|
121
|
+
])
|
108
122
|
|
109
123
|
return OperationResult(success=True)
|
110
124
|
|
@@ -121,6 +135,7 @@ class TransferredEntityPack(ObjectPack):
|
|
121
135
|
|
122
136
|
need_check_permission = True
|
123
137
|
list_window = TransferredEntityListWindow
|
138
|
+
edit_window = TransferredEntityEditWindow
|
124
139
|
|
125
140
|
columns = [
|
126
141
|
{
|
@@ -134,6 +149,10 @@ class TransferredEntityPack(ObjectPack):
|
|
134
149
|
{
|
135
150
|
'data_index': 'no_export',
|
136
151
|
'header': 'Отключение экспорта',
|
152
|
+
},
|
153
|
+
{
|
154
|
+
'data_index': 'queue_level',
|
155
|
+
'header': 'Уровень очереди',
|
137
156
|
}
|
138
157
|
]
|
139
158
|
|