Code

Ticket #494: 494.r12835.diff

File 494.r12835.diff, 10.8 KB (added by schinckel, 4 years ago)

A version that actually adds the classes properly. Works with r12835, and StackedInlines.

Line 
1Index: django/forms/formsets.py
2===================================================================
3--- django/forms/formsets.py    (revision 12835)
4+++ django/forms/formsets.py    (working copy)
5@@ -324,11 +324,11 @@
6         return mark_safe(u'\n'.join([unicode(self.management_form), forms]))
7 
8 def formset_factory(form, formset=BaseFormSet, extra=1, can_order=False,
9-                    can_delete=False, max_num=0):
10+                    can_delete=False, max_num=0, classes=None):
11     """Return a FormSet for the given form class."""
12     attrs = {'form': form, 'extra': extra,
13              'can_order': can_order, 'can_delete': can_delete,
14-             'max_num': max_num}
15+             'max_num': max_num, 'classes':classes or []}
16     return type(form.__name__ + 'FormSet', (formset,), attrs)
17 
18 def all_valid(formsets):
19Index: django/forms/models.py
20===================================================================
21--- django/forms/models.py      (revision 12835)
22+++ django/forms/models.py      (working copy)
23@@ -647,7 +647,7 @@
24         super(BaseModelFormSet, self).add_fields(form, index)
25 
26 def modelformset_factory(model, form=ModelForm, formfield_callback=lambda f: f.formfield(),
27-                         formset=BaseModelFormSet,
28+                         formset=BaseModelFormSet, classes=None,
29                          extra=1, can_delete=False, can_order=False,
30                          max_num=0, fields=None, exclude=None):
31     """
32@@ -656,7 +656,8 @@
33     form = modelform_factory(model, form=form, fields=fields, exclude=exclude,
34                              formfield_callback=formfield_callback)
35     FormSet = formset_factory(form, formset, extra=extra, max_num=max_num,
36-                              can_order=can_order, can_delete=can_delete)
37+                              can_order=can_order, can_delete=can_delete,
38+                              classes=classes or [])
39     FormSet.model = model
40     return FormSet
41 
42@@ -798,7 +799,7 @@
43 
44 def inlineformset_factory(parent_model, model, form=ModelForm,
45                           formset=BaseInlineFormSet, fk_name=None,
46-                          fields=None, exclude=None,
47+                          fields=None, exclude=None, classes=None,
48                           extra=3, can_order=False, can_delete=True, max_num=0,
49                           formfield_callback=lambda f: f.formfield()):
50     """
51@@ -821,6 +822,7 @@
52         'fields': fields,
53         'exclude': exclude,
54         'max_num': max_num,
55+        'classes': classes or [],
56     }
57     FormSet = modelformset_factory(model, **kwargs)
58     FormSet.fk = fk
59Index: django/contrib/admin/media/css/forms.css
60===================================================================
61--- django/contrib/admin/media/css/forms.css    (revision 12835)
62+++ django/contrib/admin/media/css/forms.css    (working copy)
63@@ -125,21 +125,21 @@
64 
65 /* COLLAPSED FIELDSETS */
66 
67-fieldset.collapsed * {
68+fieldset.collapsed *, div.collapsed * {
69     display: none;
70 }
71 
72-fieldset.collapsed h2, fieldset.collapsed {
73+fieldset.collapsed h2, fieldset.collapsed, div.collapsed h2, div.collapsed {
74     display: block !important;
75 }
76 
77-fieldset.collapsed h2 {
78+fieldset.collapsed h2, div.collapsed h2 {
79     background-image: url(../img/admin/nav-bg.gif);
80     background-position: bottom left;
81     color: #999;
82 }
83 
84-fieldset.collapsed .collapse-toggle {
85+.collapse-toggle {
86     background: transparent;
87     display: inline !important;
88 }
89Index: django/contrib/admin/media/js/collapse.min.js
90===================================================================
91--- django/contrib/admin/media/js/collapse.min.js       (revision 12835)
92+++ django/contrib/admin/media/js/collapse.min.js       (working copy)
93@@ -1,2 +1,2 @@
94-(function(a){a(document).ready(function(){a("fieldset.collapse").each(function(c,b){if(a(b).find("div.errors").length==0){a(b).addClass("collapsed");a(b).find("h2").first().append(' (<a id="fieldsetcollapser'+c+'" class="collapse-toggle" href="#">'+gettext("Show")+"</a>)")}});a("fieldset.collapse a.collapse-toggle").toggle(function(){a(this).text(gettext("Hide"));a(this).closest("fieldset").removeClass("collapsed");return false},function(){a(this).text(gettext("Show"));a(this).closest("fieldset").addClass("collapsed");
95-return false})})})(jQuery);
96+(function(a){a(document).ready(function(){a("div.collapse").each(function(c,b){if(a(b).find("div.errors").length==0){a(b).addClass("collapsed");a(b).find("h2").first().append(' (<a id="divcollapser'+c+'" class="collapse-toggle" href="#">'+gettext("Show")+"</a>)")}});a("fieldset.collapse").each(function(c,b){if(a(b).find("div.errors").length==0){a(b).addClass("collapsed");a(b).find("h2").first().append(' (<a id="fieldsetcollapser'+c+'" class="collapse-toggle" href="#">'+gettext("Show")+"</a>)")}});
97+a("fieldset.collapse a.collapse-toggle").toggle(function(){a(this).text(gettext("Hide"));a(this).closest("fieldset").removeClass("collapsed");return false},function(){a(this).text(gettext("Show"));a(this).closest("fieldset").addClass("collapsed");return false});a("div.collapse a.collapse-toggle").toggle(function(){a(this).text(gettext("Hide"));a(this).closest("div").removeClass("collapsed");return false},function(){a(this).text(gettext("Show"));a(this).closest("div").addClass("collapsed");return false})})})(jQuery);
98Index: django/contrib/admin/media/js/collapse.js
99===================================================================
100--- django/contrib/admin/media/js/collapse.js   (revision 12835)
101+++ django/contrib/admin/media/js/collapse.js   (working copy)
102@@ -1,5 +1,14 @@
103 (function($) {
104        $(document).ready(function() {
105+           $("div.collapse").each(function(i, elem) {
106+                       // Don't hide if fields in this fieldset have errors
107+            if ( $(elem).find("div.errors").length == 0 ) {
108+                               $(elem).addClass("collapsed");
109+                               $(elem).find("h2").first().append(' (<a id="divcollapser' +
110+                                       i +'" class="collapse-toggle" href="#">' + gettext("Show") +
111+                                       '</a>)');
112+            }
113+               });
114                // Add anchor tag for Show/Hide link
115                $("fieldset.collapse").each(function(i, elem) {
116                        // Don't hide if fields in this fieldset have errors
117@@ -10,6 +19,8 @@
118                                        '</a>)');
119                        }
120                });
121+
122+               
123                // Add toggle to anchor tag
124                $("fieldset.collapse a.collapse-toggle").toggle(
125                        function() { // Show
126@@ -23,5 +34,17 @@
127                                return false;
128                        }
129                );
130+               $("div.collapse a.collapse-toggle").toggle(
131+                       function() { // Show
132+                               $(this).text(gettext("Hide"));
133+                               $(this).closest("div").removeClass("collapsed");
134+                               return false;
135+                       },
136+                       function() { // Hide
137+                               $(this).text(gettext("Show"));
138+                               $(this).closest("div").addClass("collapsed");
139+                               return false;
140+                       }
141+               );
142        });
143 })(jQuery);
144Index: django/contrib/admin/options.py
145===================================================================
146--- django/contrib/admin/options.py     (revision 12835)
147+++ django/contrib/admin/options.py     (working copy)
148@@ -1184,6 +1184,7 @@
149     verbose_name = None
150     verbose_name_plural = None
151     can_delete = True
152+    classes = []
153 
154     def __init__(self, parent_model, admin_site):
155         self.admin_site = admin_site
156@@ -1200,6 +1201,8 @@
157         js = ['js/jquery.min.js', 'js/inlines.min.js']
158         if self.prepopulated_fields:
159             js.append('js/urlify.js')
160+        if 'collapse' in self.classes:
161+            js.append('js/collapse.min.js')
162         if self.filter_vertical or self.filter_horizontal:
163             js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js'])
164         return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js])
165@@ -1230,6 +1233,7 @@
166             "extra": self.extra,
167             "max_num": self.max_num,
168             "can_delete": self.can_delete,
169+            "classes": self.classes,
170         }
171         defaults.update(kwargs)
172         return inlineformset_factory(self.parent_model, self.model, **defaults)
173Index: django/contrib/admin/templates/admin/edit_inline/stacked.html
174===================================================================
175--- django/contrib/admin/templates/admin/edit_inline/stacked.html       (revision 12835)
176+++ django/contrib/admin/templates/admin/edit_inline/stacked.html       (working copy)
177@@ -1,5 +1,5 @@
178 {% load i18n adminmedia %}
179-<div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group">
180+<div class="inline-group {% for class in inline_admin_formset.formset.classes %} {{class}}{% endfor %}" id="{{ inline_admin_formset.formset.prefix }}-group">
181   <h2>{{ inline_admin_formset.opts.verbose_name_plural|title }}</h2>
182 {{ inline_admin_formset.formset.management_form }}
183 {{ inline_admin_formset.formset.non_form_errors }}
184Index: django/contrib/admin/templates/admin/edit_inline/tabular.html
185===================================================================
186--- django/contrib/admin/templates/admin/edit_inline/tabular.html       (revision 12835)
187+++ django/contrib/admin/templates/admin/edit_inline/tabular.html       (working copy)
188@@ -2,7 +2,7 @@
189 <div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group">
190   <div class="tabular inline-related {% if forloop.last %}last-related{% endif %}">
191 {{ inline_admin_formset.formset.management_form }}
192-<fieldset class="module">
193+<fieldset class="module {% for class in inline_admin_formset.formset.classes %} {{class}}{% endfor %}">
194    <h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
195    {{ inline_admin_formset.formset.non_form_errors }}
196    <table>
197Index: django/contrib/contenttypes/generic.py
198===================================================================
199--- django/contrib/contenttypes/generic.py      (revision 12835)
200+++ django/contrib/contenttypes/generic.py      (working copy)
201@@ -335,7 +335,7 @@
202 def generic_inlineformset_factory(model, form=ModelForm,
203                                   formset=BaseGenericInlineFormSet,
204                                   ct_field="content_type", fk_field="object_id",
205-                                  fields=None, exclude=None,
206+                                  fields=None, exclude=None, classes=None,
207                                   extra=3, can_order=False, can_delete=True,
208                                   max_num=0,
209                                   formfield_callback=lambda f: f.formfield()):
210@@ -360,7 +360,7 @@
211         exclude = [ct_field.name, fk_field.name]
212     FormSet = modelformset_factory(model, form=form,
213                                    formfield_callback=formfield_callback,
214-                                   formset=formset,
215+                                   formset=formset, classes=classes or [],
216                                    extra=extra, can_delete=can_delete, can_order=can_order,
217                                    fields=fields, exclude=exclude, max_num=max_num)
218     FormSet.ct_field = ct_field
219@@ -394,7 +394,8 @@
220             "can_order": False,
221             "fields": fields,
222             "max_num": self.max_num,
223-            "exclude": exclude
224+            "exclude": exclude,
225+            "classes": classes,
226         }
227         return generic_inlineformset_factory(self.model, **defaults)
228