edu-rdm-integration 3.19.1__tar.gz → 3.21.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.19.1 → edu_rdm_integration-3.21.0}/CHANGELOG.md +60 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/PKG-INFO +15 -2
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/README.md +13 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/pyproject.toml +1 -1
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_entities/mixins.py +1 -1
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_models/mixins.py +1 -1
- edu_rdm_integration-3.21.0/src/edu_rdm_integration/stages/service/model_outdated_data/cleaners.py +415 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration.egg-info/PKG-INFO +15 -2
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration.egg-info/requires.txt +1 -1
- edu_rdm_integration-3.19.1/src/edu_rdm_integration/stages/service/model_outdated_data/cleaners.py +0 -35
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/CONDUCT.md +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/LICENSE +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/MANIFEST.in +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/setup.cfg +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/collect_and_export_data/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/collect_and_export_data/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/collect_and_export_data/migrations/0001_initial.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/collect_and_export_data/migrations/0002_auto_20250204_1413.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/collect_and_export_data/migrations/0003_auto_20250704_0725.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/collect_and_export_data/migrations/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/collect_and_export_data/models.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/consts.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/enums.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/helpers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/mapping.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/operations.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/redis_cache.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/registry/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/registry/actions.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/registry/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/registry/templates/ui-js/start-task.js +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/registry/ui.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/signals.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/storages.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/typing.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/core/utils.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0001_initial.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0002_init_data_uploadstatus.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0003_create_index_file_upload_status.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0004_uploaderclientlog.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0005_auto_20231204_1224.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0006_request_status_data.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0007_delete_upload_status.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0008_transferredentity.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0009_auto_20240522_1619.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0010_transferredentity_export_enabled.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0011_exportingdatasubstageentity.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0012_exportingdatasubstageattachment_attachment_size.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0013_set_attachment_size.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0014_uploaddatacommand.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0015_set_exporting_sub_stage_status.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0016_transferredentity_queue_level.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0017_delete_uploaddatacommand.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/0018_auto_20250704_0725.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/migrations/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/models.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/cleanup_outdated_data/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/cleanup_outdated_data/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/cleanup_outdated_data/management/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/cleanup_outdated_data/management/commands/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/cleanup_outdated_data/management/commands/rdm_cleanup_outdated_data.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/actions.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/app_meta.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/enums.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/migrations/0001_initial.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/migrations/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/mixins.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/models.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/tasks.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/templates/ui-js/transferred-entity-list.js +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/pipelines/transfer/ui.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_entities/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_entities/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_entities/entities.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_entities/migrations/0001_initial.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_entities/migrations/0002_rename_regionaldatamartentityenum_rdmentityenum.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_entities/migrations/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_entities/models.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_entities/utils.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_models/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_models/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_models/migrations/0001_initial.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_models/migrations/0002_rename_regionaldatamartmodelenum_rdmmodelenum.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_models/migrations/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_models/models.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/rdm_models/utils.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/consts.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/__init__.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/apps.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/caches.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/consts.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/enums.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/errors.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/functions.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/helpers.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/managers.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/presenters.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/results.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/runners.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/strings.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/tests.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/function_templates/function_collect_data_template/validators.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/base/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/base/caches.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/base/consts.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/base/functions.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/base/helpers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/base/managers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/base/mixins.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/base/runners.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/caches.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/consts.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/enums.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/errors.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/functions.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/helpers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/managers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/presenters.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/results.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/runners.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/strings.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/tests.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/base/validators.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/calculated/strategies.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/caches.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/consts.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/enums.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/errors.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/functions.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/helpers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/managers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/presenters.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/results.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/runners.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/strings.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/tests.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/base/validators.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/functions/non_calculated/strategies.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/generators.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/helpers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/management/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/management/base.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/management/commands/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/management/commands/collect_latest_models_data.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/management/commands/collect_models_data.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/migrations/0001_initial.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/migrations/0002_edurdmcollectdatacommandprogress.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/migrations/0003_auto_20250704_0810.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/migrations/0004_auto_20250704_0825.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/migrations/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/mixins.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/models.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/operations.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/registry/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/registry/actions.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/registry/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/registry/templates/ui-js/collect-command-window.js +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/registry/templates/ui-js/validators.js +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/registry/ui.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/collect_data/tests.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/consts.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/__init__.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/apps.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/caches.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/consts.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/enums.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/errors.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/functions.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/helpers.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/managers.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/presenters.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/results.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/runners.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/strings.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/tests.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/function_templates/function_export_data_template/validators.py-tpl +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/caches.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/consts.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/enums.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/errors.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/functions.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/helpers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/managers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/presenters.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/requests.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/results.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/runners.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/strings.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/tests.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/functions/base/validators.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/generators.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/helpers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/management/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/management/base.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/management/commands/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/management/commands/export_entities_data.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/management/commands/export_latest_entities_data.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/migrations/0001_initial.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/migrations/0002_auto_20250704_0810.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/migrations/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/mixins.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/models.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/operations.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/registry/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/registry/actions.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/registry/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/registry/templates/ui-js/create-export-command-win.js +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/registry/templates/ui-js/stage_for_export.js +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/registry/ui.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/export_data/strategies.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/service/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/service/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/service/model_outdated_data/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/service/model_outdated_data/managers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/service/service_outdated_data/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/service/tasks.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/consts.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/dataclasses.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/enums.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/export_managers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/helpers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/management/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/management/base.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/management/commands/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/management/commands/async_fix_attachment_size.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/management/commands/check_upload_status.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/management/commands/datamart_status.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/management/commands/datamart_upload.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/migrations/0001_initial.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/migrations/0002_auto_20250704_0810.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/migrations/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/models.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/operations.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/queues.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/tasks.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/uploader_log/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/uploader_log/actions.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/uploader_log/apps.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/uploader_log/enums.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/uploader_log/managers.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/uploader_log/migrations/0001_initial.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/uploader_log/migrations/__init__.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/uploader_log/models.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/uploader_log/templates/ui-js/object-grid-buttons.js +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration/stages/upload_data/uploader_log/ui.py +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration.egg-info/SOURCES.txt +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration.egg-info/dependency_links.txt +0 -0
- {edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration.egg-info/top_level.txt +0 -0
|
@@ -29,6 +29,66 @@
|
|
|
29
29
|
### Удалено
|
|
30
30
|
|
|
31
31
|
|
|
32
|
+
## [3.21.0] - 2025-10-08
|
|
33
|
+
|
|
34
|
+
Переименование m3-django-compat в m3-django-compatibility.
|
|
35
|
+
|
|
36
|
+
### Изменено
|
|
37
|
+
|
|
38
|
+
- [PYTD-20](https://jira.bars.group/browse/PYTD-20)
|
|
39
|
+
MINOR Переименование m3-django-compat в m3-django-compatibility.
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
## [3.20.0] - 2025-10-06
|
|
43
|
+
|
|
44
|
+
Проверка записей моделей РВД на устаревание чанками при помощи asyncio. Добавление настроек для работы.
|
|
45
|
+
|
|
46
|
+
### Изменено
|
|
47
|
+
|
|
48
|
+
- [EDUSCHL-24216](https://jira.bars.group/browse/EDUSCHL-24216)
|
|
49
|
+
MINOR Добавление настроек для работы зачистки устаревших данных моделей РВД чанками.
|
|
50
|
+
|
|
51
|
+
- [EDUSCHL-24216](https://jira.bars.group/browse/EDUSCHL-24216)
|
|
52
|
+
MINOR Перенесена базовая реализация сборщика устаревших данных из ЭШ в пакет.
|
|
53
|
+
|
|
54
|
+
Добавлены новые настройки
|
|
55
|
+
|
|
56
|
+
| Название настройки в settings | Описание | Значение по умолчанию |
|
|
57
|
+
|---------------------------------------------|------------------------------------------------------------------------|-----------------------|
|
|
58
|
+
| RDM_CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE | Размер чанка записей зачистки устаревших данных моделей РВД | 10000 |
|
|
59
|
+
| RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE | Количество подключений к БД для зачистки устаревших данных моделей РВД | 10 |
|
|
60
|
+
|
|
61
|
+
В settings.py:
|
|
62
|
+
|
|
63
|
+
- Добавить значение по умолчанию:
|
|
64
|
+
```
|
|
65
|
+
PROJECT_DEFAULT_CONFIG.update({
|
|
66
|
+
...
|
|
67
|
+
('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE'): 10000,
|
|
68
|
+
('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE'): 10,
|
|
69
|
+
...
|
|
70
|
+
})
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- Получить значение настройки из конфигурационного файла:
|
|
74
|
+
```
|
|
75
|
+
# Размер чанка записей зачистки устаревших данных моделей РВД
|
|
76
|
+
RDM_CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE = conf.get_int('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE')
|
|
77
|
+
# Количество подключений к БД для зачистки устаревших данных моделей РВД
|
|
78
|
+
RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE = conf.get_int('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE')
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
- В дефолтный конфиг проекта необходимо добавить:
|
|
82
|
+
```
|
|
83
|
+
# Настройки зачистки устаревших данных
|
|
84
|
+
[rdm_cleanup_outdated_data]
|
|
85
|
+
# Размер чанка записей проверки устаревших данных моделей РВД
|
|
86
|
+
CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE = 10000
|
|
87
|
+
# Количество подключений к БД для проверки устаревших данных моделей РВД
|
|
88
|
+
CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE = 10
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
|
|
32
92
|
## [3.19.1] - 2025-10-02
|
|
33
93
|
|
|
34
94
|
Возвращение полей для указания операции и подэтапа сбора у всех моделей РВД.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: edu-rdm-integration
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.21.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
|
|
@@ -30,7 +30,7 @@ Requires-Dist: asyncpg==0.23.0
|
|
|
30
30
|
Requires-Dist: educommon<4,>=3.25.0
|
|
31
31
|
Requires-Dist: edu-function-tools<1,>=0.2.0
|
|
32
32
|
Requires-Dist: m3-db-utils<1,>=0.7.0
|
|
33
|
-
Requires-Dist: m3-django-
|
|
33
|
+
Requires-Dist: m3-django-compatibility<2,>=1.12.0
|
|
34
34
|
Requires-Dist: m3-ui<2.3,>=2.2.122
|
|
35
35
|
Requires-Dist: uploader-client<1,>=0.3.0
|
|
36
36
|
Provides-Extra: dev
|
|
@@ -198,6 +198,8 @@ INSTALLED_APPS = (
|
|
|
198
198
|
('uploader_client', 'INSTALLATION_NAME'): '',
|
|
199
199
|
('uploader_client', 'INSTALLATION_ID'): '',
|
|
200
200
|
('rdm_cleanup_outdated_data', 'ENABLE_CLEANUP_MODELS_OUTDATED_DATA'): False,
|
|
201
|
+
('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE'): 10000,
|
|
202
|
+
('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE'): 10,
|
|
201
203
|
})
|
|
202
204
|
```
|
|
203
205
|
- Получение значений настроек из конфигурационного файла в settings.py:
|
|
@@ -313,6 +315,10 @@ INSTALLED_APPS = (
|
|
|
313
315
|
|
|
314
316
|
# Включить зачистку устаревших данных моделей РВД
|
|
315
317
|
RDM_ENABLE_CLEANUP_MODELS_OUTDATED_DATA = conf.get_bool('rdm_cleanup_outdated_data', 'ENABLE_CLEANUP_MODELS_OUTDATED_DATA')
|
|
318
|
+
# Размер чанка записей зачистки устаревших данных моделей РВД
|
|
319
|
+
RDM_CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE = conf.get_int('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE')
|
|
320
|
+
# Количество подключений к БД для зачистки устаревших данных моделей РВД
|
|
321
|
+
RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE = conf.get_int('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE')
|
|
316
322
|
```
|
|
317
323
|
|
|
318
324
|
Перечень настроек в settings.py указан в таблице ниже.
|
|
@@ -373,6 +379,9 @@ INSTALLED_APPS = (
|
|
|
373
379
|
| RDM_EXPORT_LOG_DIR | Директория логов экспорта данных, доступных для скачивания | |
|
|
374
380
|
| RDM_UPLOAD_LOG_DIR | Директория логов отправки данных в витрину, доступных для скачивания | |
|
|
375
381
|
| RDM_ENABLE_CLEANUP_MODELS_OUTDATED_DATA | Включение зачистки устаревших данных моделей РВД | False |
|
|
382
|
+
| RDM_CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE | Размер чанка записей зачистки устаревших данных моделей РВД | 10000 |
|
|
383
|
+
| RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE | Количество подключений к БД для зачистки устаревших данных моделей РВД | 10 |
|
|
384
|
+
|
|
376
385
|
|
|
377
386
|
- В дефолтный конфиг проекта необходимо добавить:
|
|
378
387
|
|
|
@@ -473,6 +482,10 @@ INSTALLED_APPS = (
|
|
|
473
482
|
[rdm_cleanup_outdated_data]
|
|
474
483
|
# Включить зачистку устаревших данных моделей РВД
|
|
475
484
|
ENABLE_CLEANUP_MODELS_OUTDATED_DATA = False
|
|
485
|
+
# Размер чанка записей проверки устаревших данных моделей РВД
|
|
486
|
+
CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE = 10000
|
|
487
|
+
# Количество подключений к БД для проверки устаревших данных моделей РВД
|
|
488
|
+
CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE = 10
|
|
476
489
|
```
|
|
477
490
|
На основе дефолтного конфига произвести конфигурирование приложений.
|
|
478
491
|
|
|
@@ -150,6 +150,8 @@ INSTALLED_APPS = (
|
|
|
150
150
|
('uploader_client', 'INSTALLATION_NAME'): '',
|
|
151
151
|
('uploader_client', 'INSTALLATION_ID'): '',
|
|
152
152
|
('rdm_cleanup_outdated_data', 'ENABLE_CLEANUP_MODELS_OUTDATED_DATA'): False,
|
|
153
|
+
('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE'): 10000,
|
|
154
|
+
('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE'): 10,
|
|
153
155
|
})
|
|
154
156
|
```
|
|
155
157
|
- Получение значений настроек из конфигурационного файла в settings.py:
|
|
@@ -265,6 +267,10 @@ INSTALLED_APPS = (
|
|
|
265
267
|
|
|
266
268
|
# Включить зачистку устаревших данных моделей РВД
|
|
267
269
|
RDM_ENABLE_CLEANUP_MODELS_OUTDATED_DATA = conf.get_bool('rdm_cleanup_outdated_data', 'ENABLE_CLEANUP_MODELS_OUTDATED_DATA')
|
|
270
|
+
# Размер чанка записей зачистки устаревших данных моделей РВД
|
|
271
|
+
RDM_CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE = conf.get_int('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE')
|
|
272
|
+
# Количество подключений к БД для зачистки устаревших данных моделей РВД
|
|
273
|
+
RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE = conf.get_int('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE')
|
|
268
274
|
```
|
|
269
275
|
|
|
270
276
|
Перечень настроек в settings.py указан в таблице ниже.
|
|
@@ -325,6 +331,9 @@ INSTALLED_APPS = (
|
|
|
325
331
|
| RDM_EXPORT_LOG_DIR | Директория логов экспорта данных, доступных для скачивания | |
|
|
326
332
|
| RDM_UPLOAD_LOG_DIR | Директория логов отправки данных в витрину, доступных для скачивания | |
|
|
327
333
|
| RDM_ENABLE_CLEANUP_MODELS_OUTDATED_DATA | Включение зачистки устаревших данных моделей РВД | False |
|
|
334
|
+
| RDM_CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE | Размер чанка записей зачистки устаревших данных моделей РВД | 10000 |
|
|
335
|
+
| RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE | Количество подключений к БД для зачистки устаревших данных моделей РВД | 10 |
|
|
336
|
+
|
|
328
337
|
|
|
329
338
|
- В дефолтный конфиг проекта необходимо добавить:
|
|
330
339
|
|
|
@@ -425,6 +434,10 @@ INSTALLED_APPS = (
|
|
|
425
434
|
[rdm_cleanup_outdated_data]
|
|
426
435
|
# Включить зачистку устаревших данных моделей РВД
|
|
427
436
|
ENABLE_CLEANUP_MODELS_OUTDATED_DATA = False
|
|
437
|
+
# Размер чанка записей проверки устаревших данных моделей РВД
|
|
438
|
+
CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE = 10000
|
|
439
|
+
# Количество подключений к БД для проверки устаревших данных моделей РВД
|
|
440
|
+
CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE = 10
|
|
428
441
|
```
|
|
429
442
|
На основе дефолтного конфига произвести конфигурирование приложений.
|
|
430
443
|
|
edu_rdm_integration-3.21.0/src/edu_rdm_integration/stages/service/model_outdated_data/cleaners.py
ADDED
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from abc import (
|
|
3
|
+
ABCMeta,
|
|
4
|
+
)
|
|
5
|
+
from typing import (
|
|
6
|
+
TYPE_CHECKING,
|
|
7
|
+
Optional,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
import asyncpg
|
|
11
|
+
from django.conf import (
|
|
12
|
+
settings,
|
|
13
|
+
)
|
|
14
|
+
from django.db import (
|
|
15
|
+
connection,
|
|
16
|
+
)
|
|
17
|
+
from django.db.models import (
|
|
18
|
+
ForeignKey,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
from educommon import (
|
|
22
|
+
logger,
|
|
23
|
+
)
|
|
24
|
+
from m3_db_utils.models import (
|
|
25
|
+
FictiveForeignKeyField,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
from edu_rdm_integration.rdm_models.models import (
|
|
29
|
+
BaseMainRDMModel,
|
|
30
|
+
RDMModelEnum,
|
|
31
|
+
)
|
|
32
|
+
from edu_rdm_integration.stages.export_data.models import (
|
|
33
|
+
RDMExportingDataSubStageStatus,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from asyncpg import (
|
|
39
|
+
Pool,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
from m3_db_utils.models import (
|
|
43
|
+
ModelEnumValue,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class BaseModelOutdatedDataCleaner(metaclass=ABCMeta):
|
|
48
|
+
"""Базовый класс уборщика устаревших данных моделей РВД."""
|
|
49
|
+
|
|
50
|
+
# Запрос для разбиения таблицы на чанки и получения идентификаторов первых и последних записей
|
|
51
|
+
SELECT_RDM_CHUNK_BOUNDED_SQL = """
|
|
52
|
+
DO $$
|
|
53
|
+
DECLARE
|
|
54
|
+
chunk_size INT := {chunk_size};
|
|
55
|
+
last_id INT := 0;
|
|
56
|
+
first_id INT;
|
|
57
|
+
last_chunk_id INT;
|
|
58
|
+
BEGIN
|
|
59
|
+
-- Создаем временную таблицу без ON COMMIT DROP
|
|
60
|
+
DROP TABLE IF EXISTS rdm_chunk_bounds;
|
|
61
|
+
CREATE TEMP TABLE rdm_chunk_bounds (
|
|
62
|
+
chunk_number INT,
|
|
63
|
+
first_id INT,
|
|
64
|
+
last_id INT
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
DROP TABLE IF EXISTS tmp_chunk;
|
|
68
|
+
CREATE TEMP TABLE tmp_chunk (id INT) ON COMMIT DROP;
|
|
69
|
+
|
|
70
|
+
WHILE TRUE LOOP
|
|
71
|
+
TRUNCATE tmp_chunk;
|
|
72
|
+
|
|
73
|
+
INSERT INTO tmp_chunk (id)
|
|
74
|
+
SELECT id
|
|
75
|
+
FROM {table_name}
|
|
76
|
+
WHERE id > last_id
|
|
77
|
+
ORDER BY id
|
|
78
|
+
LIMIT chunk_size;
|
|
79
|
+
|
|
80
|
+
IF NOT FOUND THEN
|
|
81
|
+
EXIT;
|
|
82
|
+
END IF;
|
|
83
|
+
|
|
84
|
+
SELECT MIN(id), MAX(id)
|
|
85
|
+
INTO first_id, last_chunk_id
|
|
86
|
+
FROM tmp_chunk;
|
|
87
|
+
|
|
88
|
+
INSERT INTO rdm_chunk_bounds (chunk_number, first_id, last_id)
|
|
89
|
+
VALUES (
|
|
90
|
+
(SELECT COUNT(*) FROM rdm_chunk_bounds) + 1,
|
|
91
|
+
first_id,
|
|
92
|
+
last_chunk_id
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
last_id := last_chunk_id;
|
|
96
|
+
END LOOP;
|
|
97
|
+
END $$;
|
|
98
|
+
|
|
99
|
+
-- Теперь можно безопасно выбрать данные
|
|
100
|
+
SELECT * FROM rdm_chunk_bounds ORDER BY chunk_number;
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
REMOVE_OUTDATED_DATA_SQL = """
|
|
104
|
+
WITH deleted_rows AS (
|
|
105
|
+
DELETE FROM {table_name}
|
|
106
|
+
WHERE id IN (
|
|
107
|
+
WITH tbl AS (
|
|
108
|
+
SELECT *
|
|
109
|
+
FROM {table_name}
|
|
110
|
+
WHERE id >= {first_id}
|
|
111
|
+
AND id <= {last_id}
|
|
112
|
+
)
|
|
113
|
+
SELECT tbl.id
|
|
114
|
+
FROM tbl
|
|
115
|
+
WHERE {conditions}
|
|
116
|
+
)
|
|
117
|
+
RETURNING id
|
|
118
|
+
)
|
|
119
|
+
SELECT COUNT(*) AS deleted_count FROM deleted_rows;
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
def __init__(
|
|
123
|
+
self,
|
|
124
|
+
model_enum_value: 'ModelEnumValue',
|
|
125
|
+
*args,
|
|
126
|
+
safe: bool = False,
|
|
127
|
+
log_sql: bool = False,
|
|
128
|
+
**kwargs,
|
|
129
|
+
):
|
|
130
|
+
self._model_enum_value = model_enum_value
|
|
131
|
+
self._safe = safe
|
|
132
|
+
self._log_sql = log_sql
|
|
133
|
+
self._deleted_count = 0
|
|
134
|
+
|
|
135
|
+
super().__init__(*args, **kwargs)
|
|
136
|
+
|
|
137
|
+
def get_remove_empty_related_data_conditions(self) -> Optional[str]:
|
|
138
|
+
"""Формирование условий очистки данных, содержащих связи с моделями с отсутствующими связанными записями."""
|
|
139
|
+
remove_empty_related_data_conditions = None
|
|
140
|
+
|
|
141
|
+
rel_model_condition_template = """
|
|
142
|
+
NOT EXISTS (
|
|
143
|
+
SELECT 1 FROM {0} WHERE {0}.id = tbl.{1}
|
|
144
|
+
)
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
rel_model_null_condition_template = """
|
|
148
|
+
tbl.{1} IS NOT NULL AND NOT EXISTS (
|
|
149
|
+
SELECT 1 FROM {0} WHERE {0}.id = tbl.{1}
|
|
150
|
+
)
|
|
151
|
+
"""
|
|
152
|
+
|
|
153
|
+
remove_empty_related_data_conditions_template = """
|
|
154
|
+
(
|
|
155
|
+
{}
|
|
156
|
+
)
|
|
157
|
+
-- Добавлено условие: удалить только записи старше 30 дней
|
|
158
|
+
AND tbl.modified <= NOW() - INTERVAL '30 days'
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
model_label_enum_data = RDMModelEnum.get_model_label_enum_data()
|
|
162
|
+
related_fields = []
|
|
163
|
+
|
|
164
|
+
for field in self._model_enum_value.model._meta.concrete_fields:
|
|
165
|
+
if isinstance(field, FictiveForeignKeyField):
|
|
166
|
+
model_label = field.to
|
|
167
|
+
elif isinstance(field, ForeignKey):
|
|
168
|
+
model_label = field.related_model._meta.label
|
|
169
|
+
else:
|
|
170
|
+
continue
|
|
171
|
+
|
|
172
|
+
if model_label in model_label_enum_data:
|
|
173
|
+
table_name = model_label_enum_data[model_label].model._meta.db_table
|
|
174
|
+
related_fields.append((field.name, table_name, field.null))
|
|
175
|
+
|
|
176
|
+
if related_fields:
|
|
177
|
+
rel_model_conditions_list = []
|
|
178
|
+
|
|
179
|
+
for field_name, table_name, is_null in related_fields:
|
|
180
|
+
if is_null:
|
|
181
|
+
rel_model_conditions_list.append(
|
|
182
|
+
rel_model_null_condition_template.format(table_name, field_name)
|
|
183
|
+
)
|
|
184
|
+
else:
|
|
185
|
+
rel_model_conditions_list.append(rel_model_condition_template.format(table_name, field_name))
|
|
186
|
+
|
|
187
|
+
rel_model_conditions = ' OR '.join(rel_model_conditions_list)
|
|
188
|
+
|
|
189
|
+
remove_empty_related_data_conditions = remove_empty_related_data_conditions_template.format(
|
|
190
|
+
rel_model_conditions
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
return remove_empty_related_data_conditions
|
|
194
|
+
|
|
195
|
+
def get_remove_closed_periods_data_conditions(self) -> Optional[str]:
|
|
196
|
+
"""Формирование условия очистки данных по закрытым периодам обучения - учебным годам.
|
|
197
|
+
|
|
198
|
+
Очистка данных производится в таблицах моделей РВД. Производится обход по всем периодам обучения. Если с даты
|
|
199
|
+
окончания периода обучения прошло более 30 дней, то данные по модели РВД удаляются.
|
|
200
|
+
"""
|
|
201
|
+
|
|
202
|
+
def get_remove_data_by_deleted_records_conditions(self) -> Optional[str]:
|
|
203
|
+
"""Формирование условия очистки данных по удаленным записям в ЭШ.
|
|
204
|
+
|
|
205
|
+
Если данные в ЭШ были удалены, то после оповещения "Региональной витрины данных" об удалении того или иного
|
|
206
|
+
экземпляра сущности, данные могут быть удалены, т.к. больше не будут обновляться.
|
|
207
|
+
"""
|
|
208
|
+
remove_data_by_deleted_records_conditions_sql = None
|
|
209
|
+
|
|
210
|
+
if issubclass(self._model_enum_value.model, BaseMainRDMModel):
|
|
211
|
+
remove_data_by_deleted_records_conditions_sql = """
|
|
212
|
+
EXISTS (
|
|
213
|
+
SELECT 1
|
|
214
|
+
FROM rdm_exporting_data_sub_stage redss
|
|
215
|
+
WHERE redss.id = tbl.exporting_sub_stage_id
|
|
216
|
+
AND redss.status_id = 'FINISHED'
|
|
217
|
+
AND tbl.operation = 3
|
|
218
|
+
)
|
|
219
|
+
"""
|
|
220
|
+
|
|
221
|
+
return remove_data_by_deleted_records_conditions_sql
|
|
222
|
+
|
|
223
|
+
def get_reverse_relation_conditions(self) -> Optional[str]:
|
|
224
|
+
"""Формирование условий для удаления записей по связанным моделям.
|
|
225
|
+
|
|
226
|
+
Записи по связанным моделям удаляются по следующим условиям:
|
|
227
|
+
- если запись в таблице с обратной связью не найдена или была успешно выгружена в витрину.
|
|
228
|
+
"""
|
|
229
|
+
processed_model_fields = []
|
|
230
|
+
not_fished_exporting_data_statuses = ', '.join(
|
|
231
|
+
[f"'{status.key}'" for status in RDMExportingDataSubStageStatus.get_not_finished_statuses()]
|
|
232
|
+
)
|
|
233
|
+
conditions = []
|
|
234
|
+
main_model_condition_template = """
|
|
235
|
+
NOT EXISTS (
|
|
236
|
+
SELECT 1
|
|
237
|
+
FROM (SELECT DISTINCT exporting_sub_stage_id, {2} FROM {0}) {1}
|
|
238
|
+
LEFT JOIN (SELECT id, status_id FROM rdm_exporting_data_sub_stage) redss
|
|
239
|
+
ON redss.id = {1}.exporting_sub_stage_id
|
|
240
|
+
WHERE {1}.{2} = tbl.id AND redss.status_id IN ({3})
|
|
241
|
+
)
|
|
242
|
+
"""
|
|
243
|
+
enum_data = RDMModelEnum.get_enum_data()
|
|
244
|
+
for model_key, field_names in self._model_enum_value.reverse_relations.items():
|
|
245
|
+
model_enum_value = enum_data[model_key]
|
|
246
|
+
|
|
247
|
+
if issubclass(model_enum_value.model, BaseMainRDMModel):
|
|
248
|
+
for field_name in field_names:
|
|
249
|
+
if (model_enum_value.model._meta.db_table, field_name) not in processed_model_fields:
|
|
250
|
+
table_slug = ''.join(w[0] for w in model_enum_value.model._meta.db_table.split('_'))
|
|
251
|
+
|
|
252
|
+
conditions.append(
|
|
253
|
+
main_model_condition_template.format(
|
|
254
|
+
model_enum_value.model._meta.db_table,
|
|
255
|
+
table_slug,
|
|
256
|
+
field_name,
|
|
257
|
+
not_fished_exporting_data_statuses,
|
|
258
|
+
)
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
processed_model_fields.append((model_enum_value.model._meta.db_table, field_name))
|
|
262
|
+
|
|
263
|
+
return ' AND '.join(conditions) if conditions else None
|
|
264
|
+
|
|
265
|
+
def get_remove_data_by_finished_status_conditions(self) -> Optional[str]:
|
|
266
|
+
"""Формирование условия для удаления записей по выгруженным моделям."""
|
|
267
|
+
remove_data_by_finished_status_conditions_sql = None
|
|
268
|
+
|
|
269
|
+
if issubclass(self._model_enum_value.model, BaseMainRDMModel):
|
|
270
|
+
remove_data_by_finished_status_conditions_sql = """
|
|
271
|
+
EXISTS (
|
|
272
|
+
SELECT 1
|
|
273
|
+
FROM rdm_exporting_data_sub_stage redss
|
|
274
|
+
WHERE redss.id = tbl.exporting_sub_stage_id
|
|
275
|
+
AND redss.status_id = 'FINISHED'
|
|
276
|
+
)
|
|
277
|
+
"""
|
|
278
|
+
|
|
279
|
+
return remove_data_by_finished_status_conditions_sql
|
|
280
|
+
|
|
281
|
+
def get_merged_conditions(self) -> str:
|
|
282
|
+
"""Формирование общего условия для определения устаревших записей."""
|
|
283
|
+
remove_empty_related_data_conditions = self.get_remove_empty_related_data_conditions()
|
|
284
|
+
remove_closed_periods_data_conditions = self.get_remove_closed_periods_data_conditions()
|
|
285
|
+
remove_data_by_deleted_records_conditions = self.get_remove_data_by_deleted_records_conditions()
|
|
286
|
+
reverse_relation_conditions = self.get_reverse_relation_conditions()
|
|
287
|
+
remove_data_by_finished_status_conditions = self.get_remove_data_by_finished_status_conditions()
|
|
288
|
+
|
|
289
|
+
conditions = ''
|
|
290
|
+
main_conditions = []
|
|
291
|
+
if remove_empty_related_data_conditions:
|
|
292
|
+
main_conditions.append(f'({remove_empty_related_data_conditions})')
|
|
293
|
+
|
|
294
|
+
if remove_closed_periods_data_conditions:
|
|
295
|
+
main_conditions.append(f'({remove_closed_periods_data_conditions})')
|
|
296
|
+
|
|
297
|
+
if remove_data_by_deleted_records_conditions:
|
|
298
|
+
main_conditions.append(f'({remove_data_by_deleted_records_conditions})')
|
|
299
|
+
|
|
300
|
+
if main_conditions:
|
|
301
|
+
conditions = ' OR '.join(main_conditions)
|
|
302
|
+
|
|
303
|
+
if reverse_relation_conditions and remove_data_by_finished_status_conditions:
|
|
304
|
+
additional_conditions = f'({reverse_relation_conditions}) AND ({remove_data_by_finished_status_conditions})'
|
|
305
|
+
else:
|
|
306
|
+
additional_conditions = reverse_relation_conditions or remove_data_by_finished_status_conditions
|
|
307
|
+
|
|
308
|
+
if conditions and additional_conditions:
|
|
309
|
+
conditions = f'({conditions}) AND ({additional_conditions})'
|
|
310
|
+
else:
|
|
311
|
+
conditions = additional_conditions or conditions
|
|
312
|
+
|
|
313
|
+
return conditions
|
|
314
|
+
|
|
315
|
+
def get_chunk_bounded(self) -> list[tuple[int, int, int]]:
|
|
316
|
+
"""Получение идентификаторов-границ чанков для проверки и удаления устаревших данных."""
|
|
317
|
+
get_chunk_bounded_sql = self.SELECT_RDM_CHUNK_BOUNDED_SQL.format(
|
|
318
|
+
chunk_size=settings.RDM_CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE,
|
|
319
|
+
table_name=self._model_enum_value.model._meta.db_table,
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
if self._log_sql:
|
|
323
|
+
# Проверка на доступность sqlparse для форматирования
|
|
324
|
+
try:
|
|
325
|
+
import sqlparse
|
|
326
|
+
except ImportError:
|
|
327
|
+
sqlparse = None
|
|
328
|
+
|
|
329
|
+
if sqlparse:
|
|
330
|
+
# Форматирование кода
|
|
331
|
+
get_chunk_bounded_sql = sqlparse.format(
|
|
332
|
+
sql=get_chunk_bounded_sql,
|
|
333
|
+
reindent=True,
|
|
334
|
+
strip_comments=True,
|
|
335
|
+
)
|
|
336
|
+
logger.info(
|
|
337
|
+
f'Запрос для получения границ чанков модели {self._model_enum_value.key}: \n{get_chunk_bounded_sql}\n'
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
with connection.cursor() as cursor:
|
|
341
|
+
cursor.execute(get_chunk_bounded_sql)
|
|
342
|
+
result = cursor.fetchall()
|
|
343
|
+
|
|
344
|
+
return result
|
|
345
|
+
|
|
346
|
+
def prepare_queries(self, chunk_bounded: list[tuple[int, int, int]]) -> list[str]:
|
|
347
|
+
"""Формирование списка запросов для удаления устаревших данных."""
|
|
348
|
+
queries = []
|
|
349
|
+
conditions = self.get_merged_conditions()
|
|
350
|
+
|
|
351
|
+
for chunk_number, first_id, last_id in chunk_bounded:
|
|
352
|
+
remove_outdated_data_sql = self.REMOVE_OUTDATED_DATA_SQL.format(
|
|
353
|
+
table_name=self._model_enum_value.model._meta.db_table,
|
|
354
|
+
first_id=first_id,
|
|
355
|
+
last_id=last_id,
|
|
356
|
+
conditions=conditions,
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
queries.append(remove_outdated_data_sql)
|
|
360
|
+
|
|
361
|
+
return queries
|
|
362
|
+
|
|
363
|
+
async def execute_query(self, pool: 'Pool', query: str) -> str:
|
|
364
|
+
"""Асинхронное выполнение запроса."""
|
|
365
|
+
async with pool.acquire() as conn:
|
|
366
|
+
try:
|
|
367
|
+
if self._safe:
|
|
368
|
+
logger.info(f'Запрос не будет выполнен, включен безопасный режим!\n')
|
|
369
|
+
|
|
370
|
+
if self._log_sql:
|
|
371
|
+
logger.info(f'{query}\n')
|
|
372
|
+
else:
|
|
373
|
+
deleted_count = await conn.fetchval(query)
|
|
374
|
+
|
|
375
|
+
self._deleted_count += deleted_count
|
|
376
|
+
|
|
377
|
+
if self._log_sql:
|
|
378
|
+
logger.info(f'При помощи запроса:\n{query}\n')
|
|
379
|
+
|
|
380
|
+
logger.info(f'Было удалено записей: {deleted_count}\n')
|
|
381
|
+
except Exception as e:
|
|
382
|
+
logger.error(f'Ошибка при выполнении {query}\n{e}')
|
|
383
|
+
|
|
384
|
+
async def execute_queries(self, queries: list[str]) -> None:
|
|
385
|
+
"""Асинхронное выполнение запросов."""
|
|
386
|
+
DB_SETTINGS = settings.DATABASES['default']
|
|
387
|
+
|
|
388
|
+
pool = await asyncpg.create_pool(
|
|
389
|
+
max_size=settings.RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE,
|
|
390
|
+
min_size=settings.RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE,
|
|
391
|
+
host=DB_SETTINGS['HOST'],
|
|
392
|
+
port=DB_SETTINGS['PORT'],
|
|
393
|
+
user=DB_SETTINGS['USER'],
|
|
394
|
+
password=DB_SETTINGS['PASSWORD'],
|
|
395
|
+
database=DB_SETTINGS['NAME'],
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
tasks = [self.execute_query(pool, query) for query in queries]
|
|
399
|
+
|
|
400
|
+
await asyncio.gather(*tasks)
|
|
401
|
+
|
|
402
|
+
def run(self):
|
|
403
|
+
"""Запуск очистки устаревших данных."""
|
|
404
|
+
chunk_bounded = self.get_chunk_bounded()
|
|
405
|
+
|
|
406
|
+
queries = self.prepare_queries(chunk_bounded=chunk_bounded)
|
|
407
|
+
|
|
408
|
+
if queries:
|
|
409
|
+
even_loop = asyncio.new_event_loop()
|
|
410
|
+
try:
|
|
411
|
+
even_loop.run_until_complete(self.execute_queries(queries=queries))
|
|
412
|
+
finally:
|
|
413
|
+
even_loop.close()
|
|
414
|
+
|
|
415
|
+
logger.info(f'Удалено записей модели {self._model_enum_value.key}: {self._deleted_count}')
|
{edu_rdm_integration-3.19.1 → edu_rdm_integration-3.21.0}/src/edu_rdm_integration.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: edu-rdm-integration
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.21.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
|
|
@@ -30,7 +30,7 @@ Requires-Dist: asyncpg==0.23.0
|
|
|
30
30
|
Requires-Dist: educommon<4,>=3.25.0
|
|
31
31
|
Requires-Dist: edu-function-tools<1,>=0.2.0
|
|
32
32
|
Requires-Dist: m3-db-utils<1,>=0.7.0
|
|
33
|
-
Requires-Dist: m3-django-
|
|
33
|
+
Requires-Dist: m3-django-compatibility<2,>=1.12.0
|
|
34
34
|
Requires-Dist: m3-ui<2.3,>=2.2.122
|
|
35
35
|
Requires-Dist: uploader-client<1,>=0.3.0
|
|
36
36
|
Provides-Extra: dev
|
|
@@ -198,6 +198,8 @@ INSTALLED_APPS = (
|
|
|
198
198
|
('uploader_client', 'INSTALLATION_NAME'): '',
|
|
199
199
|
('uploader_client', 'INSTALLATION_ID'): '',
|
|
200
200
|
('rdm_cleanup_outdated_data', 'ENABLE_CLEANUP_MODELS_OUTDATED_DATA'): False,
|
|
201
|
+
('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE'): 10000,
|
|
202
|
+
('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE'): 10,
|
|
201
203
|
})
|
|
202
204
|
```
|
|
203
205
|
- Получение значений настроек из конфигурационного файла в settings.py:
|
|
@@ -313,6 +315,10 @@ INSTALLED_APPS = (
|
|
|
313
315
|
|
|
314
316
|
# Включить зачистку устаревших данных моделей РВД
|
|
315
317
|
RDM_ENABLE_CLEANUP_MODELS_OUTDATED_DATA = conf.get_bool('rdm_cleanup_outdated_data', 'ENABLE_CLEANUP_MODELS_OUTDATED_DATA')
|
|
318
|
+
# Размер чанка записей зачистки устаревших данных моделей РВД
|
|
319
|
+
RDM_CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE = conf.get_int('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE')
|
|
320
|
+
# Количество подключений к БД для зачистки устаревших данных моделей РВД
|
|
321
|
+
RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE = conf.get_int('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE')
|
|
316
322
|
```
|
|
317
323
|
|
|
318
324
|
Перечень настроек в settings.py указан в таблице ниже.
|
|
@@ -373,6 +379,9 @@ INSTALLED_APPS = (
|
|
|
373
379
|
| RDM_EXPORT_LOG_DIR | Директория логов экспорта данных, доступных для скачивания | |
|
|
374
380
|
| RDM_UPLOAD_LOG_DIR | Директория логов отправки данных в витрину, доступных для скачивания | |
|
|
375
381
|
| RDM_ENABLE_CLEANUP_MODELS_OUTDATED_DATA | Включение зачистки устаревших данных моделей РВД | False |
|
|
382
|
+
| RDM_CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE | Размер чанка записей зачистки устаревших данных моделей РВД | 10000 |
|
|
383
|
+
| RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE | Количество подключений к БД для зачистки устаревших данных моделей РВД | 10 |
|
|
384
|
+
|
|
376
385
|
|
|
377
386
|
- В дефолтный конфиг проекта необходимо добавить:
|
|
378
387
|
|
|
@@ -473,6 +482,10 @@ INSTALLED_APPS = (
|
|
|
473
482
|
[rdm_cleanup_outdated_data]
|
|
474
483
|
# Включить зачистку устаревших данных моделей РВД
|
|
475
484
|
ENABLE_CLEANUP_MODELS_OUTDATED_DATA = False
|
|
485
|
+
# Размер чанка записей проверки устаревших данных моделей РВД
|
|
486
|
+
CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE = 10000
|
|
487
|
+
# Количество подключений к БД для проверки устаревших данных моделей РВД
|
|
488
|
+
CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE = 10
|
|
476
489
|
```
|
|
477
490
|
На основе дефолтного конфига произвести конфигурирование приложений.
|
|
478
491
|
|