educommon 3.16.0__tar.gz → 3.18.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 (380) hide show
  1. {educommon-3.16.0 → educommon-3.18.0}/CHANGELOG.md +29 -5
  2. {educommon-3.16.0 → educommon-3.18.0}/PKG-INFO +1 -1
  3. educommon-3.18.0/src/educommon/audit_log/management/commands/audit_log_migrate_data.py +357 -0
  4. educommon-3.18.0/src/educommon/audit_log/migrations/0010_alter_auditlog_time.py +24 -0
  5. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/models.py +4 -1
  6. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/utils/__init__.py +32 -0
  7. {educommon-3.16.0 → educommon-3.18.0}/src/educommon.egg-info/PKG-INFO +1 -1
  8. {educommon-3.16.0 → educommon-3.18.0}/src/educommon.egg-info/SOURCES.txt +2 -0
  9. {educommon-3.16.0 → educommon-3.18.0}/CONDUCT.md +0 -0
  10. {educommon-3.16.0 → educommon-3.18.0}/CONTRIBUTING.md +0 -0
  11. {educommon-3.16.0 → educommon-3.18.0}/MANIFEST.in +0 -0
  12. {educommon-3.16.0 → educommon-3.18.0}/README.md +0 -0
  13. {educommon-3.16.0 → educommon-3.18.0}/pyproject.toml +0 -0
  14. {educommon-3.16.0 → educommon-3.18.0}/setup.cfg +0 -0
  15. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/__init__.py +0 -0
  16. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/README.rst +0 -0
  17. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/__init__.py +0 -0
  18. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/apps.py +0 -0
  19. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/static/edu_about/barsgroup.png +0 -0
  20. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/ui/__init__.py +0 -0
  21. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/ui/about-window.js +0 -0
  22. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/ui/actions.py +0 -0
  23. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/ui/common-tab.html +0 -0
  24. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/ui/packages-tab.js +0 -0
  25. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/ui/postgresql-extensions-tab.js +0 -0
  26. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/ui/ui.py +0 -0
  27. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/about/utils.py +0 -0
  28. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/__init__.py +0 -0
  29. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/actions.py +0 -0
  30. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/apps.py +0 -0
  31. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/consts.py +0 -0
  32. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/exceptions.py +0 -0
  33. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/helpers.py +0 -0
  34. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/locker.py +0 -0
  35. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/migrations/0001_initial.py +0 -0
  36. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/migrations/0002_task_type_and_status_data.py +0 -0
  37. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/migrations/0003_alter_runningtask_options.py +0 -0
  38. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/migrations/__init__.py +0 -0
  39. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/models.py +0 -0
  40. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/tasks.py +0 -0
  41. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/templates/ui-js/async-task-list-win.js +0 -0
  42. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/templates/ui-js/async-task-revoke.js +0 -0
  43. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/templates/ui-js/async-task-view-win.js +0 -0
  44. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_task/ui.py +0 -0
  45. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_tasks/__init__.py +0 -0
  46. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_tasks/apps.py +0 -0
  47. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_tasks/exceptions.py +0 -0
  48. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_tasks/fixtures/initial_data.json +0 -0
  49. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_tasks/locks.py +0 -0
  50. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_tasks/migrations/0001_initial.py +0 -0
  51. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_tasks/migrations/0002_load_initial_data.py +0 -0
  52. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_tasks/migrations/__init__.py +0 -0
  53. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_tasks/models.py +0 -0
  54. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_tasks/statuses.py +0 -0
  55. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/async_tasks/tasks.py +0 -0
  56. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/README.rst +0 -0
  57. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/__init__.py +0 -0
  58. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/actions.py +0 -0
  59. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/app_meta.py +0 -0
  60. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/apps.py +0 -0
  61. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/constants.py +0 -0
  62. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/error_log/__init__.py +0 -0
  63. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/error_log/actions.py +0 -0
  64. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/helpers.py +0 -0
  65. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/management/__init__.py +0 -0
  66. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/management/commands/__init__.py +0 -0
  67. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/management/commands/reinstall_audit_log.py +0 -0
  68. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/middleware.py +0 -0
  69. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/migrations/0001_initial.py +0 -0
  70. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/migrations/0002_install_audit_log.py +0 -0
  71. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/migrations/0003_logproxy.py +0 -0
  72. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/migrations/0004_reinstall_audit_log.py +0 -0
  73. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/migrations/0005_postgresql_error.py +0 -0
  74. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/migrations/0006_auto_20200806_1707.py +0 -0
  75. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/migrations/0007_create_selective_tables_function.py +0 -0
  76. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/migrations/0008_table_logged.py +0 -0
  77. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/migrations/0009_reinstall_audit_log.py +0 -0
  78. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/migrations/__init__.py +0 -0
  79. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/permissions.py +0 -0
  80. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/proxies.py +0 -0
  81. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/routers.py +0 -0
  82. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/sql/configure_audit_log.sql +0 -0
  83. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/sql/install_audit_log.sql +0 -0
  84. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/ui.py +0 -0
  85. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/audit_log/utils/operations.py +0 -0
  86. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/__init__.py +0 -0
  87. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/__init__.py +0 -0
  88. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/actions.py +0 -0
  89. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/app_meta.py +0 -0
  90. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/backends/__init__.py +0 -0
  91. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/backends/base.py +0 -0
  92. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/backends/caching.py +0 -0
  93. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/backends/simple.py +0 -0
  94. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/checker.py +0 -0
  95. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/config.py +0 -0
  96. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/constants.py +0 -0
  97. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/management/__init__.py +0 -0
  98. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/management/commands/__init__.py +0 -0
  99. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/management/commands/rbac.py +0 -0
  100. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/manager.py +0 -0
  101. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/migrations/0001_initial.py +0 -0
  102. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/migrations/0002_model_modifier_metaclass_fix.py +0 -0
  103. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/migrations/0003_permission_hidden.py +0 -0
  104. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/migrations/0004_auto_20171024_1245.py +0 -0
  105. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/migrations/__init__.py +0 -0
  106. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/models.py +0 -0
  107. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/permissions.py +0 -0
  108. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/templates/rbac/role-add-window.js +0 -0
  109. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/templates/rbac/role-edit-window.js +0 -0
  110. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/templates/rbac/roles-list-window.js +0 -0
  111. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/templates/rbac/roles-view-list-window.js +0 -0
  112. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/ui.py +0 -0
  113. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/utils.py +0 -0
  114. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/rbac/validators.py +0 -0
  115. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/__init__.py +0 -0
  116. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/actions.py +0 -0
  117. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/app_meta.py +0 -0
  118. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/checkers.py +0 -0
  119. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/const.py +0 -0
  120. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/migrations/0001_initial.py +0 -0
  121. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/migrations/__init__.py +0 -0
  122. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/models.py +0 -0
  123. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/static/simple_auth/simple_auth.css +0 -0
  124. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/templates/simple_auth/change_reset_password_page.html +0 -0
  125. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/templates/simple_auth/email/reset_password.html +0 -0
  126. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/templates/simple_auth/login_page.html +0 -0
  127. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/templates/simple_auth/reset_password_page.html +0 -0
  128. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/ui.py +0 -0
  129. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/auth/simple_auth/validators.py +0 -0
  130. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/__init__.py +0 -0
  131. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/actions.py +0 -0
  132. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/app_meta.py +0 -0
  133. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/base.py +0 -0
  134. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/catalogs.py +0 -0
  135. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/__init__.py +0 -0
  136. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/actions.py +0 -0
  137. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/apps.py +0 -0
  138. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/migrations/0001_initial.py +0 -0
  139. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/migrations/0002_add_contingent_model_deleted.py +0 -0
  140. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/migrations/__init__.py +0 -0
  141. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/model_views.py +0 -0
  142. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/models.py +0 -0
  143. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/observer.py +0 -0
  144. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/plugin_meta.py +0 -0
  145. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/storage.py +0 -0
  146. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/contingent_plugin/utils.py +0 -0
  147. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/json_data/icao.json +0 -0
  148. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/json_data/okogu.json +0 -0
  149. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/contingent/json_data/oksm.json +0 -0
  150. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/__init__.py +0 -0
  151. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/__init__.py +0 -0
  152. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/fields.py +0 -0
  153. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/migration/__init__.py +0 -0
  154. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/migration/operations.py +0 -0
  155. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/mixins/__init__.py +0 -0
  156. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/mixins/date_interval.py +0 -0
  157. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/mixins/validation.py +0 -0
  158. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/model_view/__init__.py +0 -0
  159. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/model_view/table-view.html +0 -0
  160. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/models.py +0 -0
  161. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/observer.py +0 -0
  162. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/partitioning/README.md +0 -0
  163. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/partitioning/__init__.py +0 -0
  164. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/partitioning/const.py +0 -0
  165. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/partitioning/management/__init__.py +0 -0
  166. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/partitioning/management/commands/__init__.py +0 -0
  167. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/partitioning/management/commands/apply_partitioning.py +0 -0
  168. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/partitioning/management/commands/clear_table.py +0 -0
  169. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/partitioning/management/commands/split_table.py +0 -0
  170. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/partitioning/partitioning.sql +0 -0
  171. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/partitioning/partitioning_set_search_path.sql +0 -0
  172. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/partitioning/triggers.sql +0 -0
  173. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/routers.py +0 -0
  174. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/signals.py +0 -0
  175. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/utils.py +0 -0
  176. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/validators/__init__.py +0 -0
  177. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/db/validators/simple.py +0 -0
  178. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/__init__.py +0 -0
  179. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/README.rst +0 -0
  180. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/__init__.py +0 -0
  181. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/api.py +0 -0
  182. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/app_meta.py +0 -0
  183. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/exceptions.py +0 -0
  184. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/management/__init__.py +0 -0
  185. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/management/commands/__init__.py +0 -0
  186. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/management/commands/atcfs_migrate.py +0 -0
  187. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/models.py +0 -0
  188. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/monkey_patching.py +0 -0
  189. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/settings.py +0 -0
  190. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/storage.py +0 -0
  191. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/django/storages/atcfs/templates/atcfs_unavailable.html +0 -0
  192. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/extjs/__init__.py +0 -0
  193. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/extjs/fields/__init__.py +0 -0
  194. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/extjs/fields/input_params.py +0 -0
  195. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/XLSReader.py +0 -0
  196. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/__init__.py +0 -0
  197. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/api.py +0 -0
  198. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/constants.py +0 -0
  199. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/loggers.py +0 -0
  200. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/proxy.py +0 -0
  201. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/proxy_import.py +0 -0
  202. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/refactoring-notes.txt +0 -0
  203. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/report.py +0 -0
  204. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/test_file.xls +0 -0
  205. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/ui.py +0 -0
  206. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/importer/validators.py +0 -0
  207. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/integration_entities/README.rst +0 -0
  208. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/integration_entities/__init__.py +0 -0
  209. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/integration_entities/consts.py +0 -0
  210. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/integration_entities/entities.py +0 -0
  211. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/integration_entities/enums.py +0 -0
  212. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/integration_entities/helpers.py +0 -0
  213. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/integration_entities/mixins.py +0 -0
  214. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ioc/__init__.py +0 -0
  215. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/logger/__init__.py +0 -0
  216. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/logger/app_settings.py +0 -0
  217. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/logger/apps.py +0 -0
  218. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/logger/consts.py +0 -0
  219. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/logger/formatters.py +0 -0
  220. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/logger/helpers.py +0 -0
  221. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/logger/loggers.py +0 -0
  222. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/logger/records.py +0 -0
  223. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/__init__.py +0 -0
  224. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/extensions/__init__.py +0 -0
  225. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/extensions/listeners/__init__.py +0 -0
  226. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/extensions/listeners/delete_check/__init__.py +0 -0
  227. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/extensions/listeners/delete_check/cancel-confirm-window.js +0 -0
  228. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/extensions/listeners/delete_check/listeners.py +0 -0
  229. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/extensions/listeners/delete_check/mixins.py +0 -0
  230. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/extensions/listeners/delete_check/related-objects-window.html +0 -0
  231. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/extensions/listeners/delete_check/signals.py +0 -0
  232. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/extensions/listeners/delete_check/ui.py +0 -0
  233. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/extensions/listeners/delete_check/utils.py +0 -0
  234. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/extensions/ui.py +0 -0
  235. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/m3/transaction_context.py +0 -0
  236. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/objectpack/__init__.py +0 -0
  237. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/objectpack/actions.py +0 -0
  238. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/objectpack/apps.py +0 -0
  239. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/objectpack/filters.py +0 -0
  240. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/objectpack/templates/base-grid-window.js +0 -0
  241. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/objectpack/templates/filter-panel.js +0 -0
  242. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/objectpack/templates/grid-panel.js +0 -0
  243. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/objectpack/templates/multiSelectWindow.js +0 -0
  244. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/objectpack/templates/multiselect-page-fix.js +0 -0
  245. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/objectpack/templates/relations-check-mixin-template.html +0 -0
  246. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/objectpack/ui.py +0 -0
  247. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/__init__.py +0 -0
  248. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/actions.py +0 -0
  249. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/README.rst +0 -0
  250. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/__init__.py +0 -0
  251. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/app_meta.py +0 -0
  252. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/apps.py +0 -0
  253. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/base.py +0 -0
  254. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/builders/__init__.py +0 -0
  255. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/builders/excel/__init__.py +0 -0
  256. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/builders/excel/_base.py +0 -0
  257. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/builders/excel/_header.py +0 -0
  258. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/builders/excel/constants.py +0 -0
  259. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/builders/excel/product.py +0 -0
  260. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/builders/excel/with_merged_cells.py +0 -0
  261. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/config.py +0 -0
  262. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/constants.py +0 -0
  263. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/editor/__init__.py +0 -0
  264. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/editor/actions.py +0 -0
  265. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/editor/edit-window.js +0 -0
  266. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/editor/list-window.js +0 -0
  267. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/editor/ui.py +0 -0
  268. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/exceptions.py +0 -0
  269. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/migrations/0001_initial.py +0 -0
  270. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/migrations/0002_report_filters.py +0 -0
  271. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/migrations/0003_reportfilter_exclude.py +0 -0
  272. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/migrations/0004_reportfilter_fields.py +0 -0
  273. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/migrations/0005_reportcolumn_visible.py +0 -0
  274. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/migrations/0006_reportsorting.py +0 -0
  275. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/migrations/0007_include_available_units.py +0 -0
  276. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/migrations/0008_auto_20170407_1318.py +0 -0
  277. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/migrations/0009_auto_20180405_0642.py +0 -0
  278. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/migrations/0010_add_aggregate_fields.py +0 -0
  279. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/migrations/__init__.py +0 -0
  280. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/mixins.py +0 -0
  281. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/models.py +0 -0
  282. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/plugin_meta.py +0 -0
  283. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/registries.py +0 -0
  284. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/utils.py +0 -0
  285. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/constructor/validators.py +0 -0
  286. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/reporter.py +0 -0
  287. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/report/utils.py +0 -0
  288. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/rest/__init__.py +0 -0
  289. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/rest/actions.py +0 -0
  290. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/rest/context.py +0 -0
  291. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/rest/controllers.py +0 -0
  292. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/rest/misc.py +0 -0
  293. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/rest/mixins.py +0 -0
  294. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/secure_media/README.rst +0 -0
  295. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/secure_media/__init__.py +0 -0
  296. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/secure_media/app_meta.py +0 -0
  297. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/thread_data.py +0 -0
  298. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/__init__.py +0 -0
  299. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/caching.py +0 -0
  300. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/conversion.py +0 -0
  301. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/crypto.py +0 -0
  302. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/date.py +0 -0
  303. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/db/__init__.py +0 -0
  304. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/db/postgresql.py +0 -0
  305. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/fonts/Arial.ttf +0 -0
  306. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/fonts/Calibri.ttf +0 -0
  307. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/fonts/Tahoma.ttf +0 -0
  308. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/fonts/__init__.py +0 -0
  309. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/licence/__init__.py +0 -0
  310. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/licence/converters.py +0 -0
  311. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/misc.py +0 -0
  312. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/object_grid.py +0 -0
  313. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/phone_number/__init__.py +0 -0
  314. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/phone_number/enums.py +0 -0
  315. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/phone_number/modelfields.py +0 -0
  316. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/phone_number/phone_number.py +0 -0
  317. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/phone_number/validators.py +0 -0
  318. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/plugins.py +0 -0
  319. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/registry.py +0 -0
  320. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/seqtools.py +0 -0
  321. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/serializer.py +0 -0
  322. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/storage.py +0 -0
  323. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/system.py +0 -0
  324. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/system_app/__init__.py +0 -0
  325. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/system_app/management/__init__.py +0 -0
  326. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/system_app/management/commands/__init__.py +0 -0
  327. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/system_app/management/commands/delete_objects.py +0 -0
  328. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/system_app/templatetags/__init__.py +0 -0
  329. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/system_app/templatetags/educommon.py +0 -0
  330. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/ui.py +0 -0
  331. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/xml/__init__.py +0 -0
  332. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/xml/catalog.json +0 -0
  333. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/xml/resolver.py +0 -0
  334. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/xml/saml-schema-assertion-2.0.xsd +0 -0
  335. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/xml/saml-schema-protocol-2.0.xsd +0 -0
  336. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/xml/xenc-schema.xsd +0 -0
  337. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/utils/xml/xmldsig-core-schema.xsd +0 -0
  338. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/README.rst +0 -0
  339. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/__init__.py +0 -0
  340. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/actions.py +0 -0
  341. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/app_meta.py +0 -0
  342. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/base.py +0 -0
  343. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/migrations/0001_initial.py +0 -0
  344. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/migrations/0002_auto_20160628_1334.py +0 -0
  345. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/migrations/0003_add_fields_to_smev_logs.py +0 -0
  346. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/migrations/0004_auto_20160727_1600.py +0 -0
  347. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/migrations/0005_auto_20161130_1615.py +0 -0
  348. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/migrations/0006_auto_20170327_1027.py +0 -0
  349. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/migrations/0007_auto_20180607_1040.py +0 -0
  350. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/migrations/0008_auto_20180713_1445.py +0 -0
  351. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/migrations/0009_auto_20201130_1553.py +0 -0
  352. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/migrations/__init__.py +0 -0
  353. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/models.py +0 -0
  354. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/provider.py +0 -0
  355. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/report.py +0 -0
  356. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/smev/__init__.py +0 -0
  357. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/smev/applications.py +0 -0
  358. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/smev/exceptions.py +0 -0
  359. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/templates/report/smev_logs.xlsx +0 -0
  360. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/templates/ui-js/smev-logs-list-window.js +0 -0
  361. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/templates/ui-js/smev-logs-report-setting-window.js +0 -0
  362. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/ui.py +0 -0
  363. {educommon-3.16.0 → educommon-3.18.0}/src/educommon/ws_log/utils.py +0 -0
  364. {educommon-3.16.0 → educommon-3.18.0}/src/educommon.egg-info/dependency_links.txt +0 -0
  365. {educommon-3.16.0 → educommon-3.18.0}/src/educommon.egg-info/requires.txt +0 -0
  366. {educommon-3.16.0 → educommon-3.18.0}/src/educommon.egg-info/top_level.txt +0 -0
  367. {educommon-3.16.0 → educommon-3.18.0}/tests/test_contingent_plugin_utils.py +0 -0
  368. {educommon-3.16.0 → educommon-3.18.0}/tests/test_dates_splitter.py +0 -0
  369. {educommon-3.16.0 → educommon-3.18.0}/tests/test_delete_check.py +0 -0
  370. {educommon-3.16.0 → educommon-3.18.0}/tests/test_delete_objects.py +0 -0
  371. {educommon-3.16.0 → educommon-3.18.0}/tests/test_django_db_utils.py +0 -0
  372. {educommon-3.16.0 → educommon-3.18.0}/tests/test_interval_mixins.py +0 -0
  373. {educommon-3.16.0 → educommon-3.18.0}/tests/test_personal_data_fields.py +0 -0
  374. {educommon-3.16.0 → educommon-3.18.0}/tests/test_phone_number.py +0 -0
  375. {educommon-3.16.0 → educommon-3.18.0}/tests/test_report.py +0 -0
  376. {educommon-3.16.0 → educommon-3.18.0}/tests/test_service_db_router.py +0 -0
  377. {educommon-3.16.0 → educommon-3.18.0}/tests/test_utils.py +0 -0
  378. {educommon-3.16.0 → educommon-3.18.0}/tests/test_utils_plugins.py +0 -0
  379. {educommon-3.16.0 → educommon-3.18.0}/tests/test_validators.py +0 -0
  380. {educommon-3.16.0 → educommon-3.18.0}/tests/tests_rbac.py +0 -0
@@ -28,6 +28,30 @@
28
28
  ### Удалено
29
29
 
30
30
 
31
+ # [3.18.0] - 2025-06-05
32
+
33
+ ### Добавлено
34
+
35
+ - [EDUSCHL-23442](https://jira.bars.group/browse/EDUSCHL-23442)
36
+ MINOR Добавлена manage-команда переноса логов из локальных приложений в educommon.audit_log
37
+
38
+ ### Изменено
39
+
40
+ - [EDUSCHL-23442](https://jira.bars.group/browse/EDUSCHL-23442)
41
+ PATCH В поле AuditLog.time auto_now_add заменен на default
42
+
43
+
44
+ # [3.17.0] - 2025-05-28
45
+
46
+ Добавлена проверка конфликтующих таблиц которые должны логироваться, но находятся в сервисных приложениях.
47
+
48
+ ### Добавлено
49
+
50
+ - [EDUSCHL-23590](https://jira.bars.group/browse/EDUSCHL-23590)
51
+ MINOR Добавлена функция get_table_names_for_app_labels для получения множества с именами таблиц для указанных приложений.
52
+ Добавлена проверка конфликтующих таблиц которые должны логироваться, но находятся в сервисных приложениях.
53
+
54
+
31
55
  # [3.16.0] - 2025-05-15
32
56
 
33
57
  Добавлена настройка передачи дополнительных SQL файлов для выполнения в МК reinstall_audit_log.
@@ -72,9 +96,9 @@
72
96
  ### Изменено
73
97
 
74
98
  - [EDUSCHL-23386](https://jira.bars.group/browse/EDUSCHL-23386)
75
- MINOR Классы LogProxy, AuditLogPack преобразованы в абстрактные с добавлением абстрактных методов для
99
+ MINOR Классы LogProxy, AuditLogPack преобразованы в абстрактные с добавлением абстрактных методов для
76
100
  извлечения исходных данных необходимых при: отображении ФИО пользователя в журнале изменений; фильтрации по ФИО;
77
- отображении ФИО, организации в окне редактирования записи журнала изменений.
101
+ отображении ФИО, организации в окне редактирования записи журнала изменений.
78
102
  Подробнее о необходимых настройках в audit_log/README.rst.
79
103
 
80
104
 
@@ -83,7 +107,7 @@
83
107
  Небольшой рефакторинг для корректной сборки пакета.
84
108
 
85
109
  ### Изменено
86
-
110
+
87
111
  - MINOR Удалены ненужные файлы, актуализирована сборка пакета.
88
112
 
89
113
 
@@ -106,14 +130,14 @@
106
130
  PATCH Заменено устаревшее строковое форматирование `%` на f-строки и `.format()`.
107
131
  PATCH Проведён широкий рефакторинг кода с использованием `ruff`: улучшена читаемость, устранены потенциальные ошибки и упрощена структура модулей.
108
132
  - [EDUKNDG-15346](https://jira.bars.group/browse/EDUKNDG-15346)
109
- PATCH Исправлена минимальная дата для валидатора поля RangedDateField и BirthDateField.
133
+ PATCH Исправлена минимальная дата для валидатора поля RangedDateField и BirthDateField.
110
134
  - [EDUSCHL-23422](https://jira.bars.group/browse/EDUSCHL-23422)
111
135
  PATCH Тип сообщения о предотвращении доступа к БД, по которой не проводистя миграция,
112
136
  с `warning` изменён на `debug`
113
137
 
114
138
  ### Удалено
115
139
 
116
- - [EDUDEVOPS-28](https://jira.bars.group/browse/EDUDEVOPS-28)
140
+ - [EDUDEVOPS-28](https://jira.bars.group/browse/EDUDEVOPS-28)
117
141
  PATCH Удалены остатки поддержки Python2: директивы `__future__`, проверки `sys.version_info`, типы `unicode`, `basestring` и др.
118
142
 
119
143
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: educommon
3
- Version: 3.16.0
3
+ Version: 3.18.0
4
4
  Summary: Общая кодовая база для проектов БЦ Образование
5
5
  Author-email: BARS Group <education_dev@bars-open.ru>
6
6
  Project-URL: Homepage, https://stash.bars-open.ru/projects/EDUBASE/repos/educommon/browse
@@ -0,0 +1,357 @@
1
+ """
2
+ Команда переноса данных из локального AuditLog'а в educommon'овский.
3
+ """
4
+ import sys
5
+ from datetime import (
6
+ datetime as dt,
7
+ )
8
+ from typing import (
9
+ TYPE_CHECKING,
10
+ Generator,
11
+ Optional,
12
+ Type,
13
+ )
14
+
15
+ from dateutil.relativedelta import (
16
+ relativedelta,
17
+ )
18
+ from django.apps import (
19
+ apps,
20
+ )
21
+ from django.core.management.base import (
22
+ BaseCommand,
23
+ OutputWrapper,
24
+ )
25
+ from django.db.models import (
26
+ ManyToManyField,
27
+ Model,
28
+ )
29
+
30
+ from educommon.audit_log.models import (
31
+ AuditLog,
32
+ Table,
33
+ )
34
+ from educommon.audit_log.utils import (
35
+ get_model_by_table,
36
+ )
37
+
38
+
39
+ if TYPE_CHECKING:
40
+ from django.db.models.query import (
41
+ QuerySet,
42
+ )
43
+
44
+
45
+ PROJECT_LOCAL_AUDIT_LOG_APP = {
46
+ 'eduschl': 'web_edu_audit_log',
47
+ 'edussuz': 'audit_log_ssuz',
48
+ 'edukndg': 'audit_log_kndg'
49
+ }
50
+ LOG_OPERATION_MAP = {
51
+ 'N': AuditLog.OPERATION_CREATE,
52
+ 'I': AuditLog.OPERATION_CREATE,
53
+ 'U': AuditLog.OPERATION_UPDATE,
54
+ 'D': AuditLog.OPERATION_DELETE,
55
+ }
56
+ LOCAL_AUDIT_LOG_MODEL_NAME = 'Log'
57
+ DEFAULT_DATE_YEAR_RANGE = 1
58
+
59
+
60
+ class BulkSaver:
61
+ """Контекстный менеджер для группового сохранения записей."""
62
+
63
+ def __init__(self, bulk_size: int) -> None:
64
+ self._bulk_size = bulk_size
65
+ self._bulk_list = []
66
+
67
+ def __enter__(self):
68
+ return self
69
+
70
+ def __exit__(self, *exc):
71
+ self._bulk_save()
72
+
73
+ def save(self, audit_log: AuditLog):
74
+ self._bulk_list.append(audit_log)
75
+ if len(self._bulk_list) >= self._bulk_size:
76
+ self._bulk_save()
77
+
78
+ def _bulk_save(self):
79
+ AuditLog.objects.bulk_create(self._bulk_list)
80
+ self._bulk_list.clear()
81
+
82
+
83
+ class LogMigrator:
84
+ """Класс для миграции логов из локального AuditLog'а в educommon'овский."""
85
+
86
+ def __init__(self, stdout: OutputWrapper):
87
+ """Инициализация."""
88
+ self._stdout = stdout
89
+
90
+ @staticmethod
91
+ def get_model(model_name: str) -> Optional[Type[Model]]:
92
+ """Bозвращает класс модели по имени."""
93
+ for mod in apps.get_models():
94
+ if mod.__name__ == model_name and mod.__module__.find('django') == -1:
95
+ return mod
96
+
97
+ return None
98
+
99
+ def _get_educommon_table(self, model_name: str, create: bool = False) -> tuple[Optional[Table], str]:
100
+ """Возвращает таблицу, отслеживаемую системой аудита."""
101
+ model_cls = self.get_model(model_name)
102
+
103
+ if not model_cls:
104
+ return None, f'Не найдено Django моделей с именем {model_name}'
105
+ try:
106
+ return Table.objects.get(name=model_cls._meta.db_table), ''
107
+ except Table.DoesNotExist:
108
+ is_loggable_mixin_use = getattr(model_cls, 'need_to_log', False)
109
+
110
+ if not is_loggable_mixin_use:
111
+ return None, (
112
+ f'В таблицу {model_name} не добавлен LoggableModelMixin'
113
+ )
114
+
115
+ if create:
116
+ return Table.objects.create(
117
+ name=model_cls._meta.db_table,
118
+ schema='public',
119
+ logged=True,
120
+ ), ''
121
+
122
+ return None, (
123
+ f'В educommon не найдено таблицы с именем {model_cls._meta.db_table}. '
124
+ 'Таблицу можно создать, указав флаг force_create_educommon_table'
125
+ )
126
+
127
+ @staticmethod
128
+ def _get_fields_map(table: Table) -> dict[str, str]:
129
+ """Возвращает словарь соответствия поля модели и его названия."""
130
+ return {
131
+ field.name: field.attname
132
+ for field in get_model_by_table(table)._meta.get_fields()
133
+ if field.concrete and not isinstance(field, ManyToManyField)
134
+ }
135
+
136
+ def _get_local_audit_log_query(
137
+ self,
138
+ project: str,
139
+ model_name: str,
140
+ date_from: dt,
141
+ date_to: dt
142
+ ) -> tuple[Optional['QuerySet'], str]:
143
+ """Возвращает QuerySet с локальными логами."""
144
+ if not (audit_log_app_name := PROJECT_LOCAL_AUDIT_LOG_APP.get(project)):
145
+ return None, 'Неизвестное название проекта.'
146
+
147
+ audit_log_model = apps.get_model(audit_log_app_name, LOCAL_AUDIT_LOG_MODEL_NAME)
148
+
149
+ if not audit_log_model:
150
+ return None, 'Не найдена локальная модель логов.'
151
+
152
+ return audit_log_model.objects.filter(
153
+ model=model_name,
154
+ date__lt=date_to,
155
+ date__gte=date_from,
156
+ ), ''
157
+
158
+ @staticmethod
159
+ def _prepare_local_logs(query: 'QuerySet') -> Generator[tuple, None, None]:
160
+ """Подготавливает данные логов для дальнейшего использования."""
161
+ query = query.values_list(
162
+ 'user_id',
163
+ 'date',
164
+ 'model_id',
165
+ 'object_json',
166
+ 'ip',
167
+ 'operation',
168
+ ).order_by(
169
+ 'date',
170
+ )
171
+ for user_id, date_, model_id, object_json, ip, operation in query.iterator():
172
+ yield user_id, date_, model_id, ip, operation, object_json
173
+
174
+ @staticmethod
175
+ def _prepare_object_dict(fields_map: dict, object_dict: Optional[dict]) -> dict[str, str]:
176
+ """Подготавливает данные о объекте для AuditLog.
177
+
178
+ В основном требуется только для переименования ForeignKey-полей вида
179
+ `period` в `period_id`
180
+ """
181
+ if not object_dict:
182
+ return {}
183
+
184
+ filled_field_names = set(fields_map).intersection(object_dict)
185
+ return {
186
+ fields_map[field_name]: object_dict[field_name]
187
+ for field_name in filled_field_names
188
+ }
189
+
190
+ def process(
191
+ self,
192
+ model_name: str,
193
+ project: str,
194
+ bulk_save_size: int,
195
+ date_from: Optional[dt] = None,
196
+ date_to: Optional[dt] = None,
197
+ force_create_educommon_table: bool = False,
198
+ ):
199
+ """Перенос записей из локального AuditLog'а в educommon."""
200
+ table, error = self._get_educommon_table(model_name, force_create_educommon_table)
201
+ if error:
202
+ self._stdout.write(error)
203
+ return
204
+
205
+ fields_map = self._get_fields_map(table)
206
+
207
+ first_audit_log_date = self._get_first_audit_log_date(table)
208
+ date_to = dt.combine((date_to or dt.today()), dt.max.time())
209
+
210
+ date_to = min(date_to, first_audit_log_date)
211
+ date_from = date_from or (date_to - relativedelta(years=DEFAULT_DATE_YEAR_RANGE))
212
+
213
+ self._stdout.write(
214
+ f'Поиск записей в локальном Auditlog с {date_from} по {date_to}... ',
215
+ ending='',
216
+ )
217
+
218
+ local_audit_log_query, error = self._get_local_audit_log_query(
219
+ project=project,
220
+ model_name=model_name,
221
+ date_from=date_from,
222
+ date_to=date_to,
223
+ )
224
+ if error:
225
+ self._stdout.write(error)
226
+ return
227
+
228
+ total_count = local_audit_log_query.count()
229
+ self._stdout.write(f'Найдено {total_count} запись(ей).')
230
+
231
+ local_logs = self._prepare_local_logs(local_audit_log_query)
232
+ self._stdout.write(f'Подготовка к работе... (занимает некоторое время)', ending='\r',)
233
+ with BulkSaver(bulk_save_size) as bulk:
234
+ for count, (user_id, date_, object_id, ip, operation, data_dict) in enumerate(local_logs, start=1):
235
+ object_dict = self._prepare_object_dict(fields_map, data_dict[0].get('fields', {}))
236
+
237
+ operation = LOG_OPERATION_MAP[operation]
238
+
239
+ if operation == AuditLog.OPERATION_UPDATE:
240
+ changes = object_dict
241
+ else:
242
+ # Если объект быз создан или удалён, то изменений нет.
243
+ changes = {}
244
+
245
+ bulk.save(AuditLog(
246
+ user_id=user_id,
247
+ ip=ip,
248
+ time=date_,
249
+ table_id=table.id,
250
+ data=object_dict,
251
+ changes=changes,
252
+ object_id=object_id,
253
+ operation=operation,
254
+ ))
255
+
256
+ self._stdout.write(
257
+ f'Обработано {(count / total_count) * 100:5.2f}% запись(ей)... (Последняя от {date_})',
258
+ ending='\r',
259
+ )
260
+
261
+ def _get_first_audit_log_date(self, table: str) -> dt:
262
+ """Возвращает первую дату/время появления audit_log по переданной таблице.
263
+
264
+ В случае отсуствия логов прекращает выполнение команды за отсутствием данных для переноса.
265
+ """
266
+ first_log = AuditLog.objects.filter(
267
+ table=table,
268
+ ).order_by('time').first()
269
+
270
+ if not first_log:
271
+ self._stdout.write('Не найдены локальные логи переданной модели. Завершение команды.')
272
+ sys.exit()
273
+
274
+ return first_log.time
275
+
276
+
277
+ class Command(BaseCommand):
278
+ """Команда переноса данных из локального AuditLog'а в educommon'овский."""
279
+
280
+ help = (
281
+ 'Команда для переноса данных из локального AuditLog`а в educommon.audit_log.models.AuditLog.\n'
282
+ 'Пример использования:\n'
283
+ 'audit_log_migrate_data --project eduschl --model_name Mark --date_from 10.10.2024'
284
+ )
285
+
286
+ @staticmethod
287
+ def _get_date(date_string: str) -> dt:
288
+ return dt.strptime(date_string, '%d.%m.%Y')
289
+
290
+ def add_arguments(self, parser):
291
+ parser.add_argument(
292
+ '--model_name',
293
+ type=str,
294
+ help='Название модели из локального лога',
295
+ )
296
+ parser.add_argument(
297
+ '--project',
298
+ type=str,
299
+ help='Наименование (код) продукта, в котором применяется команда',
300
+ )
301
+ parser.add_argument(
302
+ '--date_from',
303
+ type=self._get_date,
304
+ required=False,
305
+ help=(
306
+ 'Дата, с которой будут переноситься логи в формате ДД.ММ.ГГГГ. '
307
+ 'Значение по умолчанию - на год раньше даты, указанной в --date_to'
308
+ ),
309
+ )
310
+ parser.add_argument(
311
+ '--date_to',
312
+ type=self._get_date,
313
+ required=False,
314
+ help=(
315
+ 'Дата, по которую будут переноситься логи в формате ДД.ММ.ГГГГ.'
316
+ 'Значение по умолчанию - текущая дата.'
317
+ ),
318
+ )
319
+ parser.add_argument(
320
+ '--force_create_educommon_table',
321
+ action='store_true',
322
+ default=False,
323
+ help=(
324
+ 'Создание отслеживаемой таблицы (educommon.audit_log.models.Table), '
325
+ 'если она еще не была создана'
326
+ ),
327
+ )
328
+ parser.add_argument(
329
+ '--bulk_save_size',
330
+ type=int,
331
+ default=500,
332
+ help='По сколько записей за раз будет сохраняться. По умолчанию 500',
333
+ )
334
+
335
+ def handle(
336
+ self,
337
+ model_name: str,
338
+ project: str,
339
+ date_from: Optional[dt],
340
+ date_to: Optional[dt],
341
+ force_create_educommon_table: bool,
342
+ bulk_save_size: int,
343
+ *args,
344
+ **options,
345
+ ):
346
+ """Выполнение переноса записей."""
347
+ self.stdout.write('Начало работы команды.')
348
+ LogMigrator(self.stdout).process(
349
+ model_name=model_name,
350
+ project=project,
351
+ date_from=date_from,
352
+ date_to=date_to,
353
+ force_create_educommon_table=force_create_educommon_table,
354
+ bulk_save_size=bulk_save_size,
355
+ )
356
+
357
+ self.stdout.write(self.style.SUCCESS('Выполнение команды завершено.'))
@@ -0,0 +1,24 @@
1
+ # Generated by Django 3.2.24 on 2025-05-16 12:04
2
+
3
+ from django.db import (
4
+ migrations,
5
+ models,
6
+ )
7
+ from django.utils import (
8
+ timezone,
9
+ )
10
+
11
+
12
+ class Migration(migrations.Migration):
13
+
14
+ dependencies = [
15
+ ('audit_log', '0009_reinstall_audit_log'),
16
+ ]
17
+
18
+ operations = [
19
+ migrations.AlterField(
20
+ model_name='auditlog',
21
+ name='time',
22
+ field=models.DateTimeField(db_index=True, default=timezone.now, verbose_name='Дата, время'),
23
+ ),
24
+ ]
@@ -41,6 +41,9 @@ from django.db.backends.signals import (
41
41
  from django.dispatch.dispatcher import (
42
42
  receiver,
43
43
  )
44
+ from django.utils import (
45
+ timezone,
46
+ )
44
47
 
45
48
  from educommon.audit_log.utils import (
46
49
  get_audit_log_context,
@@ -115,7 +118,7 @@ class AuditLog(ReadOnlyMixin, BaseModel):
115
118
  verbose_name='Тип пользователя',
116
119
  )
117
120
  ip = models.GenericIPAddressField(null=True, verbose_name='IP адрес')
118
- time = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Дата, время')
121
+ time = models.DateTimeField(default=timezone.now, db_index=True, verbose_name='Дата, время')
119
122
  table = models.ForeignKey(
120
123
  Table,
121
124
  verbose_name='Таблица',
@@ -40,6 +40,7 @@ from django.db.transaction import (
40
40
  from django.http import (
41
41
  HttpRequest,
42
42
  )
43
+
43
44
  from m3_django_compat import (
44
45
  get_related,
45
46
  )
@@ -52,6 +53,9 @@ from educommon.audit_log.constants import (
52
53
  PG_LOCK_ID,
53
54
  SQL_FILES_DIR,
54
55
  )
56
+ from educommon.logger import (
57
+ error as logger_error,
58
+ )
55
59
  from educommon.utils.misc import (
56
60
  cached_property,
57
61
  )
@@ -99,6 +103,19 @@ def get_need_to_log_table_names() -> Set[str]:
99
103
  return table_names
100
104
 
101
105
 
106
+ def get_table_names_for_app_labels(app_labels: Iterable[str]) -> Set[str]:
107
+ """Возвращает множество с именами таблиц для указанных приложений."""
108
+ tables = set()
109
+ for app_label in app_labels:
110
+ try:
111
+ app_config = apps.get_app_config(app_label)
112
+ tables.update(model._meta.db_table for model in app_config.get_models())
113
+ except LookupError:
114
+ continue
115
+
116
+ return tables
117
+
118
+
102
119
  def update_or_create_tables(need_to_log_table_names: Iterable[str]) -> bool:
103
120
  """Создаёт записи Table для отслеживаемых таблиц, либо меняет флаг logged.
104
121
 
@@ -109,6 +126,21 @@ def update_or_create_tables(need_to_log_table_names: Iterable[str]) -> bool:
109
126
  need_to_log_table_names = set(need_to_log_table_names)
110
127
  existed_table_names = set(Table.objects.filter(schema='public').values_list('name', flat=True))
111
128
 
129
+ # Таблицы сервисных приложений, которые не должны отслеживаться аудит-логом
130
+ allowed_service_apps_labels = getattr(settings, 'ALLOWED_SERVICE_APPS_LABELS', [])
131
+ service_table_names = get_table_names_for_app_labels(allowed_service_apps_labels)
132
+
133
+ # Проверка конфликтных таблиц: должны логироваться, но находятся в сервисных приложениях
134
+ conflicting_tables = need_to_log_table_names & service_table_names
135
+ if conflicting_tables:
136
+ tables = ', '.join(sorted(conflicting_tables))
137
+ error_msg = (
138
+ f'Невозможно включить логирование для сервисных таблиц: {tables}. '
139
+ 'Исключите их из отслеживания или перенесите таблицы в основную БД.'
140
+ )
141
+ logger_error(error_msg)
142
+ raise ValueError(error_msg)
143
+
112
144
  to_create_table_names = need_to_log_table_names - existed_table_names
113
145
  to_disable_table_names = existed_table_names - need_to_log_table_names
114
146
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: educommon
3
- Version: 3.16.0
3
+ Version: 3.18.0
4
4
  Summary: Общая кодовая база для проектов БЦ Образование
5
5
  Author-email: BARS Group <education_dev@bars-open.ru>
6
6
  Project-URL: Homepage, https://stash.bars-open.ru/projects/EDUBASE/repos/educommon/browse
@@ -68,6 +68,7 @@ src/educommon/audit_log/error_log/__init__.py
68
68
  src/educommon/audit_log/error_log/actions.py
69
69
  src/educommon/audit_log/management/__init__.py
70
70
  src/educommon/audit_log/management/commands/__init__.py
71
+ src/educommon/audit_log/management/commands/audit_log_migrate_data.py
71
72
  src/educommon/audit_log/management/commands/reinstall_audit_log.py
72
73
  src/educommon/audit_log/migrations/0001_initial.py
73
74
  src/educommon/audit_log/migrations/0002_install_audit_log.py
@@ -78,6 +79,7 @@ src/educommon/audit_log/migrations/0006_auto_20200806_1707.py
78
79
  src/educommon/audit_log/migrations/0007_create_selective_tables_function.py
79
80
  src/educommon/audit_log/migrations/0008_table_logged.py
80
81
  src/educommon/audit_log/migrations/0009_reinstall_audit_log.py
82
+ src/educommon/audit_log/migrations/0010_alter_auditlog_time.py
81
83
  src/educommon/audit_log/migrations/__init__.py
82
84
  src/educommon/audit_log/sql/configure_audit_log.sql
83
85
  src/educommon/audit_log/sql/install_audit_log.sql
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes