|
4 | 4 | ) |
5 | 5 | from django.utils.safestring import mark_safe |
6 | 6 | from django.utils.html import format_html |
| 7 | +from django.utils.translation import gettext_lazy as _ |
7 | 8 | from django.template import Library |
8 | 9 | from django.template.loader import get_template |
| 10 | +from django.contrib.admin.templatetags.admin_list import ( |
| 11 | + result_headers, result_hidden_fields) |
9 | 12 | import urllib.parse |
10 | 13 |
|
| 14 | +from treebeard.templatetags import needs_checkboxes |
| 15 | +from treebeard.templatetags.admin_tree import check_empty_dict, get_parent_id, \ |
| 16 | + items_for_result |
| 17 | + |
11 | 18 | register = Library() |
12 | 19 |
|
13 | 20 | DOT = '.' |
@@ -97,3 +104,77 @@ def adminlte_admin_list_filter(cl, spec): |
97 | 104 | 'choices': choices, |
98 | 105 | 'spec': spec, |
99 | 106 | }) |
| 107 | + |
| 108 | + |
| 109 | +def results(cl): |
| 110 | + """ |
| 111 | + reorder by priority_level |
| 112 | + :param cl: |
| 113 | + :return: |
| 114 | + """ |
| 115 | + if cl.formset: |
| 116 | + new_result_list = [] |
| 117 | + new_forms = [] |
| 118 | + parent_nodes = cl.result_list.filter(depth=1).order_by( |
| 119 | + '-priority_level') |
| 120 | + for parent_node in parent_nodes: |
| 121 | + new_result_list.append(parent_node) |
| 122 | + |
| 123 | + child_nodes = parent_node.get_children().order_by('-priority_level') |
| 124 | + for child_node in child_nodes: |
| 125 | + new_result_list.append(child_node) |
| 126 | + |
| 127 | + order_ = [] |
| 128 | + for i, obj in enumerate(new_result_list): |
| 129 | + for j, obj_new in enumerate(cl.result_list): |
| 130 | + if obj_new == obj: |
| 131 | + order_.append(j) |
| 132 | + |
| 133 | + for o in order_: |
| 134 | + new_forms.append(cl.formset.forms[o]) |
| 135 | + |
| 136 | + for res, form in zip(new_result_list, new_forms): |
| 137 | + yield (res.pk, get_parent_id(res), res.get_depth(), |
| 138 | + res.get_children_count(), |
| 139 | + list(items_for_result(cl, res, form))) |
| 140 | + else: |
| 141 | + new_result_list = [] |
| 142 | + parent_nodes = cl.result_list.filter(depth=1).order_by( |
| 143 | + '-priority_level') |
| 144 | + for parent_node in parent_nodes: |
| 145 | + new_result_list.append(parent_node) |
| 146 | + |
| 147 | + child_nodes = parent_node.get_children().order_by('-priority_level') |
| 148 | + for child_node in child_nodes: |
| 149 | + new_result_list.append(child_node) |
| 150 | + |
| 151 | + for res in new_result_list: |
| 152 | + yield (res.pk, get_parent_id(res), res.get_depth(), |
| 153 | + res.get_children_count(), |
| 154 | + list(items_for_result(cl, res, None))) |
| 155 | + |
| 156 | + |
| 157 | +@register.inclusion_tag( |
| 158 | + 'admin/tree_change_list_results.html', takes_context=True) |
| 159 | +def adminlte_result_tree(context, cl, request): |
| 160 | + """ |
| 161 | + Added 'filtered' param, so the template's js knows whether the results have |
| 162 | + been affected by a GET param or not. Only when the results are not filtered |
| 163 | + you can drag and sort the tree |
| 164 | + """ |
| 165 | + |
| 166 | + # Here I'm adding an extra col on pos 2 for the drag handlers |
| 167 | + headers = list(result_headers(cl)) |
| 168 | + headers.insert(1 if needs_checkboxes(context) else 0, { |
| 169 | + 'text': '+', |
| 170 | + 'sortable': True, |
| 171 | + 'url': request.path, |
| 172 | + 'tooltip': _('Return to ordered tree'), |
| 173 | + 'class_attrib': mark_safe(' class="oder-grabber"') |
| 174 | + }) |
| 175 | + return { |
| 176 | + 'filtered': not check_empty_dict(request.GET), |
| 177 | + 'result_hidden_fields': list(result_hidden_fields(cl)), |
| 178 | + 'result_headers': headers, |
| 179 | + 'results': list(results(cl)), |
| 180 | + } |
0 commit comments