bazis-users 2.3.0__tar.gz → 2.3.2__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 (94) hide show
  1. {bazis_users-2.3.0 → bazis_users-2.3.2}/.github/workflows/release.yml +5 -2
  2. {bazis_users-2.3.0 → bazis_users-2.3.2}/.github/workflows/tests.yml +1 -1
  3. {bazis_users-2.3.0 → bazis_users-2.3.2}/CLAUDE.md +1 -1
  4. {bazis_users-2.3.0 → bazis_users-2.3.2}/PKG-INFO +2 -2
  5. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/_version.py +3 -3
  6. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/conf.py +5 -1
  7. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis_users.egg-info/PKG-INFO +2 -2
  8. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis_users.egg-info/SOURCES.txt +2 -0
  9. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis_users.egg-info/requires.txt +1 -1
  10. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis_users.egg-info/scm_file_list.json +2 -0
  11. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis_users.egg-info/scm_version.json +2 -2
  12. bazis_users-2.3.2/docs/releases/2.3.1.md +6 -0
  13. bazis_users-2.3.2/docs/releases/2.3.2.md +6 -0
  14. {bazis_users-2.3.0 → bazis_users-2.3.2}/pyproject.toml +1 -1
  15. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/sample/main.py +1 -1
  16. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/sample/settings.py +1 -1
  17. {bazis_users-2.3.0 → bazis_users-2.3.2}/tests/test_tokens.py +28 -0
  18. {bazis_users-2.3.0 → bazis_users-2.3.2}/.dockerignore +0 -0
  19. {bazis_users-2.3.0 → bazis_users-2.3.2}/.github/workflows/build-publish.yml +0 -0
  20. {bazis_users-2.3.0 → bazis_users-2.3.2}/.github/workflows/update-licenses.yml +0 -0
  21. {bazis_users-2.3.0 → bazis_users-2.3.2}/.gitignore +0 -0
  22. {bazis_users-2.3.0 → bazis_users-2.3.2}/README.md +0 -0
  23. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/__init__.py +0 -0
  24. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/admin_abstract.py +0 -0
  25. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/apps.py +0 -0
  26. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/locale/en/LC_MESSAGES/django.mo +0 -0
  27. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/locale/en/LC_MESSAGES/django.po +0 -0
  28. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/locale/ru/LC_MESSAGES/django.mo +0 -0
  29. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/locale/ru/LC_MESSAGES/django.po +0 -0
  30. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/middleware.py +0 -0
  31. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/migrations/0001_initial.py +0 -0
  32. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/migrations/0002_user_dt_first_login.py +0 -0
  33. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/migrations/__init__.py +0 -0
  34. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/models.py +0 -0
  35. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/models_abstract.py +0 -0
  36. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/router.py +0 -0
  37. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/routes.py +0 -0
  38. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/routes_abstract.py +0 -0
  39. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/schemas.py +0 -0
  40. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis/contrib/users/service.py +0 -0
  41. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis_users.egg-info/dependency_links.txt +0 -0
  42. {bazis_users-2.3.0 → bazis_users-2.3.2}/bazis_users.egg-info/top_level.txt +0 -0
  43. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/Makefile +0 -0
  44. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/README.md +0 -0
  45. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/_static/pydata-custom.css +0 -0
  46. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/_static/readthedocs-custom.css +0 -0
  47. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/_templates/custom-class-template.rst +0 -0
  48. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/_templates/custom-module-template.rst +0 -0
  49. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/conf.py +0 -0
  50. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/index.rst +0 -0
  51. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/make.bat +0 -0
  52. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/manage.py +0 -0
  53. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/project.env +0 -0
  54. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/releases/2.3.0.md +0 -0
  55. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/requirements.txt +0 -0
  56. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/settings.py +0 -0
  57. {bazis_users-2.3.0 → bazis_users-2.3.2}/docs/structure.rst +0 -0
  58. {bazis_users-2.3.0 → bazis_users-2.3.2}/pytest.ini +0 -0
  59. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/deploy/admin.sh +0 -0
  60. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/deploy/app.sh +0 -0
  61. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/deploy/config/admin.py +0 -0
  62. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/deploy/config/app.py +0 -0
  63. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/deploy/db.sh +0 -0
  64. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/deploy/init.sh +0 -0
  65. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/entity/__init__.py +0 -0
  66. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/entity/admin.py +0 -0
  67. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/entity/migrations/0001_initial.py +0 -0
  68. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/entity/migrations/0002_alter_childentity_dt_created_and_more.py +0 -0
  69. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/entity/migrations/__init__.py +0 -0
  70. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/entity/models.py +0 -0
  71. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/entity/router.py +0 -0
  72. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/entity/routes.py +0 -0
  73. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/manage.py +0 -0
  74. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/project.env +0 -0
  75. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/pyproject.toml +0 -0
  76. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/sample/__init__.py +0 -0
  77. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/sample/router.py +0 -0
  78. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/sample/urls.py +0 -0
  79. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/sample/wsgi.py +0 -0
  80. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/users/__init__.py +0 -0
  81. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/users/admin.py +0 -0
  82. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/users/apps.py +0 -0
  83. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/users/migrations/0001_initial.py +0 -0
  84. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/users/migrations/0002_user_dt_first_login.py +0 -0
  85. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/users/migrations/__init__.py +0 -0
  86. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/users/models.py +0 -0
  87. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/users/router.py +0 -0
  88. {bazis_users-2.3.0 → bazis_users-2.3.2}/sample/uv.lock +0 -0
  89. {bazis_users-2.3.0 → bazis_users-2.3.2}/setup.cfg +0 -0
  90. {bazis_users-2.3.0 → bazis_users-2.3.2}/tests/__init__.py +0 -0
  91. {bazis_users-2.3.0 → bazis_users-2.3.2}/tests/conftest.py +0 -0
  92. {bazis_users-2.3.0 → bazis_users-2.3.2}/tests/factories.py +0 -0
  93. {bazis_users-2.3.0 → bazis_users-2.3.2}/tests/test_protected.py +0 -0
  94. {bazis_users-2.3.0 → bazis_users-2.3.2}/tests/test_users.py +0 -0
@@ -42,9 +42,12 @@ jobs:
42
42
  echo "::error::Tag v$VERSION already exists"
43
43
  exit 1
44
44
  fi
45
- LAST_TAG=$(git tag --list 'v*' --sort=-v:refname | head -n 1)
45
+ # versionsort.suffix: a pre-release (v2.4.0-rc1) sorts before its release (v2.4.0)
46
+ LAST_TAG=$(git -c versionsort.suffix=- tag --list 'v*' --sort=-v:refname | head -n 1)
46
47
  echo "Last release: ${LAST_TAG:-none}, new release: v$VERSION"
47
- if [ -n "$LAST_TAG" ] && [ "$(printf '%s\n%s\n' "${LAST_TAG#v}" "$VERSION" | sort -V | tail -n 1)" != "$VERSION" ]; then
48
+ # sort -V orders "~" before anything, as versionsort.suffix does with "-"
49
+ NEWEST=$(printf '%s\n%s\n' "${LAST_TAG#v}" "$VERSION" | sed 's/-/~/' | sort -V | tail -n 1)
50
+ if [ -n "$LAST_TAG" ] && [ "$NEWEST" != "${VERSION/-/\~}" ]; then
48
51
  echo "::error::Version $VERSION is not newer than $LAST_TAG"
49
52
  exit 1
50
53
  fi
@@ -20,7 +20,7 @@ jobs:
20
20
  steps:
21
21
  - uses: actions/checkout@v4
22
22
  - uses: astral-sh/setup-uv@v6
23
- - run: uvx ruff check bazis tests
23
+ - run: uvx ruff check bazis tests sample
24
24
 
25
25
  tests:
26
26
  name: tests (python ${{ matrix.python }}, ${{ matrix.resolution }})
@@ -29,7 +29,7 @@ BS_MEDIA_ROOT=/tmp/bazis/media BS_STATIC_ROOT=/tmp/bazis/static BS_WEBAPP_ROOT=/
29
29
  python -m pytest ../tests -o addopts="" -p no:cacheprovider
30
30
  ```
31
31
 
32
- Lint: `ruff check bazis tests`. CI also runs `python manage.py makemigrations --check
32
+ Lint: `ruff check bazis tests sample`. CI also runs `python manage.py makemigrations --check
33
33
  --dry-run` in `sample`: commit the migrations of model changes, including the sample apps.
34
34
 
35
35
  ## Releasing
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bazis-users
3
- Version: 2.3.0
3
+ Version: 2.3.2
4
4
  Summary: User management module for Bazis framework.
5
5
  Author-email: Ilya Kharyn <ilya.tt07@gmail.com>
6
6
  Maintainer-email: Ilya Kharyn <ilya.tt07@gmail.com>
@@ -17,7 +17,7 @@ Classifier: Framework :: Django
17
17
  Classifier: Framework :: FastAPI
18
18
  Requires-Python: >=3.12
19
19
  Description-Content-Type: text/markdown
20
- Requires-Dist: bazis>=2.3.0
20
+ Requires-Dist: bazis>=2.3.1
21
21
  Requires-Dist: python-multipart>=0.0.18
22
22
  Requires-Dist: PyJWT>=2.10
23
23
  Provides-Extra: test
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2.3.0'
22
- __version_tuple__ = version_tuple = (2, 3, 0)
21
+ __version__ = version = '2.3.2'
22
+ __version_tuple__ = version_tuple = (2, 3, 2)
23
23
 
24
- __commit_id__ = commit_id = 'g5959b6ec7'
24
+ __commit_id__ = commit_id = 'gfa5e68bf1'
@@ -38,7 +38,11 @@ class Settings(BazisSettings):
38
38
  BAZIS_JWT_SESSION_ALG: Literal['HS256', 'HS384', 'HS512'] = Field(
39
39
  'HS256', title=_('JWT algorithm')
40
40
  )
41
- BAZIS_JWT_SESSION_LIFETIME: int = Field(86400, title=_('JWT lifetime'), dynamic=True)
41
+ BAZIS_JWT_SESSION_LIFETIME: int = Field(
42
+ 86400,
43
+ title=_('JWT lifetime'),
44
+ json_schema_extra={'dynamic': True},
45
+ )
42
46
 
43
47
 
44
48
  settings = Settings()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bazis-users
3
- Version: 2.3.0
3
+ Version: 2.3.2
4
4
  Summary: User management module for Bazis framework.
5
5
  Author-email: Ilya Kharyn <ilya.tt07@gmail.com>
6
6
  Maintainer-email: Ilya Kharyn <ilya.tt07@gmail.com>
@@ -17,7 +17,7 @@ Classifier: Framework :: Django
17
17
  Classifier: Framework :: FastAPI
18
18
  Requires-Python: >=3.12
19
19
  Description-Content-Type: text/markdown
20
- Requires-Dist: bazis>=2.3.0
20
+ Requires-Dist: bazis>=2.3.1
21
21
  Requires-Dist: python-multipart>=0.0.18
22
22
  Requires-Dist: PyJWT>=2.10
23
23
  Provides-Extra: test
@@ -50,6 +50,8 @@ docs/_static/readthedocs-custom.css
50
50
  docs/_templates/custom-class-template.rst
51
51
  docs/_templates/custom-module-template.rst
52
52
  docs/releases/2.3.0.md
53
+ docs/releases/2.3.1.md
54
+ docs/releases/2.3.2.md
53
55
  sample/manage.py
54
56
  sample/project.env
55
57
  sample/pyproject.toml
@@ -1,4 +1,4 @@
1
- bazis>=2.3.0
1
+ bazis>=2.3.1
2
2
  python-multipart>=0.0.18
3
3
  PyJWT>=2.10
4
4
 
@@ -39,6 +39,8 @@
39
39
  "docs/manage.py",
40
40
  "docs/project.env",
41
41
  "docs/releases/2.3.0.md",
42
+ "docs/releases/2.3.1.md",
43
+ "docs/releases/2.3.2.md",
42
44
  "docs/requirements.txt",
43
45
  "docs/settings.py",
44
46
  "docs/structure.rst",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "2.3.0",
2
+ "tag": "2.3.2",
3
3
  "distance": 0,
4
- "node": "g5959b6ec72f5fb36c16474b35bc9e8f2363459ce",
4
+ "node": "gfa5e68bf11f081b876fbfebf90cdac9a6b124dcb",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-01"
@@ -0,0 +1,6 @@
1
+ # bazis-users 2.3.1
2
+
3
+ - Requires Bazis 2.3.1. Its relationships endpoints changed any relation of any object:
4
+ every authenticated user could add himself to Django groups or permissions with
5
+ `POST /users/user/<id>/relationships/groups` (or `user_permissions`), which the user
6
+ schema excludes. A test now checks that both are refused.
@@ -0,0 +1,6 @@
1
+ # bazis-users 2.3.2
2
+
3
+ ## Fixes
4
+
5
+ - `BAZIS_JWT_SESSION_LIFETIME` is declared with `json_schema_extra` (an extra keyword
6
+ argument of `Field` is deprecated in Pydantic 2 and emitted a warning).
@@ -33,7 +33,7 @@ classifiers = [
33
33
  "Framework :: FastAPI",
34
34
  ]
35
35
  dependencies = [
36
- "bazis>=2.3.0",
36
+ "bazis>=2.3.1",
37
37
  "python-multipart>=0.0.18",
38
38
  "PyJWT>=2.10",
39
39
  ]
@@ -17,4 +17,4 @@ import os
17
17
 
18
18
  os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sample.settings')
19
19
 
20
- from bazis.core.app import app # noqa: E401
20
+ from bazis.core.app import app # noqa: E402, F401
@@ -12,4 +12,4 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- import bazis.core.configure # noqa: F401
15
+ import bazis.core.configure # noqa: F401
@@ -133,3 +133,31 @@ def test_token_without_expiration_is_anonymous(sample_app, user):
133
133
  token = _token({'sub': user.username})
134
134
  assert get_token_data(token_header=None, token_param=None, token_cookie=token) == {}
135
135
  assert _get_me(sample_app, token).status_code == 401
136
+
137
+
138
+ @pytest.mark.django_db(transaction=True)
139
+ def test_user_cannot_grant_himself_groups(sample_app, user):
140
+ """
141
+ groups and user_permissions are excluded from the user schema: the relationships
142
+ endpoints must not change them (privilege escalation through Django permissions).
143
+ """
144
+ from django.contrib.auth.models import Group, Permission
145
+
146
+ admins = Group.objects.create(name='admins')
147
+ admins.permissions.set(Permission.objects.all())
148
+ client = get_api_client(sample_app, user.jwt_build())
149
+
150
+ response = client.post(
151
+ f'/api/v1/users/user/{user.id}/relationships/groups',
152
+ json_data={'data': [{'id': str(admins.id), 'type': 'auth.group'}]},
153
+ )
154
+ assert response.status_code == 403
155
+ assert not user.groups.exists()
156
+
157
+ permission = Permission.objects.first()
158
+ response = client.post(
159
+ f'/api/v1/users/user/{user.id}/relationships/user_permissions',
160
+ json_data={'data': [{'id': str(permission.id), 'type': 'auth.permission'}]},
161
+ )
162
+ assert response.status_code == 403
163
+ assert not user.user_permissions.exists()
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
File without changes