edu-rdm-integration 0.6.5__tar.gz → 0.6.7__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 (162) hide show
  1. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/CHANGELOG.md +29 -5
  2. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/PKG-INFO +36 -7
  3. edu-rdm-integration-0.6.7/requirements/dependencies/external_packages.txt +2 -0
  4. edu-rdm-integration-0.6.7/requirements/dependencies/internal_packages.txt +4 -0
  5. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/setup.py +5 -1
  6. edu-rdm-integration-0.6.7/src/edu_rdm_integration/collect_data/tests.py +138 -0
  7. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/entities.py +36 -5
  8. edu-rdm-integration-0.6.7/src/edu_rdm_integration/enum_register/mixins.py +87 -0
  9. edu-rdm-integration-0.6.7/src/edu_rdm_integration/enum_register/register.py +82 -0
  10. edu-rdm-integration-0.6.7/src/edu_rdm_integration/migrations/__init__.py +0 -0
  11. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/utils.py +39 -0
  12. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration.egg-info/PKG-INFO +36 -7
  13. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration.egg-info/SOURCES.txt +4 -0
  14. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration.egg-info/requires.txt +2 -1
  15. edu-rdm-integration-0.6.5/requirements/dependencies/external_packages.txt +0 -1
  16. edu-rdm-integration-0.6.5/requirements/dependencies/internal_packages.txt +0 -4
  17. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/CONDUCT.md +0 -0
  18. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/LICENSE +0 -0
  19. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/MANIFEST.in +0 -0
  20. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/README.md +0 -0
  21. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/pyproject.toml +0 -0
  22. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/requirements/dependencies/development_packages.txt +0 -0
  23. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/requirements/dependencies/internal_sources.txt +0 -0
  24. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/requirements/dependencies/production_packages.txt +0 -0
  25. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/requirements/dependencies/system_packages.txt +0 -0
  26. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/requirements/dependencies/testing_packages.txt +0 -0
  27. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/requirements/development.txt +0 -0
  28. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/requirements/production.txt +0 -0
  29. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/requirements/stage.txt +0 -0
  30. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/setup.cfg +0 -0
  31. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/__init__.py +0 -0
  32. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/__init__.py +0 -0
  33. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/apps.py +0 -0
  34. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/caches.py +0 -0
  35. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/consts.py +0 -0
  36. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/enums.py +0 -0
  37. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/errors.py +0 -0
  38. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/functions.py +0 -0
  39. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/helpers.py +0 -0
  40. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/managers.py +0 -0
  41. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/presenters.py +0 -0
  42. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/receivers.py +0 -0
  43. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/results.py +0 -0
  44. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/runners.py +0 -0
  45. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/strategies.py +0 -0
  46. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/strings.py +0 -0
  47. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/tests.py +0 -0
  48. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/adapters/validators.py +0 -0
  49. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/app_settings.py +0 -0
  50. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/apps.py +0 -0
  51. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/__init__.py +0 -0
  52. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/base/__init__.py +0 -0
  53. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/base/caches.py +0 -0
  54. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/base/functions.py +0 -0
  55. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/base/managers.py +0 -0
  56. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/base/mixins.py +0 -0
  57. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/base/runners.py +0 -0
  58. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/__init__.py +0 -0
  59. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/__init__.py +0 -0
  60. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/caches.py +0 -0
  61. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/consts.py +0 -0
  62. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/enums.py +0 -0
  63. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/errors.py +0 -0
  64. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/functions.py +0 -0
  65. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/helpers.py +0 -0
  66. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/managers.py +0 -0
  67. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/presenters.py +0 -0
  68. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/results.py +0 -0
  69. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/runners.py +0 -0
  70. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/strings.py +0 -0
  71. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/tests.py +0 -0
  72. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/base/validators.py +0 -0
  73. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/calculated/strategies.py +0 -0
  74. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/collect.py +0 -0
  75. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/generators.py +0 -0
  76. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/helpers.py +0 -0
  77. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/__init__.py +0 -0
  78. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/__init__.py +0 -0
  79. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/caches.py +0 -0
  80. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/consts.py +0 -0
  81. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/enums.py +0 -0
  82. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/errors.py +0 -0
  83. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/functions.py +0 -0
  84. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/helpers.py +0 -0
  85. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/managers.py +0 -0
  86. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/presenters.py +0 -0
  87. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/results.py +0 -0
  88. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/runners.py +0 -0
  89. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/strings.py +0 -0
  90. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/tests.py +0 -0
  91. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/base/validators.py +0 -0
  92. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/collect_data/non_calculated/strategies.py +0 -0
  93. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/consts.py +0 -0
  94. {edu-rdm-integration-0.6.5/src/edu_rdm_integration/export_data → edu-rdm-integration-0.6.7/src/edu_rdm_integration/enum_register}/__init__.py +0 -0
  95. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/enums.py +0 -0
  96. {edu-rdm-integration-0.6.5/src/edu_rdm_integration/export_data/base → edu-rdm-integration-0.6.7/src/edu_rdm_integration/export_data}/__init__.py +0 -0
  97. {edu-rdm-integration-0.6.5/src/edu_rdm_integration/function_templates → edu-rdm-integration-0.6.7/src/edu_rdm_integration/export_data/base}/__init__.py +0 -0
  98. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/caches.py +0 -0
  99. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/consts.py +0 -0
  100. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/enums.py +0 -0
  101. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/errors.py +0 -0
  102. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/functions.py +0 -0
  103. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/helpers.py +0 -0
  104. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/managers.py +0 -0
  105. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/presenters.py +0 -0
  106. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/requests.py +0 -0
  107. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/results.py +0 -0
  108. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/runners.py +0 -0
  109. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/strings.py +0 -0
  110. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/tests.py +0 -0
  111. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/base/validators.py +0 -0
  112. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/consts.py +0 -0
  113. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/export.py +0 -0
  114. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/generators.py +0 -0
  115. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/helpers.py +0 -0
  116. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/export_data/strategies.py +0 -0
  117. {edu-rdm-integration-0.6.5/src/edu_rdm_integration/management → edu-rdm-integration-0.6.7/src/edu_rdm_integration/function_templates}/__init__.py +0 -0
  118. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/__init__.py-tpl +0 -0
  119. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/apps.py-tpl +0 -0
  120. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/caches.py-tpl +0 -0
  121. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/consts.py-tpl +0 -0
  122. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/enums.py-tpl +0 -0
  123. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/errors.py-tpl +0 -0
  124. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/functions.py-tpl +0 -0
  125. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/helpers.py-tpl +0 -0
  126. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/managers.py-tpl +0 -0
  127. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/presenters.py-tpl +0 -0
  128. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/results.py-tpl +0 -0
  129. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/runners.py-tpl +0 -0
  130. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/strings.py-tpl +0 -0
  131. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/tests.py-tpl +0 -0
  132. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_collect_data_template/validators.py-tpl +0 -0
  133. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/__init__.py-tpl +0 -0
  134. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/apps.py-tpl +0 -0
  135. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/caches.py-tpl +0 -0
  136. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/consts.py-tpl +0 -0
  137. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/enums.py-tpl +0 -0
  138. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/errors.py-tpl +0 -0
  139. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/functions.py-tpl +0 -0
  140. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/helpers.py-tpl +0 -0
  141. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/managers.py-tpl +0 -0
  142. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/presenters.py-tpl +0 -0
  143. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/results.py-tpl +0 -0
  144. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/runners.py-tpl +0 -0
  145. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/strings.py-tpl +0 -0
  146. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/tests.py-tpl +0 -0
  147. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/function_templates/function_export_data_template/validators.py-tpl +0 -0
  148. {edu-rdm-integration-0.6.5/src/edu_rdm_integration/management/commands → edu-rdm-integration-0.6.7/src/edu_rdm_integration/management}/__init__.py +0 -0
  149. {edu-rdm-integration-0.6.5/src/edu_rdm_integration/migrations → edu-rdm-integration-0.6.7/src/edu_rdm_integration/management/commands}/__init__.py +0 -0
  150. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/management/commands/collect_models_data.py +0 -0
  151. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/management/commands/export_entities_data.py +0 -0
  152. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/management/general.py +0 -0
  153. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/mapping.py +0 -0
  154. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/migrations/0001_initial.py +0 -0
  155. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/migrations/0002_init_data_uploadstatus.py +0 -0
  156. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/models.py +0 -0
  157. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/signals.py +0 -0
  158. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration/storages.py +0 -0
  159. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration.egg-info/dependency_links.txt +0 -0
  160. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration.egg-info/namespace_packages.txt +0 -0
  161. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration.egg-info/not-zip-safe +0 -0
  162. {edu-rdm-integration-0.6.5 → edu-rdm-integration-0.6.7}/src/edu_rdm_integration.egg-info/top_level.txt +0 -0
@@ -29,6 +29,30 @@
29
29
  ### Удалено
30
30
 
31
31
 
32
+ ## [0.6.7] - 2023-11-01
33
+
34
+ Добавлен миксин EntityEnumRegisterMixin для регистрации сущностей в RegionalDataMartEntityEnum.
35
+ Миксин ModelEnumRegisterMixin для регистрации моделей в RegionalDataMartModelEnum.
36
+ Добавлены методы для запуска регистрации моделей и сущностей.
37
+
38
+ ### Добавлено
39
+
40
+ - [EDUCLLG-7632](https://jira.bars.group/browse/EDUCLLG-7632)
41
+ PATCH - Добавлен функционал регистрации моделей и сущностей в моделях-перечислениях.
42
+
43
+
44
+ ## [0.6.6] - 2023-10-16
45
+
46
+ Добавлен базовый класс для тестирования Функций сбора, добавлена явная зависимость Django.
47
+
48
+ ### Добавлено
49
+
50
+ - [EDUSCHL-20684](https://jira.bars.group/browse/EDUSCHL-20684)
51
+ PATCH - Базовый класс для тестирования Функций сбора;
52
+ - [EDUSCHL-20684](https://jira.bars.group/browse/EDUSCHL-20684)
53
+ PATCH - Добавлена зависимость Django.
54
+
55
+
32
56
  ## [0.6.5] - 2023-10-11
33
57
 
34
58
  Получение метода генерации логов вынесено в отдельный метод для избавления от необходимости хранить все методы в одном классе.
@@ -111,7 +135,7 @@
111
135
 
112
136
  ## [0.5.8] - 2023-09-13
113
137
 
114
- Исправлена ошибка добавления в описание асинхронной задачи списка выгруженных сущностей
138
+ Исправлена ошибка добавления в описание асинхронной задачи списка выгруженных сущностей
115
139
  BaseExportLatestEntitiesData._set_description_to_async_task.
116
140
 
117
141
  ### Исправлено
@@ -143,8 +167,8 @@ BaseExportLatestEntitiesData._set_description_to_async_task.
143
167
  - [EDUSCHL-20435](https://jira.bars.group/browse/EDUSCHL-20435)
144
168
  PATCH - Исправлено нахождение левой границы в классе ExportLatestEntitiesData;
145
169
  - Добавлена проверка на наличие запущенных или готовых к выгрузке сущностей;
146
- - Добавлен параметр update_modified, который обновляет поле modified у собранных моделей,
147
- чтобы выгрузить невыгруженные записи.
170
+ - Добавлен параметр update_modified, который обновляет поле modified у собранных моделей,
171
+ чтобы выгрузить невыгруженные записи.
148
172
 
149
173
 
150
174
  ## [0.5.5] - 2023-09-04
@@ -197,14 +221,14 @@ split_by_days_count переименовал в split_by_quantity.
197
221
  - [EDUSCHL-20227](https://jira.bars.group/browse/EDUSCHL-20227)
198
222
  PATCH Если у сущности не заполнен creating_trigger_models, то в генераторе BaseFirstCollectModelsDataCommandsGenerator
199
223
  не формируется словарь с параметрами для команды.
200
-
224
+
201
225
  - [EDUSCHL-20229](https://jira.bars.group/browse/EDUSCHL-20229)
202
226
  PATCH Если у сущности не заполнен creating_trigger_models, то в генераторе BaseFirstCollectModelsDataCommandsGenerator
203
227
  не формируется словарь с параметрами для команды.
204
228
 
205
229
 
206
230
  ## [0.5.0] - 2023-08-19
207
-
231
+
208
232
  Дополнительная функциональность WebEduEntityValueCache была перенесена в EntityCache в function_tools.
209
233
 
210
234
  ### Удалено
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edu-rdm-integration
3
- Version: 0.6.5
3
+ Version: 0.6.7
4
4
  Summary: Интеграция с Региональной витриной данных
5
5
  Home-page:
6
6
  Download-URL:
@@ -16,6 +16,10 @@ Classifier: Programming Language :: Python :: 3.8
16
16
  Classifier: Programming Language :: Python :: 3.9
17
17
  Classifier: Intended Audience :: Developers
18
18
  Classifier: Environment :: Console
19
+ Classifier: Framework :: Django :: 1.11
20
+ Classifier: Framework :: Django :: 2.0
21
+ Classifier: Framework :: Django :: 2.1
22
+ Classifier: Framework :: Django :: 2.2
19
23
  Description-Content-Type: text/markdown
20
24
  License-File: LICENSE
21
25
  Requires-Dist: packaging<24,>=21.3
@@ -23,9 +27,10 @@ Requires-Dist: pip<24,>=20.1.1
23
27
  Requires-Dist: setuptools<69,>=47.3.1
24
28
  Requires-Dist: wheel<0.42,>=0.37.1
25
29
  Requires-Dist: transliterate<2
30
+ Requires-Dist: Django<2.3,>=1.11
26
31
  Requires-Dist: educommon<4,>=3.0.0
27
32
  Requires-Dist: function-tools<1,>=0.5.0
28
- Requires-Dist: m3-db-utils<1,>=0.3.6
33
+ Requires-Dist: m3-db-utils<1,>=0.3.8
29
34
  Requires-Dist: uploader-client<1,>=0.1.12
30
35
 
31
36
  # Проект "Интеграция с Региональной витриной данных (РВД)"
@@ -285,6 +290,30 @@ Requires-Dist: uploader-client<1,>=0.1.12
285
290
  ### Удалено
286
291
 
287
292
 
293
+ ## [0.6.7] - 2023-11-01
294
+
295
+ Добавлен миксин EntityEnumRegisterMixin для регистрации сущностей в RegionalDataMartEntityEnum.
296
+ Миксин ModelEnumRegisterMixin для регистрации моделей в RegionalDataMartModelEnum.
297
+ Добавлены методы для запуска регистрации моделей и сущностей.
298
+
299
+ ### Добавлено
300
+
301
+ - [EDUCLLG-7632](https://jira.bars.group/browse/EDUCLLG-7632)
302
+ PATCH - Добавлен функционал регистрации моделей и сущностей в моделях-перечислениях.
303
+
304
+
305
+ ## [0.6.6] - 2023-10-16
306
+
307
+ Добавлен базовый класс для тестирования Функций сбора, добавлена явная зависимость Django.
308
+
309
+ ### Добавлено
310
+
311
+ - [EDUSCHL-20684](https://jira.bars.group/browse/EDUSCHL-20684)
312
+ PATCH - Базовый класс для тестирования Функций сбора;
313
+ - [EDUSCHL-20684](https://jira.bars.group/browse/EDUSCHL-20684)
314
+ PATCH - Добавлена зависимость Django.
315
+
316
+
288
317
  ## [0.6.5] - 2023-10-11
289
318
 
290
319
  Получение метода генерации логов вынесено в отдельный метод для избавления от необходимости хранить все методы в одном классе.
@@ -367,7 +396,7 @@ Requires-Dist: uploader-client<1,>=0.1.12
367
396
 
368
397
  ## [0.5.8] - 2023-09-13
369
398
 
370
- Исправлена ошибка добавления в описание асинхронной задачи списка выгруженных сущностей
399
+ Исправлена ошибка добавления в описание асинхронной задачи списка выгруженных сущностей
371
400
  BaseExportLatestEntitiesData._set_description_to_async_task.
372
401
 
373
402
  ### Исправлено
@@ -399,8 +428,8 @@ BaseExportLatestEntitiesData._set_description_to_async_task.
399
428
  - [EDUSCHL-20435](https://jira.bars.group/browse/EDUSCHL-20435)
400
429
  PATCH - Исправлено нахождение левой границы в классе ExportLatestEntitiesData;
401
430
  - Добавлена проверка на наличие запущенных или готовых к выгрузке сущностей;
402
- - Добавлен параметр update_modified, который обновляет поле modified у собранных моделей,
403
- чтобы выгрузить невыгруженные записи.
431
+ - Добавлен параметр update_modified, который обновляет поле modified у собранных моделей,
432
+ чтобы выгрузить невыгруженные записи.
404
433
 
405
434
 
406
435
  ## [0.5.5] - 2023-09-04
@@ -453,14 +482,14 @@ split_by_days_count переименовал в split_by_quantity.
453
482
  - [EDUSCHL-20227](https://jira.bars.group/browse/EDUSCHL-20227)
454
483
  PATCH Если у сущности не заполнен creating_trigger_models, то в генераторе BaseFirstCollectModelsDataCommandsGenerator
455
484
  не формируется словарь с параметрами для команды.
456
-
485
+
457
486
  - [EDUSCHL-20229](https://jira.bars.group/browse/EDUSCHL-20229)
458
487
  PATCH Если у сущности не заполнен creating_trigger_models, то в генераторе BaseFirstCollectModelsDataCommandsGenerator
459
488
  не формируется словарь с параметрами для команды.
460
489
 
461
490
 
462
491
  ## [0.5.0] - 2023-08-19
463
-
492
+
464
493
  Дополнительная функциональность WebEduEntityValueCache была перенесена в EntityCache в function_tools.
465
494
 
466
495
  ### Удалено
@@ -0,0 +1,2 @@
1
+ transliterate<2
2
+ Django>=1.11,<2.3
@@ -0,0 +1,4 @@
1
+ educommon>=3.0.0,<4
2
+ function-tools>=0.5.0,<1
3
+ m3-db-utils>=0.3.8,<1
4
+ uploader-client>=0.1.12,<1
@@ -17,7 +17,7 @@ from setuptools import (
17
17
 
18
18
  PROJECT = 'edu_rdm_integration'
19
19
 
20
- VERSION = '0.6.5'
20
+ VERSION = '0.6.7'
21
21
 
22
22
  current_dir_path = Path().resolve()
23
23
 
@@ -83,6 +83,10 @@ setup(
83
83
  'Programming Language :: Python :: 3.9',
84
84
  'Intended Audience :: Developers',
85
85
  'Environment :: Console',
86
+ 'Framework :: Django :: 1.11',
87
+ 'Framework :: Django :: 2.0',
88
+ 'Framework :: Django :: 2.1',
89
+ 'Framework :: Django :: 2.2',
86
90
  ],
87
91
 
88
92
  platforms=['Any'],
@@ -0,0 +1,138 @@
1
+ import datetime
2
+ import decimal
3
+ import uuid
4
+ from typing import (
5
+ TYPE_CHECKING,
6
+ Any,
7
+ Dict,
8
+ Optional,
9
+ Type,
10
+ )
11
+ from unittest import (
12
+ mock,
13
+ )
14
+
15
+ from django.conf import (
16
+ settings,
17
+ )
18
+ from django.db.models.fields.files import (
19
+ FieldFile,
20
+ )
21
+ from django.test import (
22
+ TestCase,
23
+ )
24
+ from django.utils import (
25
+ timezone,
26
+ )
27
+
28
+ from educommon.audit_log.models import (
29
+ AuditLog,
30
+ Table,
31
+ )
32
+ from educommon.integration_entities.enums import (
33
+ EntityLogOperation,
34
+ )
35
+
36
+
37
+ if TYPE_CHECKING:
38
+ from django.db.models import (
39
+ Model,
40
+ )
41
+
42
+ from function_tools.managers import (
43
+ RunnerManager,
44
+ )
45
+
46
+
47
+ class BaseCollectingFunctionTestCase(TestCase):
48
+ """Базовый класс тестирования Функции сбора."""
49
+
50
+ databases = (settings.DEFAULT_DB_ALIAS, settings.SERVICE_DB_ALIAS)
51
+
52
+ @property
53
+ def manager(self) -> Type['RunnerManager']:
54
+ """Менеджер раннера Функции сбора."""
55
+ raise NotImplementedError
56
+
57
+ @classmethod
58
+ def tearDownClass(cls) -> None:
59
+ """Вызывается один раз после запуска всех тестов класса."""
60
+ cls.delete_auditlogs()
61
+
62
+ super().tearDownClass()
63
+
64
+ @staticmethod
65
+ def delete_auditlogs() -> None:
66
+ """Удаляет логи."""
67
+ AuditLog.objects.all().delete()
68
+
69
+ def setUp(self) -> None:
70
+ """Подготавливает фикстуры."""
71
+ self.now = timezone.now()
72
+
73
+ def run_collecting_function(self) -> None:
74
+ """Запускает Функцию сбора."""
75
+ runner_manager = self.manager(
76
+ logs_period_started_at=datetime.datetime.combine(self.now, datetime.time.min),
77
+ logs_period_ended_at=datetime.datetime.combine(self.now, datetime.time.max),
78
+ )
79
+ runner_manager.run()
80
+
81
+ @mock.patch('educommon.audit_log.models.AuditLog.ready_to_save')
82
+ @mock.patch('educommon.audit_log.models.AuditLog.is_read_only')
83
+ def create_auditlog(
84
+ self,
85
+ is_read_only_mock: mock.MagicMock,
86
+ ready_to_save_mock: mock.MagicMock,
87
+ *,
88
+ instance: 'Model',
89
+ changes: Optional[Dict[str, Any]] = None,
90
+ operation: EntityLogOperation = EntityLogOperation.UPDATE,
91
+ ) -> None:
92
+ """Создает AuditLog."""
93
+ is_read_only_mock.return_value = False
94
+ ready_to_save_mock.return_value = True
95
+
96
+ table = Table.objects.only('pk').get(name=instance._meta.db_table)
97
+
98
+ timestamp = datetime.datetime.combine(self.now, timezone.now().time())
99
+
100
+ if changes is None:
101
+ changes = {'__stub': None} # changes не может быть пустым
102
+ else:
103
+ changes['modified'] = timestamp.isoformat().replace('T', ' ')
104
+
105
+ AuditLog.objects.create(
106
+ user_id=1,
107
+ user_type_id=1,
108
+ ip='127.0.0.1',
109
+ data=self._clean_data(instance),
110
+ changes=changes,
111
+ table=table,
112
+ object_id=instance.pk,
113
+ time=timestamp,
114
+ operation=operation,
115
+ )
116
+
117
+ def _clean_data(self, instance: 'Model') -> Dict[str, Optional[str]]:
118
+ """Подготавливает данные экземпляра модели для формирования AuditLog'a."""
119
+ fields = {}
120
+
121
+ for key, value in vars(instance).items():
122
+ if key.startswith('_'):
123
+ continue
124
+
125
+ if isinstance(value, datetime.datetime):
126
+ fields[key] = value.strftime('%Y-%m-%d %H:%M:%S.%f%z')
127
+ elif isinstance(value, datetime.date):
128
+ fields[key] = value.strftime('%Y-%m-%d')
129
+ elif isinstance(value, bool):
130
+ fields[key] = 't' if value else 'f'
131
+ elif isinstance(value, (int, float, uuid.UUID, decimal.Decimal)):
132
+ fields[key] = str(value)
133
+ elif isinstance(value, FieldFile):
134
+ fields[key] = value.name
135
+ else:
136
+ fields[key] = value
137
+
138
+ return fields
@@ -8,15 +8,27 @@ from typing import (
8
8
  Tuple,
9
9
  )
10
10
 
11
+ from edu_rdm_integration.enum_register.mixins import (
12
+ EntityEnumRegisterMixin,
13
+ )
14
+ from edu_rdm_integration.models import (
15
+ RegionalDataMartModelEnum,
16
+ )
11
17
  from educommon.integration_entities.entities import (
12
18
  BaseEntity,
13
19
  )
14
20
 
15
21
 
16
22
  @dataclass
17
- class AddressEntity(BaseEntity):
23
+ class AddressEntity(EntityEnumRegisterMixin, BaseEntity):
18
24
  """Сущность РВД 'Адреса'."""
19
25
 
26
+ # Параметры регистрации в модель-перечисление РВД
27
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
28
+ title = 'Адреса'
29
+ main_model_enum = RegionalDataMartModelEnum.ADDRESS
30
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
31
+
20
32
  # Имена полей объявляются как константы, чтобы можно было выводить списки полей
21
33
  ID = 'id'
22
34
  USE_ADDRESS = 'use_address'
@@ -88,9 +100,16 @@ class AddressEntity(BaseEntity):
88
100
 
89
101
 
90
102
  @dataclass
91
- class AddressOrganisationEntity(BaseEntity):
103
+ class AddressOrganisationEntity(EntityEnumRegisterMixin, BaseEntity):
92
104
  """Сущность РВД 'Адреса'."""
93
105
 
106
+ # Параметры регистрации в модель-перечисление РВД
107
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
108
+ title = 'Адреса организаций'
109
+ main_model_enum = RegionalDataMartModelEnum.ADDRESS_ORGANISATION
110
+ additional_model_enums = (RegionalDataMartModelEnum.ORGANISATION, )
111
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
112
+
94
113
  # Имена полей объявляются как константы, чтобы можно было выводить списки полей
95
114
  ADDRESS_ID = 'address_id'
96
115
  ORGANISATION_ID = 'organisation_id'
@@ -132,9 +151,15 @@ class AddressOrganisationEntity(BaseEntity):
132
151
 
133
152
 
134
153
  @dataclass
135
- class TelecomEntity(BaseEntity):
154
+ class TelecomEntity(EntityEnumRegisterMixin, BaseEntity):
136
155
  """Сущность РВД "Контактные данные"."""
137
156
 
157
+ # Параметры регистрации в модель-перечисление РВД
158
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
159
+ title = 'Контактные данные'
160
+ main_model_enum = RegionalDataMartModelEnum.TELECOM
161
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
162
+
138
163
  # Имена полей объявляются как константы, чтобы можно было выводить списки полей
139
164
  ID = 'id'
140
165
  TYPE_CONTACT = 'type_contact'
@@ -194,11 +219,17 @@ class TelecomEntity(BaseEntity):
194
219
 
195
220
 
196
221
  @dataclass
197
- class OrganisationsEntity(BaseEntity):
222
+ class OrganisationsEntity(EntityEnumRegisterMixin, BaseEntity):
198
223
  """
199
224
  Сущность РВД "Организации".
200
225
  """
201
226
 
227
+ # Параметры регистрации в модель-перечисление РВД
228
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
229
+ title = 'Организации'
230
+ main_model_enum = RegionalDataMartModelEnum.ORGANISATION
231
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
232
+
202
233
  ID = 'id'
203
234
  ROSOBR_ID = 'rosobr_id'
204
235
  OGRN = 'ogrn'
@@ -209,7 +240,7 @@ class OrganisationsEntity(BaseEntity):
209
240
  OKPF = 'okpf'
210
241
  OKFS = 'okfs'
211
242
  OKOGU = 'okogu'
212
- OKATO = 'okato'
243
+ OKATO = 'okato'
213
244
  OKTMO = 'oktmo'
214
245
  NAME = 'name'
215
246
  PARTOF_ID = 'partof_id'
@@ -0,0 +1,87 @@
1
+ from typing import (
2
+ Any,
3
+ Dict,
4
+ Tuple,
5
+ )
6
+
7
+ from django.db import (
8
+ models,
9
+ )
10
+ from django.utils.decorators import (
11
+ classproperty,
12
+ )
13
+
14
+ from edu_rdm_integration.models import (
15
+ RegionalDataMartEntityEnum,
16
+ RegionalDataMartModelEnum,
17
+ )
18
+ from edu_rdm_integration.utils import (
19
+ camel_to_underscore,
20
+ )
21
+ from m3_db_utils.mixins import (
22
+ BaseEnumRegisterMixin,
23
+ )
24
+ from m3_db_utils.models import (
25
+ ModelEnumValue,
26
+ )
27
+
28
+
29
+ class EntityEnumRegisterMixin(BaseEnumRegisterMixin):
30
+ """Миксин, для регистрации сущности в RegionalDataMartEntityEnum."""
31
+
32
+ enum = RegionalDataMartEntityEnum
33
+ """Модель-перечисление в которую регистрируется сущность."""
34
+
35
+ main_model_enum: ModelEnumValue
36
+ """Значение RegionalDataMartModelEnum,
37
+ основной модели РВД для формирования сущности."""
38
+
39
+ additional_model_enums: Tuple[ModelEnumValue] = ()
40
+ """Перечень дополнительных значений RegionalDataMartModelEnum,
41
+ которые участвуют в формировании записей сущностей"""
42
+
43
+ title: str
44
+ """Расшифровка сущности модели-перечисления"""
45
+
46
+ @classproperty
47
+ def key(cls) -> str:
48
+ return camel_to_underscore(cls.__name__.rsplit('Entity', 1)[0], upper=True)
49
+
50
+ @classmethod
51
+ def get_register_params(cls) -> Dict[str, Any]:
52
+ register_params = super().get_register_params()
53
+ register_params['main_model_enum'] = cls.main_model_enum
54
+ register_params['entity'] = cls
55
+ register_params['additional_model_enums'] = cls.additional_model_enums
56
+
57
+ return register_params
58
+
59
+
60
+ class ModelEnumRegisterMixin(BaseEnumRegisterMixin):
61
+ """Миксин, для регистрации модели в RegionalDataMartModelEnum."""
62
+
63
+ enum = RegionalDataMartModelEnum
64
+ """Модель-перечисление в которую регистрируется модель."""
65
+
66
+ creating_trigger_models: Tuple[models.Model] = ()
67
+ """Перечень моделей по которым генерируются логи."""
68
+
69
+ loggable_models: Tuple[models.Model] = ()
70
+ """Перечень моделей по которым собираются логи."""
71
+
72
+ @classproperty
73
+ def key(cls) -> str:
74
+ return camel_to_underscore(cls.__name__).upper()
75
+
76
+ @classproperty
77
+ def title(cls):
78
+ return cls._meta.verbose_name
79
+
80
+ @classmethod
81
+ def get_register_params(cls) -> Dict[str, Any]:
82
+ register_params = super().get_register_params()
83
+ register_params['model'] = cls
84
+ register_params['creating_trigger_models'] = cls.creating_trigger_models
85
+ register_params['loggable_models'] = cls.loggable_models
86
+
87
+ return register_params
@@ -0,0 +1,82 @@
1
+ import inspect
2
+ import sys
3
+ from importlib import (
4
+ import_module,
5
+ )
6
+ from operator import (
7
+ attrgetter,
8
+ )
9
+ from typing import (
10
+ Iterable,
11
+ Type,
12
+ )
13
+
14
+ from django.apps import (
15
+ apps,
16
+ )
17
+ from django.db import (
18
+ models,
19
+ )
20
+
21
+ from edu_rdm_integration.enum_register.mixins import (
22
+ EntityEnumRegisterMixin,
23
+ ModelEnumRegisterMixin,
24
+ )
25
+ from edu_rdm_integration.models import (
26
+ BaseEntityModel,
27
+ )
28
+ from educommon.integration_entities.entities import (
29
+ BaseEntity,
30
+ )
31
+ from m3_db_utils.mixins import (
32
+ BaseEnumRegisterMixin,
33
+ )
34
+
35
+
36
+ def register_classes(classes: Iterable[Type[BaseEnumRegisterMixin]]) -> None:
37
+ """Вызывает метод регистрации в модель-перечисление
38
+ у переданных классов.
39
+
40
+ Args:
41
+ classes: Классы, поддерживающие интерфейс регистрации.
42
+ """
43
+ classes = sorted(classes, key=attrgetter('order_number'))
44
+
45
+ for enum_class in classes:
46
+ enum_class.register()
47
+
48
+
49
+ def is_register_model(model: models.Model) -> bool:
50
+ """Проверяет, является ли класс регистрируемой моделью."""
51
+ return issubclass(model, ModelEnumRegisterMixin)
52
+
53
+
54
+ def is_register_entity(class_) -> bool:
55
+ """Проверяет, является ли класс регистрируемой сущностью."""
56
+ return (
57
+ inspect.isclass(class_) and
58
+ issubclass(class_, BaseEntity) and
59
+ issubclass(class_, EntityEnumRegisterMixin)
60
+ )
61
+
62
+
63
+ def register_models() -> None:
64
+ """Регистрирует модели в RegionalDataMartModelEnum."""
65
+ register_classes([
66
+ m for m in apps.get_models() if is_register_model(m)
67
+ ])
68
+
69
+
70
+ def register_entities(import_path: str) -> None:
71
+ """Находит регистрируемые сущности в модуле по переданному пути и
72
+ регистрирует в RegionalDataMartEntityEnum.
73
+
74
+ Args:
75
+ import_path: Путь до пакета, хранящего классы сущностей;
76
+ """
77
+ import_module(import_path)
78
+ entities_module = sys.modules[import_path]
79
+
80
+ register_classes([
81
+ c[1] for c in inspect.getmembers(entities_module, is_register_entity)
82
+ ])
@@ -165,3 +165,42 @@ def split_interval_by_delta(start_date: datetime, end_date: datetime, days_delta
165
165
  intervals = [*zip(iter_interval, iter_interval)]
166
166
 
167
167
  return intervals
168
+
169
+
170
+ def camel_to_underscore(name: str, upper=False) -> str:
171
+ """Переводит строку из верблюжьего в змеиный регистр.
172
+ По умолчанию строка приводится к нижнему регистру.
173
+ Несколько заглавных букв не будут разъединены, кроме последней.
174
+
175
+ Args:
176
+ name: форматируемая строка;
177
+ upper: флаг перевода в верхний регистр;
178
+
179
+ Returns:
180
+ Строка, приведенная к змеиному регистру.
181
+
182
+ >>> camel_to_underscore('ОдинДваТри')
183
+ 'один_два_три'
184
+ >>> camel_to_underscore('Один_два_три')
185
+ 'один_два_три'
186
+ >>> camel_to_underscore('Один_Два_Три')
187
+ 'один_два_три'
188
+ >>> camel_to_underscore('__ОдинДваТри__')
189
+ '__один_два_три__'
190
+ >>> camel_to_underscore('__ОдинДВАТри__')
191
+ '__один_два_три__'
192
+ """
193
+ output = []
194
+ for i, c in enumerate(name):
195
+ if i > 0:
196
+ pc = name[i - 1]
197
+ if c.isupper() and not pc.isupper() and pc != '_':
198
+ output.append('_')
199
+ elif i > 3 and not c.isupper():
200
+ previous = name[i - 3:i]
201
+ if previous.isalpha() and previous.isupper():
202
+ output.insert(len(output) - 1, '_')
203
+
204
+ output.append(c.upper() if upper else c.lower())
205
+
206
+ return ''.join(output)