edu-rdm-integration 3.19.1__tar.gz → 3.21.0__tar.gz

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