django-pfx 1.4.dev4__tar.gz → 1.4.dev8__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 (131) hide show
  1. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/PKG-INFO +1 -1
  2. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/default_settings.py +8 -0
  4. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/storage/s3_storage.py +4 -3
  5. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/rest_views.py +9 -2
  6. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_body_mixin.py +16 -0
  7. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/.gitignore +0 -0
  8. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/.gitlab-ci.yml +0 -0
  9. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/.pre-commit-config.yaml +0 -0
  10. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/LICENSE +0 -0
  11. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/MANIFEST.in +0 -0
  12. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/README.md +0 -0
  13. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/django-admin-test +0 -0
  14. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/django_pfx.egg-info/SOURCES.txt +0 -0
  15. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/django_pfx.egg-info/dependency_links.txt +0 -0
  16. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/django_pfx.egg-info/requires.txt +0 -0
  17. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/django_pfx.egg-info/top_level.txt +0 -0
  18. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/Makefile +0 -0
  19. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/conf.py +0 -0
  20. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/index.rst +0 -0
  21. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/source/api.views.rst +0 -0
  22. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/source/authentication.md +0 -0
  23. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/source/decorator.md +0 -0
  24. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/source/generate_openapi.md +0 -0
  25. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/source/getting_started.md +0 -0
  26. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/source/internationalisation.md +0 -0
  27. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/source/model.md +0 -0
  28. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/source/pfx_views.md +0 -0
  29. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/source/profiling.md +0 -0
  30. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/source/settings.md +0 -0
  31. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/doc/source/testing.md +0 -0
  32. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/img/pfx.png +0 -0
  33. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/img/pfx.svg +0 -0
  34. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/__init__.py +0 -0
  35. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/__init__.py +0 -0
  36. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/apidoc/__init__.py +0 -0
  37. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/apidoc/parameters.py +0 -0
  38. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/apidoc/schema.py +0 -0
  39. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/apidoc/tags.py +0 -0
  40. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/apps.py +0 -0
  41. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/decorator/__init__.py +0 -0
  42. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/decorator/rest.py +0 -0
  43. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/exceptions.py +0 -0
  44. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/fields.py +0 -0
  45. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/http/__init__.py +0 -0
  46. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/http/json_response.py +0 -0
  47. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  48. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +0 -0
  49. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/management/__init__.py +0 -0
  50. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/management/commands/__init__.py +0 -0
  51. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  52. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/management/commands/profile.py +0 -0
  53. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/middleware/__init__.py +0 -0
  54. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/middleware/authentication.py +0 -0
  55. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/middleware/locale.py +0 -0
  56. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/middleware/profiling.py +0 -0
  57. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/models/__init__.py +0 -0
  58. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/models/cache_mixins.py +0 -0
  59. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/models/not_null_fields.py +0 -0
  60. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/models/pfx_models.py +0 -0
  61. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  62. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/serializers/__init__.py +0 -0
  63. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/serializers/json.py +0 -0
  64. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/settings.py +0 -0
  65. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/shortcuts.py +0 -0
  66. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/storage/__init__.py +0 -0
  67. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  68. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  69. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  70. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  71. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/test.py +0 -0
  72. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/urls.py +0 -0
  73. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/__init__.py +0 -0
  74. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/authentication_views.py +0 -0
  75. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/fields.py +0 -0
  76. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/filters_views.py +0 -0
  77. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/locale_views.py +0 -0
  78. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  79. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  80. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/groups.py +0 -0
  81. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  82. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  83. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  84. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  85. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  86. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  87. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  88. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  89. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  90. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/subset.py +0 -0
  91. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  92. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  93. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  94. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  95. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  96. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/pyproject.toml +0 -0
  97. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/requirements.txt +0 -0
  98. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/runtest.py +0 -0
  99. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/serve-doc +0 -0
  100. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/setup.cfg +0 -0
  101. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/setup.py +0 -0
  102. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/__init__.py +0 -0
  103. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  104. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/models.py +0 -0
  105. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/settings/__init__.py +0 -0
  106. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/settings/ci.py +0 -0
  107. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/settings/common.py +0 -0
  108. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/settings/dev.py +0 -0
  109. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/settings/dev_custom_example.py +0 -0
  110. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/settings/dev_default.py +0 -0
  111. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/__init__.py +0 -0
  112. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/basic_api_errors.py +0 -0
  113. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/basic_api_test.py +0 -0
  114. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_api_doc.py +0 -0
  115. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_auth_api.py +0 -0
  116. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_cache.py +0 -0
  117. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_client.py +0 -0
  118. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_fields.py +0 -0
  119. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_filters.py +0 -0
  120. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_locale_api.py +0 -0
  121. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_perm_tests.py +0 -0
  122. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_perms_api.py +0 -0
  123. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_profiling_middleware.py +0 -0
  124. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_shortcuts.py +0 -0
  125. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_timezone_middleware.py +0 -0
  126. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_tools.py +0 -0
  127. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_user_queryset.py +0 -0
  128. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_view_decorators.py +0 -0
  129. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/tests/test_view_fields.py +0 -0
  130. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/urls.py +0 -0
  131. {django-pfx-1.4.dev4 → django-pfx-1.4.dev8}/tests/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-pfx
3
- Version: 1.4.dev4
3
+ Version: 1.4.dev8
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.1
2
2
  Name: django-pfx
3
- Version: 1.4.dev4
3
+ Version: 1.4.dev8
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
@@ -12,4 +12,12 @@ PFX_OPENAPI_TEMPLATE = {}
12
12
  PFX_PROFILING_SQL = ""
13
13
  PFX_PROFILING_CPROFILE = ""
14
14
 
15
+ STORAGE_S3_AWS_REGION = None
16
+ STORAGE_S3_AWS_ACCESS_KEY = None
17
+ STORAGE_S3_AWS_SECRET_KEY = None
18
+ STORAGE_S3_AWS_ENDPOINT_URL = None
19
+ STORAGE_S3_AWS_S3_BUCKET = None
20
+ STORAGE_S3_AWS_PUT_URL_EXPIRE = None
21
+ STORAGE_S3_AWS_GET_URL_EXPIRE = None
22
+
15
23
  PFX_TEST_MODE = False
@@ -1,11 +1,11 @@
1
1
  import logging
2
2
  from io import IOBase
3
3
 
4
- from django.conf import settings
5
-
6
4
  import boto3
7
5
  from botocore.exceptions import ClientError
8
6
 
7
+ from pfx.pfxcore.shortcuts import settings
8
+
9
9
  logger = logging.getLogger(__name__)
10
10
 
11
11
 
@@ -19,7 +19,8 @@ class S3Storage:
19
19
  return boto3.client(
20
20
  's3', region_name=settings.STORAGE_S3_AWS_REGION,
21
21
  aws_access_key_id=settings.STORAGE_S3_AWS_ACCESS_KEY,
22
- aws_secret_access_key=settings.STORAGE_S3_AWS_SECRET_KEY)
22
+ aws_secret_access_key=settings.STORAGE_S3_AWS_SECRET_KEY,
23
+ endpoint_url=settings.STORAGE_S3_AWS_ENDPOINT_URL)
23
24
 
24
25
  def to_python(self, value):
25
26
  if 'key' not in value:
@@ -12,6 +12,7 @@ from django.core.exceptions import (
12
12
  )
13
13
  from django.db import IntegrityError, transaction
14
14
  from django.db.models import ForeignKey, Model, Q
15
+ from django.db.models.fields import AutoFieldMixin
15
16
  from django.shortcuts import redirect
16
17
  from django.urls import path
17
18
  from django.utils.translation import gettext_lazy as _
@@ -422,7 +423,8 @@ class BodyMixin:
422
423
  except JSONDecodeError as e:
423
424
  raise JsonErrorAPIError(e)
424
425
 
425
- def body_to_model(self, model: Model, validate=True, **kwargs):
426
+ def body_to_model(
427
+ self, model: Model, validate=True, fields=None, **kwargs):
426
428
  """Return a new model instance built with request body.
427
429
 
428
430
  :param model: The model to instantiate
@@ -430,7 +432,12 @@ class BodyMixin:
430
432
  :param \\**kwargs: The optional arguments for `full_clean`
431
433
  :rtype: :class:`django.db.models.Model`
432
434
  """
433
- obj = model(**self.deserialize_body())
435
+ if fields is None:
436
+ fields = [
437
+ f.name for f in model._meta.get_fields()
438
+ if not isinstance(f, AutoFieldMixin)]
439
+ obj = model(**{
440
+ k: v for k, v in self.deserialize_body().items() if k in fields})
434
441
  if validate:
435
442
  try:
436
443
  obj.full_clean(**kwargs)
@@ -32,6 +32,22 @@ class TestBodyMixin(TestAssertMixin, TestCase):
32
32
  self.assertIsInstance(custom, CustomModel)
33
33
  self.assertEqual(custom.value, 7)
34
34
 
35
+ def test_body_to_model_ignore_auto_fields(self):
36
+ view = CustomView(id=99999, value=7)
37
+ custom = view.body_to_model(CustomModel)
38
+
39
+ self.assertIsInstance(custom, CustomModel)
40
+ self.assertNotEqual(custom.pk, 99999)
41
+ self.assertEqual(custom.value, 7)
42
+
43
+ def test_body_to_model_ignore_unknown_fields(self):
44
+ view = CustomView(id=99999, value=7)
45
+ custom = view.body_to_model(CustomModel)
46
+
47
+ self.assertIsInstance(custom, CustomModel)
48
+ self.assertNotEqual(custom.pk, 99999)
49
+ self.assertEqual(custom.value, 7)
50
+
35
51
  def test_body_to_model_validation(self):
36
52
  view = CustomView()
37
53
  with self.assertRaises(ModelValidationAPIError) as cm:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes