django-pfx 1.4.dev114__tar.gz → 1.4.dev118__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 (198) hide show
  1. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/PKG-INFO +1 -1
  2. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/decorator/rest.py +2 -1
  4. django_pfx-1.4.dev118/pfx/pfxcore/fields/decimal_field.py +33 -0
  5. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/fields.py +15 -0
  6. django_pfx-1.4.dev118/tests/tests/test_fields_decimal.py +99 -0
  7. django_pfx-1.4.dev114/pfx/pfxcore/fields/decimal_field.py +0 -15
  8. django_pfx-1.4.dev114/tests/tests/test_fields_decimal.py +0 -59
  9. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/.gitignore +0 -0
  10. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/.gitlab-ci.yml +0 -0
  11. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/.pre-commit-config.yaml +0 -0
  12. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/LICENSE +0 -0
  13. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/MANIFEST.in +0 -0
  14. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/README.md +0 -0
  15. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/django_pfx.egg-info/SOURCES.txt +0 -0
  16. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/django_pfx.egg-info/dependency_links.txt +0 -0
  17. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/django_pfx.egg-info/requires.txt +0 -0
  18. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/django_pfx.egg-info/top_level.txt +0 -0
  19. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/Makefile +0 -0
  20. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/conf.py +0 -0
  21. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/index.rst +0 -0
  22. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/source/api.views.rst +0 -0
  23. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/source/authentication.md +0 -0
  24. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/source/decorator.md +0 -0
  25. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/source/generate_openapi.md +0 -0
  26. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/source/getting_started.md +0 -0
  27. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/source/internationalisation.md +0 -0
  28. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/source/model.md +0 -0
  29. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/source/pfx_views.md +0 -0
  30. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/source/profiling.md +0 -0
  31. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/source/settings.md +0 -0
  32. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/doc/source/testing.md +0 -0
  33. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/img/pfx.png +0 -0
  34. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/img/pfx.svg +0 -0
  35. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/make_messages +0 -0
  36. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/manage.py +0 -0
  37. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/__init__.py +0 -0
  38. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/__init__.py +0 -0
  39. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/apidoc/__init__.py +0 -0
  40. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/apidoc/parameters.py +0 -0
  41. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/apidoc/schema.py +0 -0
  42. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/apidoc/tags.py +0 -0
  43. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/apps.py +0 -0
  44. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/decorator/__init__.py +0 -0
  45. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/default_settings.py +0 -0
  46. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/exceptions.py +0 -0
  47. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/fields/__init__.py +0 -0
  48. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/fields/media_field.py +0 -0
  49. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  50. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/fields/nh3_field.py +0 -0
  51. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/http/__init__.py +0 -0
  52. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/http/json_response.py +0 -0
  53. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  54. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +0 -0
  55. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/management/__init__.py +0 -0
  56. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/management/commands/__init__.py +0 -0
  57. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  58. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/management/commands/profile.py +0 -0
  59. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/middleware/__init__.py +0 -0
  60. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/middleware/authentication.py +0 -0
  61. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/middleware/locale.py +0 -0
  62. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/middleware/profiling.py +0 -0
  63. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  64. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  65. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  66. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/migrations/__init__.py +0 -0
  67. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  68. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  69. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/models/__init__.py +0 -0
  70. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  71. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/models/cache_mixins.py +0 -0
  72. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/models/login_ban.py +0 -0
  73. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/models/not_null_fields.py +0 -0
  74. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  75. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  76. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/models/pfx_models.py +0 -0
  77. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/models/pfx_user.py +0 -0
  78. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  79. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/serializers/__init__.py +0 -0
  80. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/serializers/json.py +0 -0
  81. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/settings.py +0 -0
  82. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/shortcuts.py +0 -0
  83. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/storage/__init__.py +0 -0
  84. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/storage/exceptions.py +0 -0
  85. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/storage/local_storage.py +0 -0
  86. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/storage/s3_storage.py +0 -0
  87. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  88. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  89. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  90. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  91. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  92. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  93. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/test.py +0 -0
  94. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/urls.py +0 -0
  95. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/__init__.py +0 -0
  96. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/authentication_views.py +0 -0
  97. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/filters_views.py +0 -0
  98. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/locale_views.py +0 -0
  99. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  100. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  101. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  102. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  103. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/groups.py +0 -0
  104. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  105. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  106. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  107. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  108. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  109. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  110. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  111. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  112. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  113. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/subset.py +0 -0
  114. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  115. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  116. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  117. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  118. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  119. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/pfxcore/views/rest_views.py +0 -0
  120. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/settings/__init__.py +0 -0
  121. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pfx/settings/dev.py +0 -0
  122. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/pyproject.toml +0 -0
  123. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/requirements.txt +0 -0
  124. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/serve-doc +0 -0
  125. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/setup.cfg +0 -0
  126. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/setup.py +0 -0
  127. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/__init__.py +0 -0
  128. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/apps.py +0 -0
  129. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  130. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/migrations/0001_initial.py +0 -0
  131. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/migrations/0002_alter_book_cover.py +0 -0
  132. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/migrations/0003_book_local_file.py +0 -0
  133. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/migrations/__init__.py +0 -0
  134. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/models.py +0 -0
  135. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/settings/__init__.py +0 -0
  136. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/settings/ci.py +0 -0
  137. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/settings/common.py +0 -0
  138. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/settings/dev.py +0 -0
  139. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/settings/dev_custom_example.py +0 -0
  140. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/settings/dev_default.py +0 -0
  141. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/__init__.py +0 -0
  142. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/basic_api_errors.py +0 -0
  143. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/basic_api_test.py +0 -0
  144. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_api_doc.py +0 -0
  145. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_api_doc_search.py +0 -0
  146. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_auth_api.py +0 -0
  147. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_body_mixin.py +0 -0
  148. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_cache.py +0 -0
  149. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_client.py +0 -0
  150. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_fields_choices.py +0 -0
  151. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_fields_minutes_duration.py +0 -0
  152. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_fields_nh3.py +0 -0
  153. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_filters.py +0 -0
  154. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_locale_api.py +0 -0
  155. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  156. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_perm_tests.py +0 -0
  157. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_permissions.py +0 -0
  158. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_perms_api.py +0 -0
  159. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_post_migrate_groups_update.py +0 -0
  160. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_profiling_middleware.py +0 -0
  161. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_settings.py +0 -0
  162. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_shortcuts.py +0 -0
  163. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_timezone_middleware.py +0 -0
  164. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_tools.py +0 -0
  165. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_user_queryset.py +0 -0
  166. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_view_decorators.py +0 -0
  167. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/tests/test_view_fields.py +0 -0
  168. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/urls.py +0 -0
  169. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests/views.py +0 -0
  170. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/__init__.py +0 -0
  171. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/migrations/0001_initial.py +0 -0
  172. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/migrations/__init__.py +0 -0
  173. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/settings/__init__.py +0 -0
  174. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/settings/ci.py +0 -0
  175. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/settings/common.py +0 -0
  176. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/settings/dev.py +0 -0
  177. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/settings/dev_custom_example.py +0 -0
  178. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/settings/dev_default.py +0 -0
  179. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/tests/__init__.py +0 -0
  180. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/tests/test_api.py +0 -0
  181. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/tests/test_auth_api.py +0 -0
  182. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/urls.py +0 -0
  183. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_base_user/views.py +0 -0
  184. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/__init__.py +0 -0
  185. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/migrations/0001_initial.py +0 -0
  186. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/migrations/__init__.py +0 -0
  187. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/models.py +0 -0
  188. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/settings/__init__.py +0 -0
  189. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/settings/ci.py +0 -0
  190. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/settings/common.py +0 -0
  191. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/settings/dev.py +0 -0
  192. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/settings/dev_custom_example.py +0 -0
  193. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/settings/dev_default.py +0 -0
  194. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/tests/__init__.py +0 -0
  195. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/tests/test_api.py +0 -0
  196. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/tests/test_auth_api.py +0 -0
  197. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/urls.py +0 -0
  198. {django_pfx-1.4.dev114 → django_pfx-1.4.dev118}/tests_custom_user/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-pfx
3
- Version: 1.4.dev114
3
+ Version: 1.4.dev118
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.4
2
2
  Name: django-pfx
3
- Version: 1.4.dev114
3
+ Version: 1.4.dev118
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
@@ -54,10 +54,11 @@ def rest_api(
54
54
  return decorator
55
55
 
56
56
 
57
- def rest_property(string=None, type="CharField"):
57
+ def rest_property(string=None, type="CharField", field=None):
58
58
  def decorator(func):
59
59
  func.short_description = string
60
60
  func.field_type = type
61
+ func.field = field
61
62
  return property(func)
62
63
  return decorator
63
64
 
@@ -0,0 +1,33 @@
1
+ from decimal import Decimal
2
+
3
+ from django.db import models
4
+
5
+
6
+ class DecimalField(models.DecimalField):
7
+ def __init__(
8
+ self, *args, percent=False, currency=None,
9
+ json_decimal_places=None, **kw):
10
+ super().__init__(*args, **kw)
11
+ self.percent = percent
12
+ self.currency = currency
13
+ self.json_quantize = Decimal(10) ** -(json_decimal_places or (
14
+ percent and self.decimal_places - 2 or self.decimal_places))
15
+
16
+ def to_json_meta(self, meta):
17
+ meta.update(
18
+ percent=self.percent,
19
+ currency=self.currency)
20
+ return meta
21
+
22
+ def to_json(self, value):
23
+ if value is None:
24
+ return None
25
+ if self.percent:
26
+ value *= Decimal(100)
27
+ return value.quantize(self.json_quantize)
28
+
29
+ def from_json(self, value):
30
+ if value is None:
31
+ return None
32
+ value = Decimal(value)
33
+ return self.percent and value / Decimal(100) or value
@@ -173,6 +173,17 @@ class ViewField:
173
173
  @classmethod
174
174
  def from_property(cls, name, prop, **kwargs):
175
175
  if hasattr(prop, 'fget'):
176
+ field = getattr(prop.fget, 'field', None)
177
+ if field:
178
+ setifnone(
179
+ kwargs, 'verbose_name',
180
+ cls._get_model_verbose_name(field))
181
+ setifnone(
182
+ kwargs, 'field_type',
183
+ FieldType.from_model_field(field.__class__))
184
+ kwargs['readonly'] = True
185
+ return ViewModelField(
186
+ name, model_field=field, **kwargs)
176
187
  verbose_name = getattr(
177
188
  prop.fget, 'short_description', prop.fget.__name__)
178
189
  field_type = getattr(prop.fget, 'field_type', None)
@@ -332,6 +343,8 @@ class ViewModelField(ViewField):
332
343
  res['required'] = not (
333
344
  getattr(self.model_field, 'null', False) or
334
345
  getattr(self.model_field, 'blank', False))
346
+ if hasattr(self.model_field, 'to_json_meta'):
347
+ res = self.model_field.to_json_meta(res)
335
348
  return res
336
349
 
337
350
  def to_model_value(self, value, get_related_queryset):
@@ -346,6 +359,8 @@ class ViewModelField(ViewField):
346
359
  value = _get_obj(value)
347
360
  elif self.field_type == FieldType.ModelObjectList:
348
361
  value = ModelList(_get_obj(v) for v in value)
362
+ elif hasattr(field, 'from_json'):
363
+ value = field.from_json(value)
349
364
  elif hasattr(field, 'choices') and field.choices:
350
365
  value = (value['value']
351
366
  if isinstance(value, dict) and 'value' in value
@@ -0,0 +1,99 @@
1
+ from decimal import Decimal
2
+
3
+ from django.db import connection, models
4
+ from django.test import TestCase
5
+ from django.test.utils import override_settings
6
+ from django.urls import include, path
7
+
8
+ from pfx.pfxcore import register_views
9
+ from pfx.pfxcore.decorator import rest_property, rest_view
10
+ from pfx.pfxcore.fields import DecimalField
11
+ from pfx.pfxcore.models import JSONReprMixin
12
+ from pfx.pfxcore.test import APIClient, TestAssertMixin
13
+ from pfx.pfxcore.views import RestView
14
+ from tests.views import FakeViewMixin
15
+
16
+
17
+ class TestDecimalModel(JSONReprMixin, models.Model):
18
+ decimal = DecimalField(
19
+ max_digits=10, decimal_places=5, json_decimal_places=2)
20
+ percent = DecimalField(
21
+ max_digits=10, decimal_places=4, percent=True)
22
+ monetary = DecimalField(
23
+ max_digits=10, decimal_places=5, json_decimal_places=2,
24
+ currency="CHF")
25
+
26
+ @rest_property(field=DecimalField(
27
+ max_digits=10, decimal_places=5, json_decimal_places=2,
28
+ currency="CHF"))
29
+ def price_double(self):
30
+ return Decimal(self.monetary * 2)
31
+
32
+ class Meta:
33
+ verbose_name = "TestModel"
34
+ verbose_name_plural = "TestModels"
35
+ ordering = ['pk']
36
+
37
+
38
+ @rest_view("/test-decimal-model")
39
+ class DecimalModelRestView(FakeViewMixin, RestView):
40
+ default_public = True
41
+ model = TestDecimalModel
42
+ fields = ['decimal', 'percent', 'monetary', 'price_double']
43
+
44
+
45
+ urlpatterns = [
46
+ path('api/', include(register_views(DecimalModelRestView))),
47
+ path('api/', include('pfx.pfxcore.urls'))
48
+ ]
49
+
50
+
51
+ @override_settings(ROOT_URLCONF=__name__)
52
+ class TestFieldsDecimal(TestAssertMixin, TestCase):
53
+
54
+ def setUp(self):
55
+ self.client = APIClient(default_locale='en')
56
+
57
+ @classmethod
58
+ def setUpTestData(cls):
59
+ with connection.schema_editor() as schema_editor:
60
+ schema_editor.create_model(TestDecimalModel)
61
+
62
+ def test_decimal_meta(self):
63
+ response = self.client.get('/api/test-decimal-model/meta')
64
+ self.assertRC(response, 200)
65
+ self.assertJE(response, 'fields.decimal.percent', False)
66
+ self.assertJE(response, 'fields.decimal.currency', None)
67
+ self.assertJE(response, 'fields.percent.percent', True)
68
+ self.assertJE(response, 'fields.percent.currency', None)
69
+ self.assertJE(response, 'fields.monetary.percent', False)
70
+ self.assertJE(response, 'fields.monetary.currency', "CHF")
71
+ self.assertJE(response, 'fields.price_double.percent', False)
72
+ self.assertJE(response, 'fields.price_double.currency', "CHF")
73
+
74
+ def test_decimal(self):
75
+ t = TestDecimalModel.objects.create(
76
+ decimal=3.14, percent=0.0810, monetary=100)
77
+ t.save()
78
+ t.refresh_from_db()
79
+ self.assertEqual(t.decimal, Decimal('3.14000'))
80
+ self.assertEqual(t.percent, Decimal('0.0810'))
81
+
82
+ response = self.client.get(f'/api/test-decimal-model/{t.pk}')
83
+ self.assertRC(response, 200)
84
+ self.assertJE(response, 'decimal', "3.14")
85
+ self.assertJE(response, 'percent', "8.10")
86
+ self.assertJE(response, 'monetary', "100.00")
87
+ self.assertJE(response, 'price_double', "200.00")
88
+
89
+ response = self.client.put(f'/api/test-decimal-model/{t.pk}', dict(
90
+ decimal="3.12121",
91
+ percent="7.7",
92
+ ))
93
+ self.assertRC(response, 200)
94
+ self.assertJE(response, 'decimal', "3.12")
95
+ self.assertJE(response, 'percent', "7.70")
96
+
97
+ t.refresh_from_db()
98
+ self.assertEqual(t.decimal, Decimal('3.12121'))
99
+ self.assertEqual(t.percent, Decimal('0.0770'))
@@ -1,15 +0,0 @@
1
- from decimal import Decimal
2
-
3
- from django.db import models
4
-
5
-
6
- class DecimalField(models.DecimalField):
7
- def __init__(self, *args, json_decimal_places=None, **kw):
8
- super().__init__(*args, **kw)
9
- self.json_quantize = Decimal(10) ** -(
10
- json_decimal_places or self.decimal_places)
11
-
12
- def to_json(self, value):
13
- if value is None:
14
- return None
15
- return value.quantize(self.json_quantize)
@@ -1,59 +0,0 @@
1
- from decimal import Decimal
2
-
3
- from django.db import connection, models
4
- from django.test import TestCase
5
- from django.test.utils import override_settings
6
- from django.urls import include, path
7
-
8
- from pfx.pfxcore import register_views
9
- from pfx.pfxcore.decorator import rest_view
10
- from pfx.pfxcore.fields import DecimalField
11
- from pfx.pfxcore.models import JSONReprMixin
12
- from pfx.pfxcore.test import APIClient, TestAssertMixin
13
- from pfx.pfxcore.views import RestView
14
- from tests.views import FakeViewMixin
15
-
16
-
17
- class TestDecimalModel(JSONReprMixin, models.Model):
18
- decimal = DecimalField(
19
- max_digits=10, decimal_places=5, json_decimal_places=2)
20
-
21
- class Meta:
22
- verbose_name = "TestModel"
23
- verbose_name_plural = "TestModels"
24
- ordering = ['pk']
25
-
26
-
27
- @rest_view("/test-decimal-model")
28
- class DecimalModelRestView(FakeViewMixin, RestView):
29
- default_public = True
30
- model = TestDecimalModel
31
- fields = ['decimal']
32
-
33
-
34
- urlpatterns = [
35
- path('api/', include(register_views(DecimalModelRestView))),
36
- path('api/', include('pfx.pfxcore.urls'))
37
- ]
38
-
39
-
40
- @override_settings(ROOT_URLCONF=__name__)
41
- class TestFieldsDecimal(TestAssertMixin, TestCase):
42
-
43
- def setUp(self):
44
- self.client = APIClient(default_locale='en')
45
-
46
- @classmethod
47
- def setUpTestData(cls):
48
- with connection.schema_editor() as schema_editor:
49
- schema_editor.create_model(TestDecimalModel)
50
-
51
- def test_decimal(self):
52
- t = TestDecimalModel.objects.create(decimal=3.14)
53
- t.save()
54
- t.refresh_from_db()
55
- self.assertEqual(t.decimal, Decimal('3.14000'))
56
-
57
- response = self.client.get(f'/api/test-decimal-model/{t.pk}')
58
- self.assertRC(response, 200)
59
- self.assertJE(response, 'decimal', "3.14")
File without changes