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