Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-crispy-bootstrap3 for 
openSUSE:Factory checked in at 2024-01-15 22:17:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-crispy-bootstrap3 (Old)
 and      /work/SRC/openSUSE:Factory/.python-crispy-bootstrap3.new.21961 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-crispy-bootstrap3"

Mon Jan 15 22:17:49 2024 rev:2 rq:1138700 version:2024.1

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-crispy-bootstrap3/python-crispy-bootstrap3.changes
        2023-07-25 11:50:42.533313938 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-crispy-bootstrap3.new.21961/python-crispy-bootstrap3.changes
     2024-01-15 22:19:13.638840268 +0100
@@ -1,0 +2,9 @@
+Sun Jan 14 17:47:59 UTC 2024 - Dirk Müller <[email protected]>
+
+- update to 2024.1:
+  * Updated supported versions:
+    + Django 3.2, 4.2 and 5.0.
+    + Python 3.8+.
+  * Fixed form-control class issue with checkboxes.
+
+-------------------------------------------------------------------

Old:
----
  crispy-bootstrap3-2022.1.tar.gz

New:
----
  crispy-bootstrap3-2024.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-crispy-bootstrap3.spec ++++++
--- /var/tmp/diff_new_pack.ivL3ZE/_old  2024-01-15 22:19:14.786882459 +0100
+++ /var/tmp/diff_new_pack.ivL3ZE/_new  2024-01-15 22:19:14.786882459 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-crispy-bootstrap3
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,16 +17,17 @@
 
 
 Name:           python-crispy-bootstrap3
-Version:        2022.1
+Version:        2024.1
 Release:        0
 Summary:        Bootstrap3 template pack for django-crispy-forms
 License:        MIT
 URL:            https://github.com/django-crispy-forms/crispy-bootstrap3
 Source:         
https://files.pythonhosted.org/packages/source/c/crispy-bootstrap3/crispy-bootstrap3-%{version}.tar.gz
-BuildRequires:  python-rpm-macros
+BuildRequires:  %{python_module base >= 3.8}
 BuildRequires:  %{python_module pip}
-BuildRequires:  %{python_module wheel}
 BuildRequires:  %{python_module setuptools >= 61.0}
+BuildRequires:  %{python_module wheel}
+BuildRequires:  python-rpm-macros
 # SECTION test requirements
 BuildRequires:  %{python_module Django >= 3.2}
 BuildRequires:  %{python_module django-crispy-forms >= 1.14.0}

++++++ crispy-bootstrap3-2022.1.tar.gz -> crispy-bootstrap3-2024.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap3-2022.1/CHANGELOG.md 
new/crispy-bootstrap3-2024.1/CHANGELOG.md
--- old/crispy-bootstrap3-2022.1/CHANGELOG.md   2022-12-29 17:59:22.000000000 
+0100
+++ new/crispy-bootstrap3-2024.1/CHANGELOG.md   2024-01-13 10:04:34.000000000 
+0100
@@ -1,5 +1,12 @@
 # CHANGELOG FOR CRISPY-BOOTSTRAP3
 
+## 2024.1
+
+* Updated supported versions:
+  * Django 3.2, 4.2 and 5.0.
+  * Python 3.8+.
+* Fixed form-control class issue with checkboxes.
+
 ## 2022.1
 
 * Initial release to move the template pack from core crispy-forms to a 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap3-2022.1/PKG-INFO 
new/crispy-bootstrap3-2024.1/PKG-INFO
--- old/crispy-bootstrap3-2022.1/PKG-INFO       2022-12-29 17:59:38.053930000 
+0100
+++ new/crispy-bootstrap3-2024.1/PKG-INFO       2024-01-13 10:04:46.421947000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: crispy-bootstrap3
-Version: 2022.1
+Version: 2024.1
 Summary: Bootstrap3 template pack for django-crispy-forms
 Author: David Smith
 License: MIT
@@ -26,6 +26,8 @@
 Requires-Python: >=3.7
 Description-Content-Type: text/markdown
 License-File: LICENSE
+Requires-Dist: django-crispy-forms>=1.14.0
+Requires-Dist: django>=3.2
 
 # crispy-bootstrap3
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/crispy_bootstrap3/__init__.py 
new/crispy-bootstrap3-2024.1/crispy_bootstrap3/__init__.py
--- old/crispy-bootstrap3-2022.1/crispy_bootstrap3/__init__.py  2022-12-29 
17:59:22.000000000 +0100
+++ new/crispy-bootstrap3-2024.1/crispy_bootstrap3/__init__.py  2024-01-13 
10:04:34.000000000 +0100
@@ -1 +1 @@
-__version__ = "2022.1"
+__version__ = "2024.1"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/crispy_bootstrap3/templates/bootstrap3/field.html 
new/crispy-bootstrap3-2024.1/crispy_bootstrap3/templates/bootstrap3/field.html
--- 
old/crispy-bootstrap3-2022.1/crispy_bootstrap3/templates/bootstrap3/field.html  
    2022-12-29 17:59:22.000000000 +0100
+++ 
new/crispy-bootstrap3-2024.1/crispy_bootstrap3/templates/bootstrap3/field.html  
    2024-01-13 10:04:34.000000000 +0100
@@ -25,11 +25,15 @@
         {% endif %}
 
         {% if not field|is_checkboxselectmultiple and not field|is_radioselect 
%}
-            {% if field|is_checkbox and form_show_labels %}
-                <label for="{{ field.id_for_label }}" class="{% if 
field.field.required %} requiredField{% endif %}">
+            {% if field|is_checkbox %}
+                {% if form_show_labels %}
+                    <label for="{{ field.id_for_label }}" class="{% if 
field.field.required %} requiredField{% endif %}">
+                        {% crispy_field field %}
+                        {{ field.label }}{% if field.field.required %}<span 
class="asteriskField">*</span>{% endif %}
+                    </label>
+                {% else %}
                     {% crispy_field field %}
-                    {{ field.label }}{% if field.field.required %}<span 
class="asteriskField">*</span>{% endif %}
-                </label>
+                {% endif %}
                 {% include 'bootstrap3/layout/help_text_and_errors.html' %}
             {% else %}
                 <div class="controls {{ field_class }}">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/crispy_bootstrap3.egg-info/PKG-INFO 
new/crispy-bootstrap3-2024.1/crispy_bootstrap3.egg-info/PKG-INFO
--- old/crispy-bootstrap3-2022.1/crispy_bootstrap3.egg-info/PKG-INFO    
2022-12-29 17:59:38.000000000 +0100
+++ new/crispy-bootstrap3-2024.1/crispy_bootstrap3.egg-info/PKG-INFO    
2024-01-13 10:04:46.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: crispy-bootstrap3
-Version: 2022.1
+Version: 2024.1
 Summary: Bootstrap3 template pack for django-crispy-forms
 Author: David Smith
 License: MIT
@@ -26,6 +26,8 @@
 Requires-Python: >=3.7
 Description-Content-Type: text/markdown
 License-File: LICENSE
+Requires-Dist: django-crispy-forms>=1.14.0
+Requires-Dist: django>=3.2
 
 # crispy-bootstrap3
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/crispy_bootstrap3.egg-info/SOURCES.txt 
new/crispy-bootstrap3-2024.1/crispy_bootstrap3.egg-info/SOURCES.txt
--- old/crispy-bootstrap3-2022.1/crispy_bootstrap3.egg-info/SOURCES.txt 
2022-12-29 17:59:38.000000000 +0100
+++ new/crispy-bootstrap3-2024.1/crispy_bootstrap3.egg-info/SOURCES.txt 
2024-01-13 10:04:46.000000000 +0100
@@ -64,22 +64,29 @@
 tests/utils.py
 tests/results/utils_test.html
 
tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_false.html
+tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_false_gte50.html
 
tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_true.html
+tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_true_gte50.html
 
tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_false.html
+tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_false_gte50.html
 
tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_false_lte40.html
 
tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_true.html
+tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_true_gte50.html
 
tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_true_lte40.html
 tests/results/bootstrap3/test_layout/test_layout_composition.html
+tests/results/bootstrap3/test_layout/test_layout_composition_gte50.html
 tests/results/bootstrap3/test_layout/test_multiple_checkboxes.html
 tests/results/bootstrap3/test_layout/test_multiple_fields.html
 tests/results/bootstrap3/test_layout/test_radio.html
 tests/results/bootstrap3/test_layout/test_radio_attrs.html
 
tests/results/bootstrap3/test_layout/test_second_layout_multifield_column_buttonholder_submit_div.html
+tests/results/bootstrap3/test_layout/test_second_layout_multifield_column_buttonholder_submit_div_gte50.html
 tests/results/bootstrap3/test_layout_objects/bootstrap_modal_no_kwargs.html
 tests/results/bootstrap3/test_layout_objects/bootstrap_modal_with_kwargs.html
 tests/results/bootstrap3/test_layout_objects/test_FormActions.html
 tests/results/bootstrap3/test_layout_objects/test_field_with_buttons.html
 tests/results/bootstrap3/test_layout_objects/test_prepended_appended_text.html
+tests/results/bootstrap3/test_layout_objects/test_prepended_appended_text_gte50.html
 tests/templates/crispy_render_template.html
 tests/templates/custom_field_template.html
 tests/templates/custom_form_template.html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap3-2022.1/tests/forms.py 
new/crispy-bootstrap3-2024.1/tests/forms.py
--- old/crispy-bootstrap3-2022.1/tests/forms.py 2022-12-29 17:59:22.000000000 
+0100
+++ new/crispy-bootstrap3-2024.1/tests/forms.py 2024-01-13 10:04:34.000000000 
+0100
@@ -82,6 +82,12 @@
     )
 
 
+class SimpleCheckboxSampleForm(forms.Form):
+    is_company = forms.CharField(
+        label="company", required=False, widget=forms.CheckboxInput()
+    )
+
+
 class SelectSampleForm(forms.Form):
     select = forms.ChoiceField(
         choices=((1, "Option one"), (2, "Option two"), (3, "Option three")),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_false_gte50.html
 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_false_gte50.html
--- 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_false_gte50.html
      1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_false_gte50.html
      2024-01-13 10:04:34.000000000 +0100
@@ -0,0 +1,45 @@
+<form method="post">
+    <div id="div_id_email" class="form-group">
+        <label for="id_email" class=" control-label requiredField"> email<span 
class="asteriskField">*</span> </label>
+        <div class=" controls">
+            <div class="input-group"><input type="text" name="email" 
value="invalidemail" maxlength="30"
+            aria-describedby="id_email_helptext" aria-invalid="true"
+            class="textinput textInput inputtext form-control" required 
id="id_email" />
+            <span class="input-group-addon">whatever</span></div>
+            <div id="hint_id_email" class="help-block">Insert your email</div>
+        </div>
+    </div>
+    <div id="div_id_first_name" class="form-group">
+        <label for="id_first_name" class=" control-label requiredField"> first 
name<span class="asteriskField">*</span> </label>
+        <div class=" controls">
+            <div class="input-group">
+                <span class="input-group-addon">blabla</span>
+              <input type="text" name="first_name" value="first_name_too_long" 
maxlength="5" aria-invalid="true"
+                     class="textinput textInput inputtext form-control" 
required id="id_first_name" />
+            </div>
+        </div>
+    </div>
+    <div id="div_id_last_name" class="form-group">
+        <label for="id_last_name" class=" control-label requiredField"> last 
name<span class="asteriskField">*</span> </label>
+        <div class=" controls">
+            <div class="input-group">
+                <span class="input-group-addon">foo</span>
+                <input type="text" name="last_name" value="last_name_too_long" 
maxlength="5" aria-invalid="true"
+                       class="textinput textInput inputtext form-control" 
required id="id_last_name" />
+                <span class="input-group-addon">bar</span>
+            </div>
+        </div>
+    </div>
+    <div id="div_id_password1" class="form-group">
+        <label for="id_password1" class=" control-label requiredField"> 
password<span class="asteriskField">*</span> </label>
+        <div class=" controls">
+            <div class="input-group"><input type="password" name="password1" 
maxlength="30" class="textInput textinput form-control" required 
id="id_password1" /> <span class="input-group-addon">whatever</span></div>
+        </div>
+    </div>
+    <div id="div_id_password2" class="form-group">
+        <label for="id_password2" class=" control-label requiredField"> 
re-enter password<span class="asteriskField">*</span> </label>
+        <div class=" controls">
+            <div class="input-group"><span 
class="input-group-addon">blabla</span> <input type="password" name="password2" 
maxlength="30" class="textInput textinput form-control" required 
id="id_password2" /></div>
+        </div>
+    </div>
+</form>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_true_gte50.html
 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_true_gte50.html
--- 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_true_gte50.html
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_true_gte50.html
       2024-01-13 10:04:34.000000000 +0100
@@ -0,0 +1,49 @@
+<form method="post">
+    <div id="div_id_email" class="form-group has-error">
+        <label for="id_email" class=" control-label requiredField"> email<span 
class="asteriskField">*</span> </label>
+        <div class=" controls">
+            <div class="input-group"><input type="text" name="email" 
value="invalidemail" maxlength="30"
+            aria-describedby="id_email_helptext" aria-invalid="true"
+            class="textinput textInput inputtext form-control" required 
id="id_email" />
+            <span class="input-group-addon">whatever</span></div>
+            <span id="error_1_id_email" class="help-block"><strong>Enter a 
valid email address.</strong></span>
+            <div id="hint_id_email" class="help-block">Insert your email</div>
+        </div>
+    </div>
+    <div id="div_id_first_name" class="form-group has-error">
+        <label for="id_first_name" class=" control-label requiredField"> first 
name<span class="asteriskField">*</span> </label>
+        <div class=" controls">
+            <div class="input-group">
+                <span class="input-group-addon">blabla</span>
+                <input type="text" name="first_name" 
value="first_name_too_long" maxlength="5" aria-invalid="true"
+                       class="textinput textInput inputtext form-control" 
required id="id_first_name" />
+            </div>
+
+            <span id="error_1_id_first_name" class="help-block"><strong>Ensure 
this value has at most 5 characters (it has 19).</strong></span>
+        </div>
+    </div>
+    <div id="div_id_last_name" class="form-group has-error">
+        <label for="id_last_name" class=" control-label requiredField"> last 
name<span class="asteriskField">*</span> </label>
+        <div class=" controls">
+            <div class="input-group">
+                <span class="input-group-addon">foo</span>
+                <input type="text" name="last_name" value="last_name_too_long" 
maxlength="5"  aria-invalid="true"
+                       class="textinput textInput inputtext form-control" 
required id="id_last_name" />
+                <span class="input-group-addon">bar</span>
+            </div>
+            <span id="error_1_id_last_name" class="help-block"><strong>Ensure 
this value has at most 5 characters (it has 18).</strong></span>
+        </div>
+    </div>
+    <div id="div_id_password1" class="form-group">
+        <label for="id_password1" class=" control-label requiredField"> 
password<span class="asteriskField">*</span> </label>
+        <div class=" controls">
+            <div class="input-group"><input type="password" name="password1" 
maxlength="30" class="textInput textinput form-control" required 
id="id_password1" /> <span class="input-group-addon">whatever</span></div>
+        </div>
+    </div>
+    <div id="div_id_password2" class="form-group">
+        <label for="id_password2" class=" control-label requiredField"> 
re-enter password<span class="asteriskField">*</span> </label>
+        <div class=" controls">
+            <div class="input-group"><span 
class="input-group-addon">blabla</span> <input type="password" name="password2" 
maxlength="30" class="textInput textinput form-control" required 
id="id_password2" /></div>
+        </div>
+    </div>
+</form>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_false_gte50.html
 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_false_gte50.html
--- 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_false_gte50.html
      1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_false_gte50.html
      2024-01-13 10:04:34.000000000 +0100
@@ -0,0 +1,40 @@
+<form method="post">
+    <div class="form-group">
+        <div id="div_id_is_company" class="checkbox"> <label 
for="id_is_company" class=""> <input type="checkbox"
+                    name="is_company" class="checkboxinput" 
id="id_is_company"> company </label> </div>
+    </div>
+    <div id="div_id_email" class="form-group"> <label for="id_email" 
class="control-label  requiredField"> email<span
+                class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="text" name="email" maxlength="30"
+                aria-describedby="id_email_helptext" aria-invalid="true"
+                class="textinput textInput inputtext form-control" required 
id="id_email">
+            <div id="hint_id_email" class="help-block">Insert your email</div>
+        </div>
+    </div>
+    <div id="div_id_password1" class="form-group"> <label for="id_password1" 
class="control-label  requiredField">
+            password<span class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="password" name="password1" 
maxlength="30"
+                class="textInput textinput form-control" required 
id="id_password1"> </div>
+    </div>
+    <div id="div_id_password2" class="form-group"> <label for="id_password2" 
class="control-label  requiredField">
+            re-enter password<span class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="password" name="password2" 
maxlength="30"
+                class="textInput textinput form-control" required 
id="id_password2"> </div>
+    </div>
+    <div id="div_id_first_name" class="form-group"> <label for="id_first_name" 
class="control-label  requiredField">
+            first name<span class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="text" name="first_name" 
maxlength="5" aria-invalid="true"
+                class="textinput textInput inputtext form-control" required 
id="id_first_name"> </div>
+    </div>
+    <div id="div_id_last_name" class="form-group"> <label for="id_last_name" 
class="control-label  requiredField"> last
+            name<span class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="text" name="last_name" 
maxlength="5" aria-invalid="true"
+                class="textinput textInput inputtext form-control" required 
id="id_last_name"> </div>
+    </div>
+    <div id="div_id_datetime_field" class="form-group"> 
+        <label class="control-label requiredField"> date time<span 
class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="text" name="datetime_field_0" 
class="dateinput" required aria-invalid="true"
+                id="id_datetime_field_0"><input type="text" 
name="datetime_field_1" class="timeinput" required aria-invalid="true"
+                id="id_datetime_field_1"> </div>
+    </div>
+</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_true_gte50.html
 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_true_gte50.html
--- 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_true_gte50.html
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_form_helper/test_form_show_errors_non_field_errors_true_gte50.html
       2024-01-13 10:04:34.000000000 +0100
@@ -0,0 +1,49 @@
+<form method="post">
+    <div class="alert alert-block alert-danger">
+        <ul>
+            <li>Passwords dont match</li>
+        </ul>
+    </div>
+    <div class="form-group">
+        <div id="div_id_is_company" class="checkbox"> <label 
for="id_is_company" class=""> <input type="checkbox"
+                    name="is_company" class="checkboxinput" 
id="id_is_company"> company </label> </div>
+    </div>
+    <div id="div_id_email" class="form-group has-error"> <label for="id_email" 
class="control-label  requiredField">
+            email<span class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="text" name="email" maxlength="30"
+                aria-describedby="id_email_helptext" aria-invalid="true"
+                class="textinput textInput inputtext form-control" required 
id="id_email"> <span id="error_1_id_email"
+                class="help-block"><strong>This field is 
required.</strong></span>
+            <div id="hint_id_email" class="help-block">Insert your email</div>
+        </div>
+    </div>
+    <div id="div_id_password1" class="form-group"> <label for="id_password1" 
class="control-label  requiredField">
+            password<span class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="password" name="password1" 
maxlength="30"
+                class="textInput textinput form-control" required 
id="id_password1"> </div>
+    </div>
+    <div id="div_id_password2" class="form-group"> <label for="id_password2" 
class="control-label  requiredField">
+            re-enter password<span class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="password" name="password2" 
maxlength="30"
+                class="textInput textinput form-control" required 
id="id_password2"> </div>
+    </div>
+    <div id="div_id_first_name" class="form-group has-error"> <label 
for="id_first_name"
+            class="control-label  requiredField"> first name<span 
class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="text" name="first_name" 
maxlength="5" aria-invalid="true"
+                class="textinput textInput inputtext form-control" required 
id="id_first_name"> <span
+                id="error_1_id_first_name" class="help-block"><strong>This 
field is required.</strong></span> </div>
+    </div>
+    <div id="div_id_last_name" class="form-group has-error"> <label 
for="id_last_name"
+            class="control-label  requiredField"> last name<span 
class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="text" name="last_name" 
maxlength="5" aria-invalid="true"
+                class="textinput textInput inputtext form-control" required 
id="id_last_name"> <span
+                id="error_1_id_last_name" class="help-block"><strong>This 
field is required.</strong></span> </div>
+    </div>
+    <div id="div_id_datetime_field" class="form-group has-error"> 
+        <label class="control-label  requiredField"> date time<span 
class="asteriskField">*</span> </label>
+        <div class="controls "> <input type="text" name="datetime_field_0" 
class="dateinput" required aria-invalid="true"
+                id="id_datetime_field_0"><input type="text" 
name="datetime_field_1" class="timeinput" required aria-invalid="true"
+                id="id_datetime_field_1"> <span id="error_1_id_datetime_field" 
class="help-block"><strong>This field is
+                    required.</strong></span> </div>
+    </div>
+</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_layout/test_layout_composition_gte50.html
 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_layout/test_layout_composition_gte50.html
--- 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_layout/test_layout_composition_gte50.html
        1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_layout/test_layout_composition_gte50.html
        2024-01-13 10:04:34.000000000 +0100
@@ -0,0 +1,35 @@
+<form method="post">
+    <div id="multifield_info" class="ctrlHolder">
+        <div class="alert alert-danger" role="alert"> </div>
+        <p class="blockLabel">Some company data</p>
+        <div class="multiField">
+            <div class="checkbox"> <label for="id_is_company" 
class="blockLabel"> <input type="checkbox"
+                        name="is_company" class="checkboxinput" 
id="id_is_company"> company </label> </div>
+            <div class="form-group "> <label class="control-label" 
for="id_email" class="blockLabel"> email </label>
+                <input type="text" name="email" maxlength="30" 
class="textinput textInput" required
+                       aria-describedby="id_email_helptext"
+                    id="id_email"> <span id="help_id_email" 
class="help-block">Insert your email</span> </div>
+        </div>
+    </div>
+    <div id="column_name" class="formColumn columns">
+        <div id="div_id_first_name" class="form-group"> <label 
for="id_first_name" class="control-label  requiredField">
+                first name<span class="asteriskField">*</span> </label>
+            <div class="controls "> <input type="text" name="first_name" 
maxlength="5"
+                    class="textinput textInput form-control" required 
id="id_first_name"> </div>
+        </div>
+    </div>
+    <div class="buttonHolder"> <input type="submit" name="Save" value="Save" 
class="btn btn-primary button white"
+            id="submit-id-save" /></div>
+    <div id="custom-div" class="customdivs">
+        <div id="div_id_password1" class="form-group"> <label 
for="id_password1" class="control-label  requiredField">
+                password<span class="asteriskField">*</span> </label>
+            <div class="controls "> <input type="password" name="password1" 
maxlength="30"
+                    class="textInput textinput form-control" required 
id="id_password1"> </div>
+        </div>
+        <div id="div_id_password2" class="form-group"> <label 
for="id_password2" class="control-label  requiredField">
+                re-enter password<span class="asteriskField">*</span> </label>
+            <div class="controls "> <input type="password" name="password2" 
maxlength="30"
+                    class="textInput textinput form-control" required 
id="id_password2"> </div>
+        </div>
+    </div>
+</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_layout/test_second_layout_multifield_column_buttonholder_submit_div_gte50.html
 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_layout/test_second_layout_multifield_column_buttonholder_submit_div_gte50.html
--- 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_layout/test_second_layout_multifield_column_buttonholder_submit_div_gte50.html
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_layout/test_second_layout_multifield_column_buttonholder_submit_div_gte50.html
   2024-01-13 10:04:34.000000000 +0100
@@ -0,0 +1,41 @@
+<form method="post">
+    <div id="multifield_info" class="ctrlHolder" multifield-test="123" 
title="multifield_title">
+        <div class="alert alert-danger" role="alert"> </div>
+        <p class="blockLabel">Some company data</p>
+        <div class="multiField">
+            <div class="checkbox"> <label for="id_is_company" 
class="blockLabel"> <input type="checkbox"
+                        name="is_company" class="checkboxinput" 
id="id_is_company"> company </label> </div>
+            <div class="form-group "> <label class="control-label" 
for="id_email" class="blockLabel"> email </label>
+                <input type="text" name="email" maxlength="30" 
class="textinput textInput" required
+                       aria-describedby="id_email_helptext"
+                    id="id_email"> <span id="help_id_email" 
class="help-block">Insert your email</span> </div>
+        </div>
+    </div>
+    <div id="column_name" class="formColumn columns">
+        <div id="div_id_first_name" class="form-group"> <label 
for="id_first_name" class="control-label  requiredField">
+                first name<span class="asteriskField">*</span> </label>
+            <div class="controls "> <input type="text" name="first_name" 
maxlength="5"
+                    class="textinput textInput form-control" required 
id="id_first_name"> </div>
+        </div>
+        <div id="div_id_last_name" class="form-group"> <label 
for="id_last_name" class="control-label  requiredField">
+                last name<span class="asteriskField">*</span> </label>
+            <div class="controls "> <input type="text" name="last_name" 
maxlength="5"
+                    class="textinput textInput form-control" required 
id="id_last_name"> </div>
+        </div>
+    </div>
+    <div class="buttonHolder"> <input type="submit" name="save-the-world" 
value="Save"
+            class="btn btn-primary button white" id="submit-id-save-the-world" 
data-id="test" data-name="test" /><input
+            type="submit" name="store" value="Store results" class="btn 
btn-primary" id="submit-id-store" /></div>
+    <div id="custom-div" class="customdivs" test-markup="123">
+        <div id="div_id_password1" class="form-group"> <label 
for="id_password1" class="control-label  requiredField">
+                password<span class="asteriskField">*</span> </label>
+            <div class="controls "> <input type="password" name="password1" 
maxlength="30"
+                    class="textInput textinput form-control" required 
id="id_password1"> </div>
+        </div>
+        <div id="div_id_password2" class="form-group"> <label 
for="id_password2" class="control-label  requiredField">
+                re-enter password<span class="asteriskField">*</span> </label>
+            <div class="controls "> <input type="password" name="password2" 
maxlength="30"
+                    class="textInput textinput form-control" required 
id="id_password2"> </div>
+        </div>
+    </div>
+</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_layout_objects/test_prepended_appended_text_gte50.html
 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_layout_objects/test_prepended_appended_text_gte50.html
--- 
old/crispy-bootstrap3-2022.1/tests/results/bootstrap3/test_layout_objects/test_prepended_appended_text_gte50.html
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap3-2024.1/tests/results/bootstrap3/test_layout_objects/test_prepended_appended_text_gte50.html
   2024-01-13 10:04:34.000000000 +0100
@@ -0,0 +1,37 @@
+<form method="post">
+    <div id="div_id_email" class="form-group">
+        <label for="id_email" class="control-label  requiredField">
+            email
+            <span class="asteriskField">*</span>
+        </label>
+        <div class="controls ">
+            <div class="input-group">
+                <span class="input-group-addon active">@</span>
+                <input type="text" name="email" maxlength="30" 
class="textinput textInput form-control custom-size-class"
+                       required id="id_email" 
aria-describedby="id_email_helptext">
+                <span class="input-group-addon active">gmail.com</span>
+            </div>
+            <div id="hint_id_email" class="help-block">Insert your email</div>
+        </div>
+    </div>
+    <div id="div_id_password1" class="form-group">
+        <label for="id_password1" class="control-label  requiredField">
+            password<span class="asteriskField">*</span> </label>
+        <div class="controls ">
+            <div class="input-group">
+                <input type="password" name="password1" maxlength="30" 
class="textInput textinput form-control input-lg" required id="id_password1">
+                <span class="input-lg input-group-addon">#</span>
+            </div>
+        </div>
+    </div>
+    <div id="div_id_password2" class="form-group">
+        <label for="id_password2" class="control-label  requiredField">
+            re-enter password<span class="asteriskField">*</span> </label>
+        <div class="controls ">
+            <div class="input-group">
+                <span class="input-sm input-group-addon">$</span>
+                <input type="password" name="password2" maxlength="30" 
class="input-sm textInput textinput form-control" required id="id_password2">
+            </div>
+        </div>
+    </div>
+</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap3-2022.1/tests/test_form_helper.py 
new/crispy-bootstrap3-2024.1/tests/test_form_helper.py
--- old/crispy-bootstrap3-2022.1/tests/test_form_helper.py      2022-12-29 
17:59:22.000000000 +0100
+++ new/crispy-bootstrap3-2024.1/tests/test_form_helper.py      2024-01-13 
10:04:34.000000000 +0100
@@ -139,6 +139,13 @@
             "bootstrap3/test_form_helper/"
             "test_form_show_errors_non_field_errors_true_lte40.html"
         )
+    elif django.VERSION >= (5, 0):
+        # Added 'aria-describedby' for fields with help_text
+        # https://docs.djangoproject.com/en/5.0/releases/5.0/#forms
+        expected = parse_expected(
+            "bootstrap3/test_form_helper/"
+            "test_form_show_errors_non_field_errors_true_gte50.html"
+        )
     else:
         expected = parse_expected(
             "bootstrap3/test_form_helper/"
@@ -155,6 +162,13 @@
             "bootstrap3/test_form_helper/"
             "test_form_show_errors_non_field_errors_false_lte40.html"
         )
+    elif django.VERSION >= (5, 0):
+        # Added 'aria-describedby' for fields with help_text
+        # https://docs.djangoproject.com/en/5.0/releases/5.0/#forms
+        expected = parse_expected(
+            "bootstrap3/test_form_helper/"
+            "test_form_show_errors_non_field_errors_false_gte50.html"
+        )
     else:
         expected = parse_expected(
             "bootstrap3/test_form_helper/"
@@ -528,14 +542,31 @@
     form.is_valid()
 
     form.helper.form_show_errors = True
-    assert parse_form(form) == parse_expected(
-        "bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_true.html"
-    )
+    if django.VERSION >= (5, 0):
+        # Added 'aria-describedby' for fields with help_text
+        # https://docs.djangoproject.com/en/5.0/releases/5.0/#forms
+        expected = parse_expected(
+            
"bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_true_gte50.html"
+        )
+    else:
+        expected = parse_expected(
+            
"bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_true.html"
+        )
+    assert parse_form(form) == expected
 
     form.helper.form_show_errors = False
-    assert parse_form(form) == parse_expected(
-        "bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_false.html"
-    )
+    if django.VERSION >= (5, 0):
+        # Added 'aria-describedby' for fields with help_text
+        # https://docs.djangoproject.com/en/5.0/releases/5.0/#forms
+        expected = parse_expected(
+            "bootstrap3/test_form_helper/"
+            "bootstrap_form_show_errors_bs3_false_gte50.html"
+        )
+    else:
+        expected = parse_expected(
+            
"bootstrap3/test_form_helper/bootstrap_form_show_errors_bs3_false.html"
+        )
+    assert parse_form(form) == expected
 
 
 def test_error_text_inline(settings):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap3-2022.1/tests/test_layout.py 
new/crispy-bootstrap3-2024.1/tests/test_layout.py
--- old/crispy-bootstrap3-2022.1/tests/test_layout.py   2022-12-29 
17:59:22.000000000 +0100
+++ new/crispy-bootstrap3-2024.1/tests/test_layout.py   2024-01-13 
10:04:34.000000000 +0100
@@ -1,3 +1,4 @@
+import django
 import pytest
 from crispy_forms import __version__
 from crispy_forms.bootstrap import Field, InlineCheckboxes
@@ -34,6 +35,7 @@
     SampleForm4,
     SampleForm5,
     SampleForm6,
+    SimpleCheckboxSampleForm,
 )
 from .test_settings import TEMPLATE_DIRS
 from .utils import contains_partial, parse_expected, parse_form
@@ -462,9 +464,15 @@
     html = template.render(c)
 
     # Bootstrap 4 does not contain a multifield template
-    assert parse_html(html) == parse_expected(
-        "bootstrap3/test_layout/test_layout_composition.html"
-    )
+    if django.VERSION >= (5, 0):
+        # Added 'aria-describedby' for fields with help_text
+        # https://docs.djangoproject.com/en/5.0/releases/5.0/#forms
+        expected = parse_expected(
+            "bootstrap3/test_layout/test_layout_composition_gte50.html"
+        )
+    else:
+        expected = 
parse_expected("bootstrap3/test_layout/test_layout_composition.html")
+    assert parse_html(html) == expected
 
 
 @override_settings(CRISPY_CLASS_CONVERTERS=CONVERTERS)
@@ -516,10 +524,19 @@
     html = template.render(c)
 
     # Bootstrap 4 does not contain a multifield template
-    assert parse_html(html) == parse_expected(
-        "bootstrap3/test_layout/"
-        "test_second_layout_multifield_column_buttonholder_submit_div.html"
-    )
+    if django.VERSION >= (5, 0):
+        # Added 'aria-describedby' for fields with help_text
+        # https://docs.djangoproject.com/en/5.0/releases/5.0/#forms
+        expected = parse_expected(
+            "bootstrap3/test_layout/"
+            
"test_second_layout_multifield_column_buttonholder_submit_div_gte50.html"
+        )
+    else:
+        expected = parse_expected(
+            "bootstrap3/test_layout/"
+            "test_second_layout_multifield_column_buttonholder_submit_div.html"
+        )
+    assert parse_html(html) == expected
 
 
 @override_settings(
@@ -570,6 +587,19 @@
     )
 
 
+def test_no_label_checkboxes_bs3():
+    form = SimpleCheckboxSampleForm()
+    form.helper = FormHelper()
+    # no form-control class when labels are rendered
+    html = render_crispy_form(form)
+    assert html.count("form-control") == 0
+    form.helper.form_show_labels = False
+    # no labels or form-control class when labels are hidden
+    html = render_crispy_form(form)
+    assert html.count("<label ") == 0
+    assert html.count("form-control") == 0
+
+
 @pytest.mark.skipif(__version__[0] == "1", reason="#1262 fixed required 
attributes.")
 def test_radio_bs3():
     form = SampleForm5()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap3-2022.1/tests/test_layout_objects.py 
new/crispy-bootstrap3-2024.1/tests/test_layout_objects.py
--- old/crispy-bootstrap3-2022.1/tests/test_layout_objects.py   2022-12-29 
17:59:22.000000000 +0100
+++ new/crispy-bootstrap3-2024.1/tests/test_layout_objects.py   2024-01-13 
10:04:34.000000000 +0100
@@ -1,3 +1,4 @@
+import django
 import pytest
 from crispy_forms import __version__
 from crispy_forms.bootstrap import (
@@ -162,7 +163,6 @@
 
 class TestBootstrapLayoutObjects:
     def test_custom_django_widget(self):
-
         # Make sure an inherited RadioSelect gets rendered as it
         form = SampleFormCustomWidgets()
         assert isinstance(form.fields["inline_radios"].widget, 
CustomRadioSelect)
@@ -191,9 +191,17 @@
             AppendedText("password1", "#", css_class="input-lg"),
             PrependedText("password2", "$", css_class="input-sm"),
         )
-        assert parse_form(test_form) == parse_expected(
-            "bootstrap3/test_layout_objects/test_prepended_appended_text.html"
-        )
+        if django.VERSION >= (5, 0):
+            # Added 'aria-describedby' for fields with help_text
+            # https://docs.djangoproject.com/en/5.0/releases/5.0/#forms
+            expected = parse_expected(
+                
"bootstrap3/test_layout_objects/test_prepended_appended_text_gte50.html"
+            )
+        else:
+            expected = parse_expected(
+                
"bootstrap3/test_layout_objects/test_prepended_appended_text.html"
+            )
+        assert parse_form(test_form) == expected
 
     def test_inline_radios(self):
         test_form = CheckboxesSampleForm()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap3-2022.1/tox.ini 
new/crispy-bootstrap3-2024.1/tox.ini
--- old/crispy-bootstrap3-2022.1/tox.ini        2022-12-29 17:59:22.000000000 
+0100
+++ new/crispy-bootstrap3-2024.1/tox.ini        2024-01-13 10:04:34.000000000 
+0100
@@ -1,16 +1,17 @@
 [tox]
 envlist =
-    {py37,py38,py39,py310}-django{32}-crispy{1,-latest},
-    {py38,py39,py310}-django{40,41,-latest}-crispy{1,-latest},
-    {py311}-django{41,-latest}-crispy{1,-latest},
+    {py38,py39,py310}-django32-crispy1,
+    {py38,py39,py310}-django42-crispy{1,2,-latest},
+    {py311}-django{42,50}-crispy{2,-latest},
     lint
 
 [testenv]
 deps =
-    django32: django>=3.2,<3.3
-    django40: django>=4.0a,<4.1
-    django41: django>=4.1a,<4.2
+    django32: django>=3.2,<4
+    django42: django>=4.2,<5
+    django50: django>=5.0,<5.1
     crispy1: django-crispy-forms<=2.0
+    crispy2: django-crispy-forms>=2.0,<3
     crispy-latest: 
https://github.com/django-crispy-forms/django-crispy-forms/archive/main.tar.gz
     -rrequirements/testing.txt
 commands = python -W error::DeprecationWarning -W 
error::PendingDeprecationWarning -m pytest {posargs}

Reply via email to