edu-rdm-integration 3.9.2__py3-none-any.whl → 3.10.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- edu_rdm_integration/__init__.py +0 -1
- edu_rdm_integration/adapters/apps.py +15 -2
- edu_rdm_integration/adapters/caches.py +25 -12
- edu_rdm_integration/adapters/errors.py +13 -2
- edu_rdm_integration/adapters/functions.py +53 -14
- edu_rdm_integration/adapters/helpers.py +34 -8
- edu_rdm_integration/adapters/managers.py +41 -5
- edu_rdm_integration/adapters/presenters.py +26 -2
- edu_rdm_integration/adapters/receivers.py +16 -2
- edu_rdm_integration/adapters/results.py +50 -4
- edu_rdm_integration/adapters/runners.py +79 -20
- edu_rdm_integration/adapters/strategies.py +56 -54
- edu_rdm_integration/adapters/validators.py +43 -4
- edu_rdm_integration/apps.py +3 -23
- edu_rdm_integration/collect_and_export_data/__init__.py +1 -1
- edu_rdm_integration/collect_and_export_data/apps.py +1 -0
- edu_rdm_integration/collect_and_export_data/migrations/0001_initial.py +107 -17
- edu_rdm_integration/collect_and_export_data/migrations/0002_auto_20250204_1413.py +4 -2
- edu_rdm_integration/{consts.py → core/consts.py} +0 -11
- edu_rdm_integration/{enums.py → core/enums.py} +7 -54
- edu_rdm_integration/core/helpers.py +331 -0
- edu_rdm_integration/core/operations.py +71 -0
- edu_rdm_integration/core/redis_cache.py +20 -0
- edu_rdm_integration/{collect_and_export_data → core/registry}/actions.py +6 -12
- edu_rdm_integration/core/registry/apps.py +11 -0
- edu_rdm_integration/{collect_and_export_data → core/registry}/ui.py +1 -1
- edu_rdm_integration/{storages.py → core/storages.py} +8 -17
- edu_rdm_integration/{utils.py → core/utils.py} +29 -91
- edu_rdm_integration/migrations/0001_initial.py +294 -44
- edu_rdm_integration/migrations/0002_init_data_uploadstatus.py +1 -3
- edu_rdm_integration/migrations/0003_create_index_file_upload_status.py +0 -1
- edu_rdm_integration/migrations/0004_uploaderclientlog.py +1 -2
- edu_rdm_integration/migrations/0005_auto_20231204_1224.py +16 -4
- edu_rdm_integration/migrations/0006_request_status_data.py +60 -58
- edu_rdm_integration/migrations/0007_delete_upload_status.py +0 -1
- edu_rdm_integration/migrations/0009_auto_20240522_1619.py +1 -5
- edu_rdm_integration/migrations/0010_transferredentity_export_enabled.py +0 -1
- edu_rdm_integration/migrations/0011_exportingdatasubstageentity.py +16 -3
- edu_rdm_integration/migrations/0012_exportingdatasubstageattachment_attachment_size.py +0 -1
- edu_rdm_integration/migrations/0013_set_attachment_size.py +8 -12
- edu_rdm_integration/migrations/0014_uploaddatacommand.py +33 -6
- edu_rdm_integration/migrations/0015_set_exporting_sub_stage_status.py +1 -5
- edu_rdm_integration/migrations/0016_transferredentity_queue_level.py +2 -2
- edu_rdm_integration/migrations/0017_delete_uploaddatacommand.py +3 -2
- edu_rdm_integration/migrations/__init__.py +1 -0
- edu_rdm_integration/{registry → pipelines/transfer}/actions.py +13 -26
- edu_rdm_integration/pipelines/transfer/app_meta.py +18 -0
- edu_rdm_integration/pipelines/transfer/apps.py +19 -0
- edu_rdm_integration/pipelines/transfer/enums.py +34 -0
- edu_rdm_integration/pipelines/transfer/migrations/0001_initial.py +57 -0
- edu_rdm_integration/{base.py → pipelines/transfer/mixins.py} +29 -53
- edu_rdm_integration/pipelines/transfer/models.py +48 -0
- edu_rdm_integration/{tasks.py → pipelines/transfer/tasks.py} +51 -150
- edu_rdm_integration/{registry → pipelines/transfer}/ui.py +4 -10
- edu_rdm_integration/rdm_entities/apps.py +11 -0
- edu_rdm_integration/{entities.py → rdm_entities/entities.py} +67 -57
- edu_rdm_integration/rdm_entities/migrations/0001_initial.py +44 -0
- edu_rdm_integration/{enum_register → rdm_entities}/mixins.py +8 -59
- edu_rdm_integration/rdm_entities/models.py +63 -0
- edu_rdm_integration/rdm_entities/utils.py +33 -0
- edu_rdm_integration/rdm_models/apps.py +16 -0
- edu_rdm_integration/rdm_models/migrations/0001_initial.py +40 -0
- edu_rdm_integration/rdm_models/mixins.py +67 -0
- edu_rdm_integration/rdm_models/models.py +73 -0
- edu_rdm_integration/rdm_models/utils.py +23 -0
- edu_rdm_integration/stages/collect_data/apps.py +11 -0
- edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/functions.py-tpl +2 -2
- edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/managers.py-tpl +1 -1
- edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/runners.py-tpl +1 -1
- edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/tests.py-tpl +2 -1
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/caches.py +2 -2
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/functions.py +15 -18
- edu_rdm_integration/stages/collect_data/functions/base/helpers.py +20 -0
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/managers.py +20 -27
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/mixins.py +38 -55
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/runners.py +2 -5
- edu_rdm_integration/stages/collect_data/functions/calculated/base/__init__.py +0 -0
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/caches.py +3 -7
- edu_rdm_integration/stages/collect_data/functions/calculated/base/errors.py +7 -0
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/functions.py +8 -16
- edu_rdm_integration/stages/collect_data/functions/calculated/base/helpers.py +24 -0
- edu_rdm_integration/stages/collect_data/functions/calculated/base/managers.py +19 -0
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/presenters.py +1 -3
- edu_rdm_integration/stages/collect_data/functions/calculated/base/results.py +12 -0
- edu_rdm_integration/stages/collect_data/functions/calculated/base/runners.py +28 -0
- edu_rdm_integration/stages/collect_data/functions/calculated/base/validators.py +20 -0
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/strategies.py +32 -70
- edu_rdm_integration/stages/collect_data/functions/non_calculated/__init__.py +0 -0
- edu_rdm_integration/stages/collect_data/functions/non_calculated/base/__init__.py +0 -0
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/caches.py +13 -22
- edu_rdm_integration/stages/collect_data/functions/non_calculated/base/errors.py +7 -0
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/functions.py +8 -16
- edu_rdm_integration/stages/collect_data/functions/non_calculated/base/helpers.py +24 -0
- edu_rdm_integration/stages/collect_data/functions/non_calculated/base/managers.py +19 -0
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/presenters.py +1 -3
- edu_rdm_integration/stages/collect_data/functions/non_calculated/base/results.py +12 -0
- edu_rdm_integration/stages/collect_data/functions/non_calculated/base/runners.py +28 -0
- edu_rdm_integration/stages/collect_data/functions/non_calculated/base/validators.py +20 -0
- edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/strategies.py +32 -70
- edu_rdm_integration/{collect_data → stages/collect_data}/generators.py +9 -14
- edu_rdm_integration/stages/collect_data/helpers.py +154 -0
- edu_rdm_integration/stages/collect_data/management/__init__.py +0 -0
- edu_rdm_integration/stages/collect_data/management/base.py +100 -0
- edu_rdm_integration/stages/collect_data/management/commands/__init__.py +0 -0
- edu_rdm_integration/{management → stages/collect_data/management}/commands/collect_latest_models_data.py +5 -7
- edu_rdm_integration/{management → stages/collect_data/management}/commands/collect_models_data.py +5 -7
- edu_rdm_integration/stages/collect_data/migrations/0001_initial.py +187 -0
- edu_rdm_integration/stages/collect_data/migrations/0002_edurdmcollectdatacommandprogress.py +105 -0
- edu_rdm_integration/stages/collect_data/migrations/__init__.py +0 -0
- edu_rdm_integration/stages/collect_data/mixins.py +56 -0
- edu_rdm_integration/stages/collect_data/models.py +318 -0
- edu_rdm_integration/{collect_data/collect.py → stages/collect_data/operations.py} +30 -43
- edu_rdm_integration/stages/collect_data/registry/__init__.py +0 -0
- edu_rdm_integration/{collect_data → stages/collect_data/registry}/actions.py +17 -20
- edu_rdm_integration/stages/collect_data/registry/apps.py +11 -0
- edu_rdm_integration/{collect_data → stages/collect_data/registry}/ui.py +8 -15
- edu_rdm_integration/{collect_data → stages/collect_data}/tests.py +2 -2
- edu_rdm_integration/stages/export_data/__init__.py +0 -0
- edu_rdm_integration/stages/export_data/apps.py +11 -0
- edu_rdm_integration/stages/export_data/function_templates/__init__.py +0 -0
- edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/functions.py-tpl +2 -2
- edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/managers.py-tpl +2 -2
- edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/runners.py-tpl +2 -2
- edu_rdm_integration/stages/export_data/functions/__init__.py +0 -0
- edu_rdm_integration/stages/export_data/functions/base/__init__.py +0 -0
- edu_rdm_integration/{export_data → stages/export_data/functions}/base/caches.py +3 -8
- edu_rdm_integration/stages/export_data/functions/base/errors.py +7 -0
- edu_rdm_integration/{export_data → stages/export_data/functions}/base/functions.py +28 -59
- edu_rdm_integration/{export_data → stages/export_data/functions}/base/helpers.py +7 -17
- edu_rdm_integration/{export_data → stages/export_data/functions}/base/managers.py +19 -28
- edu_rdm_integration/stages/export_data/functions/base/presenters.py +11 -0
- edu_rdm_integration/{export_data → stages/export_data/functions}/base/requests.py +13 -40
- edu_rdm_integration/stages/export_data/functions/base/results.py +12 -0
- edu_rdm_integration/{export_data → stages/export_data/functions}/base/runners.py +9 -21
- edu_rdm_integration/stages/export_data/functions/base/validators.py +20 -0
- edu_rdm_integration/{export_data → stages/export_data}/generators.py +7 -6
- edu_rdm_integration/stages/export_data/helpers.py +203 -0
- edu_rdm_integration/stages/export_data/management/__init__.py +0 -0
- edu_rdm_integration/stages/export_data/management/base.py +101 -0
- edu_rdm_integration/stages/export_data/management/commands/__init__.py +0 -0
- edu_rdm_integration/{management → stages/export_data/management}/commands/export_entities_data.py +5 -7
- edu_rdm_integration/{management → stages/export_data/management}/commands/export_latest_entities_data.py +5 -7
- edu_rdm_integration/stages/export_data/migrations/0001_initial.py +324 -0
- edu_rdm_integration/stages/export_data/migrations/__init__.py +0 -0
- edu_rdm_integration/stages/export_data/mixins.py +50 -0
- edu_rdm_integration/stages/export_data/models.py +362 -0
- edu_rdm_integration/{export_data/export.py → stages/export_data/operations.py} +13 -152
- edu_rdm_integration/stages/export_data/registry/__init__.py +0 -0
- edu_rdm_integration/{export_data → stages/export_data/registry}/actions.py +18 -18
- edu_rdm_integration/stages/export_data/registry/apps.py +11 -0
- edu_rdm_integration/{export_data → stages/export_data/registry}/ui.py +5 -7
- edu_rdm_integration/{export_data → stages/export_data}/strategies.py +30 -68
- edu_rdm_integration/stages/service/__init__.py +0 -0
- edu_rdm_integration/stages/service/apps.py +19 -0
- edu_rdm_integration/stages/service/tasks.py +63 -0
- edu_rdm_integration/stages/upload_data/__init__.py +0 -0
- edu_rdm_integration/stages/upload_data/apps.py +19 -0
- edu_rdm_integration/stages/upload_data/consts.py +10 -0
- edu_rdm_integration/{export_data → stages/upload_data}/dataclasses.py +1 -0
- edu_rdm_integration/stages/upload_data/enums.py +17 -0
- edu_rdm_integration/{export_data/export_manager.py → stages/upload_data/export_managers.py} +73 -68
- edu_rdm_integration/stages/upload_data/helpers.py +164 -0
- edu_rdm_integration/stages/upload_data/management/__init__.py +0 -0
- edu_rdm_integration/stages/upload_data/management/base.py +134 -0
- edu_rdm_integration/stages/upload_data/management/commands/__init__.py +0 -0
- edu_rdm_integration/{management → stages/upload_data/management}/commands/async_fix_attachment_size.py +32 -54
- edu_rdm_integration/{management → stages/upload_data/management}/commands/check_upload_status.py +7 -6
- edu_rdm_integration/{management → stages/upload_data/management}/commands/datamart_status.py +3 -3
- edu_rdm_integration/{management → stages/upload_data/management}/commands/datamart_upload.py +4 -4
- edu_rdm_integration/stages/upload_data/migrations/0001_initial.py +161 -0
- edu_rdm_integration/stages/upload_data/migrations/__init__.py +0 -0
- edu_rdm_integration/stages/upload_data/models.py +175 -0
- edu_rdm_integration/stages/upload_data/operations.py +156 -0
- edu_rdm_integration/{export_data/queue.py → stages/upload_data/queues.py} +10 -8
- edu_rdm_integration/stages/upload_data/tasks.py +103 -0
- edu_rdm_integration/stages/upload_data/uploader_log/__init__.py +0 -0
- edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/actions.py +14 -16
- edu_rdm_integration/stages/upload_data/uploader_log/apps.py +11 -0
- edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/managers.py +15 -30
- edu_rdm_integration/stages/upload_data/uploader_log/migrations/0001_initial.py +31 -0
- edu_rdm_integration/stages/upload_data/uploader_log/migrations/__init__.py +0 -0
- edu_rdm_integration/stages/upload_data/uploader_log/models.py +86 -0
- edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/ui.py +8 -6
- {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.0.dist-info}/METADATA +238 -238
- edu_rdm_integration-3.10.0.dist-info/RECORD +255 -0
- edu_rdm_integration/app_meta.py +0 -16
- edu_rdm_integration/app_settings.py +0 -77
- edu_rdm_integration/collect_and_export_data/models.py +0 -67
- edu_rdm_integration/collect_and_export_data/utils.py +0 -224
- edu_rdm_integration/collect_data/base/helpers.py +0 -26
- edu_rdm_integration/collect_data/calculated/base/errors.py +0 -9
- edu_rdm_integration/collect_data/calculated/base/helpers.py +0 -32
- edu_rdm_integration/collect_data/calculated/base/managers.py +0 -23
- edu_rdm_integration/collect_data/calculated/base/results.py +0 -16
- edu_rdm_integration/collect_data/calculated/base/runners.py +0 -36
- edu_rdm_integration/collect_data/calculated/base/validators.py +0 -28
- edu_rdm_integration/collect_data/helpers.py +0 -92
- edu_rdm_integration/collect_data/non_calculated/base/errors.py +0 -9
- edu_rdm_integration/collect_data/non_calculated/base/helpers.py +0 -32
- edu_rdm_integration/collect_data/non_calculated/base/managers.py +0 -23
- edu_rdm_integration/collect_data/non_calculated/base/results.py +0 -16
- edu_rdm_integration/collect_data/non_calculated/base/runners.py +0 -36
- edu_rdm_integration/collect_data/non_calculated/base/validators.py +0 -28
- edu_rdm_integration/enum_register/register.py +0 -79
- edu_rdm_integration/export_data/base/errors.py +0 -9
- edu_rdm_integration/export_data/base/presenters.py +0 -13
- edu_rdm_integration/export_data/base/results.py +0 -16
- edu_rdm_integration/export_data/base/validators.py +0 -28
- edu_rdm_integration/export_data/helpers.py +0 -92
- edu_rdm_integration/helpers.py +0 -412
- edu_rdm_integration/management/general.py +0 -327
- edu_rdm_integration/models.py +0 -982
- edu_rdm_integration/redis_cache.py +0 -51
- edu_rdm_integration/uploader_log/apps.py +0 -10
- edu_rdm_integration-3.9.2.dist-info/RECORD +0 -198
- /edu_rdm_integration/{collect_and_export_data/migrations → core}/__init__.py +0 -0
- /edu_rdm_integration/{mapping.py → core/mapping.py} +0 -0
- /edu_rdm_integration/{collect_data → core/registry}/__init__.py +0 -0
- /edu_rdm_integration/{templates → core/registry/templates}/ui-js/start-task.js +0 -0
- /edu_rdm_integration/{signals.py → core/signals.py} +0 -0
- /edu_rdm_integration/{typing.py → core/typing.py} +0 -0
- /edu_rdm_integration/{collect_data/base → pipelines}/__init__.py +0 -0
- /edu_rdm_integration/{collect_data/calculated → pipelines/transfer}/__init__.py +0 -0
- /edu_rdm_integration/{collect_data/calculated/base → pipelines/transfer/migrations}/__init__.py +0 -0
- /edu_rdm_integration/{templates → pipelines/transfer/templates}/ui-js/transferred-entity-list.js +0 -0
- /edu_rdm_integration/{collect_data/non_calculated → rdm_entities}/__init__.py +0 -0
- /edu_rdm_integration/{collect_data/non_calculated/base → rdm_entities/migrations}/__init__.py +0 -0
- /edu_rdm_integration/{enum_register → rdm_models}/__init__.py +0 -0
- /edu_rdm_integration/{export_data → rdm_models/migrations}/__init__.py +0 -0
- /edu_rdm_integration/{export_data/base → stages}/__init__.py +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data}/__init__.py +0 -0
- /edu_rdm_integration/{collect_data/const.py → stages/collect_data/consts.py} +0 -0
- /edu_rdm_integration/{management → stages/collect_data/function_templates}/__init__.py +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/__init__.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/apps.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/caches.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/consts.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/enums.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/errors.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/helpers.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/presenters.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/results.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/strings.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/collect_data/function_templates}/function_collect_data_template/validators.py-tpl +0 -0
- /edu_rdm_integration/{management/commands → stages/collect_data/functions}/__init__.py +0 -0
- /edu_rdm_integration/{registry → stages/collect_data/functions/base}/__init__.py +0 -0
- /edu_rdm_integration/{collect_data → stages/collect_data/functions}/base/consts.py +0 -0
- /edu_rdm_integration/{uploader_log → stages/collect_data/functions/calculated}/__init__.py +0 -0
- /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/consts.py +0 -0
- /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/enums.py +0 -0
- /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/strings.py +0 -0
- /edu_rdm_integration/{collect_data → stages/collect_data/functions}/calculated/base/tests.py +0 -0
- /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/consts.py +0 -0
- /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/enums.py +0 -0
- /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/strings.py +0 -0
- /edu_rdm_integration/{collect_data → stages/collect_data/functions}/non_calculated/base/tests.py +0 -0
- /edu_rdm_integration/{export_data → stages/export_data}/consts.py +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/__init__.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/apps.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/caches.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/consts.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/enums.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/errors.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/helpers.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/presenters.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/results.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/strings.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/tests.py-tpl +0 -0
- /edu_rdm_integration/{function_templates → stages/export_data/function_templates}/function_export_data_template/validators.py-tpl +0 -0
- /edu_rdm_integration/{export_data → stages/export_data/functions}/base/consts.py +0 -0
- /edu_rdm_integration/{export_data → stages/export_data/functions}/base/enums.py +0 -0
- /edu_rdm_integration/{export_data → stages/export_data/functions}/base/strings.py +0 -0
- /edu_rdm_integration/{export_data → stages/export_data/functions}/base/tests.py +0 -0
- /edu_rdm_integration/{templates → stages/export_data/registry/templates}/ui-js/stage_for_export.js +0 -0
- /edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/enums.py +0 -0
- /edu_rdm_integration/{uploader_log → stages/upload_data/uploader_log}/templates/ui-js/object-grid-buttons.js +0 -0
- {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.0.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.0.dist-info}/licenses/LICENSE +0 -0
- {edu_rdm_integration-3.9.2.dist-info → edu_rdm_integration-3.10.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,161 @@
|
|
1
|
+
# Generated by Django 3.2.24 on 2025-06-28 14:21
|
2
|
+
|
3
|
+
import django.db.models.deletion
|
4
|
+
from django.db import (
|
5
|
+
migrations,
|
6
|
+
models,
|
7
|
+
)
|
8
|
+
|
9
|
+
import educommon.django.db.mixins
|
10
|
+
import m3_db_utils.mixins
|
11
|
+
|
12
|
+
|
13
|
+
class Migration(migrations.Migration):
|
14
|
+
initial = True
|
15
|
+
|
16
|
+
dependencies = [
|
17
|
+
('edu_rdm_integration_export_data_stage', '0001_initial'),
|
18
|
+
('uploader_client', '0001_initial'),
|
19
|
+
]
|
20
|
+
|
21
|
+
operations = [
|
22
|
+
migrations.SeparateDatabaseAndState(
|
23
|
+
state_operations=[
|
24
|
+
migrations.CreateModel(
|
25
|
+
name='DataMartRequestStatus',
|
26
|
+
fields=[
|
27
|
+
('title', models.TextField(verbose_name='расшифровка значения')),
|
28
|
+
('value', models.IntegerField(verbose_name='значение')),
|
29
|
+
(
|
30
|
+
'key',
|
31
|
+
models.CharField(
|
32
|
+
db_index=True, max_length=512, primary_key=True, serialize=False, verbose_name='ключ'
|
33
|
+
),
|
34
|
+
),
|
35
|
+
('order_number', models.PositiveIntegerField(default=100000, verbose_name='Порядковый номер')),
|
36
|
+
],
|
37
|
+
options={
|
38
|
+
'verbose_name': 'Статус загрузки данных в Витрину',
|
39
|
+
'verbose_name_plural': 'Статусы загрузки данных в Витрину',
|
40
|
+
'db_table': 'rdm_request_status',
|
41
|
+
},
|
42
|
+
bases=(m3_db_utils.mixins.BaseValueMixin, models.Model),
|
43
|
+
),
|
44
|
+
migrations.CreateModel(
|
45
|
+
name='ExportingDataSubStageUploaderClientLog',
|
46
|
+
fields=[
|
47
|
+
(
|
48
|
+
'id',
|
49
|
+
models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
50
|
+
),
|
51
|
+
(
|
52
|
+
'request_id',
|
53
|
+
models.CharField(
|
54
|
+
blank=True, db_index=True, max_length=100, verbose_name='Id запроса загрузки в витрину'
|
55
|
+
),
|
56
|
+
),
|
57
|
+
('is_emulation', models.BooleanField(default=False, verbose_name='Включен режим эмуляции')),
|
58
|
+
(
|
59
|
+
'file_upload_status',
|
60
|
+
models.SmallIntegerField(
|
61
|
+
blank=True,
|
62
|
+
choices=[
|
63
|
+
(1, 'В процессе загрузки в витрину'),
|
64
|
+
(2, 'Загрузка в витрину закончена'),
|
65
|
+
(3, 'Ошибка загрузки в витрину'),
|
66
|
+
],
|
67
|
+
null=True,
|
68
|
+
verbose_name='Общий статус загрузки файла в витрину',
|
69
|
+
),
|
70
|
+
),
|
71
|
+
(
|
72
|
+
'created',
|
73
|
+
models.DateTimeField(
|
74
|
+
auto_now_add=True, db_index=True, null=True, verbose_name='Дата создания'
|
75
|
+
),
|
76
|
+
),
|
77
|
+
(
|
78
|
+
'modified',
|
79
|
+
models.DateTimeField(
|
80
|
+
auto_now=True, db_index=True, null=True, verbose_name='Дата изменения'
|
81
|
+
),
|
82
|
+
),
|
83
|
+
(
|
84
|
+
'attachment',
|
85
|
+
models.ForeignKey(
|
86
|
+
on_delete=django.db.models.deletion.CASCADE,
|
87
|
+
to='edu_rdm_integration_export_data_stage.exportingdatasubstageattachment',
|
88
|
+
verbose_name='Прикрепленный файл',
|
89
|
+
),
|
90
|
+
),
|
91
|
+
(
|
92
|
+
'entry',
|
93
|
+
models.ForeignKey(
|
94
|
+
on_delete=django.db.models.deletion.CASCADE,
|
95
|
+
related_name='uploader_client_log',
|
96
|
+
to='uploader_client.entry',
|
97
|
+
verbose_name='Лог запроса и ответа',
|
98
|
+
),
|
99
|
+
),
|
100
|
+
(
|
101
|
+
'sub_stage',
|
102
|
+
models.ForeignKey(
|
103
|
+
on_delete=django.db.models.deletion.CASCADE,
|
104
|
+
to='edu_rdm_integration_export_data_stage.exportingdatasubstage',
|
105
|
+
verbose_name='Подэтап выгрузки данных',
|
106
|
+
),
|
107
|
+
),
|
108
|
+
],
|
109
|
+
options={
|
110
|
+
'verbose_name': 'Лог запроса подэтапа выгрузки данных',
|
111
|
+
'verbose_name_plural': 'Лог запроса подэтапа выгрузки данных',
|
112
|
+
'db_table': 'rdm_exporting_data_sub_stage_uploader_client_log',
|
113
|
+
},
|
114
|
+
bases=(educommon.django.db.mixins.ReprStrPreModelMixin, models.Model),
|
115
|
+
),
|
116
|
+
migrations.CreateModel(
|
117
|
+
name='UploadStatusRequestLog',
|
118
|
+
fields=[
|
119
|
+
(
|
120
|
+
'id',
|
121
|
+
models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
122
|
+
),
|
123
|
+
(
|
124
|
+
'entry',
|
125
|
+
models.ForeignKey(
|
126
|
+
on_delete=django.db.models.deletion.CASCADE,
|
127
|
+
related_name='upload_status_request_log',
|
128
|
+
to='uploader_client.entry',
|
129
|
+
verbose_name='Cвязь запроса статуса с запросом в витрину',
|
130
|
+
),
|
131
|
+
),
|
132
|
+
(
|
133
|
+
'request_status',
|
134
|
+
models.ForeignKey(
|
135
|
+
blank=True,
|
136
|
+
null=True,
|
137
|
+
on_delete=django.db.models.deletion.PROTECT,
|
138
|
+
to='edu_rdm_integration_upload_data_stage.datamartrequeststatus',
|
139
|
+
verbose_name='Статус запроса в витрине',
|
140
|
+
),
|
141
|
+
),
|
142
|
+
(
|
143
|
+
'upload',
|
144
|
+
models.ForeignKey(
|
145
|
+
on_delete=django.db.models.deletion.CASCADE,
|
146
|
+
to='edu_rdm_integration_upload_data_stage.exportingdatasubstageuploaderclientlog',
|
147
|
+
verbose_name='Cвязь запроса статуса с загрузкой файла в витрину',
|
148
|
+
),
|
149
|
+
),
|
150
|
+
],
|
151
|
+
options={
|
152
|
+
'verbose_name': 'Лог запроса подэтапа выгрузки данных',
|
153
|
+
'verbose_name_plural': 'Логи запроса подэтапа выгрузки данных',
|
154
|
+
'db_table': 'rdm_upload_status_request_log',
|
155
|
+
},
|
156
|
+
bases=(educommon.django.db.mixins.ReprStrPreModelMixin, models.Model),
|
157
|
+
),
|
158
|
+
],
|
159
|
+
database_operations=[],
|
160
|
+
),
|
161
|
+
]
|
File without changes
|
@@ -0,0 +1,175 @@
|
|
1
|
+
from django.db.models import (
|
2
|
+
CASCADE,
|
3
|
+
PROTECT,
|
4
|
+
BooleanField,
|
5
|
+
CharField,
|
6
|
+
DateTimeField,
|
7
|
+
ForeignKey,
|
8
|
+
SmallIntegerField,
|
9
|
+
)
|
10
|
+
from m3.db import (
|
11
|
+
BaseObjectModel,
|
12
|
+
)
|
13
|
+
from uploader_client.models import (
|
14
|
+
Entry,
|
15
|
+
)
|
16
|
+
|
17
|
+
from educommon.django.db.mixins import (
|
18
|
+
ReprStrPreModelMixin,
|
19
|
+
)
|
20
|
+
from m3_db_utils.models import (
|
21
|
+
ModelEnumValue,
|
22
|
+
TitledIntegerModelEnum,
|
23
|
+
)
|
24
|
+
|
25
|
+
from edu_rdm_integration.stages.export_data.models import (
|
26
|
+
ExportingDataSubStage,
|
27
|
+
ExportingDataSubStageAttachment,
|
28
|
+
)
|
29
|
+
from edu_rdm_integration.stages.upload_data.enums import (
|
30
|
+
FileUploadStatusEnum,
|
31
|
+
)
|
32
|
+
|
33
|
+
|
34
|
+
class DataMartRequestStatus(TitledIntegerModelEnum):
|
35
|
+
"""Модель-перечисление статусов загрузки данных в Витрину."""
|
36
|
+
|
37
|
+
UPLOAD_TO_BUFFER = ModelEnumValue(
|
38
|
+
value=-1,
|
39
|
+
title='Загрузка данных в буффер',
|
40
|
+
)
|
41
|
+
|
42
|
+
BUFFERED = ModelEnumValue(
|
43
|
+
value=0,
|
44
|
+
title='Запрос буфферизирован',
|
45
|
+
)
|
46
|
+
|
47
|
+
WAIT_FOR_OPEN_DELTA = ModelEnumValue(
|
48
|
+
value=1,
|
49
|
+
title='Ожидает открытия дельты',
|
50
|
+
)
|
51
|
+
|
52
|
+
IN_PROCESSING = ModelEnumValue(
|
53
|
+
value=2,
|
54
|
+
title='В обработке',
|
55
|
+
)
|
56
|
+
|
57
|
+
SUCCESSFULLY_PROCESSED = ModelEnumValue(
|
58
|
+
value=3,
|
59
|
+
title='Успешно обработан',
|
60
|
+
)
|
61
|
+
|
62
|
+
FAILED_PROCESSING = ModelEnumValue(
|
63
|
+
value=4,
|
64
|
+
title='Ошибка обработки запроса',
|
65
|
+
)
|
66
|
+
|
67
|
+
REQUEST_ID_NOT_FOUND = ModelEnumValue(
|
68
|
+
value=5,
|
69
|
+
title='Идентификатор запроса не обнаружен',
|
70
|
+
)
|
71
|
+
|
72
|
+
FORMAT_LOGICAL_CONTROL = ModelEnumValue(
|
73
|
+
value=6,
|
74
|
+
title='Форматно-логический контроль',
|
75
|
+
)
|
76
|
+
|
77
|
+
FLC_ERROR = ModelEnumValue(
|
78
|
+
value=7,
|
79
|
+
title='Ошибки ФЛК',
|
80
|
+
)
|
81
|
+
|
82
|
+
class Meta:
|
83
|
+
db_table = 'rdm_request_status'
|
84
|
+
verbose_name = 'Статус загрузки данных в Витрину'
|
85
|
+
verbose_name_plural = 'Статусы загрузки данных в Витрину'
|
86
|
+
|
87
|
+
|
88
|
+
class ExportingDataSubStageUploaderClientLog(ReprStrPreModelMixin, BaseObjectModel):
|
89
|
+
"""Связь лога Загрузчика данных с подэтапом выгрузки данных."""
|
90
|
+
|
91
|
+
entry = ForeignKey(
|
92
|
+
to=Entry,
|
93
|
+
verbose_name='Лог запроса и ответа',
|
94
|
+
on_delete=CASCADE,
|
95
|
+
related_name='uploader_client_log',
|
96
|
+
)
|
97
|
+
|
98
|
+
sub_stage = ForeignKey(
|
99
|
+
to=ExportingDataSubStage,
|
100
|
+
verbose_name='Подэтап выгрузки данных',
|
101
|
+
on_delete=CASCADE,
|
102
|
+
)
|
103
|
+
|
104
|
+
attachment = ForeignKey(
|
105
|
+
to=ExportingDataSubStageAttachment,
|
106
|
+
verbose_name='Прикрепленный файл',
|
107
|
+
on_delete=CASCADE,
|
108
|
+
)
|
109
|
+
|
110
|
+
request_id = CharField(
|
111
|
+
verbose_name='Id запроса загрузки в витрину',
|
112
|
+
max_length=100,
|
113
|
+
blank=True,
|
114
|
+
db_index=True,
|
115
|
+
)
|
116
|
+
|
117
|
+
is_emulation = BooleanField(
|
118
|
+
verbose_name='Включен режим эмуляции',
|
119
|
+
default=False,
|
120
|
+
)
|
121
|
+
|
122
|
+
file_upload_status = SmallIntegerField(
|
123
|
+
verbose_name='Общий статус загрузки файла в витрину',
|
124
|
+
choices=FileUploadStatusEnum.get_choices(),
|
125
|
+
null=True,
|
126
|
+
blank=True,
|
127
|
+
)
|
128
|
+
|
129
|
+
created = DateTimeField(
|
130
|
+
verbose_name='Дата создания',
|
131
|
+
auto_now_add=True,
|
132
|
+
null=True,
|
133
|
+
blank=True,
|
134
|
+
db_index=True,
|
135
|
+
)
|
136
|
+
modified = DateTimeField(
|
137
|
+
verbose_name='Дата изменения',
|
138
|
+
auto_now=True,
|
139
|
+
null=True,
|
140
|
+
blank=True,
|
141
|
+
db_index=True,
|
142
|
+
)
|
143
|
+
|
144
|
+
class Meta:
|
145
|
+
db_table = 'rdm_exporting_data_sub_stage_uploader_client_log'
|
146
|
+
verbose_name = 'Лог запроса подэтапа выгрузки данных'
|
147
|
+
verbose_name_plural = 'Лог запроса подэтапа выгрузки данных'
|
148
|
+
|
149
|
+
|
150
|
+
class UploadStatusRequestLog(ReprStrPreModelMixin, BaseObjectModel):
|
151
|
+
"""Модель связывающая статусы, загрузку файла в витрину и http-запрос к витрине."""
|
152
|
+
|
153
|
+
upload = ForeignKey(
|
154
|
+
verbose_name='Cвязь запроса статуса с загрузкой файла в витрину',
|
155
|
+
to=ExportingDataSubStageUploaderClientLog,
|
156
|
+
on_delete=CASCADE,
|
157
|
+
)
|
158
|
+
entry = ForeignKey(
|
159
|
+
verbose_name='Cвязь запроса статуса с запросом в витрину',
|
160
|
+
to=Entry,
|
161
|
+
on_delete=CASCADE,
|
162
|
+
related_name='upload_status_request_log',
|
163
|
+
)
|
164
|
+
request_status = ForeignKey(
|
165
|
+
verbose_name='Статус запроса в витрине',
|
166
|
+
to=DataMartRequestStatus,
|
167
|
+
on_delete=PROTECT,
|
168
|
+
null=True,
|
169
|
+
blank=True,
|
170
|
+
)
|
171
|
+
|
172
|
+
class Meta:
|
173
|
+
db_table = 'rdm_upload_status_request_log'
|
174
|
+
verbose_name = 'Лог запроса подэтапа выгрузки данных'
|
175
|
+
verbose_name_plural = 'Логи запроса подэтапа выгрузки данных'
|
@@ -0,0 +1,156 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
from typing import (
|
4
|
+
Union,
|
5
|
+
)
|
6
|
+
|
7
|
+
from django.conf import (
|
8
|
+
settings,
|
9
|
+
)
|
10
|
+
|
11
|
+
from educommon import (
|
12
|
+
logger,
|
13
|
+
)
|
14
|
+
|
15
|
+
from edu_rdm_integration.core.operations import (
|
16
|
+
BaseOperationData,
|
17
|
+
)
|
18
|
+
from edu_rdm_integration.core.redis_cache import (
|
19
|
+
AbstractCache,
|
20
|
+
)
|
21
|
+
from edu_rdm_integration.stages.export_data.consts import (
|
22
|
+
TOTAL_ATTACHMENTS_SIZE_KEY,
|
23
|
+
)
|
24
|
+
from edu_rdm_integration.stages.upload_data.export_managers import (
|
25
|
+
ExportQueueSender,
|
26
|
+
WorkerSender,
|
27
|
+
)
|
28
|
+
from edu_rdm_integration.stages.upload_data.queues import (
|
29
|
+
Queue,
|
30
|
+
)
|
31
|
+
|
32
|
+
|
33
|
+
class UploadData(BaseOperationData):
|
34
|
+
"""Класс отправки файлов в витрину."""
|
35
|
+
|
36
|
+
def __init__(
|
37
|
+
self,
|
38
|
+
data_cache: AbstractCache,
|
39
|
+
queue: Queue,
|
40
|
+
**kwargs,
|
41
|
+
):
|
42
|
+
super().__init__(**kwargs)
|
43
|
+
|
44
|
+
self.data_cache = data_cache
|
45
|
+
self.queue = queue
|
46
|
+
|
47
|
+
self._configure_agent_client()
|
48
|
+
self.result = {
|
49
|
+
'total_file_size': 0, # Общий размер отправленных файлов
|
50
|
+
'queue_is_full': False, # Признак переполнения очереди
|
51
|
+
'uploaded_entities': '', # Список сущностей, попавших в выгрузку
|
52
|
+
}
|
53
|
+
|
54
|
+
@property
|
55
|
+
def _log_file_path(self) -> Union[str, bytes]:
|
56
|
+
"""Путь до лог файла."""
|
57
|
+
return os.path.join(settings.MEDIA_ROOT, settings.RDM_UPLOAD_LOG_DIR, 'upload_entity.log')
|
58
|
+
|
59
|
+
def _add_file_handler(self) -> None:
|
60
|
+
"""Добавляет обработчик логов."""
|
61
|
+
self._file_handler = logging.FileHandler(self._log_file_path)
|
62
|
+
|
63
|
+
logging.getLogger('info_logger').addHandler(self._file_handler)
|
64
|
+
logging.getLogger('exception_logger').addHandler(self._file_handler)
|
65
|
+
|
66
|
+
# TODO https://jira.bars.group/browse/EDUSCHL-22492. Вынужденная мера, т.к. при запуске команды не производится
|
67
|
+
# проверка готовности конфигов приложений. Нужно переработать механизм конфигурирования клиента загрузчика.
|
68
|
+
def _configure_agent_client(self):
|
69
|
+
"""Конфигурирование клиента загрузчика данных в Витрину."""
|
70
|
+
import uploader_client
|
71
|
+
from django.core.cache import (
|
72
|
+
DEFAULT_CACHE_ALIAS,
|
73
|
+
caches,
|
74
|
+
)
|
75
|
+
from uploader_client.contrib.rdm.interfaces.configurations import (
|
76
|
+
RegionalDataMartEmulationUploaderConfig,
|
77
|
+
RegionalDataMartUploaderConfig,
|
78
|
+
)
|
79
|
+
|
80
|
+
if settings.RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION:
|
81
|
+
uploader_client.set_config(
|
82
|
+
RegionalDataMartEmulationUploaderConfig(
|
83
|
+
interface='uploader_client.contrib.rdm.interfaces.rest.OpenAPIInterfaceEmulation',
|
84
|
+
url=settings.RDM_UPLOADER_CLIENT_URL,
|
85
|
+
datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
|
86
|
+
timeout=1,
|
87
|
+
request_retries=1,
|
88
|
+
file_status=settings.RDM_RESPONSE_FILE_STATUS,
|
89
|
+
)
|
90
|
+
)
|
91
|
+
elif settings.RDM_UPLOADER_CLIENT_USE_PROXY_API:
|
92
|
+
uploader_client.set_config(
|
93
|
+
RegionalDataMartUploaderConfig(
|
94
|
+
interface='uploader_client.contrib.rdm.interfaces.rest.ProxyAPIInterface',
|
95
|
+
cache=caches[DEFAULT_CACHE_ALIAS],
|
96
|
+
url=settings.RDM_UPLOADER_CLIENT_URL,
|
97
|
+
datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
|
98
|
+
timeout=settings.RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT,
|
99
|
+
request_retries=settings.RDM_UPLOADER_CLIENT_REQUEST_RETRIES,
|
100
|
+
organization_ogrn=settings.RDM_UPLOADER_CLIENT_ORGANIZATION_OGRN,
|
101
|
+
installation_name=settings.RDM_UPLOADER_CLIENT_INSTALLATION_NAME,
|
102
|
+
installation_id=settings.RDM_UPLOADER_CLIENT_INSTALLATION_ID,
|
103
|
+
username=settings.RDM_UPLOADER_CLIENT_USERNAME,
|
104
|
+
password=settings.RDM_UPLOADER_CLIENT_PASSWORD,
|
105
|
+
)
|
106
|
+
)
|
107
|
+
else:
|
108
|
+
uploader_client.set_config(
|
109
|
+
RegionalDataMartUploaderConfig(
|
110
|
+
url=settings.RDM_UPLOADER_CLIENT_URL,
|
111
|
+
datamart_name=settings.RDM_UPLOADER_CLIENT_DATAMART_NAME,
|
112
|
+
timeout=settings.RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT,
|
113
|
+
request_retries=settings.RDM_UPLOADER_CLIENT_REQUEST_RETRIES,
|
114
|
+
)
|
115
|
+
)
|
116
|
+
|
117
|
+
def update_total_queue_size_in_cache(self, received_files_size: int):
|
118
|
+
"""Обновление размера файлов в кеш."""
|
119
|
+
with self.data_cache.lock(f'{TOTAL_ATTACHMENTS_SIZE_KEY}:lock', timeout=300):
|
120
|
+
queue_total_file_size = self.data_cache.get(TOTAL_ATTACHMENTS_SIZE_KEY) or 0
|
121
|
+
if queue_total_file_size:
|
122
|
+
queue_total_file_size -= received_files_size
|
123
|
+
if queue_total_file_size > 0:
|
124
|
+
self.data_cache.set(
|
125
|
+
TOTAL_ATTACHMENTS_SIZE_KEY,
|
126
|
+
queue_total_file_size,
|
127
|
+
timeout=settings.RDM_REDIS_CACHE_TIMEOUT_SECONDS,
|
128
|
+
)
|
129
|
+
|
130
|
+
def upload_data(self, *args, **kwargs):
|
131
|
+
"""Запускает отправку данных в витрину."""
|
132
|
+
try:
|
133
|
+
exporter = ExportQueueSender(self.data_cache, self.queue, settings.RDM_UPLOAD_DATA_TASK_EXPORT_STAGES)
|
134
|
+
exporter.run()
|
135
|
+
|
136
|
+
self.result['queue_is_full'] = exporter.queue_is_full
|
137
|
+
self.result['total_file_size'] = exporter.queue_total_file_size
|
138
|
+
|
139
|
+
# Если очередь не переполнена - то отправляем данные в витрину
|
140
|
+
if not exporter.queue_is_full:
|
141
|
+
sender = WorkerSender(self.queue)
|
142
|
+
sender.run()
|
143
|
+
|
144
|
+
if sender.entities:
|
145
|
+
self.result['uploaded_entities'] = ','.join(sender.entities)
|
146
|
+
|
147
|
+
if sender.received_file_size:
|
148
|
+
self.update_total_queue_size_in_cache(sender.received_file_size)
|
149
|
+
|
150
|
+
except Exception as err:
|
151
|
+
logger.exception(err)
|
152
|
+
raise err
|
153
|
+
finally:
|
154
|
+
self._remove_file_handler()
|
155
|
+
|
156
|
+
return self.result
|
@@ -15,20 +15,21 @@ from redis import (
|
|
15
15
|
Redis,
|
16
16
|
)
|
17
17
|
|
18
|
-
from edu_rdm_integration.
|
18
|
+
from edu_rdm_integration.core.helpers import (
|
19
|
+
as_text,
|
20
|
+
get_redis_version,
|
21
|
+
)
|
22
|
+
from edu_rdm_integration.stages.export_data.consts import (
|
19
23
|
REDIS_QUEUE_KEY_DELIMITER,
|
20
24
|
)
|
21
|
-
from edu_rdm_integration.
|
25
|
+
from edu_rdm_integration.stages.upload_data.dataclasses import (
|
22
26
|
UploadFile,
|
23
27
|
)
|
24
|
-
from edu_rdm_integration.redis_cache import (
|
25
|
-
as_text,
|
26
|
-
get_redis_version,
|
27
|
-
)
|
28
28
|
|
29
29
|
|
30
30
|
class Queue(ABC):
|
31
31
|
"""Интерфейс очереди."""
|
32
|
+
|
32
33
|
queue_key: str = ''
|
33
34
|
|
34
35
|
@property
|
@@ -65,6 +66,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
|
|
65
66
|
(Sorted Set in Redis)
|
66
67
|
- Информация по файлам стандартно по ключу - ключом выступает sub_stage_id
|
67
68
|
"""
|
69
|
+
|
68
70
|
queue_key = 'rdm:export_sub_stage_ids_queue'
|
69
71
|
prefix = 'rdm:'
|
70
72
|
|
@@ -76,7 +78,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
|
|
76
78
|
host=settings.RDM_REDIS_HOST,
|
77
79
|
port=settings.RDM_REDIS_PORT,
|
78
80
|
db=settings.RDM_REDIS_DB,
|
79
|
-
password=settings.RDM_REDIS_PASSWORD
|
81
|
+
password=settings.RDM_REDIS_PASSWORD,
|
80
82
|
)
|
81
83
|
|
82
84
|
def _make_key(self, key: Union[int, str]) -> str:
|
@@ -143,7 +145,7 @@ class RdmRedisSubStageAttachmentQueue(Queue):
|
|
143
145
|
while true do
|
144
146
|
local stage = redis.call("zpopmin", q)
|
145
147
|
local stage_id = stage[2]
|
146
|
-
|
148
|
+
|
147
149
|
if stage_id == nil then
|
148
150
|
break
|
149
151
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
import celery
|
2
|
+
from celery.schedules import (
|
3
|
+
crontab,
|
4
|
+
)
|
5
|
+
from django.conf import (
|
6
|
+
settings,
|
7
|
+
)
|
8
|
+
from django.core.cache import (
|
9
|
+
cache,
|
10
|
+
)
|
11
|
+
|
12
|
+
from educommon.async_task.models import (
|
13
|
+
AsyncTaskType,
|
14
|
+
)
|
15
|
+
from educommon.async_task.tasks import (
|
16
|
+
UniquePeriodicAsyncTask,
|
17
|
+
)
|
18
|
+
|
19
|
+
from edu_rdm_integration.core.consts import (
|
20
|
+
TASK_QUEUE_NAME,
|
21
|
+
)
|
22
|
+
from edu_rdm_integration.stages.upload_data.enums import (
|
23
|
+
FileUploadStatusEnum,
|
24
|
+
)
|
25
|
+
from edu_rdm_integration.stages.upload_data.helpers import (
|
26
|
+
UploadStatusHelper,
|
27
|
+
)
|
28
|
+
from edu_rdm_integration.stages.upload_data.models import (
|
29
|
+
ExportingDataSubStageUploaderClientLog,
|
30
|
+
)
|
31
|
+
from edu_rdm_integration.stages.upload_data.operations import (
|
32
|
+
UploadData,
|
33
|
+
)
|
34
|
+
from edu_rdm_integration.stages.upload_data.queues import (
|
35
|
+
RdmRedisSubStageAttachmentQueue,
|
36
|
+
)
|
37
|
+
|
38
|
+
|
39
|
+
class RDMCheckUploadStatus(UniquePeriodicAsyncTask):
|
40
|
+
"""Периодическая задача для сбора статусов по загрузке файла в витрину."""
|
41
|
+
|
42
|
+
queue = TASK_QUEUE_NAME
|
43
|
+
routing_key = TASK_QUEUE_NAME
|
44
|
+
description = 'Сбор статусов загрузки данных в витрину "Региональная витрина данных"'
|
45
|
+
lock_expire_seconds = settings.RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS
|
46
|
+
task_type = AsyncTaskType.UNKNOWN
|
47
|
+
run_every = crontab(
|
48
|
+
minute=settings.RDM_UPLOAD_STATUS_TASK_MINUTE,
|
49
|
+
hour=settings.RDM_UPLOAD_STATUS_TASK_HOUR,
|
50
|
+
day_of_week=settings.RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK,
|
51
|
+
)
|
52
|
+
|
53
|
+
def process(self, *args, **kwargs):
|
54
|
+
"""Выполнение."""
|
55
|
+
super().process(*args, **kwargs)
|
56
|
+
|
57
|
+
# Получаем незавершенные загрузки данных в витрину
|
58
|
+
in_progress_uploads = ExportingDataSubStageUploaderClientLog.objects.filter(
|
59
|
+
file_upload_status=FileUploadStatusEnum.IN_PROGRESS,
|
60
|
+
is_emulation=False,
|
61
|
+
).select_related('attachment')
|
62
|
+
|
63
|
+
UploadStatusHelper(in_progress_uploads, cache).run()
|
64
|
+
|
65
|
+
|
66
|
+
class UploadDataAsyncTask(UniquePeriodicAsyncTask):
|
67
|
+
"""Формирование очереди файлов и их отправка."""
|
68
|
+
|
69
|
+
queue = TASK_QUEUE_NAME
|
70
|
+
routing_key = TASK_QUEUE_NAME
|
71
|
+
description = 'Отправка данных в витрину "Региональная витрина данных"'
|
72
|
+
lock_expire_seconds = settings.RDM_UPLOAD_DATA_TASK_LOCK_EXPIRE_SECONDS
|
73
|
+
task_type = AsyncTaskType.SYSTEM
|
74
|
+
run_every = crontab(
|
75
|
+
minute=settings.RDM_UPLOAD_DATA_TASK_MINUTE,
|
76
|
+
hour=settings.RDM_UPLOAD_DATA_TASK_HOUR,
|
77
|
+
day_of_week=settings.RDM_UPLOAD_DATA_TASK_DAY_OF_WEEK,
|
78
|
+
)
|
79
|
+
|
80
|
+
def process(self, *args, **kwargs):
|
81
|
+
"""Выполнение."""
|
82
|
+
super().process(*args, **kwargs)
|
83
|
+
|
84
|
+
queue = RdmRedisSubStageAttachmentQueue()
|
85
|
+
upload_data = UploadData(
|
86
|
+
data_cache=cache,
|
87
|
+
queue=queue,
|
88
|
+
)
|
89
|
+
|
90
|
+
upload_result = upload_data.upload_data()
|
91
|
+
|
92
|
+
task_result = {
|
93
|
+
'Общий объем отправленных файлов': f'{upload_result["total_file_size"]}',
|
94
|
+
'Очередь отправки переполнена': 'Да' if upload_result['queue_is_full'] else 'Нет',
|
95
|
+
'Сущности, отправленные в витрину': upload_result['uploaded_entities'],
|
96
|
+
}
|
97
|
+
|
98
|
+
self.set_progress(values=task_result)
|
99
|
+
|
100
|
+
|
101
|
+
celery_app = celery.app.app_or_default()
|
102
|
+
celery_app.register_task(RDMCheckUploadStatus)
|
103
|
+
celery_app.register_task(UploadDataAsyncTask)
|
File without changes
|