edu-rdm-integration 3.9.1__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} +30 -192
- 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.1.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.1.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.1.dist-info → edu_rdm_integration-3.10.0.dist-info}/WHEEL +0 -0
- {edu_rdm_integration-3.9.1.dist-info → edu_rdm_integration-3.10.0.dist-info}/licenses/LICENSE +0 -0
- {edu_rdm_integration-3.9.1.dist-info → edu_rdm_integration-3.10.0.dist-info}/top_level.txt +0 -0
@@ -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
|
@@ -14,10 +14,6 @@ from typing import (
|
|
14
14
|
from django.conf import (
|
15
15
|
settings,
|
16
16
|
)
|
17
|
-
from edu_rdm_integration.uploader_log.enums import (
|
18
|
-
RequestResultStatus,
|
19
|
-
)
|
20
|
-
|
21
17
|
from django.db.models import (
|
22
18
|
Q,
|
23
19
|
)
|
@@ -27,6 +23,9 @@ from m3_ext.ui.icons import (
|
|
27
23
|
from objectpack.actions import (
|
28
24
|
ObjectPack,
|
29
25
|
)
|
26
|
+
from objectpack.filters import (
|
27
|
+
CustomFilter,
|
28
|
+
)
|
30
29
|
|
31
30
|
from educommon.objectpack.actions import (
|
32
31
|
ExtObjectRowsAction,
|
@@ -44,21 +43,19 @@ from educommon.utils.ui import (
|
|
44
43
|
append_template_globals,
|
45
44
|
)
|
46
45
|
|
47
|
-
from edu_rdm_integration.
|
46
|
+
from edu_rdm_integration.stages.upload_data.uploader_log.enums import (
|
47
|
+
RequestResultStatus,
|
48
|
+
)
|
49
|
+
from edu_rdm_integration.stages.upload_data.uploader_log.models import (
|
48
50
|
UploaderClientLog,
|
49
51
|
)
|
50
|
-
from edu_rdm_integration.uploader_log.ui import (
|
52
|
+
from edu_rdm_integration.stages.upload_data.uploader_log.ui import (
|
51
53
|
UploaderLogInfoWindow,
|
52
54
|
)
|
53
|
-
from objectpack.filters import (
|
54
|
-
CustomFilter,
|
55
|
-
)
|
56
55
|
|
57
56
|
|
58
57
|
class UploaderLogPack(ObjectPack):
|
59
|
-
"""
|
60
|
-
Пак журнала Загрузчика данных в витрину.
|
61
|
-
"""
|
58
|
+
"""Пак журнала Загрузчика данных в витрину."""
|
62
59
|
|
63
60
|
title = 'Журнал логов РВД'
|
64
61
|
model = UploaderClientLog
|
@@ -104,13 +101,14 @@ class UploaderLogPack(ObjectPack):
|
|
104
101
|
tooltip='C',
|
105
102
|
default_value=date.today() - timedelta(days=1),
|
106
103
|
editable=False,
|
107
|
-
lookup=lambda v: Q(request_datetime__gte=datetime.combine(v, time.min))
|
108
|
-
)
|
104
|
+
lookup=lambda v: Q(request_datetime__gte=datetime.combine(v, time.min)),
|
105
|
+
)
|
106
|
+
& _fd(
|
109
107
|
'request_datetime',
|
110
108
|
tooltip='По',
|
111
109
|
default_value=date.today,
|
112
110
|
editable=False,
|
113
|
-
lookup=lambda v: Q(request_datetime__lte=datetime.combine(v, time.max))
|
111
|
+
lookup=lambda v: Q(request_datetime__lte=datetime.combine(v, time.max)),
|
114
112
|
),
|
115
113
|
'width': 11,
|
116
114
|
},
|
@@ -251,10 +249,10 @@ class UploaderLogPack(ObjectPack):
|
|
251
249
|
|
252
250
|
Args:
|
253
251
|
menu: Объект меню.
|
252
|
+
|
254
253
|
Returns:
|
255
254
|
Подменю "Администрирование -> Региональная витрина данных -> Журнал логов РВД".
|
256
255
|
"""
|
257
|
-
|
258
256
|
if settings.RDM_MENU_ITEM:
|
259
257
|
return menu.SubMenu(
|
260
258
|
'Администрирование',
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from django.apps import (
|
2
|
+
AppConfig,
|
3
|
+
)
|
4
|
+
|
5
|
+
|
6
|
+
class UploaderLoggerConfig(AppConfig): # noqa D101
|
7
|
+
"""Приложение для работы с логами выгрузки данных в РВД."""
|
8
|
+
|
9
|
+
name = 'edu_rdm_integration.stages.upload_data.uploader_log'
|
10
|
+
label = 'edu_rdm_integration_uploader_log'
|
11
|
+
verbose_name = 'Журнал логов РВД'
|
@@ -12,7 +12,7 @@ from django.db.models.functions import (
|
|
12
12
|
Cast,
|
13
13
|
)
|
14
14
|
|
15
|
-
from edu_rdm_integration.uploader_log.enums import (
|
15
|
+
from edu_rdm_integration.stages.upload_data.uploader_log.enums import (
|
16
16
|
RequestResultStatus,
|
17
17
|
)
|
18
18
|
|
@@ -26,9 +26,8 @@ class UploaderClientLogManager(Manager):
|
|
26
26
|
|
27
27
|
result_status = Case(
|
28
28
|
When(
|
29
|
-
Q(Q(error__isnull=True) | Q(error__exact=''))
|
30
|
-
|
31
|
-
then=Value(RequestResultStatus.SUCCESS)
|
29
|
+
Q(Q(error__isnull=True) | Q(error__exact='')) & Q(Q(response__isnull=False) & ~Q(response__exact='')),
|
30
|
+
then=Value(RequestResultStatus.SUCCESS),
|
32
31
|
),
|
33
32
|
default=Value(RequestResultStatus.ERROR),
|
34
33
|
output_field=PositiveSmallIntegerField(),
|
@@ -37,30 +36,21 @@ class UploaderClientLogManager(Manager):
|
|
37
36
|
query = query.annotate(
|
38
37
|
request_datetime=F('date_time'),
|
39
38
|
attachment_file=Case(
|
40
|
-
When(
|
41
|
-
request__icontains='POST',
|
42
|
-
then=F('uploader_client_log__attachment__attachment')
|
43
|
-
),
|
39
|
+
When(request__icontains='POST', then=F('uploader_client_log__attachment__attachment')),
|
44
40
|
When(
|
45
41
|
request__icontains='GET',
|
46
42
|
then=F('upload_status_request_log__upload__attachment__attachment'),
|
47
43
|
),
|
48
44
|
default=Value(''),
|
49
|
-
output_field
|
45
|
+
output_field=CharField(),
|
50
46
|
),
|
51
47
|
status_code=Case(
|
52
|
-
When(
|
53
|
-
request__icontains='POST',
|
54
|
-
then=Value('', output_field=CharField())
|
55
|
-
),
|
48
|
+
When(request__icontains='POST', then=Value('', output_field=CharField())),
|
56
49
|
When(
|
57
50
|
request__icontains='GET',
|
58
|
-
then=Cast(
|
59
|
-
'upload_status_request_log__request_status__value',
|
60
|
-
output_field=CharField()
|
61
|
-
),
|
51
|
+
then=Cast('upload_status_request_log__request_status__value', output_field=CharField()),
|
62
52
|
),
|
63
|
-
default=Value('')
|
53
|
+
default=Value(''),
|
64
54
|
),
|
65
55
|
status_description=Case(
|
66
56
|
When(
|
@@ -71,7 +61,8 @@ class UploaderClientLogManager(Manager):
|
|
71
61
|
request__icontains='GET',
|
72
62
|
then=F('upload_status_request_log__request_status__title'),
|
73
63
|
),
|
74
|
-
default=Value(''),
|
64
|
+
default=Value(''),
|
65
|
+
output_field=CharField(),
|
75
66
|
),
|
76
67
|
is_emulation=Case(
|
77
68
|
When(
|
@@ -82,20 +73,14 @@ class UploaderClientLogManager(Manager):
|
|
82
73
|
request__icontains='GET',
|
83
74
|
then=F('upload_status_request_log__upload__is_emulation'),
|
84
75
|
),
|
85
|
-
default=Value(False)
|
76
|
+
default=Value(False),
|
86
77
|
),
|
87
78
|
request_id=Case(
|
88
|
-
When(
|
89
|
-
|
90
|
-
|
91
|
-
),
|
92
|
-
When(
|
93
|
-
request__icontains='GET',
|
94
|
-
then=F('upload_status_request_log__upload__request_id')
|
95
|
-
),
|
96
|
-
default=Value('')
|
79
|
+
When(request__icontains='POST', then=F('uploader_client_log__request_id')),
|
80
|
+
When(request__icontains='GET', then=F('upload_status_request_log__upload__request_id')),
|
81
|
+
default=Value(''),
|
97
82
|
),
|
98
|
-
result_status=result_status
|
83
|
+
result_status=result_status,
|
99
84
|
)
|
100
85
|
|
101
86
|
return query
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Generated by Django 3.2.24 on 2025-06-28 14:22
|
2
|
+
|
3
|
+
from django.db import (
|
4
|
+
migrations,
|
5
|
+
)
|
6
|
+
|
7
|
+
|
8
|
+
class Migration(migrations.Migration):
|
9
|
+
initial = True
|
10
|
+
|
11
|
+
dependencies = [
|
12
|
+
('uploader_client', '0001_initial'),
|
13
|
+
]
|
14
|
+
|
15
|
+
operations = [
|
16
|
+
migrations.SeparateDatabaseAndState(
|
17
|
+
state_operations=[
|
18
|
+
migrations.CreateModel(
|
19
|
+
name='UploaderClientLog',
|
20
|
+
fields=[],
|
21
|
+
options={
|
22
|
+
'proxy': True,
|
23
|
+
'indexes': [],
|
24
|
+
'constraints': [],
|
25
|
+
},
|
26
|
+
bases=('uploader_client.entry',),
|
27
|
+
),
|
28
|
+
],
|
29
|
+
database_operations=[],
|
30
|
+
),
|
31
|
+
]
|
File without changes
|
@@ -0,0 +1,86 @@
|
|
1
|
+
from functools import (
|
2
|
+
cached_property,
|
3
|
+
)
|
4
|
+
from io import (
|
5
|
+
StringIO,
|
6
|
+
)
|
7
|
+
from typing import (
|
8
|
+
Optional,
|
9
|
+
)
|
10
|
+
|
11
|
+
from django.db.models import (
|
12
|
+
Manager,
|
13
|
+
)
|
14
|
+
from uploader_client.models import (
|
15
|
+
Entry,
|
16
|
+
)
|
17
|
+
|
18
|
+
from edu_rdm_integration.stages.upload_data.uploader_log.enums import (
|
19
|
+
RequestResultStatus,
|
20
|
+
)
|
21
|
+
from edu_rdm_integration.stages.upload_data.uploader_log.managers import (
|
22
|
+
UploaderClientLogManager,
|
23
|
+
)
|
24
|
+
|
25
|
+
|
26
|
+
class UploaderClientLog(Entry):
|
27
|
+
"""Прокси модель Загрузчика данных в витрину."""
|
28
|
+
|
29
|
+
objects = UploaderClientLogManager()
|
30
|
+
base_objects = Manager()
|
31
|
+
|
32
|
+
@cached_property
|
33
|
+
def http_method_and_url(self) -> tuple[str, str]:
|
34
|
+
"""Возвращает http-метод и url из поля запроса Entry.request."""
|
35
|
+
request = StringIO(self.request)
|
36
|
+
request_first_line = request.readline()
|
37
|
+
request.close()
|
38
|
+
|
39
|
+
method, url = request_first_line.split(' ')[:2]
|
40
|
+
if not (method and url.startswith('http')):
|
41
|
+
method = url = ''
|
42
|
+
|
43
|
+
return method.strip('[]'), url
|
44
|
+
|
45
|
+
@cached_property
|
46
|
+
def http_response_status(self) -> Optional[str]:
|
47
|
+
"""Статус-код запроса к витрине."""
|
48
|
+
try:
|
49
|
+
http_status = self.response.split(' ')[0].strip('[]')
|
50
|
+
|
51
|
+
if not http_status:
|
52
|
+
return None
|
53
|
+
|
54
|
+
if 200 <= int(http_status) < 300:
|
55
|
+
http_status = 'Успех'
|
56
|
+
elif int(http_status) >= 400:
|
57
|
+
http_status = 'Ошибка'
|
58
|
+
except (IndexError, AttributeError):
|
59
|
+
http_status = None
|
60
|
+
|
61
|
+
return http_status
|
62
|
+
|
63
|
+
@property
|
64
|
+
def http_method(self) -> str:
|
65
|
+
"""Значение http-метода."""
|
66
|
+
return self.http_method_and_url[0]
|
67
|
+
|
68
|
+
@property
|
69
|
+
def request_url(self) -> str:
|
70
|
+
"""URL запроса."""
|
71
|
+
return self.http_method_and_url[1]
|
72
|
+
|
73
|
+
@property
|
74
|
+
def request_error(self) -> Optional[str]:
|
75
|
+
"""Ошибка запроса."""
|
76
|
+
return self.error
|
77
|
+
|
78
|
+
@property
|
79
|
+
def result_status_display(self) -> str:
|
80
|
+
"""Результат запроса."""
|
81
|
+
result_status = getattr(self, 'result_status', RequestResultStatus.ERROR)
|
82
|
+
|
83
|
+
return RequestResultStatus.values.get(result_status) or RequestResultStatus.values[RequestResultStatus.ERROR]
|
84
|
+
|
85
|
+
class Meta:
|
86
|
+
proxy = True
|
@@ -45,12 +45,14 @@ class UploaderLogInfoWindow(BaseEditWindow):
|
|
45
45
|
"""Размещение компонентов окна на форме."""
|
46
46
|
super(UploaderLogInfoWindow, self)._do_layout()
|
47
47
|
|
48
|
-
self.form.items.extend(
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
48
|
+
self.form.items.extend(
|
49
|
+
(
|
50
|
+
self.field__request,
|
51
|
+
self.field__response,
|
52
|
+
self.field__error,
|
53
|
+
self.field__attachment,
|
54
|
+
)
|
55
|
+
)
|
54
56
|
|
55
57
|
def set_params(self, params):
|
56
58
|
"""Настройка окна."""
|