django-bootstrap5 23.4__tar.gz → 24.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 (125) hide show
  1. django_bootstrap5-24.2/.editorconfig +23 -0
  2. django_bootstrap5-24.2/.readthedocs.yaml +19 -0
  3. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/CHANGELOG.md +15 -0
  4. django_bootstrap5-24.2/MANIFEST.in +17 -0
  5. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/Makefile +8 -5
  6. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/PKG-INFO +3 -4
  7. django_bootstrap5-24.2/docs/changelog.rst +2 -0
  8. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/docs/conf.py +1 -1
  9. django_bootstrap5-24.2/docs/contributing.rst +2 -0
  10. django_bootstrap5-24.2/docs/migrate.rst +2 -0
  11. django_bootstrap5-24.2/docs/requirements.txt +3 -0
  12. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/docs/settings.rst +4 -1
  13. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/settings.py +7 -1
  14. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/pyproject.toml +12 -11
  15. django_bootstrap5-24.2/requirements-dev.txt +8 -0
  16. django_bootstrap5-24.2/requirements-test.txt +5 -0
  17. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/core.py +5 -4
  18. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/renderers.py +4 -2
  19. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/templates/django_bootstrap5/bootstrap5.html +6 -16
  20. django_bootstrap5-24.2/src/django_bootstrap5/templates/django_bootstrap5/widgets/radio_select_button_group.html +16 -0
  21. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/templatetags/django_bootstrap5.py +18 -4
  22. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5.egg-info/PKG-INFO +3 -4
  23. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5.egg-info/SOURCES.txt +4 -5
  24. django_bootstrap5-24.2/src/django_bootstrap5.egg-info/requires.txt +1 -0
  25. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_css_and_js_tags.py +10 -3
  26. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_field_datetime.py +15 -15
  27. django_bootstrap5-24.2/tests/test_bootstrap_field_radio_select_button_group.py +107 -0
  28. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_templates.py +13 -0
  29. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tox.ini +4 -8
  30. django-bootstrap5-23.4/.github/dependabot.yml +0 -17
  31. django-bootstrap5-23.4/.github/workflows/dependabot-auto-approve-and-merge.yml +0 -35
  32. django-bootstrap5-23.4/.github/workflows/test.yml +0 -101
  33. django-bootstrap5-23.4/.gitignore +0 -65
  34. django-bootstrap5-23.4/.readthedocs.yml +0 -11
  35. django-bootstrap5-23.4/docs/changelog.rst +0 -1
  36. django-bootstrap5-23.4/docs/contributing.rst +0 -1
  37. django-bootstrap5-23.4/docs/migrate.rst +0 -1
  38. django-bootstrap5-23.4/docs/requirements.txt +0 -3
  39. django-bootstrap5-23.4/requirements-dev.txt +0 -6
  40. django-bootstrap5-23.4/requirements-test.txt +0 -5
  41. django-bootstrap5-23.4/src/django_bootstrap5/templates/django_bootstrap5/widgets/radio_select_button_group.html +0 -8
  42. django-bootstrap5-23.4/src/django_bootstrap5.egg-info/requires.txt +0 -1
  43. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/AUTHORS +0 -0
  44. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/CONTRIBUTING.md +0 -0
  45. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/LICENSE +0 -0
  46. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/MIGRATE.md +0 -0
  47. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/README.md +0 -0
  48. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/docs/example_template.rst +0 -0
  49. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/docs/forms.rst +0 -0
  50. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/docs/index.rst +0 -0
  51. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/docs/installation.rst +0 -0
  52. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/docs/quickstart.rst +0 -0
  53. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/docs/templates.rst +0 -0
  54. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/docs/templatetags.rst +0 -0
  55. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/docs/widgets.rst +0 -0
  56. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/__init__.py +0 -0
  57. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/app/__init__.py +0 -0
  58. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/app/forms.py +0 -0
  59. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/app/views.py +0 -0
  60. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/manage.py +0 -0
  61. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/templates/app/base.html +0 -0
  62. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/templates/app/bootstrap.html +0 -0
  63. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/templates/app/form.html +0 -0
  64. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/templates/app/form_by_field.html +0 -0
  65. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/templates/app/form_horizontal.html +0 -0
  66. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/templates/app/form_inline.html +0 -0
  67. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/templates/app/form_with_files.html +0 -0
  68. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/templates/app/formset.html +0 -0
  69. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/templates/app/home.html +0 -0
  70. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/templates/app/misc.html +0 -0
  71. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/templates/app/pagination.html +0 -0
  72. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/example/urls.py +0 -0
  73. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/manage.py +0 -0
  74. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/setup.cfg +0 -0
  75. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/__about__.py +0 -0
  76. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/__init__.py +0 -0
  77. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/components.py +0 -0
  78. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/css.py +0 -0
  79. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/forms.py +0 -0
  80. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/html.py +0 -0
  81. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/size.py +0 -0
  82. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/templates/django_bootstrap5/field_errors.html +0 -0
  83. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/templates/django_bootstrap5/field_help_text.html +0 -0
  84. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/templates/django_bootstrap5/form_errors.html +0 -0
  85. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/templates/django_bootstrap5/messages.html +0 -0
  86. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/templates/django_bootstrap5/pagination.html +0 -0
  87. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/templates/django_bootstrap5/widgets/clearable_file_input.html +0 -0
  88. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/templates/django_bootstrap5/widgets/radio_select.html +0 -0
  89. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/templatetags/__init__.py +0 -0
  90. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/text.py +0 -0
  91. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/utils.py +0 -0
  92. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5/widgets.py +0 -0
  93. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5.egg-info/dependency_links.txt +0 -0
  94. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/src/django_bootstrap5.egg-info/top_level.txt +0 -0
  95. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/__init__.py +0 -0
  96. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/app/__init__.py +0 -0
  97. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/app/settings.py +0 -0
  98. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/app/urls.py +0 -0
  99. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/base.py +0 -0
  100. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/image.py +0 -0
  101. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_alert.py +0 -0
  102. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_button.py +0 -0
  103. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_field.py +0 -0
  104. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_field_input_checkbox.py +0 -0
  105. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_field_input_color.py +0 -0
  106. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_field_input_file.py +0 -0
  107. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_field_input_range.py +0 -0
  108. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_field_input_text.py +0 -0
  109. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_field_parameters.py +0 -0
  110. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_field_radio_select.py +0 -0
  111. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_field_select.py +0 -0
  112. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_field_textarea.py +0 -0
  113. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_form.py +0 -0
  114. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_formset.py +0 -0
  115. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_label.py +0 -0
  116. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_messages.py +0 -0
  117. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_bootstrap_pagination.py +0 -0
  118. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_components.py +0 -0
  119. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_css.py +0 -0
  120. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_html.py +0 -0
  121. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_settings.py +0 -0
  122. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_size.py +0 -0
  123. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_text.py +0 -0
  124. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_urls.py +0 -0
  125. {django-bootstrap5-23.4 → django_bootstrap5-24.2}/tests/test_version.py +0 -0
@@ -0,0 +1,23 @@
1
+ # https://editorconfig.org/
2
+
3
+ root = true
4
+
5
+ [*]
6
+ indent_style = space
7
+ indent_size = 4
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+ end_of_line = lf
11
+ charset = utf-8
12
+
13
+ [*.py]
14
+ max_line_length = 88
15
+
16
+ [*.toml]
17
+ indent_size = 2
18
+
19
+ [docs/**.rst]
20
+ max_line_length = 79
21
+
22
+ [*.{yaml,yml}]
23
+ indent_size = 2
@@ -0,0 +1,19 @@
1
+ # .readthedocs.yaml
2
+ # Read the Docs configuration file
3
+ # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
4
+
5
+ version: 2
6
+
7
+ build:
8
+ os: ubuntu-22.04
9
+ tools:
10
+ python: "3.11"
11
+
12
+ sphinx:
13
+ configuration: docs/conf.py
14
+
15
+ python:
16
+ install:
17
+ - requirements: docs/requirements.txt
18
+ - method: pip
19
+ path: .
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 24.2 (2024-04-23)
4
+
5
+ - Add .editorconfig (#598).
6
+ - Remove support for Django 4.1 (EOL) (#597).
7
+ - Add support for color mode (#593).
8
+ - Change bootstrap_setting from filter to tag (#595).
9
+ - Remove support for Python 3.7 (EOL) (#588).
10
+ - Remove support for Django 3.2 (EOL) (#583).
11
+ - Update Bootstrap to 5.3.3 (#584).
12
+ - Fix Read the Docs (#585, #587).
13
+
14
+ ## 24.1 (2024-04-12)
15
+
16
+ - Fix RadioSelectButtonGroup rendering and add 'disabled' attribute to radio button group template (#447).
17
+
3
18
  ## 23.4 (2023-12-28)
4
19
 
5
20
  - Use ruff instead of black for formatting (#536).
@@ -0,0 +1,17 @@
1
+ include LICENSE
2
+ include MANIFEST.in
3
+ include .editorconfig
4
+ include *.yaml
5
+ include pyproject.toml
6
+ include *.md
7
+ include *.py
8
+ include *.txt
9
+ include Makefile
10
+ include tox.ini
11
+ include docs/*.rst docs/*.txt docs/*.py docs/Makefile
12
+ graft src
13
+ graft tests
14
+ graft example
15
+ prune docs/_build
16
+ exclude example/db.sqlite3
17
+ global-exclude *.py[cod]
@@ -12,11 +12,11 @@ tests:
12
12
  .PHONY: reformat
13
13
  reformat:
14
14
  ruff format .
15
- ruff --fix .
15
+ ruff check . --fix
16
16
 
17
17
  .PHONY: lint
18
18
  lint:
19
- ruff .
19
+ ruff check .
20
20
 
21
21
  .PHONY: docs
22
22
  docs: clean
@@ -45,12 +45,15 @@ else
45
45
  endif
46
46
 
47
47
  .PHONY: build
48
- build: docs
48
+ build:
49
49
  python -m build
50
+ twine check dist/*
51
+ check-manifest
52
+ pyroma .
53
+ check-wheel-contents dist
50
54
 
51
55
  .PHONY: publish
52
- publish: porcelain branch build
53
- twine check dist/*
56
+ publish: porcelain branch docs build
54
57
  twine upload dist/*
55
58
  git tag -a v${VERSION} -m "Release ${VERSION}"
56
59
  git push origin --tags
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-bootstrap5
3
- Version: 23.4
3
+ Version: 24.2
4
4
  Summary: Bootstrap 5 for Django
5
5
  Author-email: Dylan Verheul <dylan@dyve.net>
6
6
  License: BSD 3-Clause License
@@ -37,11 +37,10 @@ Project-URL: Documentation, https://django-bootstrap5.readthedocs.io/
37
37
  Project-URL: Homepage, https://github.com/zostera/django-bootstrap5
38
38
  Project-URL: Issues, https://github.com/zostera/django-bootstrap5/issues
39
39
  Project-URL: Source, https://github.com/zostera/django-bootstrap5
40
+ Keywords: django,bootstrap,bootstrap5
40
41
  Classifier: Development Status :: 5 - Production/Stable
41
42
  Classifier: Environment :: Web Environment
42
43
  Classifier: Framework :: Django
43
- Classifier: Framework :: Django :: 3.2
44
- Classifier: Framework :: Django :: 4.1
45
44
  Classifier: Framework :: Django :: 4.2
46
45
  Classifier: Framework :: Django :: 5.0
47
46
  Classifier: Intended Audience :: Developers
@@ -59,7 +58,7 @@ Requires-Python: >=3.8
59
58
  Description-Content-Type: text/markdown
60
59
  License-File: LICENSE
61
60
  License-File: AUTHORS
62
- Requires-Dist: Django>=3.2
61
+ Requires-Dist: Django>=4.2
63
62
 
64
63
  # django-bootstrap5
65
64
 
@@ -0,0 +1,2 @@
1
+ .. include:: ../CHANGELOG.md
2
+ :parser: myst_parser.sphinx_
@@ -15,7 +15,7 @@ copyright = f"{year}, {author}"
15
15
  extensions = [
16
16
  "sphinx.ext.autodoc",
17
17
  "sphinx.ext.viewcode",
18
- "sphinx_mdinclude",
18
+ "myst_parser",
19
19
  ]
20
20
 
21
21
  htmlhelp_basename = f"{project}-doc"
@@ -0,0 +1,2 @@
1
+ .. include:: ../CONTRIBUTING.md
2
+ :parser: myst_parser.sphinx_
@@ -0,0 +1,2 @@
1
+ .. include:: ../MIGRATE.md
2
+ :parser: myst_parser.sphinx_
@@ -0,0 +1,3 @@
1
+ sphinx==7.3.7
2
+ myst-parser==2.0.0
3
+ furo==2024.1.29
@@ -16,7 +16,7 @@ The ``BOOTSTRAP5`` dict variable contains these settings and defaults:
16
16
 
17
17
  # The complete URL to the Bootstrap CSS file.
18
18
  # Note that a URL can be either a string
19
- # ("https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css"),
19
+ # ("https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css"),
20
20
  # or a dict with keys `url`, `integrity` and `crossorigin` like the default value below.
21
21
  "css_url": {
22
22
  "url": "https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css",
@@ -34,6 +34,9 @@ The ``BOOTSTRAP5`` dict variable contains these settings and defaults:
34
34
  # The complete URL to the Bootstrap CSS theme file (None means no theme).
35
35
  "theme_url": None,
36
36
 
37
+ # Color mode (None means do not set color mode).
38
+ "color_mode": None,
39
+
37
40
  # Put JavaScript in the HEAD section of the HTML document (only relevant if you use bootstrap5.html).
38
41
  'javascript_in_head': False,
39
42
 
@@ -141,7 +141,13 @@ LOGGING = {
141
141
  "class": "django.utils.log.AdminEmailHandler",
142
142
  }
143
143
  },
144
- "loggers": {"django.request": {"handlers": ["mail_admins"], "level": "ERROR", "propagate": True}},
144
+ "loggers": {
145
+ "django.request": {
146
+ "handlers": ["mail_admins"],
147
+ "level": "ERROR",
148
+ "propagate": True,
149
+ }
150
+ },
145
151
  }
146
152
 
147
153
  # Settings for django-bootstrap5
@@ -1,6 +1,6 @@
1
1
  [build-system]
2
2
  build-backend = "setuptools.build_meta"
3
- requires = ["setuptools>=64", "setuptools_scm>=8"]
3
+ requires = ["setuptools>=64"]
4
4
 
5
5
  [project]
6
6
  authors = [
@@ -10,8 +10,6 @@ classifiers = [
10
10
  "Development Status :: 5 - Production/Stable",
11
11
  "Environment :: Web Environment",
12
12
  "Framework :: Django",
13
- "Framework :: Django :: 3.2",
14
- "Framework :: Django :: 4.1",
15
13
  "Framework :: Django :: 4.2",
16
14
  "Framework :: Django :: 5.0",
17
15
  "Intended Audience :: Developers",
@@ -26,13 +24,14 @@ classifiers = [
26
24
  "Topic :: Software Development :: Libraries",
27
25
  "Topic :: Utilities",
28
26
  ]
29
- dependencies = ["Django>=3.2"]
27
+ dependencies = ["Django>=4.2"]
30
28
  description = "Bootstrap 5 for Django"
29
+ keywords = ["django", "bootstrap", "bootstrap5"]
31
30
  license = {file = "LICENSE"}
32
31
  name = "django-bootstrap5"
33
32
  readme = "README.md"
34
33
  requires-python = ">=3.8"
35
- version = "23.4"
34
+ version = "24.2"
36
35
 
37
36
  [project.urls]
38
37
  Changelog = "https://github.com/zostera/django-bootstrap5/blob/main/CHANGELOG.md"
@@ -43,6 +42,11 @@ Source = "https://github.com/zostera/django-bootstrap5"
43
42
 
44
43
  [tool.ruff]
45
44
  fix = false
45
+ line-length = 120
46
+ src = ["src"]
47
+ target-version = "py38"
48
+
49
+ [tool.ruff.lint]
46
50
  fixable = [
47
51
  "I001", # isort (sorting)
48
52
  "F", # flake8
@@ -55,7 +59,6 @@ ignore = [
55
59
  "D212", # D212: Multi-line docstring summary should start at the first line
56
60
  "D301", # D301: Use r”“” if any backslashes in a docstring (unclear how else to handle backslashes in docstrings)
57
61
  ]
58
- line-length = 120
59
62
  select = [
60
63
  "D", # pydocstyle
61
64
  "E", # pycodestyle
@@ -63,14 +66,12 @@ select = [
63
66
  "I", # isort
64
67
  "UP", # pyupgrade
65
68
  ]
66
- src = ["src"]
67
- target-version = "py38"
68
69
  unfixable = [
69
70
  "F8", # names in flake8, such as defined but unused variables
70
71
  ]
71
72
 
72
- [tool.ruff.isort]
73
- known-first-party = ["django_marina", "app"]
73
+ [tool.ruff.lint.isort]
74
+ known-first-party = ["django_bootstrap5", "app"]
74
75
  known-third-party = ["django"]
75
76
 
76
77
  [tool.coverage.run]
@@ -78,7 +79,7 @@ branch = true
78
79
  source = ["src", "tests"]
79
80
 
80
81
  [tool.coverage.paths]
81
- package = ["src/django_marina", "*/django_marina/src/django_marina"]
82
+ package = ["src/django_bootstrap5", "*/django_bootstrap5/src/django_bootstrap5"]
82
83
 
83
84
  [tool.coverage.report]
84
85
  show_missing = true
@@ -0,0 +1,8 @@
1
+ -r requirements-test.txt
2
+ -r docs/requirements.txt
3
+ twine==5.0.0
4
+ build==1.2.1
5
+ setuptools==69.5.1
6
+ check-manifest==0.49
7
+ pyroma==4.2
8
+ check-wheel-contents==0.6.0
@@ -0,0 +1,5 @@
1
+ tox==4.14.2
2
+ coverage==7.4.4
3
+ ruff==0.4.1
4
+ pillow>=10.3.0
5
+ beautifulsoup4>=4.12.3
@@ -5,16 +5,17 @@ from django.conf import settings
5
5
  BOOTSTRAP5 = {"foo": "bar"}
6
6
  BOOTSTRAP5_DEFAULTS = {
7
7
  "css_url": {
8
- "url": "https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css",
9
- "integrity": "sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65",
8
+ "url": "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css",
9
+ "integrity": "sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH",
10
10
  "crossorigin": "anonymous",
11
11
  },
12
12
  "javascript_url": {
13
- "url": "https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js",
14
- "integrity": "sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4",
13
+ "url": "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js",
14
+ "integrity": "sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz",
15
15
  "crossorigin": "anonymous",
16
16
  },
17
17
  "theme_url": None,
18
+ "color_mode": None,
18
19
  "javascript_in_head": False,
19
20
  "wrapper_class": "mb-3",
20
21
  "inline_wrapper_class": "",
@@ -19,7 +19,7 @@ from .forms import render_field, render_form, render_label
19
19
  from .size import DEFAULT_SIZE, SIZE_MD, get_size_class, parse_size
20
20
  from .text import text_value
21
21
  from .utils import render_template_file
22
- from .widgets import ReadOnlyPasswordHashWidget, is_widget_with_placeholder
22
+ from .widgets import RadioSelectButtonGroup, ReadOnlyPasswordHashWidget, is_widget_with_placeholder
23
23
 
24
24
 
25
25
  class BaseRenderer:
@@ -347,7 +347,9 @@ class FieldRenderer(BaseRenderer):
347
347
  for widget in widgets:
348
348
  self.add_widget_class_attrs(widget)
349
349
  self.add_placeholder_attrs(widget)
350
- if isinstance(widget, (RadioSelect, CheckboxSelectMultiple)):
350
+ if isinstance(widget, (RadioSelect, CheckboxSelectMultiple)) and not isinstance(
351
+ widget, RadioSelectButtonGroup
352
+ ):
351
353
  widget.template_name = "django_bootstrap5/widgets/radio_select.html"
352
354
  elif isinstance(widget, ClearableFileInput):
353
355
  widget.template_name = "django_bootstrap5/widgets/clearable_file_input.html"
@@ -2,41 +2,31 @@
2
2
  {% load django_bootstrap5 %}
3
3
  {% load i18n %}
4
4
  {% get_current_language as LANGUAGE_CODE %}
5
- <html lang="{{ LANGUAGE_CODE|default:'en_us' }}">
6
-
5
+ {% bootstrap_setting "color_mode" as COLOR_MODE %}
6
+ {% bootstrap_setting "javascript_in_head" as BOOTSTRAP_JAVASCRIPT_IN_HEAD %}
7
+ <html lang="{{ LANGUAGE_CODE|default:'en_us' }}"{% if COLOR_MODE %} data-bs-theme="{{ COLOR_MODE }}"{% endif %}>
7
8
  <head>
8
-
9
9
  <!-- Required meta tags -->
10
10
  <meta charset="utf-8">
11
11
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
12
-
13
12
  <!-- Page title -->
14
13
  <title>{% block bootstrap5_title %}django-bootstrap5 template title{% endblock %}</title>
15
-
16
14
  <!-- Bootstrap CSS -->
17
15
  {% bootstrap_css %}
18
-
19
16
  <!-- Bootstrap JavaScript if it is in head -->
20
- {% if 'javascript_in_head'|bootstrap_setting %}
21
- {% bootstrap_javascript %}
22
- {% endif %}
23
-
24
- {% block bootstrap5_extra_head %}{% endblock %}
17
+ {% if BOOTSTRAP_JAVASCRIPT_IN_HEAD %}{% bootstrap_javascript %}{% endif %}
25
18
 
19
+ {% block bootstrap5_extra_head %}{% endblock %}
26
20
  </head>
27
21
 
28
22
  <body>
29
23
  {% block bootstrap5_before_content %}{% endblock %}
30
24
  {% block bootstrap5_content %} CONTENT {% endblock %}
31
25
  {% block bootstrap5_after_content %}{% endblock %}
32
-
33
26
  <!-- Bootstrap JavaScript if it is in body -->
34
- {% if not 'javascript_in_head'|bootstrap_setting %}
35
- {% bootstrap_javascript %}
36
- {% endif %}
27
+ {% if not BOOTSTRAP_JAVASCRIPT_IN_HEAD %}{% bootstrap_javascript %}{% endif %}
37
28
 
38
29
  {% block bootstrap5_extra_script %}{% endblock %}
39
-
40
30
  </body>
41
31
 
42
32
  </html>
@@ -0,0 +1,16 @@
1
+ <div{% if widget.attrs.id %} id="{{ widget.attrs.id }}"{% endif %} class="btn-group" role="group">
2
+ {% for group, options, index in widget.optgroups %}
3
+ {% for option in options %}
4
+ <input type="{{ option.type }}"
5
+ class="{{ widget.attrs.class|add:' btn-check' }}"
6
+ autocomplete="off"
7
+ name="{{ option.name }}"
8
+ id="{{ option.attrs.id }}"
9
+ {% if option.value != None %} value="{{ option.value|stringformat:'s' }}"
10
+ {% if option.attrs.checked %} checked="checked"{% endif %}{% endif %}
11
+ {% if widget.attrs.disabled %} disabled{% endif %}
12
+ {% if widget.required %} required{% endif %}>
13
+ <label class="btn btn-outline-primary" for="{{ option.attrs.id }}">{{ option.label }}</label>
14
+ {% endfor %}
15
+ {% endfor %}
16
+ </div>
@@ -10,7 +10,14 @@ from django.utils.safestring import mark_safe
10
10
  from ..components import render_alert, render_button
11
11
  from ..core import css_url, get_bootstrap_setting, javascript_url, theme_url
12
12
  from ..css import _css_class_list, merge_css_classes
13
- from ..forms import render_field, render_form, render_form_errors, render_formset, render_formset_errors, render_label
13
+ from ..forms import (
14
+ render_field,
15
+ render_form,
16
+ render_form_errors,
17
+ render_formset,
18
+ render_formset_errors,
19
+ render_label,
20
+ )
14
21
  from ..html import render_link_tag, render_script_tag
15
22
  from ..size import get_size_class
16
23
  from ..utils import render_template_file, url_replace_param
@@ -26,12 +33,12 @@ MESSAGE_ALERT_TYPES = {
26
33
  register = template.Library()
27
34
 
28
35
 
29
- @register.filter
36
+ @register.simple_tag
30
37
  def bootstrap_setting(value):
31
38
  """
32
39
  Return django-bootstrap5 setting for use in in a template.
33
40
 
34
- Please consider this filter private, do not use it in your own templates.
41
+ Please consider this tag private, do not use it in your own templates.
35
42
  """
36
43
  return get_bootstrap_setting(value)
37
44
 
@@ -775,7 +782,14 @@ def get_pagination_context(
775
782
  if extra:
776
783
  params.update(parse_qs(extra))
777
784
  url = urlunparse(
778
- [parts.scheme, parts.netloc, parts.path, parts.params, urlencode(params, doseq=True), parts.fragment]
785
+ [
786
+ parts.scheme,
787
+ parts.netloc,
788
+ parts.path,
789
+ parts.params,
790
+ urlencode(params, doseq=True),
791
+ parts.fragment,
792
+ ]
779
793
  )
780
794
 
781
795
  pagination_css_classes = ["pagination"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-bootstrap5
3
- Version: 23.4
3
+ Version: 24.2
4
4
  Summary: Bootstrap 5 for Django
5
5
  Author-email: Dylan Verheul <dylan@dyve.net>
6
6
  License: BSD 3-Clause License
@@ -37,11 +37,10 @@ Project-URL: Documentation, https://django-bootstrap5.readthedocs.io/
37
37
  Project-URL: Homepage, https://github.com/zostera/django-bootstrap5
38
38
  Project-URL: Issues, https://github.com/zostera/django-bootstrap5/issues
39
39
  Project-URL: Source, https://github.com/zostera/django-bootstrap5
40
+ Keywords: django,bootstrap,bootstrap5
40
41
  Classifier: Development Status :: 5 - Production/Stable
41
42
  Classifier: Environment :: Web Environment
42
43
  Classifier: Framework :: Django
43
- Classifier: Framework :: Django :: 3.2
44
- Classifier: Framework :: Django :: 4.1
45
44
  Classifier: Framework :: Django :: 4.2
46
45
  Classifier: Framework :: Django :: 5.0
47
46
  Classifier: Intended Audience :: Developers
@@ -59,7 +58,7 @@ Requires-Python: >=3.8
59
58
  Description-Content-Type: text/markdown
60
59
  License-File: LICENSE
61
60
  License-File: AUTHORS
62
- Requires-Dist: Django>=3.2
61
+ Requires-Dist: Django>=4.2
63
62
 
64
63
  # django-bootstrap5
65
64
 
@@ -1,9 +1,10 @@
1
- .gitignore
2
- .readthedocs.yml
1
+ .editorconfig
2
+ .readthedocs.yaml
3
3
  AUTHORS
4
4
  CHANGELOG.md
5
5
  CONTRIBUTING.md
6
6
  LICENSE
7
+ MANIFEST.in
7
8
  MIGRATE.md
8
9
  Makefile
9
10
  README.md
@@ -12,9 +13,6 @@ pyproject.toml
12
13
  requirements-dev.txt
13
14
  requirements-test.txt
14
15
  tox.ini
15
- .github/dependabot.yml
16
- .github/workflows/dependabot-auto-approve-and-merge.yml
17
- .github/workflows/test.yml
18
16
  docs/changelog.rst
19
17
  docs/conf.py
20
18
  docs/contributing.rst
@@ -90,6 +88,7 @@ tests/test_bootstrap_field_input_range.py
90
88
  tests/test_bootstrap_field_input_text.py
91
89
  tests/test_bootstrap_field_parameters.py
92
90
  tests/test_bootstrap_field_radio_select.py
91
+ tests/test_bootstrap_field_radio_select_button_group.py
93
92
  tests/test_bootstrap_field_select.py
94
93
  tests/test_bootstrap_field_textarea.py
95
94
  tests/test_bootstrap_form.py
@@ -41,8 +41,15 @@ class MediaTestCase(BootstrapTestCase):
41
41
  self.expected_bootstrap_css + '<link rel="stylesheet" href="//example.com/theme.css">',
42
42
  )
43
43
 
44
- def test_bootstrap_setting_filter(self):
45
- self.assertEqual(self.render('{{ "required_css_class"|bootstrap_setting }}'), "django_bootstrap5-req")
44
+ def test_bootstrap_setting_tag(self):
46
45
  self.assertEqual(
47
- self.render('{% if "javascript_in_head"|bootstrap_setting %}head{% else %}body{% endif %}'), "head"
46
+ self.render('{% bootstrap_setting "required_css_class" %}'),
47
+ "django_bootstrap5-req",
48
+ )
49
+ self.assertEqual(
50
+ self.render(
51
+ '{% bootstrap_setting "javascript_in_head" as BOOTSTRAP_JAVASCRIPT_IN_HEAD %}'
52
+ + "{% if BOOTSTRAP_JAVASCRIPT_IN_HEAD %}head{% else %}body{% endif %}"
53
+ ),
54
+ "head",
48
55
  )
@@ -1,7 +1,7 @@
1
1
  from django import forms
2
2
  from django.contrib.admin.widgets import AdminSplitDateTime
3
3
 
4
- from tests.base import DJANGO_VERSION, BootstrapTestCase
4
+ from tests.base import BootstrapTestCase
5
5
 
6
6
 
7
7
  class DateTimeTestForm(forms.Form):
@@ -9,17 +9,11 @@ class DateTimeTestForm(forms.Form):
9
9
 
10
10
 
11
11
  class DateTimeTestCase(BootstrapTestCase):
12
- def fix_django41(self, html):
13
- """Return expected HTML fixed for Django 4.1 if necessary."""
14
- if DJANGO_VERSION >= "4.1":
15
- html = html.replace(' for="id_test_0"', "")
16
- return html
17
-
18
12
  def test_input_type_admin_split_date_time(self):
19
13
  """Test field with AdminSplitDateTime widget."""
20
14
  expected_html = (
21
15
  '<div class="django_bootstrap5-req mb-3">'
22
- '<label class="form-label" for="id_test_0">Test</label>'
16
+ '<label class="form-label">Test</label>'
23
17
  '<p class="datetime">'
24
18
  "Date: "
25
19
  '<input type="text" name="test_0" class="form-control vDateField" size="10"'
@@ -33,14 +27,14 @@ class DateTimeTestCase(BootstrapTestCase):
33
27
  )
34
28
  self.assertHTMLEqual(
35
29
  self.render("{% bootstrap_field form.test %}", context={"form": DateTimeTestForm()}),
36
- self.fix_django41(expected_html),
30
+ expected_html,
37
31
  )
38
32
 
39
33
  def test_input_type_admin_split_date_time_horizontal(self):
40
34
  """Test field with AdminSplitDateTime widget with layout horizontal."""
41
35
  expected_html = (
42
36
  '<div class="django_bootstrap5-req row mb-3">'
43
- '<label class="col-form-label col-sm-2" for="id_test_0">Test</label>'
37
+ '<label class="col-form-label col-sm-2">Test</label>'
44
38
  '<div class="col-sm-10">'
45
39
  '<p class="datetime">'
46
40
  "Date: "
@@ -55,15 +49,18 @@ class DateTimeTestCase(BootstrapTestCase):
55
49
  "</div>"
56
50
  )
57
51
  self.assertHTMLEqual(
58
- self.render('{% bootstrap_field form.test layout="horizontal" %}', context={"form": DateTimeTestForm()}),
59
- self.fix_django41(expected_html),
52
+ self.render(
53
+ '{% bootstrap_field form.test layout="horizontal" %}',
54
+ context={"form": DateTimeTestForm()},
55
+ ),
56
+ expected_html,
60
57
  )
61
58
 
62
59
  def test_input_type_admin_split_date_time_floating(self):
63
60
  """Test field with AdminSplitDateTime widget with layout floating."""
64
61
  expected_html = (
65
62
  '<div class="django_bootstrap5-req mb-3">'
66
- '<label class="form-label" for="id_test_0">Test</label>'
63
+ '<label class="form-label">Test</label>'
67
64
  '<p class="datetime">'
68
65
  "Date: "
69
66
  '<input type="text" name="test_0" class="form-control vDateField" size="10"'
@@ -76,6 +73,9 @@ class DateTimeTestCase(BootstrapTestCase):
76
73
  "</div>"
77
74
  )
78
75
  self.assertHTMLEqual(
79
- self.render('{% bootstrap_field form.test layout="floating" %}', context={"form": DateTimeTestForm()}),
80
- self.fix_django41(expected_html),
76
+ self.render(
77
+ '{% bootstrap_field form.test layout="floating" %}',
78
+ context={"form": DateTimeTestForm()},
79
+ ),
80
+ expected_html,
81
81
  )