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
@@ -1,10 +1,10 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: edu-rdm-integration
|
3
|
-
Version: 3.
|
3
|
+
Version: 3.10.0
|
4
4
|
Summary: Интеграция с Региональной витриной данных
|
5
5
|
Author-email: BARS Group <education_dev@bars.group>
|
6
|
-
Project-URL: Homepage, https://stash.bars-open.ru/projects/EDUBASE/repos/
|
7
|
-
Project-URL: Repository, https://stash.bars-open.ru/scm/edubase/
|
6
|
+
Project-URL: Homepage, https://stash.bars-open.ru/projects/EDUBASE/repos/edu-rdm-integration/browse
|
7
|
+
Project-URL: Repository, https://stash.bars-open.ru/scm/edubase/edu-rdm-integration.git
|
8
8
|
Classifier: Development Status :: 5 - Production/Stable
|
9
9
|
Classifier: Programming Language :: Python :: 3
|
10
10
|
Classifier: Programming Language :: Python :: 3.9
|
@@ -31,7 +31,7 @@ Requires-Dist: m3-django-compat<2,>=1.10.2
|
|
31
31
|
Requires-Dist: uploader-client<1,>=0.2.3
|
32
32
|
Provides-Extra: dev
|
33
33
|
Requires-Dist: isort==5.12.0; extra == "dev"
|
34
|
-
Requires-Dist: ruff==0.
|
34
|
+
Requires-Dist: ruff==0.12.0; extra == "dev"
|
35
35
|
Requires-Dist: flake8<7,>=4.0.1; extra == "dev"
|
36
36
|
Requires-Dist: pytest<8,>=3.2.5; extra == "dev"
|
37
37
|
Requires-Dist: pytest-cov<5; extra == "dev"
|
@@ -47,7 +47,8 @@ Dynamic: license-file
|
|
47
47
|
Для интеграции с Региональной витриной данных был выделен отдельный пакет для использования его компонентов в различных
|
48
48
|
продуктах.
|
49
49
|
|
50
|
-
На текущий момент интеграция реализуется в рамках проектов Электронная школа (ЭШ) и
|
50
|
+
На текущий момент интеграция реализуется в рамках проектов Электронный детский сад (ЭДС), Электронная школа (ЭШ) и
|
51
|
+
Электронный колледж (ЭК).
|
51
52
|
|
52
53
|
## Описание концепции
|
53
54
|
|
@@ -60,7 +61,7 @@ Dynamic: license-file
|
|
60
61
|
|
61
62
|
## Принцип работы
|
62
63
|
|
63
|
-
Весь процесс разделен на
|
64
|
+
Весь процесс разделен на сбор, выгрузку данных в файлы, отправку файлов. Выделяются следующие понятия:
|
64
65
|
|
65
66
|
Модель продукта
|
66
67
|
: Django-модель находящаяся в самом продукте. При помощи нее производится накапливание пользовательских данных;
|
@@ -111,6 +112,25 @@ Dynamic: license-file
|
|
111
112
|
- В проект внедрен m3-db-utils;
|
112
113
|
- В проект внедрен uploader-client.
|
113
114
|
|
115
|
+
## Подключение в settings.py
|
116
|
+
|
117
|
+
INSTALLED_APPS = (
|
118
|
+
...
|
119
|
+
'edu_rdm_integration',
|
120
|
+
'edu_rdm_integration.core.registry',
|
121
|
+
'edu_rdm_integration.rdm_entities',
|
122
|
+
'edu_rdm_integration.rdm_models',
|
123
|
+
'edu_rdm_integration.pipelines.transfer',
|
124
|
+
'edu_rdm_integration.stages.collect_data',
|
125
|
+
'edu_rdm_integration.stages.export_data',
|
126
|
+
'edu_rdm_integration.stages.service',
|
127
|
+
'edu_rdm_integration.stages.upload_data',
|
128
|
+
'edu_rdm_integration.stages.upload_data.uploader_log',
|
129
|
+
'edu_rdm_integration.stages.collect_data.registry',
|
130
|
+
'edu_rdm_integration.stages.export_data.registry',
|
131
|
+
...
|
132
|
+
)
|
133
|
+
|
114
134
|
## Параметры конфигурационного файла
|
115
135
|
|
116
136
|
В разных проектах существуют различные способы добавления настроек, где-то через плагины, где-то напрямую в settings.py.
|
@@ -125,64 +145,12 @@ Dynamic: license-file
|
|
125
145
|
('rdm_general', 'EXPORT_ENTITY_ID_PREFIX'): '', # Дефолтное значение нужно изменить на специфическое системе
|
126
146
|
('rdm_general', 'COLLECT_CHUNK_SIZE'): 500,
|
127
147
|
('rdm_general', 'EXPORT_CHUNK_SIZE'): 500,
|
148
|
+
('rdm_general', 'UPLOAD_QUEUE_MAX_SIZE'): 500_000_000,
|
149
|
+
('rdm_general', 'RDM_MENU_ITEM'): False,
|
128
150
|
('rdm_transfer_task', 'MINUTE'): '0',
|
129
151
|
('rdm_transfer_task', 'HOUR'): '*/4',
|
130
152
|
('rdm_transfer_task', 'DAY_OF_WEEK'): '*',
|
131
153
|
('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS'): 21600,
|
132
|
-
('rdm_transfer_task', 'TIMEDELTA'): 3600,
|
133
|
-
('rdm_transfer_task', 'ENTITIES'): '',
|
134
|
-
('rdm_upload_status_task', 'MINUTE'): '*/30',
|
135
|
-
('rdm_upload_status_task', 'HOUR'): '*',
|
136
|
-
('rdm_upload_status_task', 'DAY_OF_WEEK'): '*',
|
137
|
-
('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS'): 7200,
|
138
|
-
('uploader_client', 'URL'): 'http://localhost:8090',
|
139
|
-
('uploader_client', 'DATAMART_NAME'): '',
|
140
|
-
('uploader_client', 'REQUEST_RETRIES'): 10,
|
141
|
-
('uploader_client', 'REQUEST_TIMEOUT'): 10,
|
142
|
-
('uploader_client', 'ENABLE_REQUEST_EMULATION'): False,
|
143
|
-
})
|
144
|
-
```
|
145
|
-
Дополнительные настройки с версии 3.4.2
|
146
|
-
```
|
147
|
-
PROJECT_DEFAULT_CONFIG.update({
|
148
|
-
# Настройки РВД
|
149
|
-
('rdm_general', 'EXPORT_ENTITY_ID_PREFIX'): '', # Дефолтное значение нужно изменить на специфическое системе
|
150
|
-
('rdm_general', 'COLLECT_CHUNK_SIZE'): 500,
|
151
|
-
('rdm_general', 'EXPORT_CHUNK_SIZE'): 500,
|
152
|
-
('rdm_transfer_task', 'MINUTE'): '0',
|
153
|
-
('rdm_transfer_task', 'HOUR'): '*/4',
|
154
|
-
('rdm_transfer_task', 'DAY_OF_WEEK'): '*',
|
155
|
-
('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS'): 21600,
|
156
|
-
('rdm_transfer_task', 'TIMEDELTA'): 3600,
|
157
|
-
('rdm_transfer_task', 'ENTITIES'): '',
|
158
|
-
('rdm_upload_status_task', 'MINUTE'): '*/30',
|
159
|
-
('rdm_upload_status_task', 'HOUR'): '*',
|
160
|
-
('rdm_upload_status_task', 'DAY_OF_WEEK'): '*',
|
161
|
-
('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS'): 7200,
|
162
|
-
('rdm_upload_data_task', 'MINUTE'): '0',
|
163
|
-
('rdm_upload_data_task', 'HOUR'): '*/2',
|
164
|
-
('rdm_upload_data_task', 'DAY_OF_WEEK'): '*',
|
165
|
-
('rdm_upload_data_task', 'LOCK_EXPIRE_SECONDS'): 7200,
|
166
|
-
('uploader_client', 'URL'): 'http://localhost:8090',
|
167
|
-
('uploader_client', 'DATAMART_NAME'): '',
|
168
|
-
('uploader_client', 'REQUEST_RETRIES'): 10,
|
169
|
-
('uploader_client', 'REQUEST_TIMEOUT'): 10,
|
170
|
-
('uploader_client', 'ENABLE_REQUEST_EMULATION'): False,
|
171
|
-
})
|
172
|
-
```
|
173
|
-
С версии пакета 3.6 добавляются новые настройки для двух периодических задач разных очередей сбора и выгрузки данных
|
174
|
-
```
|
175
|
-
PROJECT_DEFAULT_CONFIG.update({
|
176
|
-
# Настройки РВД
|
177
|
-
('rdm_general', 'EXPORT_ENTITY_ID_PREFIX'): '', # Дефолтное значение нужно изменить на специфическое системе
|
178
|
-
('rdm_general', 'COLLECT_CHUNK_SIZE'): 500,
|
179
|
-
('rdm_general', 'EXPORT_CHUNK_SIZE'): 500,
|
180
|
-
('rdm_transfer_task', 'MINUTE'): '0',
|
181
|
-
('rdm_transfer_task', 'HOUR'): '*/4',
|
182
|
-
('rdm_transfer_task', 'DAY_OF_WEEK'): '*',
|
183
|
-
('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS'): 21600,
|
184
|
-
('rdm_transfer_task', 'TIMEDELTA'): 3600,
|
185
|
-
('rdm_transfer_task', 'ENTITIES'): '',
|
186
154
|
('rdm_transfer_task_fast', 'MINUTE'): '*/5',
|
187
155
|
('rdm_transfer_task_fast', 'HOUR'): '*',
|
188
156
|
('rdm_transfer_task_fast', 'DAY_OF_WEEK'): '*',
|
@@ -191,21 +159,39 @@ Dynamic: license-file
|
|
191
159
|
('rdm_transfer_task_long', 'HOUR'): '*/6',
|
192
160
|
('rdm_transfer_task_long', 'DAY_OF_WEEK'): '*',
|
193
161
|
('rdm_transfer_task_long', 'LOCK_EXPIRE_SECONDS'): 28800,
|
194
|
-
('rdm_upload_status_task', 'MINUTE'): '*/30',
|
195
|
-
('rdm_upload_status_task', 'HOUR'): '*',
|
196
|
-
('rdm_upload_status_task', 'DAY_OF_WEEK'): '*',
|
197
|
-
('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS'): 7200,
|
198
162
|
('rdm_upload_data_task', 'MINUTE'): '0',
|
199
163
|
('rdm_upload_data_task', 'HOUR'): '*/2',
|
200
164
|
('rdm_upload_data_task', 'DAY_OF_WEEK'): '*',
|
201
165
|
('rdm_upload_data_task', 'LOCK_EXPIRE_SECONDS'): 7200,
|
166
|
+
('rdm_upload_data_task', 'EXPORT_STAGES'): 500,
|
167
|
+
('rdm_upload_status_task', 'MINUTE'): '*/30',
|
168
|
+
('rdm_upload_status_task', 'HOUR'): '*',
|
169
|
+
('rdm_upload_status_task', 'DAY_OF_WEEK'): '*',
|
170
|
+
('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS'): 7200,
|
171
|
+
('rdm_check_suspend_task', 'MINUTE'): '*/10',
|
172
|
+
('rdm_check_suspend_task', 'HOUR'): '*',
|
173
|
+
('rdm_check_suspend_task', 'DAY_OF_WEEK'): '*',
|
174
|
+
('rdm_check_suspend_task', 'LOCK_EXPIRE_SECONDS'): 7200,
|
175
|
+
('rdm_check_suspend_task', 'STAGE_TIMEOUT'): 120,
|
176
|
+
# Настройки очереди отправки
|
177
|
+
('rdm_redis', 'REDIS_HOST'): 'localhost',
|
178
|
+
('rdm_redis', 'REDIS_PORT'): 6379,
|
179
|
+
('rdm_redis', 'REDIS_DB'): 1,
|
180
|
+
('rdm_redis', 'REDIS_PASSWORD'): '',
|
181
|
+
('rdm_redis', 'REDIS_CACHE_TIMEOUT_SECONDS'): 7200,
|
202
182
|
('uploader_client', 'URL'): 'http://localhost:8090',
|
203
183
|
('uploader_client', 'DATAMART_NAME'): '',
|
204
184
|
('uploader_client', 'REQUEST_RETRIES'): 10,
|
205
185
|
('uploader_client', 'REQUEST_TIMEOUT'): 10,
|
206
186
|
('uploader_client', 'ENABLE_REQUEST_EMULATION'): False,
|
207
|
-
|
208
|
-
|
187
|
+
('uploader_client', 'RESPONSE_FILE_STATUS'): 'success',
|
188
|
+
('uploader_client', 'USE_PROXY_API'): False,
|
189
|
+
('uploader_client', 'USERNAME'): '',
|
190
|
+
('uploader_client', 'PASSWORD'): '',
|
191
|
+
('uploader_client', 'ORGANIZATION_OGRN'): '',
|
192
|
+
('uploader_client', 'INSTALLATION_NAME'): '',
|
193
|
+
('uploader_client', 'INSTALLATION_ID'): '',
|
194
|
+
})
|
209
195
|
```
|
210
196
|
- Получение значений настроек из конфигурационного файла в settings.py:
|
211
197
|
|
@@ -228,72 +214,19 @@ Dynamic: license-file
|
|
228
214
|
|
229
215
|
# Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified
|
230
216
|
RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE = conf.get_int('rdm_general', 'UPDATE_NON_EXPORTED_CHUNK_SIZE')
|
217
|
+
|
218
|
+
# Объем очереди файлов в витрину (в байтах) - по умолчанию 512 Мбайт
|
219
|
+
RDM_UPLOAD_QUEUE_MAX_SIZE = conf.get_int('rdm_general', 'UPLOAD_QUEUE_MAX_SIZE')
|
220
|
+
|
221
|
+
# Пункт меню "Региональная витрина данных" - Спрятать (False) / Отображать (True)
|
222
|
+
RDM_MENU_ITEM = conf.get_bool('rdm_general', 'RDM_MENU_ITEM')
|
231
223
|
|
232
224
|
# Настройка запуска периодической задачи выгрузки данных:
|
233
225
|
RDM_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task', 'MINUTE')
|
234
226
|
RDM_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task', 'HOUR')
|
235
227
|
RDM_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task', 'DAY_OF_WEEK')
|
236
|
-
|
237
|
-
|
238
|
-
# Настройка запуска периодической задачи статуса загрузки данных в витрину:
|
239
|
-
RDM_UPLOAD_STATUS_TASK_MINUTE = conf.get('rdm_upload_status_task', 'MINUTE')
|
240
|
-
RDM_UPLOAD_STATUS_TASK_HOUR = conf.get('rdm_upload_status_task', 'HOUR')
|
241
|
-
RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK = conf.get('rdm_upload_status_task', 'DAY_OF_WEEK')
|
242
|
-
RDM_UPLOAD_STATUS_TASK_EXPIRE_SECOND = conf.get('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS')
|
243
|
-
|
244
|
-
# Настройка запуска периодической задачи поиска зависших этапов экспорта:
|
245
|
-
RDM_CHECK_SUSPEND_TASK_MINUTE = conf.get('rdm_check_suspend_task', 'MINUTE')
|
246
|
-
RDM_CHECK_SUSPEND_TASK_HOUR = conf.get('rdm_check_suspend_task', 'HOUR')
|
247
|
-
RDM_CHECK_SUSPEND_TASK_DAY_OF_WEEK = conf.get('rdm_check_suspend_task', 'DAY_OF_WEEK')
|
248
|
-
RDM_CHECK_SUSPEND_TASK_EXPIRE_SECOND = conf.get('rdm_check_suspend_task', 'LOCK_EXPIRE_SECONDS')
|
249
|
-
RDM_CHECK_SUSPEND_TASK_TIMEDELTA = conf.get_int('rdm_check_suspend_task', 'TIMEDELTA')
|
228
|
+
RDM_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = conf.get('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS')
|
250
229
|
|
251
|
-
# Загрузка данных в Региональную витрину данных (РВД)
|
252
|
-
# Адрес витрины (schema://host:port)
|
253
|
-
RDM_UPLOADER_CLIENT_URL = conf.get('uploader_client', 'URL')
|
254
|
-
|
255
|
-
# Мнемоника Витрины
|
256
|
-
RDM_UPLOADER_CLIENT_DATAMART_NAME = conf.get('uploader_client', 'DATAMART_NAME')
|
257
|
-
|
258
|
-
# Количество повторных попыток запроса
|
259
|
-
RDM_UPLOADER_CLIENT_REQUEST_RETRIES = conf.get_int('uploader_client', 'REQUEST_RETRIES')
|
260
|
-
|
261
|
-
# Таймаут запроса, сек
|
262
|
-
RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT = conf.get_int('uploader_client', 'REQUEST_TIMEOUT')
|
263
|
-
|
264
|
-
# Включить эмуляцию отправки запросов
|
265
|
-
RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION = conf.get_bool('uploader_client', 'ENABLE_REQUEST_EMULATION')
|
266
|
-
|
267
|
-
```
|
268
|
-
Дополнительные настройки с версии 3.3.0
|
269
|
-
```
|
270
|
-
# Объем очереди файлов в витрину (в байтах) - по умолчанию 512 Мбайт.
|
271
|
-
RDM_UPLOAD_QUEUE_MAX_SIZE = conf.get_int('rdm_general', 'UPLOAD_QUEUE_MAX_SIZE') or 500_000_000
|
272
|
-
|
273
|
-
# Настройка очереди Redis для формирования файлов РВД.
|
274
|
-
RDM_REDIS_HOST = conf.get('rdm_redis', 'REDIS_HOST')
|
275
|
-
RDM_REDIS_PORT = conf.get('rdm_redis', 'REDIS_PORT')
|
276
|
-
RDM_REDIS_DB = conf.get('rdm_redis', 'REDIS_DB')
|
277
|
-
RDM_REDIS_PASSWORD = conf.get('rdm_redis', 'REDIS_PASSWORD')
|
278
|
-
|
279
|
-
```
|
280
|
-
Дополнительные настройки с версии 3.3.1
|
281
|
-
```
|
282
|
-
# Таймаут для сохранения параметров в общем кеш.
|
283
|
-
RDM_REDIS_CACHE_TIMEOUT_SECONDS = conf.get_int('rdm_redis', 'REDIS_CACHE_TIMEOUT_SECONDS') or 60 * 60 * 2
|
284
|
-
|
285
|
-
```
|
286
|
-
Дополнительные настройки с версии 3.4.2
|
287
|
-
```
|
288
|
-
# Настройка запуска периодической задачи отправки файлов с данными РВД
|
289
|
-
RDM_UPLOAD_DATA_TASK_MINUTE = conf.get('rdm_upload_data_task', 'MINUTE')
|
290
|
-
RDM_UPLOAD_DATA_TASK_HOUR = conf.get('rdm_upload_data_task', 'HOUR')
|
291
|
-
RDM_UPLOAD_DATA_TASK_DAY_OF_WEEK = conf.get('rdm_upload_data_task', 'DAY_OF_WEEK')
|
292
|
-
RDM_UPLOAD_DATA_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_upload_data_task', 'LOCK_EXPIRE_SECONDS') or 60 * 60 * 2
|
293
|
-
|
294
|
-
```
|
295
|
-
С версии пакета 3.6 добавляются настройки для двух новых периодических задач
|
296
|
-
```
|
297
230
|
# Настройка запуска периодической задачи выгрузки данных - быстрая очередь:
|
298
231
|
RDM_FAST_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task_fast', 'MINUTE')
|
299
232
|
RDM_FAST_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task_fast', 'HOUR')
|
@@ -305,68 +238,130 @@ Dynamic: license-file
|
|
305
238
|
RDM_LONG_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task_long', 'HOUR')
|
306
239
|
RDM_LONG_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task_long', 'DAY_OF_WEEK')
|
307
240
|
RDM_LONG_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_transfer_task_long', 'LOCK_EXPIRE_SECONDS')
|
241
|
+
|
242
|
+
# Настройка запуска периодической задачи поиска зависших этапов экспорта:
|
243
|
+
RDM_CHECK_SUSPEND_TASK_MINUTE = conf.get('rdm_check_suspend_task', 'MINUTE')
|
244
|
+
RDM_CHECK_SUSPEND_TASK_HOUR = conf.get('rdm_check_suspend_task', 'HOUR')
|
245
|
+
RDM_CHECK_SUSPEND_TASK_DAY_OF_WEEK = conf.get('rdm_check_suspend_task', 'DAY_OF_WEEK')
|
246
|
+
RDM_CHECK_SUSPEND_TASK_LOCK_EXPIRE_SECONDS = conf.get('rdm_check_suspend_task', 'LOCK_EXPIRE_SECONDS')
|
247
|
+
RDM_CHECK_SUSPEND_TASK_STAGE_TIMEOUT = conf.get_int('rdm_check_suspend_task', 'STAGE_TIMEOUT')
|
248
|
+
|
249
|
+
# Настройка запуска периодической задачи отправки файлов с данными РВД
|
250
|
+
RDM_UPLOAD_DATA_TASK_MINUTE = conf.get('rdm_upload_data_task', 'MINUTE')
|
251
|
+
RDM_UPLOAD_DATA_TASK_HOUR = conf.get('rdm_upload_data_task', 'HOUR')
|
252
|
+
RDM_UPLOAD_DATA_TASK_DAY_OF_WEEK = conf.get('rdm_upload_data_task', 'DAY_OF_WEEK')
|
253
|
+
RDM_UPLOAD_DATA_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_upload_data_task', 'LOCK_EXPIRE_SECONDS')
|
254
|
+
# Количество подэтапов для обработки в периодической задаче отправки данных
|
255
|
+
RDM_UPLOAD_DATA_TASK_EXPORT_STAGES = conf.get_int('rdm_upload_data_task', 'EXPORT_STAGES')
|
308
256
|
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
| UPLOADS | Основная директория в MEDIA, в которой будет создана директория edu_rdm_integration для сохранения файлов для дальнейшей выгрузки | 500 |
|
315
|
-
| RDM_COLLECT_CHUNK_SIZE | Количество записей моделей обрабатываемых за одну итерацию сбора данных | 500 |
|
316
|
-
| RDM_EXPORT_CHUNK_SIZE | Количество записей моделей обрабатываемых за одну итерацию экспорта | 500 |
|
317
|
-
| RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE | # Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified | 5000 |
|
318
|
-
| RDM_UPLOADER_CLIENT_URL | Адрес витрины (schema://host:port) | 'http://localhost:8090' |
|
319
|
-
| RDM_UPLOADER_CLIENT_DATAMART_NAME | Мнемоника Витрины | 'test' |
|
320
|
-
| RDM_UPLOADER_CLIENT_REQUEST_RETRIES | Количество повторных попыток запроса | 10 |
|
321
|
-
| RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT | Таймаут запроса, сек | 10 |
|
322
|
-
| RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION | Включить эмуляцию отправки запросов | True |
|
323
|
-
| RDM_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи выгрузки данных. Минута | '0' |
|
324
|
-
| RDM_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи выгрузки данных. Час | '*/4' |
|
325
|
-
| RDM_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи выгрузки данных. День недели | '*' |
|
326
|
-
| RDM_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах) | 21600 |
|
327
|
-
| RDM_UPLOAD_STATUS_TASK_MINUTE | Настройка запуска периодической задачи статуса загрузки данных в витрину. Минута | '*/30' |
|
328
|
-
| RDM_UPLOAD_STATUS_TASK_HOUR | Настройка запуска периодической задачи статуса загрузки данных в витрину. Час | '*' |
|
329
|
-
| RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи статуса загрузки данных в витрину. День недели | '*' |
|
330
|
-
| RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах) | 3600 |
|
331
|
-
| RDM_CHECK_SUSPEND_TASK_STAGE_TIMEOUT | Дельта для определения зависшего подэтапа. Минута | 120 |
|
257
|
+
# Настройка запуска периодической задачи статуса загрузки данных в витрину:
|
258
|
+
RDM_UPLOAD_STATUS_TASK_MINUTE = conf.get('rdm_upload_status_task', 'MINUTE')
|
259
|
+
RDM_UPLOAD_STATUS_TASK_HOUR = conf.get('rdm_upload_status_task', 'HOUR')
|
260
|
+
RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK = conf.get('rdm_upload_status_task', 'DAY_OF_WEEK')
|
261
|
+
RDM_UPLOAD_STATUS_TASK_EXPIRE_SECOND = conf.get('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS')
|
332
262
|
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
| RDM_REDIS_DB | Настройка очереди Redis для формирования файлов РВД (номер бд). | |
|
341
|
-
| RDM_REDIS_PASSWORD | Настройка очереди Redis для формирования файлов РВД (пароль). | |
|
263
|
+
# Настройка очереди Redis для формирования файлов РВД.
|
264
|
+
RDM_REDIS_HOST = conf.get('rdm_redis', 'REDIS_HOST')
|
265
|
+
RDM_REDIS_PORT = conf.get('rdm_redis', 'REDIS_PORT')
|
266
|
+
RDM_REDIS_DB = conf.get('rdm_redis', 'REDIS_DB')
|
267
|
+
RDM_REDIS_PASSWORD = conf.get('rdm_redis', 'REDIS_PASSWORD')
|
268
|
+
# Таймаут для сохранения параметров в общем кеш.
|
269
|
+
RDM_REDIS_CACHE_TIMEOUT_SECONDS = conf.get_int('rdm_redis', 'REDIS_CACHE_TIMEOUT_SECONDS')
|
342
270
|
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
271
|
+
# Загрузка данных в Региональную витрину данных (РВД)
|
272
|
+
# Адрес витрины (schema://host:port)
|
273
|
+
RDM_UPLOADER_CLIENT_URL = conf.get('uploader_client', 'URL')
|
274
|
+
# Мнемоника Витрины
|
275
|
+
RDM_UPLOADER_CLIENT_DATAMART_NAME = conf.get('uploader_client', 'DATAMART_NAME')
|
276
|
+
# Количество повторных попыток запроса
|
277
|
+
RDM_UPLOADER_CLIENT_REQUEST_RETRIES = conf.get_int('uploader_client', 'REQUEST_RETRIES')
|
278
|
+
# Таймаут запроса, сек
|
279
|
+
RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT = conf.get_int('uploader_client', 'REQUEST_TIMEOUT')
|
280
|
+
# Включить эмуляцию отправки запросов
|
281
|
+
RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION = conf.get_bool('uploader_client', 'ENABLE_REQUEST_EMULATION')
|
282
|
+
# Установить тип ответа витрины при проверке статуса отправленного файла
|
283
|
+
RDM_RESPONSE_FILE_STATUS = conf.get('uploader_client', 'RESPONSE_FILE_STATUS')
|
284
|
+
# Использование Proxy API
|
285
|
+
RDM_UPLOADER_CLIENT_USE_PROXY_API = conf.get_bool('uploader_client', 'USE_PROXY_API')
|
286
|
+
# Имя пользователя IAM
|
287
|
+
RDM_UPLOADER_CLIENT_USERNAME = conf.get('uploader_client', 'USERNAME')
|
288
|
+
# Пароль пользователя IAM
|
289
|
+
RDM_UPLOADER_CLIENT_PASSWORD = conf.get('uploader_client', 'PASSWORD')
|
290
|
+
# ОГРН организации, в рамках которой развёрнута Витрина
|
291
|
+
RDM_UPLOADER_CLIENT_ORGANIZATION_OGRN = conf.get('uploader_client', 'ORGANIZATION_OGRN')
|
292
|
+
# Имя инсталляции в целевой Витрине
|
293
|
+
RDM_UPLOADER_CLIENT_INSTALLATION_NAME = conf.get('uploader_client', 'INSTALLATION_NAME')
|
294
|
+
# Идентификатор инсталляции в целевой Витрине
|
295
|
+
RDM_UPLOADER_CLIENT_INSTALLATION_ID = conf.get('uploader_client', 'INSTALLATION_ID')
|
348
296
|
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
|
363
|
-
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
297
|
+
# Директория логов сбора данных, доступных для скачивания
|
298
|
+
RDM_COLLECT_LOG_DIR = os.path.join('logs', 'rdm', 'collect')
|
299
|
+
os.makedirs(os.path.join(MEDIA_ROOT, RDM_COLLECT_LOG_DIR), exist_ok=True)
|
300
|
+
# Директория логов экспорта данных, доступных для скачивания
|
301
|
+
RDM_EXPORT_LOG_DIR = os.path.join('logs', 'rdm', 'export')
|
302
|
+
os.makedirs(os.path.join(MEDIA_ROOT, RDM_EXPORT_LOG_DIR), exist_ok=True)
|
303
|
+
# Директория логов отправки данных в витрину, доступных для скачивания
|
304
|
+
RDM_UPLOAD_LOG_DIR = os.path.join('logs', 'rdm', 'upload')
|
305
|
+
os.makedirs(os.path.join(MEDIA_ROOT, RDM_UPLOAD_LOG_DIR), exist_ok=True)
|
306
|
+
```
|
307
|
+
|
308
|
+
Перечень настроек в settings.py указан в таблице ниже.
|
309
|
+
|
310
|
+
| Название настройки в settings | Описание | Значение по умолчанию |
|
311
|
+
|----------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------|-------------------------|
|
312
|
+
| UPLOADS | Основная директория в MEDIA, в которой будет создана директория edu_rdm_integration для сохранения файлов для дальнейшей выгрузки | 500 |
|
313
|
+
| RDM_EXPORT_ENTITY_ID_PREFIX | Префикс идентификаторов записей сущностей специфический для продукта | |
|
314
|
+
| RDM_COLLECT_CHUNK_SIZE | Количество записей моделей обрабатываемых за одну итерацию сбора данных | 500 |
|
315
|
+
| RDM_EXPORT_CHUNK_SIZE | Количество записей моделей обрабатываемых за одну итерацию экспорта | 500 |
|
316
|
+
| RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE | # Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified | 5000 |
|
317
|
+
| RDM_UPLOAD_QUEUE_MAX_SIZE | Объем очереди файлов в витрину (в байтах). | 500_000_000 |
|
318
|
+
| RDM_MENU_ITEM | Отображение пункта меню Пункт меню "Региональная витрина данных" | False |
|
319
|
+
| RDM_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи выгрузки данных. Минута | '0' |
|
320
|
+
| RDM_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи выгрузки данных. Час | '*/4' |
|
321
|
+
| RDM_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи выгрузки данных. День недели | '*' |
|
322
|
+
| RDM_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах) | 21600 |
|
323
|
+
| RDM_FAST_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. Минута | '*/5' |
|
324
|
+
| RDM_FAST_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. Час | '*' |
|
325
|
+
| RDM_FAST_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. День недели | '*' |
|
326
|
+
| RDM_FAST_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах) | 1800 |
|
327
|
+
| RDM_LONG_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. Минута | 0 |
|
328
|
+
| RDM_LONG_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. Час | '*/6' |
|
329
|
+
| RDM_LONG_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. День недели | '*' |
|
330
|
+
| RDM_LONG_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах) | 28800 |
|
331
|
+
| RDM_CHECK_SUSPEND_TASK_MINUTE | Настройка запуска периодической задачи поиска зависших этапов экспорта. Минута | */10 |
|
332
|
+
| RDM_CHECK_SUSPEND_TASK_HOUR | Настройка запуска периодической задачи поиска зависших этапов экспорта. Час | * |
|
333
|
+
| RDM_CHECK_SUSPEND_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи поиска зависших этапов экспорта. День недели | * |
|
334
|
+
| RDM_CHECK_SUSPEND_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах). | 7200 |
|
335
|
+
| RDM_CHECK_SUSPEND_TASK_STAGE_TIMEOUT | Дельта для определения зависшего подэтапа. Минута | 120 |
|
336
|
+
| RDM_UPLOAD_DATA_TASK_MINUTE | Настройка запуска периодической задачи отправки файлов с данными РВД (минута). | '0' |
|
337
|
+
| RDM_UPLOAD_DATA_TASK_HOUR | Настройка запуска периодической задачи отправки файлов с данными РВД (час). | '*/2' |
|
338
|
+
| RDM_UPLOAD_DATA_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи отправки файлов с данными РВД (день недели). | '*' |
|
339
|
+
| RDM_UPLOAD_DATA_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах). | 7200 |
|
340
|
+
| RDM_UPLOAD_DATA_TASK_EXPORT_STAGES | Количество подэтапов для обработки в периодической задаче отправки данных. | 500 |
|
341
|
+
| RDM_UPLOAD_STATUS_TASK_MINUTE | Настройка запуска периодической задачи статуса загрузки данных в витрину. Минута | '*/30' |
|
342
|
+
| RDM_UPLOAD_STATUS_TASK_HOUR | Настройка запуска периодической задачи статуса загрузки данных в витрину. Час | '*' |
|
343
|
+
| RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи статуса загрузки данных в витрину. День недели | '*' |
|
344
|
+
| RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах) | 3600 |
|
345
|
+
| RDM_REDIS_HOST | Настройка очереди Redis для формирования файлов РВД (хост). | |
|
346
|
+
| RDM_REDIS_PORT | Настройка очереди Redis для формирования файлов РВД (порт). | |
|
347
|
+
| RDM_REDIS_DB | Настройка очереди Redis для формирования файлов РВД (номер бд). | |
|
348
|
+
| RDM_REDIS_PASSWORD | Настройка очереди Redis для формирования файлов РВД (пароль). | |
|
349
|
+
| RDM_REDIS_CACHE_TIMEOUT_SECONDS | Таймаут для сохранения параметров в общем кеш (секунды). | 7200 |
|
350
|
+
| RDM_UPLOADER_CLIENT_URL | Адрес витрины (schema://host:port) | 'http://localhost:8090' |
|
351
|
+
| RDM_UPLOADER_CLIENT_DATAMART_NAME | Мнемоника Витрины | 'test' |
|
352
|
+
| RDM_UPLOADER_CLIENT_REQUEST_RETRIES | Количество повторных попыток запроса | 10 |
|
353
|
+
| RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT | Таймаут запроса, сек | 10 |
|
354
|
+
| RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION | Включить эмуляцию отправки запросов | True |
|
355
|
+
| RDM_RESPONSE_FILE_STATUS | Установить тип ответа витрины при проверке статуса отправленного файла | 'success' |
|
356
|
+
| RDM_UPLOADER_CLIENT_USE_PROXY_API | Использование Proxy API | False |
|
357
|
+
| RDM_UPLOADER_CLIENT_USERNAME | Имя пользователя IAM | |
|
358
|
+
| RDM_UPLOADER_CLIENT_PASSWORD | Пароль пользователя IAM | |
|
359
|
+
| RDM_UPLOADER_CLIENT_ORGANIZATION_OGRN | ОГРН организации, в рамках которой развёрнута Витрина | |
|
360
|
+
| RDM_UPLOADER_CLIENT_INSTALLATION_NAME | Имя инсталляции в целевой Витрине | |
|
361
|
+
| RDM_UPLOADER_CLIENT_INSTALLATION_ID | Идентификатор инсталляции в целевой Витрине | |
|
362
|
+
| RDM_COLLECT_LOG_DIR | Директория логов сбора данных, доступных для скачивания | |
|
363
|
+
| RDM_EXPORT_LOG_DIR | Директория логов экспорта данных, доступных для скачивания | |
|
364
|
+
| RDM_UPLOAD_LOG_DIR | Директория логов отправки данных в витрину, доступных для скачивания | |
|
370
365
|
|
371
366
|
- В дефолтный конфиг проекта необходимо добавить:
|
372
367
|
|
@@ -381,7 +376,11 @@ Dynamic: license-file
|
|
381
376
|
# Количество записей моделей ЭШ обрабатываемых за одну итерацию сбора данных
|
382
377
|
COLLECT_CHUNK_SIZE = 500
|
383
378
|
# Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified
|
384
|
-
UPDATE_NON_EXPORTED_CHUNK_SIZE =
|
379
|
+
UPDATE_NON_EXPORTED_CHUNK_SIZE = 5000
|
380
|
+
# Объем очереди файлов в витрину (в байтах) - по умолчанию 512 Мбайт.
|
381
|
+
UPLOAD_QUEUE_MAX_SIZE = 500000000
|
382
|
+
# Отображение пункта меню "Региональная витрина данных"
|
383
|
+
RDM_MENU_ITEM = False
|
385
384
|
|
386
385
|
# Настройка запуска периодической задачи выгрузки данных
|
387
386
|
[rdm_transfer_task]
|
@@ -389,18 +388,19 @@ Dynamic: license-file
|
|
389
388
|
HOUR=*
|
390
389
|
DAY_OF_WEEK=*
|
391
390
|
LOCK_EXPIRE_SECONDS=21600
|
392
|
-
|
393
|
-
|
394
|
-
# Сущности, по которым должен производиться сбор и выгрузка данных. Перечисляются через запятую без пробелов.
|
395
|
-
ENTITIES =
|
396
|
-
|
397
|
-
# Настройка запуска периодической задачи статуса загрузки данных в витрину
|
398
|
-
[rdm_upload_status_task]
|
391
|
+
|
392
|
+
[rdm_transfer_task_fast]
|
399
393
|
MINUTE=*/2
|
400
394
|
HOUR=*
|
401
395
|
DAY_OF_WEEK=*
|
402
|
-
LOCK_EXPIRE_SECONDS=
|
403
|
-
|
396
|
+
LOCK_EXPIRE_SECONDS = 1800
|
397
|
+
|
398
|
+
[rdm_transfer_task_long]
|
399
|
+
MINUTE=*/15
|
400
|
+
HOUR=*
|
401
|
+
DAY_OF_WEEK=*
|
402
|
+
LOCK_EXPIRE_SECONDS = 21600
|
403
|
+
|
404
404
|
# Настройка запуска периодической задачи поиска зависших этапов экспорта
|
405
405
|
[rdm_check_suspend_task]
|
406
406
|
MINUTE=*/10
|
@@ -409,6 +409,30 @@ Dynamic: license-file
|
|
409
409
|
LOCK_EXPIRE_SECONDS=7200
|
410
410
|
# Дельта для определения зависшего подэтапа, мин
|
411
411
|
STAGE_TIMEOUT=120
|
412
|
+
|
413
|
+
# Настройка запуска периодической задачи отправки csv-файлов в витрину.
|
414
|
+
[rdm_upload_data_task]
|
415
|
+
MINUTE=*/2
|
416
|
+
HOUR=*
|
417
|
+
DAY_OF_WEEK=*
|
418
|
+
LOCK_EXPIRE_SECONDS = 7200
|
419
|
+
EXPORT_STAGES = 500
|
420
|
+
|
421
|
+
# Настройка запуска периодической задачи статуса загрузки данных в витрину
|
422
|
+
[rdm_upload_status_task]
|
423
|
+
MINUTE=*/2
|
424
|
+
HOUR=*
|
425
|
+
DAY_OF_WEEK=*
|
426
|
+
LOCK_EXPIRE_SECONDS=7200
|
427
|
+
|
428
|
+
# Настройка очереди Redis для формирования файлов РВД.
|
429
|
+
[rdm_redis]
|
430
|
+
REDIS_HOST = localhost
|
431
|
+
REDIS_PORT = 6379
|
432
|
+
REDIS_DB = 1
|
433
|
+
REDIS_PASSWORD =
|
434
|
+
# Таймаут для сохранения параметров в общем кеш.
|
435
|
+
REDIS_CACHE_TIMEOUT_SECONDS = 7200
|
412
436
|
|
413
437
|
[uploader_client]
|
414
438
|
# Адрес витрины
|
@@ -421,53 +445,29 @@ Dynamic: license-file
|
|
421
445
|
REQUEST_TIMEOUT = 10
|
422
446
|
# Включить эмуляцию отправки запросов
|
423
447
|
ENABLE_REQUEST_EMULATION = True
|
448
|
+
# Использовать Proxy API
|
449
|
+
USE_PROXY_API = False
|
450
|
+
# Имя пользователя IAM
|
451
|
+
USERNAME =
|
452
|
+
# Пароль пользователя IAM
|
453
|
+
PASSWORD =
|
454
|
+
# ОГРН организации, в рамках которой развёрнута Витрина
|
455
|
+
ORGANIZATION_OGRN =
|
456
|
+
# Имя инсталляции в целевой Витрине
|
457
|
+
INSTALLATION_NAME =
|
458
|
+
# Идентификатор инсталляции в целевой Витрине
|
459
|
+
INSTALLATION_ID =
|
424
460
|
```
|
425
|
-
|
426
|
-
```
|
427
|
-
[rdm_general]
|
428
|
-
...
|
429
|
-
# Объем очереди файлов в витрину (в байтах) - по умолчанию 512 Мбайт.
|
430
|
-
UPLOAD_QUEUE_MAX_SIZE = 500_000_000
|
461
|
+
На основе дефолтного конфига произвести конфигурирование приложений.
|
431
462
|
|
432
|
-
|
433
|
-
[rdm_redis]
|
434
|
-
REDIS_HOST = localhost
|
435
|
-
REDIS_PORT = 6379
|
436
|
-
REDIS_DB = 1
|
437
|
-
REDIS_PASSWORD =
|
438
|
-
```
|
439
|
-
- С версии 3.3.1 в дефолтный конфиг нужно добавить
|
440
|
-
```
|
441
|
-
[rdm_redis]
|
442
|
-
...
|
443
|
-
# Таймаут для сохранения параметров в общем кеш.
|
444
|
-
REDIS_CACHE_TIMEOUT_SECONDS = 7200
|
445
|
-
```
|
446
|
-
- С версии 3.4.2 в дефолтный конфиг нужно добавить
|
447
|
-
```
|
448
|
-
# Настройка запуска периодической задачи отправки csv-файлов в витрину.
|
449
|
-
[rdm_upload_data_task]
|
450
|
-
MINUTE=*/2
|
451
|
-
HOUR=*
|
452
|
-
DAY_OF_WEEK=*
|
453
|
-
LOCK_EXPIRE_SECONDS = 60 * 60 * 2
|
454
|
-
```
|
455
|
-
- С версии 3.6 в дефолтный конфиг также нужно добавить два дополнительных раздела
|
456
|
-
```
|
457
|
-
|
458
|
-
[rdm_transfer_task_fast]
|
459
|
-
MINUTE=*/2
|
460
|
-
HOUR=*
|
461
|
-
DAY_OF_WEEK=*
|
462
|
-
LOCK_EXPIRE_SECONDS = 1800
|
463
|
+
## Форматирование
|
463
464
|
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
На основе дефолтного конфига произвести конфигурирование приложений.
|
465
|
+
Форматирование исходного кода осуществляется при помощи ruff. Ниже приведены команды для осуществления форматирования.
|
466
|
+
|
467
|
+
```bash
|
468
|
+
$ ruff format src/
|
469
|
+
$ ruff check --fix --unsafe-fixes src/
|
470
|
+
```
|
471
471
|
|
472
472
|
## Сборка и распространение
|
473
473
|
|