Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-django-silk for openSUSE:Factory checked in at 2026-08-22 21:34:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-django-silk (Old) and /work/SRC/openSUSE:Factory/.python-django-silk.new.1258 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-django-silk" Sat Aug 22 21:34:54 2026 rev:19 rq:1372915 version:5.5.2 Changes: -------- --- /work/SRC/openSUSE:Factory/python-django-silk/python-django-silk.changes 2026-03-29 20:01:20.771048437 +0200 +++ /work/SRC/openSUSE:Factory/.python-django-silk.new.1258/python-django-silk.changes 2026-08-22 21:36:58.140983097 +0200 @@ -1,0 +2,22 @@ +Fri Aug 21 19:31:39 UTC 2026 - Dirk Müller <[email protected]> + +- update to 5.5.2: + * This will be the final release to support Django 4.2 and + Django 5.1. + * Fix making a release build (#897) @albertyw + * Fix HTML in request_summary.html (#852) @JortRoelofs + * Fix filtering for JS content (#868) @albertyw + * Fix silk collector finalise raising TypeError when a "model" + key is present in query dict (#872) @albertyw + * Exclude NULL view_names from View filter dropdown (#882) + @albertyw + * Fix FiltersManager.get() raising AttributeError without + session support (#887) @agu2347 + * Fix AttributeError generating curl command for non-string + query params (#885) @agu2347 + * Add support for Python 3.15 (#892) @hugovk + * Fix test coverage flakiness (#850) @albertyw + * Fix test project (#871) @VaishnavGhenge + * Dependency updates + +------------------------------------------------------------------- Old: ---- django_silk-5.5.0.tar.gz New: ---- django_silk-5.5.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-django-silk.spec ++++++ --- /var/tmp/diff_new_pack.wymAlW/_old 2026-08-22 21:36:58.868010018 +0200 +++ /var/tmp/diff_new_pack.wymAlW/_new 2026-08-22 21:36:58.869010056 +0200 @@ -17,7 +17,7 @@ Name: python-django-silk -Version: 5.5.0 +Version: 5.5.2 Release: 0 Summary: Profiling for the Django Framework License: MIT ++++++ django_silk-5.5.0.tar.gz -> django_silk-5.5.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/.github/workflows/release.yml new/django_silk-5.5.2/.github/workflows/release.yml --- old/django_silk-5.5.0/.github/workflows/release.yml 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/.github/workflows/release.yml 2026-08-13 06:11:58.660540800 +0200 @@ -11,24 +11,24 @@ runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 with: fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v7 with: python-version: 3.14 - name: Install dependencies run: | python -m pip install -U pip - python -m pip install -U setuptools twine wheel + python -m pip install -U build twine - name: Build package run: | - python setup.py --version - python setup.py sdist --format=gztar bdist_wheel + python -m build + ls -l dist/ twine check dist/* - name: Upload packages to Jazzband diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/.github/workflows/test.yml new/django_silk-5.5.2/.github/workflows/test.yml --- old/django_silk-5.5.0/.github/workflows/test.yml 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/.github/workflows/test.yml 2026-08-13 06:11:58.660578300 +0200 @@ -9,7 +9,7 @@ strategy: fail-fast: false matrix: - python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] + python-version: ['3.10', '3.11', '3.12', '3.13', '3.14', '3.15'] django-version: ['4.2', '5.1', '5.2', '6.0', 'main'] postgres-version: ['14', '18'] mariadb-version: ['10.6', '10.11', '11.4', '11.8'] @@ -19,10 +19,14 @@ python-version: '3.13' - django-version: '4.2' python-version: '3.14' + - django-version: '4.2' + python-version: '3.15' # Django 5.1 doesn't support Python >= 3.14 - django-version: '5.1' python-version: '3.14' + - django-version: '5.1' + python-version: '3.15' # Django 6.0 doesn't support Python <3.12 (https://docs.djangoproject.com/en/dev/releases/6.0/#python-compatibility) - django-version: '6.0' @@ -63,12 +67,13 @@ - 3306:3306 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + uses: actions/setup-python@v7 with: python-version: ${{ matrix.python-version }} + allow-prereleases: true - name: Get pip cache dir id: pip-cache @@ -76,11 +81,11 @@ echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT - name: Cache - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: ${{ steps.pip-cache.outputs.dir }} key: - ${{ matrix.python-version }}-v1-${{ hashFiles('**/requirements.txt') }}-${{ hashFiles('**/setup.py') }}-${{ hashFiles('**/tox.ini') }} + ${{ matrix.python-version }}-v1-${{ hashFiles('**/requirements.txt') }}-${{ hashFiles('**/setup.py') }}-${{ hashFiles('**/pyproject.toml') }}-${{ hashFiles('**/tox.ini') }} restore-keys: | ${{ matrix.python-version }}-v1- @@ -96,6 +101,6 @@ DJANGO: ${{ matrix.django-version }} - name: Upload coverage - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v7 with: name: Python ${{ matrix.python-version }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/.pre-commit-config.yaml new/django_silk-5.5.2/.pre-commit-config.yaml --- old/django_silk-5.5.0/.pre-commit-config.yaml 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/.pre-commit-config.yaml 2026-08-13 06:11:58.660578300 +0200 @@ -13,7 +13,7 @@ hooks: - id: yesqa - repo: https://github.com/pycqa/isort - rev: '8.0.1' + rev: '9.0.0b2' hooks: - id: isort args: ['--profile', 'black'] @@ -52,7 +52,7 @@ - id: pyupgrade args: ['--keep-mock'] - repo: https://github.com/adamchainz/django-upgrade - rev: '1.30.0' + rev: '1.31.1' hooks: - id: django-upgrade args: [--target-version, '4.2'] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/CHANGELOG.md new/django_silk-5.5.2/CHANGELOG.md --- old/django_silk-5.5.0/CHANGELOG.md 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/CHANGELOG.md 2026-08-13 06:11:58.660648300 +0200 @@ -1,6 +1,43 @@ # Change Log ## Unreleased +## [5.5.2](https://github.com/jazzband/django-silk/tree/5.5.2) (2026-08-11) +:release-by: Albert Wang (@albertyw) +[Full Changelog](https://github.com/jazzband/django-silk/compare/5.5.0..5.5.2) + +This is a re-release of 5.5.1 due to build/release issues. + +This will be the final release to support Django 4.2 and Django 5.1. + +**Fixes:** + + - Fix making a release build (#897) @albertyw + +## [5.5.1](https://github.com/jazzband/django-silk/tree/5.5.1) (2026-08-01) +:release-by: Albert Wang (@albertyw) +[Full Changelog](https://github.com/jazzband/django-silk/compare/5.5.0..5.5.1) + +This will be the final release to support Django 4.2 and Django 5.1 + +**Fixes:** + + - Fix HTML in request_summary.html (#852) @JortRoelofs + - Fix filtering for JS content (#868) @albertyw + - Fix silk collector finalise raising TypeError when a "model" key is present in query dict (#872) @albertyw + - Exclude NULL view_names from View filter dropdown (#882) @albertyw + - Fix FiltersManager.get() raising AttributeError without session support (#887) @agu2347 + - Fix AttributeError generating curl command for non-string query params (#885) @agu2347 + +**Features/Enhancements:** + + - Add support for Python 3.15 (#892) @hugovk + +**Maintenance and Cleanup:** + + - Fix test coverage flakiness (#850) @albertyw + - Fix test project (#871) @VaishnavGhenge + - Dependency updates + ## [5.5.0](https://github.com/jazzband/django-silk/tree/5.5.0) (2026-03-06) :release-by: Albert Wang (@albertyw) [Full Changelog](https://github.com/jazzband/django-silk/compare/5.4.3..5.5.0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/PKG-INFO new/django_silk-5.5.2/PKG-INFO --- old/django_silk-5.5.0/PKG-INFO 2026-03-07 09:15:50.052632300 +0100 +++ new/django_silk-5.5.2/PKG-INFO 2026-08-13 06:12:08.207594900 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: django-silk -Version: 5.5.0 +Version: 5.5.2 Summary: Silky smooth profiling for the Django Framework Home-page: https://github.com/jazzband/django-silk Author: Michael Ford @@ -21,6 +21,7 @@ Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: 3.15 Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content Requires-Python: >=3.10 @@ -77,7 +78,7 @@ Silk has been tested with: * Django: 4.2, 5.1, 5.2, 6.0 -* Python: 3.10, 3.11, 3.12, 3.13, 3.14 +* Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15 ## Installation diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/README.md new/django_silk-5.5.2/README.md --- old/django_silk-5.5.0/README.md 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/README.md 2026-08-13 06:11:58.660648300 +0200 @@ -31,7 +31,7 @@ Silk has been tested with: * Django: 4.2, 5.1, 5.2, 6.0 -* Python: 3.10, 3.11, 3.12, 3.13, 3.14 +* Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15 ## Installation diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/django_silk.egg-info/PKG-INFO new/django_silk-5.5.2/django_silk.egg-info/PKG-INFO --- old/django_silk-5.5.0/django_silk.egg-info/PKG-INFO 2026-03-07 09:15:49.000000000 +0100 +++ new/django_silk-5.5.2/django_silk.egg-info/PKG-INFO 2026-08-13 06:12:08.145595600 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: django-silk -Version: 5.5.0 +Version: 5.5.2 Summary: Silky smooth profiling for the Django Framework Home-page: https://github.com/jazzband/django-silk Author: Michael Ford @@ -21,6 +21,7 @@ Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: 3.15 Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content Requires-Python: >=3.10 @@ -77,7 +78,7 @@ Silk has been tested with: * Django: 4.2, 5.1, 5.2, 6.0 -* Python: 3.10, 3.11, 3.12, 3.13, 3.14 +* Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15 ## Installation diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/django_silk.egg-info/SOURCES.txt new/django_silk-5.5.2/django_silk.egg-info/SOURCES.txt --- old/django_silk-5.5.0/django_silk.egg-info/SOURCES.txt 2026-03-07 09:15:49.000000000 +0100 +++ new/django_silk-5.5.2/django_silk.egg-info/SOURCES.txt 2026-08-13 06:12:08.168366200 +0200 @@ -22,6 +22,8 @@ django_silk.egg-info/SOURCES.txt django_silk.egg-info/dependency_links.txt django_silk.egg-info/requires.txt +django_silk.egg-info/scm_file_list.json +django_silk.egg-info/scm_version.json django_silk.egg-info/top_level.txt docs/Makefile docs/conf.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/django_silk.egg-info/scm_file_list.json new/django_silk-5.5.2/django_silk.egg-info/scm_file_list.json --- old/django_silk-5.5.0/django_silk.egg-info/scm_file_list.json 1970-01-01 01:00:00.000000000 +0100 +++ new/django_silk-5.5.2/django_silk.egg-info/scm_file_list.json 2026-08-13 06:12:08.144238200 +0200 @@ -0,0 +1,307 @@ +{ + "files": [ + ".coveragerc", + ".github/workflows/release.yml", + ".github/workflows/test.yml", + ".gitignore", + ".pre-commit-config.yaml", + "CHANGELOG.md", + "CODE_OF_CONDUCT.md", + "CONTRIBUTING.md", + "LICENSE", + "MANIFEST.in", + "README.md", + "docs/Makefile", + "docs/conf.py", + "docs/configuration.rst", + "docs/images/1.png", + "docs/images/2.png", + "docs/images/3.png", + "docs/images/4.png", + "docs/images/5.png", + "docs/images/6.png", + "docs/images/7.png", + "docs/images/8.png", + "docs/images/9.png", + "docs/images/meta.png", + "docs/index.rst", + "docs/profiling.rst", + "docs/quickstart.rst", + "docs/troubleshooting.rst", + "gulpfile.js", + "package.json", + "project/example_app/__init__.py", + "project/example_app/admin.py", + "project/example_app/migrations/0001_initial.py", + "project/example_app/migrations/0002_alter_blind_photo.py", + "project/example_app/migrations/0003_blind_unique_name_if_provided.py", + "project/example_app/migrations/__init__.py", + "project/example_app/models.py", + "project/example_app/templates/example_app/blind_form.html", + "project/example_app/templates/example_app/index.html", + "project/example_app/templates/example_app/login.html", + "project/example_app/tests.py", + "project/example_app/urls.py", + "project/example_app/views.py", + "project/manage.py", + "project/project/__init__.py", + "project/project/settings.py", + "project/project/urls.py", + "project/tests/__init__.py", + "project/tests/data/__init__.py", + "project/tests/data/dynamic.py", + "project/tests/factories.py", + "project/tests/test_app_config.py", + "project/tests/test_code.py", + "project/tests/test_code_gen_curl.py", + "project/tests/test_code_gen_django.py", + "project/tests/test_collector.py", + "project/tests/test_command_garbage_collect.py", + "project/tests/test_compat.py", + "project/tests/test_config_auth.py", + "project/tests/test_config_long_urls.py", + "project/tests/test_config_max_body_size.py", + "project/tests/test_config_meta.py", + "project/tests/test_db.py", + "project/tests/test_dynamic_profiling.py", + "project/tests/test_encoding.py", + "project/tests/test_end_points.py", + "project/tests/test_execute_sql.py", + "project/tests/test_filters.py", + "project/tests/test_lib/__init__.py", + "project/tests/test_lib/assertion.py", + "project/tests/test_lib/mock_suite.py", + "project/tests/test_models.py", + "project/tests/test_multipart_forms.py", + "project/tests/test_profile_dot.py", + "project/tests/test_profile_parser.py", + "project/tests/test_response_assumptions.py", + "project/tests/test_sensitive_data_in_request.py", + "project/tests/test_silky_middleware.py", + "project/tests/test_silky_profiler.py", + "project/tests/test_view_clear_db.py", + "project/tests/test_view_profiling.py", + "project/tests/test_view_requests.py", + "project/tests/test_view_sql_detail.py", + "project/tests/test_view_summary_view.py", + "project/tests/urlconf_without_silk.py", + "project/tests/util.py", + "project/wsgi.py", + "pyproject.toml", + "pytest.ini", + "requirements.txt", + "screenshots/1.png", + "screenshots/10.png", + "screenshots/2.png", + "screenshots/3.png", + "screenshots/4.png", + "screenshots/5.png", + "screenshots/6.png", + "screenshots/7.png", + "screenshots/8.png", + "screenshots/9.png", + "screenshots/meta.png", + "scss/components/cell.scss", + "scss/components/colors.scss", + "scss/components/fonts.scss", + "scss/components/heading.scss", + "scss/components/numeric.scss", + "scss/components/row.scss", + "scss/components/summary.scss", + "scss/pages/base.scss", + "scss/pages/clear_db.scss", + "scss/pages/cprofile.scss", + "scss/pages/detail_base.scss", + "scss/pages/profile_detail.scss", + "scss/pages/profiling.scss", + "scss/pages/raw.scss", + "scss/pages/request.scss", + "scss/pages/requests.scss", + "scss/pages/root_base.scss", + "scss/pages/sql.scss", + "scss/pages/sql_detail.scss", + "scss/pages/summary.scss", + "setup.py", + "silk.sublime-project", + "silk/__init__.py", + "silk/apps.py", + "silk/auth.py", + "silk/code_generation/__init__.py", + "silk/code_generation/curl.py", + "silk/code_generation/django_test_client.py", + "silk/collector.py", + "silk/config.py", + "silk/errors.py", + "silk/management/__init__.py", + "silk/management/commands/__init__.py", + "silk/management/commands/silk_clear_request_log.py", + "silk/management/commands/silk_request_garbage_collect.py", + "silk/middleware.py", + "silk/migrations/0001_initial.py", + "silk/migrations/0002_auto_update_uuid4_id_field.py", + "silk/migrations/0003_request_prof_file.py", + "silk/migrations/0004_request_prof_file_storage.py", + "silk/migrations/0005_increase_request_prof_file_length.py", + "silk/migrations/0006_fix_request_prof_file_blank.py", + "silk/migrations/0007_sqlquery_identifier.py", + "silk/migrations/0008_sqlquery_analysis.py", + "silk/migrations/__init__.py", + "silk/model_factory.py", + "silk/models.py", + "silk/profiling/__init__.py", + "silk/profiling/dynamic.py", + "silk/profiling/profiler.py", + "silk/request_filters.py", + "silk/singleton.py", + "silk/sql.py", + "silk/static/silk/css/components/cell.css", + "silk/static/silk/css/components/colors.css", + "silk/static/silk/css/components/fonts.css", + "silk/static/silk/css/components/heading.css", + "silk/static/silk/css/components/numeric.css", + "silk/static/silk/css/components/row.css", + "silk/static/silk/css/components/summary.css", + "silk/static/silk/css/pages/base.css", + "silk/static/silk/css/pages/clear_db.css", + "silk/static/silk/css/pages/cprofile.css", + "silk/static/silk/css/pages/detail_base.css", + "silk/static/silk/css/pages/profile_detail.css", + "silk/static/silk/css/pages/profiling.css", + "silk/static/silk/css/pages/raw.css", + "silk/static/silk/css/pages/request.css", + "silk/static/silk/css/pages/requests.css", + "silk/static/silk/css/pages/root_base.css", + "silk/static/silk/css/pages/sql.css", + "silk/static/silk/css/pages/sql_detail.css", + "silk/static/silk/css/pages/summary.css", + "silk/static/silk/favicon-16x16.png", + "silk/static/silk/favicon-32x32.png", + "silk/static/silk/filter.png", + "silk/static/silk/filter2.png", + "silk/static/silk/fonts/fantasque/FantasqueSansMono-Bold.woff", + "silk/static/silk/fonts/fantasque/FantasqueSansMono-BoldItalic.woff", + "silk/static/silk/fonts/fantasque/FantasqueSansMono-RegItalic.woff", + "silk/static/silk/fonts/fantasque/FantasqueSansMono-Regular.woff", + "silk/static/silk/fonts/fira/FiraSans-Bold.woff", + "silk/static/silk/fonts/fira/FiraSans-BoldItalic.woff", + "silk/static/silk/fonts/fira/FiraSans-Light.woff", + "silk/static/silk/fonts/fira/FiraSans-LightItalic.woff", + "silk/static/silk/fonts/fira/FiraSans-Medium.woff", + "silk/static/silk/fonts/fira/FiraSans-MediumItalic.woff", + "silk/static/silk/fonts/fira/FiraSans-Regular.woff", + "silk/static/silk/fonts/fira/FiraSans-RegularItalic.woff", + "silk/static/silk/fonts/glyphicons-halflings-regular.eot", + "silk/static/silk/fonts/glyphicons-halflings-regular.svg", + "silk/static/silk/fonts/glyphicons-halflings-regular.ttf", + "silk/static/silk/fonts/glyphicons-halflings-regular.woff", + "silk/static/silk/fonts/glyphicons-halflings-regular.woff2", + "silk/static/silk/js/components/cell.js", + "silk/static/silk/js/components/filters.js", + "silk/static/silk/js/pages/base.js", + "silk/static/silk/js/pages/clear_db.js", + "silk/static/silk/js/pages/detail_base.js", + "silk/static/silk/js/pages/profile_detail.js", + "silk/static/silk/js/pages/profiling.js", + "silk/static/silk/js/pages/raw.js", + "silk/static/silk/js/pages/request.js", + "silk/static/silk/js/pages/requests.js", + "silk/static/silk/js/pages/root_base.js", + "silk/static/silk/js/pages/sql.js", + "silk/static/silk/js/pages/sql_detail.js", + "silk/static/silk/js/pages/summary.js", + "silk/static/silk/lib/bootstrap-datetimepicker.min.css", + "silk/static/silk/lib/bootstrap-datetimepicker.min.js", + "silk/static/silk/lib/bootstrap-theme.min.css", + "silk/static/silk/lib/bootstrap.min.css", + "silk/static/silk/lib/bootstrap.min.js", + "silk/static/silk/lib/highlight/foundation.css", + "silk/static/silk/lib/highlight/highlight.pack.js", + "silk/static/silk/lib/images/animated-overlay.gif", + "silk/static/silk/lib/images/ui-bg_diagonals-thick_18_b81900_40x40.png", + "silk/static/silk/lib/images/ui-bg_diagonals-thick_20_666666_40x40.png", + "silk/static/silk/lib/images/ui-bg_flat_10_000000_40x100.png", + "silk/static/silk/lib/images/ui-bg_glass_100_f6f6f6_1x400.png", + "silk/static/silk/lib/images/ui-bg_glass_100_fdf5ce_1x400.png", + "silk/static/silk/lib/images/ui-bg_glass_55_fbf9ee_1x400.png", + "silk/static/silk/lib/images/ui-bg_glass_65_ffffff_1x400.png", + "silk/static/silk/lib/images/ui-bg_glass_75_dadada_1x400.png", + "silk/static/silk/lib/images/ui-bg_glass_75_e6e6e6_1x400.png", + "silk/static/silk/lib/images/ui-bg_glass_95_fef1ec_1x400.png", + "silk/static/silk/lib/images/ui-bg_gloss-wave_35_f6a828_500x100.png", + "silk/static/silk/lib/images/ui-bg_highlight-soft_100_eeeeee_1x100.png", + "silk/static/silk/lib/images/ui-bg_highlight-soft_75_cccccc_1x100.png", + "silk/static/silk/lib/images/ui-bg_highlight-soft_75_ffe45c_1x100.png", + "silk/static/silk/lib/images/ui-icons_222222_256x240.png", + "silk/static/silk/lib/images/ui-icons_228ef1_256x240.png", + "silk/static/silk/lib/images/ui-icons_2e83ff_256x240.png", + "silk/static/silk/lib/images/ui-icons_444444_256x240.png", + "silk/static/silk/lib/images/ui-icons_454545_256x240.png", + "silk/static/silk/lib/images/ui-icons_555555_256x240.png", + "silk/static/silk/lib/images/ui-icons_777620_256x240.png", + "silk/static/silk/lib/images/ui-icons_777777_256x240.png", + "silk/static/silk/lib/images/ui-icons_888888_256x240.png", + "silk/static/silk/lib/images/ui-icons_cc0000_256x240.png", + "silk/static/silk/lib/images/ui-icons_cd0a0a_256x240.png", + "silk/static/silk/lib/images/ui-icons_ef8c08_256x240.png", + "silk/static/silk/lib/images/ui-icons_ffd27a_256x240.png", + "silk/static/silk/lib/images/ui-icons_ffffff_256x240.png", + "silk/static/silk/lib/jquery-3.6.0.min.js", + "silk/static/silk/lib/jquery-ui-1.13.1.min.css", + "silk/static/silk/lib/jquery-ui-1.13.1.min.js", + "silk/static/silk/lib/jquery-ui-1.13.2.min.css", + "silk/static/silk/lib/jquery-ui-1.13.2.min.js", + "silk/static/silk/lib/jquery.datetimepicker.css", + "silk/static/silk/lib/jquery.datetimepicker.js", + "silk/static/silk/lib/sortable.js", + "silk/static/silk/lib/svg-pan-zoom.min.js", + "silk/static/silk/lib/viz-lite.js", + "silk/storage.py", + "silk/templates/silk/base/base.html", + "silk/templates/silk/base/detail_base.html", + "silk/templates/silk/base/root_base.html", + "silk/templates/silk/clear_db.html", + "silk/templates/silk/cprofile.html", + "silk/templates/silk/inclusion/code.html", + "silk/templates/silk/inclusion/heading.html", + "silk/templates/silk/inclusion/profile_menu.html", + "silk/templates/silk/inclusion/profile_summary.html", + "silk/templates/silk/inclusion/request_menu.html", + "silk/templates/silk/inclusion/request_summary.html", + "silk/templates/silk/inclusion/request_summary_row.html", + "silk/templates/silk/inclusion/root_menu.html", + "silk/templates/silk/profile_detail.html", + "silk/templates/silk/profiling.html", + "silk/templates/silk/raw.html", + "silk/templates/silk/request.html", + "silk/templates/silk/requests.html", + "silk/templates/silk/sql.html", + "silk/templates/silk/sql_detail.html", + "silk/templates/silk/summary.html", + "silk/templatetags/__init__.py", + "silk/templatetags/silk_filters.py", + "silk/templatetags/silk_inclusion.py", + "silk/templatetags/silk_nav.py", + "silk/templatetags/silk_urls.py", + "silk/urls.py", + "silk/utils/__init__.py", + "silk/utils/data_deletion.py", + "silk/utils/pagination.py", + "silk/utils/profile_parser.py", + "silk/views/__init__.py", + "silk/views/clear_db.py", + "silk/views/code.py", + "silk/views/cprofile.py", + "silk/views/profile_detail.py", + "silk/views/profile_dot.py", + "silk/views/profile_download.py", + "silk/views/profiling.py", + "silk/views/raw.py", + "silk/views/request_detail.py", + "silk/views/requests.py", + "silk/views/sql.py", + "silk/views/sql_detail.py", + "silk/views/summary.py", + "tox.ini", + "web.psd" + ] +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/django_silk.egg-info/scm_version.json new/django_silk-5.5.2/django_silk.egg-info/scm_version.json --- old/django_silk-5.5.0/django_silk.egg-info/scm_version.json 1970-01-01 01:00:00.000000000 +0100 +++ new/django_silk-5.5.2/django_silk.egg-info/scm_version.json 2026-08-13 06:12:08.132381700 +0200 @@ -0,0 +1,8 @@ +{ + "tag": "5.5.2", + "distance": 0, + "node": "ge04dc567b0a17bbd8630f3e0dbffaabf2bfb97c0", + "dirty": false, + "branch": "HEAD", + "node_date": "2026-08-13" +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/docs/configuration.rst new/django_silk-5.5.2/docs/configuration.rst --- old/django_silk-5.5.0/docs/configuration.rst 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/docs/configuration.rst 2026-08-13 06:11:58.661215300 +0200 @@ -68,3 +68,32 @@ .. code-block:: python SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT = 10 + + +Query Analysis +-------------- + +To enable query analysis when supported by the DBMS, set the following in ``settings.py``: + +.. code-block:: python + + SILKY_ANALYZE_QUERIES = True + +This causes Silk to run ``EXPLAIN ANALYZE`` on each intercepted query, which provides execution plan +details including actual runtime statistics. + +.. warning:: + + When ``SILKY_ANALYZE_QUERIES`` is ``True``, the database may execute the same query twice. + For example, PostgreSQL's ``EXPLAIN ANALYZE`` [actually executes the query](https://www.postgresql.org/docs/current/sql-explain.html), + not just plans it. This means that ``UPDATE``, ``INSERT``, and ``DELETE`` statements will be + executed once by your application code and again by Silk's query analysis — potentially causing + unexpected side effects such as duplicate counter increments or duplicate log entries. + + Use this setting with caution, especially in production environments. + +To pass additional parameters for profiling when supported by the DBMS (e.g. ``VERBOSE``, ``FORMAT JSON``): + +.. code-block:: python + + SILKY_EXPLAIN_FLAGS = {'format': 'JSON', 'costs': True} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/docs/index.rst new/django_silk-5.5.2/docs/index.rst --- old/django_silk-5.5.0/docs/index.rst 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/docs/index.rst 2026-08-13 06:11:58.664648500 +0200 @@ -58,4 +58,4 @@ ------------ * Django: 4.2, 5.1, 5.2, 6.0 -* Python: 3.10, 3.11, 3.12, 3.13, 3.14 +* Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/package.json new/django_silk-5.5.2/package.json --- old/django_silk-5.5.0/package.json 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/package.json 2026-08-13 06:11:58.664648500 +0200 @@ -1,6 +1,6 @@ { "name": "silk", - "version": "5.5.0", + "version": "5.5.2", "description": "https://github.com/jazzband/django-silk", "main": "index.js", "directories": { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/project/project/settings.py new/django_silk-5.5.2/project/project/settings.py --- old/django_silk-5.5.0/project/project/settings.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/project/project/settings.py 2026-08-13 06:11:58.666056900 +0200 @@ -107,6 +107,8 @@ 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', ], }, }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/project/tests/test_code_gen_curl.py new/django_silk-5.5.2/project/tests/test_code_gen_curl.py --- old/django_silk-5.5.0/project/tests/test_code_gen_curl.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/project/tests/test_code_gen_curl.py 2026-08-13 06:11:58.666165800 +0200 @@ -21,3 +21,21 @@ '-d', '{"gamma": "delta"}', 'https://example.org/alpha/beta' ]) + + def test_non_string_query_param_value(self): + """ + Regression test for + https://github.com/jazzband/django-silk/issues/317 + + A non-string query param value (e.g. a float, as in the + issue's reproduction) must not raise AttributeError when + generating the curl command. + """ + result = curl_cmd( + url="https://example.org/alpha/beta", + method="GET", + query_params={"log_time": 1543406262.021423}, + content_type="application/json", + ) + + self.assertIn("log_time=1543406262.021423", result) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/project/tests/test_collector.py new/django_silk-5.5.2/project/tests/test_collector.py --- old/django_silk-5.5.0/project/tests/test_collector.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/project/tests/test_collector.py 2026-08-13 06:11:58.666165800 +0200 @@ -3,6 +3,7 @@ import sys from django.test import TestCase +from django.utils import timezone from tests.util import DictStorage from silk.collector import DataCollector @@ -51,6 +52,21 @@ self.assertTrue(content) self.assertGreater(len(content), 0) + def test_finalise_is_idempotent(self): + request = RequestMinFactory() + DataCollector().configure(request, should_profile=False) + DataCollector().register_query({ + 'query': 'SELECT 1', + 'start_time': timezone.now(), + 'end_time': timezone.now(), + 'traceback': '', + 'analysis': None, + 'request': request, + }) + DataCollector().finalise() + # Second call must not raise TypeError from stale 'model' key in query dict + DataCollector().finalise() + def test_configure_exception(self): other_profiler = cProfile.Profile() other_profiler.enable() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/project/tests/test_encoding.py new/django_silk-5.5.2/project/tests/test_encoding.py --- old/django_silk-5.5.0/project/tests/test_encoding.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/project/tests/test_encoding.py 2026-08-13 06:11:58.666165800 +0200 @@ -1,4 +1,5 @@ import json +import logging from unittest.mock import Mock from django.test import TestCase @@ -6,6 +7,7 @@ from silk.model_factory import RequestModelFactory, ResponseModelFactory HTTP_CONTENT_TYPE = 'content-type' +JS_CONTENT = b'var x = 1;' class TestEncodingForRequests(TestCase): @@ -148,3 +150,87 @@ body, content = factory.body() self.assertDictEqual(json.loads(body), d) self.assertEqual(mock.content, content) + + +class TestJavaScriptContentTypeResponse(TestCase): + """Responses with JavaScript content types should not log warnings when + the content cannot be parsed as JSON (issue #374).""" + + def _make_response(self, content_type, content): + mock = Mock() + mock.headers = {HTTP_CONTENT_TYPE: content_type} + mock.content = content + mock.get = mock.headers.get + return mock + + def test_application_javascript_no_warning(self): + mock = self._make_response('application/javascript', JS_CONTENT) + factory = ResponseModelFactory(mock) + with self.assertNoLogs('silk.model_factory', level=logging.WARNING): + body, content = factory.body() + self.assertFalse(body) + + def test_text_javascript_no_warning(self): + mock = self._make_response('text/javascript', JS_CONTENT) + factory = ResponseModelFactory(mock) + with self.assertNoLogs('silk.model_factory', level=logging.WARNING): + body, content = factory.body() + self.assertFalse(body) + + def test_application_x_javascript_no_warning(self): + mock = self._make_response('application/x-javascript', JS_CONTENT) + factory = ResponseModelFactory(mock) + with self.assertNoLogs('silk.model_factory', level=logging.WARNING): + body, content = factory.body() + self.assertFalse(body) + + def test_text_x_javascript_no_warning(self): + mock = self._make_response('text/x-javascript', JS_CONTENT) + factory = ResponseModelFactory(mock) + with self.assertNoLogs('silk.model_factory', level=logging.WARNING): + body, content = factory.body() + self.assertFalse(body) + + def test_json_content_type_warns_on_invalid_json(self): + mock = self._make_response('application/json', JS_CONTENT) + factory = ResponseModelFactory(mock) + with self.assertLogs('silk.model_factory', level=logging.WARNING): + body, content = factory.body() + self.assertFalse(body) + + def test_javascript_with_valid_json_parses(self): + d = {'asdf': 'qwer'} + mock = self._make_response('application/javascript', json.dumps(d).encode()) + factory = ResponseModelFactory(mock) + body, content = factory.body() + self.assertDictEqual(json.loads(body), d) + + +class TestJavaScriptContentTypeRequest(TestCase): + """Requests with JavaScript content types should silently fall back + when the body cannot be parsed as JSON.""" + + def _make_request(self, content_type, body): + mock = Mock() + mock.headers = {HTTP_CONTENT_TYPE: content_type} + mock.body = body + mock.GET = {} + mock.path = '/test/' + mock.path_info = '/test/' + mock.method = 'POST' + mock.get = mock.headers.get + return mock + + def test_application_javascript_no_warning(self): + mock = self._make_request('application/javascript', JS_CONTENT) + factory = RequestModelFactory(mock) + with self.assertNoLogs('silk.model_factory', level=logging.WARNING): + body, raw_body = factory.body() + self.assertEqual(body, JS_CONTENT.decode('UTF-8')) + + def test_javascript_with_valid_json_parses(self): + d = {'asdf': 'qwer'} + mock = self._make_request('application/javascript', json.dumps(d).encode()) + factory = RequestModelFactory(mock) + body, raw_body = factory.body() + self.assertDictEqual(json.loads(body), d) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/project/tests/test_filters.py new/django_silk-5.5.2/project/tests/test_filters.py --- old/django_silk-5.5.0/project/tests/test_filters.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/project/tests/test_filters.py 2026-08-13 06:11:58.666165800 +0200 @@ -4,13 +4,14 @@ from itertools import groupby from math import floor -from django.test import TestCase +from django.test import RequestFactory, TestCase from django.utils import timezone as django_timezone from silk import models from silk.request_filters import ( AfterDateFilter, BeforeDateFilter, + FiltersManager, FunctionNameFilter, MethodFilter, NameFilter, @@ -21,6 +22,7 @@ StatusCodeFilter, TimeSpentOnQueriesFilter, ViewNameFilter, + filters_from_request, ) from .test_lib.mock_suite import MockSuite @@ -29,6 +31,20 @@ mock_suite = MockSuite() +class TestFiltersFromRequest(TestCase): + def test_clear_filters_ignores_submitted_values(self): + request = RequestFactory().post( + '/', + { + 'clear_filters': '1', + 'filter-viewname-typ': 'ViewNameFilter', + 'filter-viewname-value': 'view1', + }, + ) + + self.assertEqual(filters_from_request(request), {}) + + class TestRequestFilters(TestCase): @classmethod def setUpClass(cls): @@ -150,6 +166,14 @@ new_dt = django_timezone.make_aware(new_dt, timezone.utc) self.assertFilter(new_dt, f) + def test_str_today(self): + dt = django_timezone.now().replace(hour=13, minute=45, second=30, microsecond=123456) + self.assertEqual(str(AfterDateFilter(dt)), '>13:45:30.123') + + def test_str_other_day(self): + f = AfterDateFilter('2020/01/02 13:45') + self.assertEqual(str(f), '>2020.01.02 13:45.000') + class TestRequestBeforeDateFilter(TestCase): def assertFilter(self, dt, f): @@ -179,6 +203,14 @@ new_dt = django_timezone.make_aware(new_dt, timezone.utc) self.assertFilter(new_dt, f) + def test_str_today(self): + dt = django_timezone.now().replace(hour=13, minute=45, second=30, microsecond=123456) + self.assertEqual(str(BeforeDateFilter(dt)), '<13:45:30.123') + + def test_str_other_day(self): + f = BeforeDateFilter('2020/01/02 13:45') + self.assertEqual(str(f), '<2020.01.02 13:45.000') + class TestProfileFilters(TestCase): def setUp(self): @@ -232,3 +264,30 @@ filtered = query_set.filter(time_taken_filter) for f in filtered: self.assertGreaterEqual(f.time_taken, c) + + +class TestFiltersManager(TestCase): + """ + Regression tests for + https://github.com/jazzband/django-silk/issues/361 + """ + class BareRequest: + pass + + def test_get_without_session_or_prior_save_returns_empty_dict(self): + """ + get() must never raise, even for a request that has neither a + .session attribute nor a previously-set .silk_filters + attribute (i.e. save() was never called for this request) -- + matching the safe default already used by the session-based + branch. + """ + manager = FiltersManager("summary_filters") + result = manager.get(TestFiltersManager.BareRequest()) + self.assertEqual(result, {}) + + def test_save_then_get_without_session_round_trips(self): + manager = FiltersManager("summary_filters") + request = TestFiltersManager.BareRequest() + manager.save(request, {"show": "all"}) + self.assertEqual(manager.get(request), {"show": "all"}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/project/tests/test_view_requests.py new/django_silk-5.5.2/project/tests/test_view_requests.py --- old/django_silk-5.5.0/project/tests/test_view_requests.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/project/tests/test_view_requests.py 2026-08-13 06:11:58.666710600 +0200 @@ -7,6 +7,7 @@ from silk.middleware import silky_reverse from silk.views.requests import RequestsView +from .factories import RequestMinFactory from .test_lib.assertion import dict_contains from .test_lib.mock_suite import MockSuite @@ -24,6 +25,15 @@ def test_order_by(self): self.assertIn(RequestsView.default_order_by, RequestsView.order_by) + def test_get_views_excludes_blank_and_null_view_names(self): + RequestMinFactory(view_name=None) + RequestMinFactory(view_name='') + RequestMinFactory(view_name='myapp.views.index') + view_names = list(RequestsView()._get_views()) + self.assertNotIn(None, view_names) + self.assertNotIn('', view_names) + self.assertIn('myapp.views.index', view_names) + class TestContext(TestCase): def test_default(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/pyproject.toml new/django_silk-5.5.2/pyproject.toml --- old/django_silk-5.5.0/pyproject.toml 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/pyproject.toml 2026-08-13 06:11:58.666710600 +0200 @@ -1,3 +1,9 @@ +[build-system] +requires = ["setuptools>=64", "setuptools_scm>=8"] +build-backend = "setuptools.build_meta" + +[tool.setuptools_scm] + [tool.autopep8] ignore = "E501,E203,W503" in-place = true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/requirements.txt new/django_silk-5.5.2/requirements.txt --- old/django_silk-5.5.0/requirements.txt 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/requirements.txt 2026-08-13 06:11:58.666710600 +0200 @@ -2,8 +2,8 @@ factory-boy==3.3.3 freezegun==1.5.5 networkx==3.4.2 -pillow==12.1.1 +pillow==12.3.0 pydot==3.0.4 -pygments==2.19.2 +pygments==2.20.0 pytest-cov==7.0.0 pytest-django==4.11.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/setup.py new/django_silk-5.5.2/setup.py --- old/django_silk-5.5.0/setup.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/setup.py 2026-08-13 06:11:58.672315800 +0200 @@ -33,6 +33,7 @@ 'Programming Language :: Python :: 3.12', 'Programming Language :: Python :: 3.13', 'Programming Language :: Python :: 3.14', + 'Programming Language :: Python :: 3.15', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', ], @@ -45,5 +46,4 @@ 'formatting': ['autopep8'], }, python_requires='>=3.10', - setup_requires=['setuptools_scm'], ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/silk/code_generation/curl.py new/django_silk-5.5.2/silk/code_generation/curl.py --- old/django_silk-5.5.0/silk/code_generation/curl.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/silk/code_generation/curl.py 2026-08-13 06:11:58.672683200 +0200 @@ -17,7 +17,7 @@ if query_params: try: query_params = urlencode( - [(k, v.encode('utf8')) for k, v in query_params.items()] + [(k, str(v).encode('utf8')) for k, v in query_params.items()] ) except TypeError: pass diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/silk/collector.py new/django_silk-5.5.2/silk/collector.py --- old/django_silk-5.5.0/silk/collector.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/silk/collector.py 2026-08-13 06:11:58.672683200 +0200 @@ -95,7 +95,7 @@ self.local.pythonprofiler = cProfile.Profile() try: self.local.pythonprofiler.enable() - except ValueError as e: + except ValueError as e: # pragma: no cover # Deal with cProfile not being allowed to run concurrently # https://github.com/jazzband/django-silk/issues/682 Logger.error('Could not enable python profiler, %s' % str(e), exc_info=True) @@ -161,7 +161,7 @@ sql_queries = [] for identifier, query in self.queries.items(): query['identifier'] = identifier - sql_query = models.SQLQuery(**query) + sql_query = models.SQLQuery(**{k: v for k, v in query.items() if k != 'model'}) sql_queries += [sql_query] models.SQLQuery.objects.bulk_create(sql_queries) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/silk/model_factory.py new/django_silk-5.5.2/silk/model_factory.py --- old/django_silk-5.5.0/silk/model_factory.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/silk/model_factory.py 2026-08-13 06:11:58.673049400 +0200 @@ -16,10 +16,12 @@ Logger = logging.getLogger('silk.model_factory') content_types_json = ['application/json', - 'application/x-javascript', - 'text/javascript', - 'text/x-javascript', 'text/x-json'] +content_types_js = ['application/javascript', + 'application/x-javascript', + 'text/javascript', + 'text/x-javascript'] +content_types_parseable = content_types_json + content_types_js multipart_form = 'multipart/form-data' content_type_form = [multipart_form, 'application/x-www-form-urlencoded'] @@ -127,7 +129,7 @@ body = self.request.POST body = json.dumps(dict(body), sort_keys=True, indent=4 , ensure_ascii=SilkyConfig().SILKY_JSON_ENSURE_ASCII) - elif content_type in content_types_json: + elif content_type in content_types_parseable: try: body = json.dumps(json.loads(raw_body), sort_keys=True, indent=4 , ensure_ascii=SilkyConfig().SILKY_JSON_ENSURE_ASCII) @@ -277,16 +279,17 @@ 'Size of %d for %s is less than %d so saving response body' % (size, self.request.path, max_body_size) ) - if content and content_type in content_types_json: + if content and content_type in content_types_parseable: # TODO: Perhaps theres a way to format the JSON without parsing it? try: body = json.dumps(json.loads(content), sort_keys=True, indent=4 , ensure_ascii=SilkyConfig().SILKY_JSON_ENSURE_ASCII) except (TypeError, ValueError): - Logger.warning( - 'Response to request with pk %s has content type %s but was unable to parse it' - % (self.request.pk, content_type) - ) + if content_type in content_types_json: + Logger.warning( + 'Response to request with pk %s has content type %s but was unable to parse it' + % (self.request.pk, content_type) + ) return body, content def construct_response_model(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/silk/request_filters.py new/django_silk-5.5.2/silk/request_filters.py --- old/django_silk-5.5.0/silk/request_filters.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/silk/request_filters.py 2026-08-13 06:11:58.673361300 +0200 @@ -208,6 +208,9 @@ def filters_from_request(request): + if 'clear_filters' in request.POST: + return {} + raw_filters = {} for key in request.POST: splt = key.split('-') @@ -244,4 +247,9 @@ def get(self, request): if hasattr(request, 'session'): return request.session.get(self.key, {}) - return request.silk_filters + # Mirror the session branch's safe default: get() should never + # raise, even when this is the first time save() has been + # called for this request (or session support isn't available + # at all), in which case silk_filters was never set. See + # GH #361. + return getattr(request, 'silk_filters', {}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/silk/static/silk/css/pages/root_base.css new/django_silk-5.5.2/silk/static/silk/css/pages/root_base.css --- old/django_silk-5.5.0/silk/static/silk/css/pages/root_base.css 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/silk/static/silk/css/pages/root_base.css 2026-08-13 06:11:58.673744000 +0200 @@ -150,6 +150,8 @@ display: inline-block; background-color: white; color: black; + border: 0; + font: inherit; margin: 10px; padding: 10px; border-radius: 5px; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/silk/static/silk/js/pages/root_base.js new/django_silk-5.5.2/silk/static/silk/js/pages/root_base.js --- old/django_silk-5.5.0/silk/static/silk/js/pages/root_base.js 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/silk/static/silk/js/pages/root_base.js 2026-08-13 06:11:58.679473000 +0200 @@ -6,10 +6,3 @@ initFilters(); }); } -function submitFilters() { - $('#filter-form2').submit(); -} -function submitEmptyFilters() { - $('#cbp-spmenu-s2 :input:not([type=hidden])').val(''); - submitFilters(); -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/silk/templates/silk/base/root_base.html new/django_silk-5.5.2/silk/templates/silk/base/root_base.html --- old/django_silk-5.5.0/silk/templates/silk/base/root_base.html 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/silk/templates/silk/base/root_base.html 2026-08-13 06:11:58.692186000 +0200 @@ -40,10 +40,10 @@ </form> <div class="button-div"> - <div class="apply-div" onclick="submitEmptyFilters()">Clear all filters</div> + <button class="apply-div" type="submit" form="filter-form2" name="clear_filters" value="1">Clear all filters</button> </div> <div class="button-div"> - <div class="apply-div" onclick="submitFilters()">Apply</div> + <button class="apply-div" type="submit" form="filter-form2">Apply</button> </div> </nav> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/silk/templates/silk/inclusion/request_summary.html new/django_silk-5.5.2/silk/templates/silk/inclusion/request_summary.html --- old/django_silk-5.5.0/silk/templates/silk/inclusion/request_summary.html 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/silk/templates/silk/inclusion/request_summary.html 2026-08-13 06:11:58.692346800 +0200 @@ -9,9 +9,10 @@ </div> <div class="time-taken-queries-div"> <span class="numeric">{{ silk_request.time_spent_on_sql_queries|floatformat:"0" }}<span class="unit">ms</span></span> - <span class="appenage">on queries<span class="meta">{% if silk_request.meta_time_spent_queries %} +{{ silk_request.meta_time_spent_queries | floatformat:"0" }}<span class="unit">ms</span>{% endif %}</span></div> + <span class="appenage">on queries<span class="meta">{% if silk_request.meta_time_spent_queries %} +{{ silk_request.meta_time_spent_queries | floatformat:"0" }}<span class="unit">ms</span>{% endif %}</span></span> + </div> <div class="num-queries-div"> <span class="numeric">{{ silk_request.num_sql_queries }}</span> - <span class="appendage">queries<span class="meta">{% if silk_request.meta_num_queries %} +{{ silk_request.meta_num_queries }}{% endif %}</span> + <span class="appendage">queries<span class="meta">{% if silk_request.meta_num_queries %} +{{ silk_request.meta_num_queries }}{% endif %}</span></span> </div> </div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/silk/views/requests.py new/django_silk-5.5.2/silk/views/requests.py --- old/django_silk-5.5.0/silk/views/requests.py 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/silk/views/requests.py 2026-08-13 06:11:58.692936200 +0200 @@ -1,4 +1,4 @@ -from django.db.models import Sum +from django.db.models import Q, Sum from django.shortcuts import render from django.template.context_processors import csrf from django.utils.decorators import method_decorator @@ -86,7 +86,7 @@ 'view_name', flat=True ).exclude( - view_name='' + Q(view_name='') | Q(view_name__isnull=True) ).order_by( 'view_name' ).distinct() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django_silk-5.5.0/tox.ini new/django_silk-5.5.2/tox.ini --- old/django_silk-5.5.0/tox.ini 2026-03-07 09:15:38.000000000 +0100 +++ new/django_silk-5.5.2/tox.ini 2026-08-13 06:11:58.692936200 +0200 @@ -5,6 +5,7 @@ 3.12: py312 3.13: py313 3.14: py314 + 3.15: py315 [gh-actions:env] DJANGO = @@ -16,8 +17,8 @@ [tox] envlist = - py{310,311,312,313,314}-dj{42,50,51,52}-{sqlite3,mysql,postgresql} - py{312,313,314}-dj{60,main}-{sqlite3,mysql,postgresql} + py{310-315}-dj{42,50,51,52}-{sqlite3,mysql,postgresql} + py{312-315}-dj{60,main}-{sqlite3,mysql,postgresql} [testenv] usedevelop = True @@ -33,9 +34,6 @@ dj52: django>=5.2,<5.3 dj60: django>=6.0,<6.1 djmain: https://github.com/django/django/archive/main.tar.gz - py312: setuptools - py313: setuptools - py314: setuptools extras = formatting setenv = PYTHONPATH={toxinidir}:{toxinidir}
