Skip to content

Commit

Permalink
Add support for django 1.10 inline classes (collapsing) fixes #32, #52
Browse files Browse the repository at this point in the history
  • Loading branch information
fdintino committed Sep 13, 2016
1 parent 0e439e5 commit d0613ab
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 8 deletions.
2 changes: 1 addition & 1 deletion nested_admin/static/nested_admin/dist/nested_admin.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion nested_admin/static/nested_admin/dist/nested_admin.js.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion nested_admin/static/nested_admin/dist/nested_admin.min.js

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ export function updatePositions(prefix, skipDeleted) {
}

export function createSortable($group) {
return $group.find('> .djn-items, > .tabular > .module > .djn-items').nestedSortable({
return $group.find('> .djn-items, > .djn-fieldset > .djn-items, > .tabular > .module > .djn-items').nestedSortable({
handle: [
'> h3.djn-drag-handler',
'> .djn-tools .drag-handler',
Expand Down
5 changes: 4 additions & 1 deletion nested_admin/templates/nesting/admin/inlines/stacked.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
data-inline-type="stacked"
data-inline-formset="{{ inline_admin_formset.inline_formset_data }}"
data-inline-model="{{ inline_admin_formset.inline_model_id }}">

{% ifinlineclasses %}<fieldset class="djn-fieldset module {{ inline_admin_formset.classes }}">{% endifinlineclasses %}
<h2>
{% if inline_admin_formset.opts.title %}{{ inline_admin_formset.opts.title }}{% else %}{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}{% endif %}
</h2>
Expand All @@ -22,7 +24,7 @@ <h2>
<div class="djn-item djn-no-drag"><div></div></div>
{% endif %}
{{ inline_admin_form.management_form }}
<div class="{% if not forloop.last %}djn-item{% endif %} djn-module djn-inline-form {% if inline_admin_formset.opts.classes %} {{ inline_admin_formset.opts.classes|join:" " }}{% endif %}{% if inline_admin_form.original or inline_admin_form.show_url %} has_original{% endif %}{% if forloop.last %} djn-empty-form empty-form{% endif %} inline-related"
<div class="{% if not forloop.last %}djn-item{% endif %} djn-module djn-inline-form{% if inline_admin_form.original or inline_admin_form.show_url %} has_original{% endif %}{% if forloop.last %} djn-empty-form empty-form{% endif %} inline-related"
{% if inline_admin_form.pk_field.field %}
data-is-initial="{% if inline_admin_form.pk_field.field.value %}true{% else %}false{% endif %}"
{% endif %}
Expand Down Expand Up @@ -71,6 +73,7 @@ <h3 class="{% if not inline_opts.sortable_options or not inline_opts.sortable_op
{% blocktrans with inline_admin_formset.opts.verbose_name|strip_parent_name:inline_opts.verbose_name|title as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}
</a>
</div>
{% ifinlineclasses %}</fieldset>{% endifinlineclasses %}
</div>
{% endwith %}{# ends with inline_admin_formset.opts as inline_opts #}

Expand Down
2 changes: 1 addition & 1 deletion nested_admin/templates/nesting/admin/inlines/tabular.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
data-inline-formset="{{ inline_admin_formset.inline_formset_data }}"
data-inline-model="{{ inline_admin_formset.inline_model_id }}">
<div class="tabular inline-related">
<fieldset class="module">
<fieldset class="module {{ inline_admin_formset.classes }}">

<h2>
{% if inline_admin_formset.opts.title %}{{ inline_admin_formset.opts.title }}{% else %}{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}{% endif %}
Expand Down
13 changes: 13 additions & 0 deletions nested_admin/templatetags/nested_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from django import template
from django.apps import apps
from django.conf import settings
from django.contrib.admin.options import InlineModelAdmin
from django.utils.safestring import mark_for_escaping, mark_safe
from django.utils.html import escape

Expand Down Expand Up @@ -174,6 +175,18 @@ def ifdj110(parser, token):
return IfConditionNode(nodelist_true, nodelist_false, django.VERSION[:2] == (1, 10))


@register.tag
def ifinlineclasses(parser, token):
nodelist_true = parser.parse(('else', 'endifinlineclasses'))
token = parser.next_token()
if token.contents == 'else':
nodelist_false = parser.parse(('endifinlineclasses',))
parser.delete_first_token()
else:
nodelist_false = template.NodeList()
return IfConditionNode(nodelist_true, nodelist_false, hasattr(InlineModelAdmin, 'classes'))


@register.tag
def ifnotdj110(parser, token):
nodelist_true = parser.parse(('else', 'endifnotdj110'))
Expand Down
59 changes: 58 additions & 1 deletion nested_admin/tests/admin_widgets/tests.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
from contextlib import contextmanager
import time
from unittest import expectedFailure
from unittest import expectedFailure, SkipTest

import django
from django.conf import settings
from django.utils import six
from django.utils.text import slugify, unescape_entities

Expand All @@ -10,6 +13,36 @@
from .models import (
TestAdminWidgetsRoot, TestAdminWidgetsA, TestAdminWidgetsB,
TestAdminWidgetsC0, TestAdminWidgetsC1)
from .admin import (
TestAdminWidgetsAInline, TestAdminWidgetsBInline,
TestAdminWidgetsC0Inline, TestAdminWidgetsC1Inline)


admin_classes = [
TestAdminWidgetsAInline, TestAdminWidgetsBInline,
TestAdminWidgetsC0Inline, TestAdminWidgetsC1Inline,
]


@contextmanager
def enable_inline_collapsing():
"""A context manager that configures the inline classes to be collapsible."""
if 'grappelli' in settings.INSTALLED_APPS:
class_attr = "inline_classes"
class_val = ("collapse", "closed", "grp-collapse", "grp-closed")
reset_val = ("collapse", "open", "grp-collapse", "grp-open")
else:
class_attr = "classes"
class_val = ("collapse", )
reset_val = None

for admin in admin_classes:
setattr(admin, class_attr, class_val)
try:
yield
finally:
for admin in admin_classes:
setattr(admin, class_attr, reset_val)


class TestAdminWidgets(BaseNestedAdminTestCase):
Expand Down Expand Up @@ -99,6 +132,30 @@ def check_fk(self, indexes):
'return $("#%s").find("option:selected").html()' % field_id)
self.assertEqual(unescape_entities(current_val), name)

def test_collapsible_inlines(self):
if not self.has_grappelli and django.VERSION < (1, 10):
raise SkipTest("Collapsible inlines not supported")

with enable_inline_collapsing():
self.load_admin()
name_field = self.get_field('name', [0])

self.assertFalse(name_field.is_displayed(), "Inline did not load collapsed")

if self.has_grappelli:
collapse_handler = self.selenium.execute_script(
'return $(arguments[0]).find("> .djn-collapse-handler")[0]',
self.get_item([0]))
else:
collapse_handler = self.selenium.execute_script(
'return $(arguments[0]).find("> fieldset > h2 > .collapse-toggle")[0]',
self.get_group())

collapse_handler.click()
self.assertTrue(name_field.is_displayed(), "Inline did not expand")
collapse_handler.click()
self.assertFalse(name_field.is_displayed(), "Inline did not collapse")

def test_initial_extra_prepopulated(self):
self.load_admin()
self.check_prepopulated([0])
Expand Down

0 comments on commit d0613ab

Please sign in to comment.