django-pfx 1.4.dev94__tar.gz → 1.4.dev98__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 (186) hide show
  1. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/PKG-INFO +1 -1
  2. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/django_pfx.egg-info/SOURCES.txt +1 -0
  4. django_pfx-1.4.dev98/pfx/pfxcore/apps.py +96 -0
  5. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/default_settings.py +0 -1
  6. django_pfx-1.4.dev98/tests/apps.py +7 -0
  7. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/basic_api_test.py +7 -0
  8. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_post_migrate_groups_update.py +23 -34
  9. django_pfx-1.4.dev94/pfx/pfxcore/apps.py +0 -36
  10. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/.gitignore +0 -0
  11. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/.gitlab-ci.yml +0 -0
  12. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/.pre-commit-config.yaml +0 -0
  13. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/LICENSE +0 -0
  14. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/MANIFEST.in +0 -0
  15. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/README.md +0 -0
  16. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/django_pfx.egg-info/dependency_links.txt +0 -0
  17. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/django_pfx.egg-info/requires.txt +0 -0
  18. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/django_pfx.egg-info/top_level.txt +0 -0
  19. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/Makefile +0 -0
  20. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/conf.py +0 -0
  21. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/index.rst +0 -0
  22. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/source/api.views.rst +0 -0
  23. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/source/authentication.md +0 -0
  24. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/source/decorator.md +0 -0
  25. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/source/generate_openapi.md +0 -0
  26. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/source/getting_started.md +0 -0
  27. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/source/internationalisation.md +0 -0
  28. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/source/model.md +0 -0
  29. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/source/pfx_views.md +0 -0
  30. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/source/profiling.md +0 -0
  31. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/source/settings.md +0 -0
  32. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/doc/source/testing.md +0 -0
  33. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/img/pfx.png +0 -0
  34. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/img/pfx.svg +0 -0
  35. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/make_messages +0 -0
  36. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/manage.py +0 -0
  37. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/__init__.py +0 -0
  38. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/__init__.py +0 -0
  39. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/apidoc/__init__.py +0 -0
  40. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/apidoc/parameters.py +0 -0
  41. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/apidoc/schema.py +0 -0
  42. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/apidoc/tags.py +0 -0
  43. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/decorator/__init__.py +0 -0
  44. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/decorator/rest.py +0 -0
  45. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/exceptions.py +0 -0
  46. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/fields.py +0 -0
  47. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/http/__init__.py +0 -0
  48. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/http/json_response.py +0 -0
  49. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  50. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +0 -0
  51. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/management/__init__.py +0 -0
  52. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/management/commands/__init__.py +0 -0
  53. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  54. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/management/commands/profile.py +0 -0
  55. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/middleware/__init__.py +0 -0
  56. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/middleware/authentication.py +0 -0
  57. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/middleware/locale.py +0 -0
  58. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/middleware/profiling.py +0 -0
  59. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  60. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  61. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  62. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/migrations/__init__.py +0 -0
  63. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  64. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  65. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/models/__init__.py +0 -0
  66. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  67. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/models/cache_mixins.py +0 -0
  68. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/models/login_ban.py +0 -0
  69. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/models/not_null_fields.py +0 -0
  70. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  71. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  72. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/models/pfx_models.py +0 -0
  73. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/models/pfx_user.py +0 -0
  74. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  75. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/serializers/__init__.py +0 -0
  76. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/serializers/json.py +0 -0
  77. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/settings.py +0 -0
  78. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/shortcuts.py +0 -0
  79. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/storage/__init__.py +0 -0
  80. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/storage/s3_storage.py +0 -0
  81. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  82. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  83. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  84. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  85. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  86. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  87. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/test.py +0 -0
  88. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/urls.py +0 -0
  89. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/__init__.py +0 -0
  90. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/authentication_views.py +0 -0
  91. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/fields.py +0 -0
  92. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/filters_views.py +0 -0
  93. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/locale_views.py +0 -0
  94. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  95. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  96. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  97. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/groups.py +0 -0
  98. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  99. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  100. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  101. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  102. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  103. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  104. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  105. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  106. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  107. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/subset.py +0 -0
  108. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  109. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  110. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  111. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  112. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  113. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/pfxcore/views/rest_views.py +0 -0
  114. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/settings/__init__.py +0 -0
  115. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pfx/settings/dev.py +0 -0
  116. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/pyproject.toml +0 -0
  117. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/requirements.txt +0 -0
  118. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/serve-doc +0 -0
  119. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/setup.cfg +0 -0
  120. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/setup.py +0 -0
  121. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/__init__.py +0 -0
  122. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  123. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/migrations/0001_initial.py +0 -0
  124. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/migrations/__init__.py +0 -0
  125. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/models.py +0 -0
  126. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/settings/__init__.py +0 -0
  127. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/settings/ci.py +0 -0
  128. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/settings/common.py +0 -0
  129. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/settings/dev.py +0 -0
  130. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/settings/dev_custom_example.py +0 -0
  131. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/settings/dev_default.py +0 -0
  132. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/__init__.py +0 -0
  133. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/basic_api_errors.py +0 -0
  134. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_api_doc.py +0 -0
  135. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_api_doc_search.py +0 -0
  136. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_auth_api.py +0 -0
  137. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_body_mixin.py +0 -0
  138. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_cache.py +0 -0
  139. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_client.py +0 -0
  140. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_fields_choices.py +0 -0
  141. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_fields_minutes_duration.py +0 -0
  142. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_filters.py +0 -0
  143. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_locale_api.py +0 -0
  144. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  145. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_perm_tests.py +0 -0
  146. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_permissions.py +0 -0
  147. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_perms_api.py +0 -0
  148. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_profiling_middleware.py +0 -0
  149. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_settings.py +0 -0
  150. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_shortcuts.py +0 -0
  151. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_timezone_middleware.py +0 -0
  152. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_tools.py +0 -0
  153. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_user_queryset.py +0 -0
  154. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_view_decorators.py +0 -0
  155. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/tests/test_view_fields.py +0 -0
  156. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/urls.py +0 -0
  157. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests/views.py +0 -0
  158. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/__init__.py +0 -0
  159. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/migrations/0001_initial.py +0 -0
  160. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/migrations/__init__.py +0 -0
  161. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/settings/__init__.py +0 -0
  162. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/settings/ci.py +0 -0
  163. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/settings/common.py +0 -0
  164. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/settings/dev.py +0 -0
  165. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/settings/dev_custom_example.py +0 -0
  166. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/settings/dev_default.py +0 -0
  167. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/tests/__init__.py +0 -0
  168. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/tests/test_api.py +0 -0
  169. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/tests/test_auth_api.py +0 -0
  170. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/urls.py +0 -0
  171. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_base_user/views.py +0 -0
  172. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/__init__.py +0 -0
  173. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/migrations/0001_initial.py +0 -0
  174. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/migrations/__init__.py +0 -0
  175. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/models.py +0 -0
  176. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/settings/__init__.py +0 -0
  177. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/settings/ci.py +0 -0
  178. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/settings/common.py +0 -0
  179. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/settings/dev.py +0 -0
  180. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/settings/dev_custom_example.py +0 -0
  181. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/settings/dev_default.py +0 -0
  182. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/tests/__init__.py +0 -0
  183. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/tests/test_api.py +0 -0
  184. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/tests/test_auth_api.py +0 -0
  185. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/urls.py +0 -0
  186. {django_pfx-1.4.dev94 → django_pfx-1.4.dev98}/tests_custom_user/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: django-pfx
3
- Version: 1.4.dev94
3
+ Version: 1.4.dev98
4
4
  Summary: Django PFX is a toolkit designed to streamline the development of RESTful APIs using the Django framework.
5
5
  Author: Hervé Martinet
6
6
  Author-email: herve.martinet@gmail.com
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: django-pfx
3
- Version: 1.4.dev94
3
+ Version: 1.4.dev98
4
4
  Summary: Django PFX is a toolkit designed to streamline the development of RESTful APIs using the Django framework.
5
5
  Author: Hervé Martinet
6
6
  Author-email: herve.martinet@gmail.com
@@ -114,6 +114,7 @@ pfx/pfxcore/views/parameters/subset_page_subset.py
114
114
  pfx/settings/__init__.py
115
115
  pfx/settings/dev.py
116
116
  tests/__init__.py
117
+ tests/apps.py
117
118
  tests/models.py
118
119
  tests/urls.py
119
120
  tests/views.py
@@ -0,0 +1,96 @@
1
+ import inspect
2
+ import logging
3
+ from pathlib import Path
4
+
5
+ from django import apps
6
+ from django.apps import AppConfig
7
+ from django.db.models.signals import post_migrate
8
+
9
+ import yaml
10
+
11
+ from pfx.pfxcore.shortcuts import permissions, settings
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ def update_groups_permissions(
17
+ groups, base_path, group_cache, is_last, module, out=True):
18
+ from django.contrib.auth.models import Group
19
+
20
+ out and print(f"Import file {base_path}/groups.yaml", end=" ")
21
+ todo = False
22
+
23
+ def log(txt):
24
+ if not out:
25
+ return
26
+ nonlocal todo
27
+ if not todo:
28
+ print()
29
+ todo = True
30
+ print(" * ", txt)
31
+
32
+ db_groups = {g.name: g for g in Group.objects.all()}
33
+
34
+ for name, perms in groups.items():
35
+ group_cache.add(name)
36
+ created = name not in db_groups
37
+ group = Group.objects.create(name=name) if created else db_groups[name]
38
+ if created:
39
+ log(f"Create group {name}")
40
+ current_perms = {
41
+ f'{p.content_type.app_label}.{p.codename}'
42
+ for p in group.permissions.filter(content_type__app_label=module)}
43
+ if created or not settings.PFX_AUTH_GROUPS_CREATE_ONLY:
44
+ to_add = set(perms) - current_perms
45
+ to_remove = current_perms - set(perms)
46
+ if to_add:
47
+ log(f"Add permissions for group {name}: {', '.join(to_add)}")
48
+ group.permissions.add(*permissions(*to_add))
49
+ if to_remove:
50
+ log(f"Remove permissions for group {name}: "
51
+ f"{', '.join(to_remove)}")
52
+ group.permissions.remove(*permissions(*to_remove))
53
+
54
+ if is_last and not settings.PFX_AUTH_GROUPS_CREATE_ONLY:
55
+ names = db_groups.keys() - group_cache
56
+ if names:
57
+ log(f"Delete groups: {', '.join(names)}")
58
+ Group.objects.filter(name__in=names).delete()
59
+
60
+ if not todo:
61
+ out and print("[nothing to do]")
62
+
63
+
64
+ def update_groups_permissions_action(sender, **kwargs):
65
+ if not isinstance(sender, PfxAppConfig):
66
+ return
67
+
68
+ base_path = '/'.join(sender.__class__.__module__.split('.')[:-1])
69
+ is_last = [
70
+ a for a in apps.apps.get_app_configs()
71
+ if isinstance(a, PfxAppConfig)][-1].name == sender.name
72
+ module = Path(inspect.getfile(sender.__class__)).parent.name
73
+
74
+ groups_file = Path(
75
+ Path(inspect.getfile(sender.__class__)).parent, 'groups.yaml')
76
+ if not groups_file.exists():
77
+ return
78
+
79
+ with groups_file.open() as file:
80
+ groups = yaml.safe_load(file)
81
+
82
+ update_groups_permissions(
83
+ groups, base_path, sender._processed_groups, is_last, module)
84
+
85
+
86
+ class PfxAppConfig(AppConfig):
87
+ _processed_groups = set()
88
+
89
+ def ready(self):
90
+ post_migrate.connect(update_groups_permissions_action, sender=self)
91
+ return super().ready()
92
+
93
+
94
+ class PfxCoreConfig(AppConfig):
95
+ name = 'pfx.pfxcore'
96
+ default = True
@@ -31,5 +31,4 @@ STORAGE_S3_AWS_GET_URL_EXPIRE = None
31
31
 
32
32
  PFX_TEST_MODE = False
33
33
 
34
- PFX_AUTH_GROUPS = None
35
34
  PFX_AUTH_GROUPS_CREATE_ONLY = False
@@ -0,0 +1,7 @@
1
+ from pfx.pfxcore import PfxAppConfig
2
+
3
+
4
+ class AccountConfig(PfxAppConfig):
5
+ default_auto_field = 'django.db.models.BigAutoField'
6
+ name = 'tests'
7
+ default = True
@@ -206,6 +206,10 @@ class BasicAPITest(TestAssertMixin, TestCase):
206
206
  def test_meta_list(self):
207
207
  response = self.client.get('/api/authors/meta/list')
208
208
  self.assertRC(response, 200)
209
+ self.assertJE(response, 'model.app', 'tests')
210
+ self.assertJE(response, 'model.name', 'author')
211
+ self.assertJE(response, 'model.object', 'Author')
212
+
209
213
  self.assertJE(response, 'filters.@0.name', 'book_type')
210
214
  self.assertJE(response, 'filters.@0.items', [
211
215
  {
@@ -571,6 +575,9 @@ class BasicAPITest(TestAssertMixin, TestCase):
571
575
  def test_meta_service(self):
572
576
  response = self.client.get('/api/authors/meta')
573
577
  self.assertRC(response, 200)
578
+ self.assertJE(response, 'model.app', 'tests')
579
+ self.assertJE(response, 'model.name', 'author')
580
+ self.assertJE(response, 'model.object', 'Author')
574
581
  self.assertJE(response, 'fields.first_name.type', 'CharField')
575
582
  self.assertJE(response, 'fields.first_name.name', 'First Name')
576
583
  self.assertJE(response, 'fields.last_name.type', 'CharField')
@@ -8,16 +8,13 @@ from pfx.pfxcore.test import TestAssertMixin
8
8
 
9
9
  class TestPostMigrateGroupsUpdate(TestAssertMixin, TestCase):
10
10
 
11
- @override_settings(PFX_AUTH_GROUPS=dict(
12
- reader=[
13
- 'tests.view_author',
14
- ],
15
- editor=[
16
- 'tests.view_author',
17
- 'tests.add_author',
18
- ]))
19
11
  def test_groups(self):
20
- update_groups_permissions(self)
12
+ update_groups_permissions(dict(
13
+ reader=[
14
+ 'tests.view_author'],
15
+ editor=[
16
+ 'tests.view_author',
17
+ 'tests.add_author']), 'tests', set(), True, 'tests', False)
21
18
 
22
19
  groups = {g.name: g for g in Group.objects.all()}
23
20
  self.assertEqual(groups.keys(), {'reader', 'editor'})
@@ -26,14 +23,11 @@ class TestPostMigrateGroupsUpdate(TestAssertMixin, TestCase):
26
23
  perms = {p.codename for p in groups['editor'].permissions.all()}
27
24
  self.assertEqual(perms, {'view_author', 'add_author'})
28
25
 
29
- with override_settings(
30
- PFX_AUTH_GROUPS=dict(
31
- editor=[
32
- 'tests.view_author',
33
- 'tests.change_author',
34
- ],
35
- new=[])):
36
- update_groups_permissions(self)
26
+ update_groups_permissions(dict(
27
+ editor=[
28
+ 'tests.view_author',
29
+ 'tests.change_author'],
30
+ new=[]), 'tests', set(), True, 'tests', False)
37
31
 
38
32
  groups = {g.name: g for g in Group.objects.all()}
39
33
  self.assertEqual(groups.keys(), {'editor', 'new'})
@@ -42,16 +36,14 @@ class TestPostMigrateGroupsUpdate(TestAssertMixin, TestCase):
42
36
  perms = {p.codename for p in groups['new'].permissions.all()}
43
37
  self.assertEqual(perms, set())
44
38
 
45
- @override_settings(PFX_AUTH_GROUPS=dict(
46
- reader=[
47
- 'tests.view_author',
48
- ],
49
- editor=[
50
- 'tests.view_author',
51
- 'tests.add_author',
52
- ]), PFX_AUTH_GROUPS_CREATE_ONLY=True)
39
+ @override_settings(PFX_AUTH_GROUPS_CREATE_ONLY=True)
53
40
  def test_groups_create_only(self):
54
- update_groups_permissions(self)
41
+ update_groups_permissions(dict(
42
+ reader=[
43
+ 'tests.view_author'],
44
+ editor=[
45
+ 'tests.view_author',
46
+ 'tests.add_author']), 'tests', set(), True, 'tests', False)
55
47
 
56
48
  groups = {g.name: g for g in Group.objects.all()}
57
49
  self.assertEqual(groups.keys(), {'reader', 'editor'})
@@ -60,14 +52,11 @@ class TestPostMigrateGroupsUpdate(TestAssertMixin, TestCase):
60
52
  perms = {p.codename for p in groups['editor'].permissions.all()}
61
53
  self.assertEqual(perms, {'view_author', 'add_author'})
62
54
 
63
- with override_settings(
64
- PFX_AUTH_GROUPS=dict(
65
- editor=[
66
- 'tests.view_author',
67
- 'tests.change_author',
68
- ],
69
- new=[])):
70
- update_groups_permissions(self)
55
+ update_groups_permissions(dict(
56
+ editor=[
57
+ 'tests.view_author',
58
+ 'tests.change_author'],
59
+ new=[]), 'tests', set(), True, 'tests', False)
71
60
 
72
61
  groups = {g.name: g for g in Group.objects.all()}
73
62
  self.assertEqual(groups.keys(), {'reader', 'editor', 'new'})
@@ -1,36 +0,0 @@
1
- import logging
2
-
3
- from django.apps import AppConfig
4
- from django.db.models.signals import post_migrate
5
-
6
- from pfx.pfxcore.shortcuts import permissions, settings
7
-
8
- logger = logging.getLogger(__name__)
9
-
10
-
11
- def update_groups_permissions(sender, **kwargs):
12
- from django.contrib.auth.models import Group
13
-
14
- groups = {g.name: g for g in Group.objects.all()}
15
-
16
- for name, perms in settings.PFX_AUTH_GROUPS.items():
17
- created = name not in groups
18
- group = Group.objects.create(name=name) if created else groups[name]
19
- if created or not settings.PFX_AUTH_GROUPS_CREATE_ONLY:
20
- group.permissions.set(permissions(*perms))
21
-
22
- if not settings.PFX_AUTH_GROUPS_CREATE_ONLY:
23
- names = groups.keys() - settings.PFX_AUTH_GROUPS.keys()
24
- Group.objects.filter(name__in=names).delete()
25
-
26
-
27
- class PfxAppConfig(AppConfig):
28
- def ready(self):
29
- if settings.PFX_AUTH_GROUPS is not None:
30
- post_migrate.connect(update_groups_permissions, sender=self)
31
- return super().ready()
32
-
33
-
34
- class PfxCoreConfig(AppConfig):
35
- name = 'pfx.pfxcore'
36
- default = True
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes