django-admin-fieldsets-extra 0.1.0__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 (70) hide show
  1. django_admin_fieldsets_extra-0.1.0/.github/workflows/compat-matrix.yml +27 -0
  2. django_admin_fieldsets_extra-0.1.0/.github/workflows/js-tests.yml +24 -0
  3. django_admin_fieldsets_extra-0.1.0/.github/workflows/pre-commit.yml +26 -0
  4. django_admin_fieldsets_extra-0.1.0/.github/workflows/pytest.yml +31 -0
  5. django_admin_fieldsets_extra-0.1.0/.github/workflows/release.yml +55 -0
  6. django_admin_fieldsets_extra-0.1.0/.gitignore +42 -0
  7. django_admin_fieldsets_extra-0.1.0/.pre-commit-config.yaml +64 -0
  8. django_admin_fieldsets_extra-0.1.0/CHANGELOG.md +29 -0
  9. django_admin_fieldsets_extra-0.1.0/CONTRIBUTING.md +123 -0
  10. django_admin_fieldsets_extra-0.1.0/LICENSE +21 -0
  11. django_admin_fieldsets_extra-0.1.0/PKG-INFO +294 -0
  12. django_admin_fieldsets_extra-0.1.0/README.md +245 -0
  13. django_admin_fieldsets_extra-0.1.0/biome.json +19 -0
  14. django_admin_fieldsets_extra-0.1.0/docs/screenshots/.gitkeep +0 -0
  15. django_admin_fieldsets_extra-0.1.0/docs/screenshots/hero.png +0 -0
  16. django_admin_fieldsets_extra-0.1.0/docs/screenshots/save-fieldset.png +0 -0
  17. django_admin_fieldsets_extra-0.1.0/docs/themes/unfold/layout.png +0 -0
  18. django_admin_fieldsets_extra-0.1.0/docs/themes/unfold/save-fieldset-dark.png +0 -0
  19. django_admin_fieldsets_extra-0.1.0/docs/themes/unfold.md +57 -0
  20. django_admin_fieldsets_extra-0.1.0/example/demo/__init__.py +0 -0
  21. django_admin_fieldsets_extra-0.1.0/example/demo/admin.py +30 -0
  22. django_admin_fieldsets_extra-0.1.0/example/demo/admin_unfold.py +37 -0
  23. django_admin_fieldsets_extra-0.1.0/example/demo/management/__init__.py +0 -0
  24. django_admin_fieldsets_extra-0.1.0/example/demo/management/commands/__init__.py +0 -0
  25. django_admin_fieldsets_extra-0.1.0/example/demo/management/commands/seed_demo.py +28 -0
  26. django_admin_fieldsets_extra-0.1.0/example/demo/migrations/0001_initial.py +41 -0
  27. django_admin_fieldsets_extra-0.1.0/example/demo/migrations/__init__.py +0 -0
  28. django_admin_fieldsets_extra-0.1.0/example/demo/models.py +29 -0
  29. django_admin_fieldsets_extra-0.1.0/example/example/__init__.py +0 -0
  30. django_admin_fieldsets_extra-0.1.0/example/example/settings.py +66 -0
  31. django_admin_fieldsets_extra-0.1.0/example/example/settings_unfold.py +8 -0
  32. django_admin_fieldsets_extra-0.1.0/example/example/urls.py +6 -0
  33. django_admin_fieldsets_extra-0.1.0/example/example/urls_unfold.py +6 -0
  34. django_admin_fieldsets_extra-0.1.0/example/example/wsgi.py +7 -0
  35. django_admin_fieldsets_extra-0.1.0/example/manage.py +20 -0
  36. django_admin_fieldsets_extra-0.1.0/package-lock.json +2963 -0
  37. django_admin_fieldsets_extra-0.1.0/package.json +16 -0
  38. django_admin_fieldsets_extra-0.1.0/pyproject.toml +135 -0
  39. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/__init__.py +1 -0
  40. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/apps.py +7 -0
  41. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/checks.py +79 -0
  42. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/contrib/__init__.py +0 -0
  43. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/contrib/unfold.py +95 -0
  44. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/locale/es/LC_MESSAGES/django.mo +0 -0
  45. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/locale/es/LC_MESSAGES/django.po +42 -0
  46. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/mixins.py +347 -0
  47. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/py.typed +0 -0
  48. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/static/fieldsets_extra/css/contrib/unfold.css +45 -0
  49. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/static/fieldsets_extra/css/fieldsets_extra.css +50 -0
  50. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/static/fieldsets_extra/js/fieldsets_extra.js +140 -0
  51. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/templates/admin/fieldsets_extra/change_form.html +34 -0
  52. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/templates/admin/fieldsets_extra/fieldset_response.html +7 -0
  53. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/templates/admin/fieldsets_extra/includes/fieldset.html +28 -0
  54. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/templates/admin/fieldsets_extra/unfold/change_form.html +15 -0
  55. django_admin_fieldsets_extra-0.1.0/src/django_admin_fieldsets_extra/types.py +17 -0
  56. django_admin_fieldsets_extra-0.1.0/tests/__init__.py +0 -0
  57. django_admin_fieldsets_extra-0.1.0/tests/admin.py +101 -0
  58. django_admin_fieldsets_extra-0.1.0/tests/conftest.py +32 -0
  59. django_admin_fieldsets_extra-0.1.0/tests/e2e/__init__.py +0 -0
  60. django_admin_fieldsets_extra-0.1.0/tests/e2e/test_e2e.py +97 -0
  61. django_admin_fieldsets_extra-0.1.0/tests/js/fieldsets_extra.test.js +47 -0
  62. django_admin_fieldsets_extra-0.1.0/tests/settings.py +61 -0
  63. django_admin_fieldsets_extra-0.1.0/tests/test_i18n.py +110 -0
  64. django_admin_fieldsets_extra-0.1.0/tests/test_inline_controls.py +54 -0
  65. django_admin_fieldsets_extra-0.1.0/tests/test_layout.py +276 -0
  66. django_admin_fieldsets_extra-0.1.0/tests/test_save_fieldset.py +178 -0
  67. django_admin_fieldsets_extra-0.1.0/tests/test_unfold.py +73 -0
  68. django_admin_fieldsets_extra-0.1.0/tests/urls.py +14 -0
  69. django_admin_fieldsets_extra-0.1.0/uv.lock +1500 -0
  70. django_admin_fieldsets_extra-0.1.0/vitest.config.js +13 -0
@@ -0,0 +1,27 @@
1
+ name: Compatibility Matrix
2
+
3
+ on:
4
+ push:
5
+ branches: [master, main]
6
+ pull_request:
7
+ branches: [master, main]
8
+
9
+ jobs:
10
+ tox:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+
15
+ - name: Install uv
16
+ uses: astral-sh/setup-uv@v5
17
+ with:
18
+ enable-cache: true
19
+
20
+ - name: Install Python versions
21
+ run: uv python install 3.10 3.12 3.13 3.14
22
+
23
+ - name: Install dependencies
24
+ run: uv sync
25
+
26
+ - name: Run compatibility matrix (tox)
27
+ run: uv run tox run
@@ -0,0 +1,24 @@
1
+ name: JavaScript Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [main, master]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+
14
+ - name: Setup Node.js
15
+ uses: actions/setup-node@v4
16
+ with:
17
+ node-version: "20"
18
+ cache: "npm"
19
+
20
+ - name: Install dependencies
21
+ run: npm ci
22
+
23
+ - name: Run Tests & Coverage
24
+ run: npm run coverage
@@ -0,0 +1,26 @@
1
+ name: Pre-commit
2
+
3
+ on:
4
+ push:
5
+ branches: [main, master]
6
+ pull_request:
7
+
8
+ jobs:
9
+ pre-commit:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+
14
+ - name: Install uv
15
+ uses: astral-sh/setup-uv@v5
16
+ with:
17
+ enable-cache: true
18
+
19
+ - name: Set up Python
20
+ run: uv python install
21
+
22
+ - name: Install dependencies
23
+ run: uv sync
24
+
25
+ - name: Run pre-commit
26
+ run: uv run pre-commit run --all-files
@@ -0,0 +1,31 @@
1
+ name: Python and Playwright Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [master, main]
6
+ pull_request:
7
+ branches: [master, main]
8
+
9
+ jobs:
10
+ test-python:
11
+ name: Python Tests
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+
16
+ - name: Install uv
17
+ uses: astral-sh/setup-uv@v5
18
+ with:
19
+ enable-cache: true
20
+
21
+ - name: Set up Python
22
+ run: uv python install
23
+
24
+ - name: Install dependencies
25
+ run: uv sync
26
+
27
+ - name: Install Playwright browsers
28
+ run: uv run playwright install --with-deps chromium
29
+
30
+ - name: Run Pytest
31
+ run: uv run pytest
@@ -0,0 +1,55 @@
1
+ name: Release
2
+
3
+ on:
4
+ release:
5
+ types:
6
+ - published
7
+
8
+ jobs:
9
+ release-build:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+
15
+ - name: Install uv
16
+ uses: astral-sh/setup-uv@v5
17
+ with:
18
+ enable-cache: true
19
+
20
+ - name: Show project version
21
+ run: |
22
+ grep "version" pyproject.toml
23
+
24
+ - name: Build release distributions
25
+ run: uv build
26
+
27
+ - name: Upload distributions
28
+ uses: actions/upload-artifact@v4
29
+ with:
30
+ name: release-dists
31
+ path: dist/
32
+
33
+ pypi-publish:
34
+ runs-on: ubuntu-latest
35
+ needs:
36
+ - release-build
37
+ permissions:
38
+ id-token: write
39
+ contents: read
40
+
41
+ environment:
42
+ name: pypi
43
+ url: https://pypi.org/project/django-admin-fieldsets-extra/
44
+
45
+ steps:
46
+ - name: Retrieve release distributions
47
+ uses: actions/download-artifact@v4
48
+ with:
49
+ name: release-dists
50
+ path: dist/
51
+
52
+ - name: Publish release distributions to PyPI
53
+ uses: pypa/gh-action-pypi-publish@release/v1
54
+ with:
55
+ packages-dir: dist/
@@ -0,0 +1,42 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .eggs/
6
+ build/
7
+ dist/
8
+ .installed.cfg
9
+ *.egg
10
+
11
+ # Virtual environments
12
+ .venv/
13
+ venv/
14
+ env/
15
+
16
+ # Testing / coverage
17
+ .pytest_cache/
18
+ .coverage
19
+ .coverage.*
20
+ coverage/
21
+ htmlcov/
22
+ .mypy_cache/
23
+ .ruff_cache/
24
+ .tox/
25
+
26
+ # Django
27
+ *.log
28
+ local_settings.py
29
+ db.sqlite3
30
+ db.sqlite3-journal
31
+ media/
32
+
33
+ # Node / JS
34
+ node_modules/
35
+
36
+ # Editors / OS
37
+ .vscode/
38
+ .idea/
39
+ .DS_Store
40
+
41
+ # Docs
42
+ docs/_build/
@@ -0,0 +1,64 @@
1
+ default_language_version:
2
+ python: &python-version python3.14
3
+
4
+ repos:
5
+ - repo: https://github.com/pre-commit/pre-commit-hooks
6
+ rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # frozen: v6.0.0
7
+ hooks:
8
+ - id: check-added-large-files
9
+ - id: check-case-conflict
10
+ - id: check-json
11
+ - id: check-merge-conflict
12
+ - id: check-symlinks
13
+ - id: check-toml
14
+ - id: debug-statements
15
+ - id: end-of-file-fixer
16
+ - id: trailing-whitespace
17
+
18
+ - repo: https://github.com/biomejs/pre-commit
19
+ rev: d1ce4972fb5ad09afd33b432bca71e8c5dfbb2b5 # frozen: v2.5.6
20
+ hooks:
21
+ - id: biome-check
22
+ additional_dependencies:
23
+ - '@biomejs/biome@2.3.8'
24
+ language_version: default
25
+
26
+ - repo: https://github.com/adamchainz/django-upgrade
27
+ rev: bdcc9646c249f00ec9781751791e7b75b48b3722 # frozen: 1.31.1
28
+ hooks:
29
+ - id: django-upgrade
30
+ args: [--target-version, "4.2"]
31
+
32
+ - repo: https://github.com/astral-sh/ruff-pre-commit
33
+ rev: 39d9ac5938dadb73df0564a45f163e25ff9fa6e2 # frozen: v0.16.1
34
+ hooks:
35
+ - id: ruff-check
36
+ args: [--fix]
37
+ - id: ruff-format
38
+
39
+ - repo: local
40
+ hooks:
41
+ - id: mypy
42
+ name: mypy
43
+ entry: mypy
44
+ language: python
45
+ additional_dependencies:
46
+ - mypy>=1.10
47
+ - django-stubs[compatible-mypy]>=5
48
+ - django>=4.2
49
+ - pytest-django>=4.8
50
+ types: [python]
51
+ files: ^(src|example)/
52
+ pass_filenames: false
53
+ args: [src/django_admin_fieldsets_extra, example]
54
+
55
+ - repo: https://github.com/adamchainz/djade-pre-commit
56
+ rev: 52a7ce253113456c2a1113186a4a19b15c8b68af # frozen: 1.9.0
57
+ hooks:
58
+ - id: djade
59
+ files: '(/|^)templates/'
60
+
61
+ - repo: https://github.com/tox-dev/pyproject-fmt
62
+ rev: d600c142bb19f521ae6a6a345f94a2efd7937759 # frozen: v2.26.0
63
+ hooks:
64
+ - id: pyproject-fmt
@@ -0,0 +1,29 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.1.0] - 2026-10-05
9
+
10
+ First release.
11
+
12
+ ### Added
13
+
14
+ - `FieldsetsExtraMixin`: `fieldsets_with_inlines` renders fieldsets
15
+ and inlines interleaved, deriving `fieldsets` and `inlines`;
16
+ `get_fieldsets_with_inlines()` for dynamic layouts.
17
+ - Change form template overriding only Django's `field_sets` and
18
+ `inline_field_sets` blocks, with `layout_fieldset` / `layout_inline`
19
+ blocks.
20
+ - `"save_button": True` on a layout fieldset: a button that saves only its
21
+ fields, re-rendering the fieldset in place.
22
+ - `contrib.unfold.UnfoldFieldsetsExtraMixin` (`unfold` extra): the layout
23
+ and save buttons with django-unfold, its tab fieldsets rendered as its
24
+ tabs; check `admin_fieldsets_extra.E101`.
25
+ - Spanish translation (`locale/es`).
26
+ - System checks, including a warning when `get_fieldsets_with_inlines()`
27
+ is overridden while `fieldsets` / `inlines` are set too.
28
+ - Works with django-admin-inline-controls' inlines, and Django 4.2 – 6.1,
29
+ Python 3.10+.
@@ -0,0 +1,123 @@
1
+ # Contributing
2
+
3
+ ## Development setup
4
+
5
+ With [uv](https://docs.astral.sh/uv/) (recommended):
6
+
7
+ ```bash
8
+ uv sync
9
+ uv run playwright install --with-deps chromium
10
+ npm install
11
+ uv run pre-commit install
12
+ ```
13
+
14
+ Without uv:
15
+
16
+ ```bash
17
+ pip install -e ".[dev]"
18
+ playwright install --with-deps chromium
19
+ pre-commit install
20
+ ```
21
+
22
+ ## Running the example project
23
+
24
+ ```bash
25
+ cd example
26
+ python manage.py migrate
27
+ python manage.py createsuperuser
28
+ python manage.py runserver
29
+ ```
30
+
31
+ ## Tests
32
+
33
+ Python (pytest + pytest-django, coverage always on via `addopts`):
34
+
35
+ ```bash
36
+ uv run pytest
37
+ ```
38
+
39
+ `tests/e2e/` (real-browser tests via pytest-playwright, driving a real
40
+ Chromium against `live_server`) runs as part of that same `uv run pytest`
41
+ — no separate command. They need `uv run playwright install chromium`
42
+ once (see Setup above) and are slower than the rest of the suite;
43
+ everything else under `tests/` is unit/integration-level and doesn't
44
+ touch a browser.
45
+
46
+ JavaScript (vitest + jsdom):
47
+
48
+ ```bash
49
+ npm test
50
+ npm run coverage
51
+ ```
52
+
53
+ ## Testing with django-admin-inline-controls
54
+
55
+ `tests/test_inline_controls.py` checks that both packages work together.
56
+ It is skipped unless django-admin-inline-controls is installed, e.g. from a
57
+ sibling checkout:
58
+
59
+ ```bash
60
+ uv pip install -e ../django-admin-inline-controls
61
+ uv run --no-sync pytest # --no-sync keeps it installed
62
+ ```
63
+
64
+ ## Compatibility matrix (tox)
65
+
66
+ `uv run pytest` above only runs against whatever Django version `uv.lock`
67
+ resolved (the newest one satisfying `dependencies`). To check the full
68
+ supported range — every Django series in `classifiers`, against the
69
+ oldest and newest Python it supports (within this package's own
70
+ `requires-python` floor) — run the tox matrix instead:
71
+
72
+ ```bash
73
+ uv run tox run-parallel # every env, in parallel
74
+ uv run tox -e py314-dj52 # a single env, e.g. to debug one failure
75
+ ```
76
+
77
+ `[tool.tox]` in `pyproject.toml` lists the exact envs. Each one gets its own ephemeral venv (via
78
+ [tox-uv](https://github.com/tox-dev/tox-uv), using uv's own Python
79
+ builds — `uv python install <version>` once for any you don't have yet)
80
+ with only `pytest`/`pytest-django`/`pytest-cov` and that env's pinned
81
+ Django, not the full `dev` group, and skips `tests/e2e/` (no Playwright
82
+ in those envs). This only tests boundaries (oldest + newest Python per
83
+ Django series), not every valid combination — that catches most real
84
+ breakage while staying fast. Runs in CI as a separate
85
+ `compat-matrix.yml` workflow, alongside the regular `pytest.yml`. Update
86
+ the `env_list` here whenever `classifiers` gains or drops a Django
87
+ series.
88
+
89
+ ## Lint / format / type-check
90
+
91
+ ```bash
92
+ uv run ruff check .
93
+ uv run ruff format --check .
94
+ uv run mypy src example
95
+ # or, everything at once:
96
+ uv run pre-commit run --all-files
97
+ ```
98
+
99
+ The mypy pre-commit hook runs against the project venv (it needs
100
+ django-stubs to resolve model types), not an isolated pre-commit env.
101
+
102
+ ## Before opening a PR
103
+
104
+ - [ ] `uv run pytest`
105
+ - [ ] `npm test`
106
+ - [ ] `uv run pre-commit run --all-files`
107
+
108
+ ## Translations
109
+
110
+ Catalogs live in `src/django_admin_fieldsets_extra/locale/`. After changing
111
+ translatable text, from that package directory:
112
+
113
+ ```bash
114
+ cd src/django_admin_fieldsets_extra
115
+ DJANGO_SETTINGS_MODULE=tests.settings PYTHONPATH=../..:../../example \
116
+ uv run django-admin makemessages -l es --no-obsolete --add-location file
117
+ # translate the new/changed entries in locale/es/LC_MESSAGES/django.po, then:
118
+ DJANGO_SETTINGS_MODULE=tests.settings PYTHONPATH=../..:../../example \
119
+ uv run django-admin compilemessages
120
+ ```
121
+
122
+ Commit both the `.po` and the compiled `.mo`. `tests/test_i18n.py` fails if
123
+ an entry is untranslated or fuzzy, or if a `.mo` is older than its `.po`.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rodolfo Becerra
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.