django-pfx 1.4.dev96__tar.gz → 1.4.dev100__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.dev96 → django_pfx-1.4.dev100}/PKG-INFO +1 -1
  2. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/django_pfx.egg-info/SOURCES.txt +1 -0
  4. django_pfx-1.4.dev100/pfx/pfxcore/apps.py +96 -0
  5. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/default_settings.py +0 -1
  6. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/models/pfx_models.py +9 -0
  7. django_pfx-1.4.dev100/tests/apps.py +7 -0
  8. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_post_migrate_groups_update.py +23 -34
  9. django_pfx-1.4.dev96/pfx/pfxcore/apps.py +0 -36
  10. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/.gitignore +0 -0
  11. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/.gitlab-ci.yml +0 -0
  12. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/.pre-commit-config.yaml +0 -0
  13. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/LICENSE +0 -0
  14. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/MANIFEST.in +0 -0
  15. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/README.md +0 -0
  16. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/django_pfx.egg-info/dependency_links.txt +0 -0
  17. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/django_pfx.egg-info/requires.txt +0 -0
  18. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/django_pfx.egg-info/top_level.txt +0 -0
  19. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/Makefile +0 -0
  20. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/conf.py +0 -0
  21. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/index.rst +0 -0
  22. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/source/api.views.rst +0 -0
  23. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/source/authentication.md +0 -0
  24. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/source/decorator.md +0 -0
  25. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/source/generate_openapi.md +0 -0
  26. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/source/getting_started.md +0 -0
  27. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/source/internationalisation.md +0 -0
  28. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/source/model.md +0 -0
  29. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/source/pfx_views.md +0 -0
  30. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/source/profiling.md +0 -0
  31. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/source/settings.md +0 -0
  32. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/doc/source/testing.md +0 -0
  33. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/img/pfx.png +0 -0
  34. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/img/pfx.svg +0 -0
  35. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/make_messages +0 -0
  36. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/manage.py +0 -0
  37. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/__init__.py +0 -0
  38. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/__init__.py +0 -0
  39. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/apidoc/__init__.py +0 -0
  40. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/apidoc/parameters.py +0 -0
  41. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/apidoc/schema.py +0 -0
  42. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/apidoc/tags.py +0 -0
  43. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/decorator/__init__.py +0 -0
  44. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/decorator/rest.py +0 -0
  45. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/exceptions.py +0 -0
  46. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/fields.py +0 -0
  47. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/http/__init__.py +0 -0
  48. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/http/json_response.py +0 -0
  49. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  50. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +0 -0
  51. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/management/__init__.py +0 -0
  52. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/management/commands/__init__.py +0 -0
  53. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  54. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/management/commands/profile.py +0 -0
  55. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/middleware/__init__.py +0 -0
  56. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/middleware/authentication.py +0 -0
  57. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/middleware/locale.py +0 -0
  58. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/middleware/profiling.py +0 -0
  59. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  60. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  61. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  62. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/migrations/__init__.py +0 -0
  63. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  64. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  65. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/models/__init__.py +0 -0
  66. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  67. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/models/cache_mixins.py +0 -0
  68. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/models/login_ban.py +0 -0
  69. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/models/not_null_fields.py +0 -0
  70. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  71. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  72. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/models/pfx_user.py +0 -0
  73. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  74. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/serializers/__init__.py +0 -0
  75. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/serializers/json.py +0 -0
  76. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/settings.py +0 -0
  77. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/shortcuts.py +0 -0
  78. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/storage/__init__.py +0 -0
  79. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/storage/s3_storage.py +0 -0
  80. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  81. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  82. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  83. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  84. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  85. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  86. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/test.py +0 -0
  87. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/urls.py +0 -0
  88. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/__init__.py +0 -0
  89. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/authentication_views.py +0 -0
  90. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/fields.py +0 -0
  91. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/filters_views.py +0 -0
  92. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/locale_views.py +0 -0
  93. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  94. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  95. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  96. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/groups.py +0 -0
  97. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  98. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  99. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  100. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  101. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  102. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  103. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  104. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  105. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  106. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/subset.py +0 -0
  107. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  108. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  109. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  110. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  111. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  112. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/pfxcore/views/rest_views.py +0 -0
  113. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/settings/__init__.py +0 -0
  114. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pfx/settings/dev.py +0 -0
  115. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/pyproject.toml +0 -0
  116. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/requirements.txt +0 -0
  117. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/serve-doc +0 -0
  118. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/setup.cfg +0 -0
  119. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/setup.py +0 -0
  120. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/__init__.py +0 -0
  121. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  122. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/migrations/0001_initial.py +0 -0
  123. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/migrations/__init__.py +0 -0
  124. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/models.py +0 -0
  125. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/settings/__init__.py +0 -0
  126. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/settings/ci.py +0 -0
  127. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/settings/common.py +0 -0
  128. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/settings/dev.py +0 -0
  129. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/settings/dev_custom_example.py +0 -0
  130. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/settings/dev_default.py +0 -0
  131. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/__init__.py +0 -0
  132. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/basic_api_errors.py +0 -0
  133. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/basic_api_test.py +0 -0
  134. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_api_doc.py +0 -0
  135. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_api_doc_search.py +0 -0
  136. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_auth_api.py +0 -0
  137. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_body_mixin.py +0 -0
  138. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_cache.py +0 -0
  139. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_client.py +0 -0
  140. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_fields_choices.py +0 -0
  141. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_fields_minutes_duration.py +0 -0
  142. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_filters.py +0 -0
  143. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_locale_api.py +0 -0
  144. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  145. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_perm_tests.py +0 -0
  146. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_permissions.py +0 -0
  147. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_perms_api.py +0 -0
  148. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_profiling_middleware.py +0 -0
  149. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_settings.py +0 -0
  150. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_shortcuts.py +0 -0
  151. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_timezone_middleware.py +0 -0
  152. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_tools.py +0 -0
  153. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_user_queryset.py +0 -0
  154. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_view_decorators.py +0 -0
  155. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/tests/test_view_fields.py +0 -0
  156. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/urls.py +0 -0
  157. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests/views.py +0 -0
  158. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/__init__.py +0 -0
  159. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/migrations/0001_initial.py +0 -0
  160. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/migrations/__init__.py +0 -0
  161. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/settings/__init__.py +0 -0
  162. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/settings/ci.py +0 -0
  163. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/settings/common.py +0 -0
  164. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/settings/dev.py +0 -0
  165. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/settings/dev_custom_example.py +0 -0
  166. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/settings/dev_default.py +0 -0
  167. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/tests/__init__.py +0 -0
  168. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/tests/test_api.py +0 -0
  169. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/tests/test_auth_api.py +0 -0
  170. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/urls.py +0 -0
  171. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_base_user/views.py +0 -0
  172. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/__init__.py +0 -0
  173. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/migrations/0001_initial.py +0 -0
  174. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/migrations/__init__.py +0 -0
  175. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/models.py +0 -0
  176. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/settings/__init__.py +0 -0
  177. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/settings/ci.py +0 -0
  178. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/settings/common.py +0 -0
  179. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/settings/dev.py +0 -0
  180. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/settings/dev_custom_example.py +0 -0
  181. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/settings/dev_default.py +0 -0
  182. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/tests/__init__.py +0 -0
  183. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/tests/test_api.py +0 -0
  184. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/tests/test_auth_api.py +0 -0
  185. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/tests_custom_user/urls.py +0 -0
  186. {django_pfx-1.4.dev96 → django_pfx-1.4.dev100}/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.dev96
3
+ Version: 1.4.dev100
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.dev96
3
+ Version: 1.4.dev100
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
@@ -23,8 +23,12 @@ class UniqueConstraint(models.UniqueConstraint):
23
23
  class JSONReprMixin():
24
24
  """A model mixin to manage JSON representation."""
25
25
  api = None
26
+ url = None
26
27
  apidoc = {}
27
28
 
29
+ def get_url(self):
30
+ return self.url
31
+
28
32
  def json_repr(self, **values):
29
33
  """Return the JSON representation of a mode instance.
30
34
 
@@ -39,6 +43,11 @@ class JSONReprMixin():
39
43
  res['resource_slug'] = self.slug
40
44
  if hasattr(self, 'reference'):
41
45
  res['resource_reference'] = self.reference
46
+ if self.api:
47
+ res['resource_api'] = f"{self.api}/{self.pk}"
48
+ url = self.get_url()
49
+ if url:
50
+ res['resource_url'] = f"{url}/{self.pk}"
42
51
  res.update(**values)
43
52
  return res
44
53
 
@@ -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
@@ -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