66from django import forms
77from django .contrib import admin , messages
88from django .contrib .admin .views .main import ORDER_VAR
9- from django .contrib .contenttypes .admin import (
10- GenericStackedInline , GenericTabularInline
11- )
12- from django .contrib .contenttypes .forms import (
13- BaseGenericInlineFormSet ,
14- )
9+ from django .contrib .contenttypes .admin import GenericStackedInline , GenericTabularInline
10+ from django .contrib .contenttypes .forms import BaseGenericInlineFormSet
1511from django .contrib .contenttypes .models import ContentType
1612from django .core .exceptions import ImproperlyConfigured
1713from django .core .paginator import EmptyPage
@@ -48,8 +44,7 @@ def _get_default_ordering(model, model_admin):
4844 none , prefix , field_name = model ._meta .ordering [0 ].rpartition ('-' )
4945 except (AttributeError , IndexError ):
5046 raise ImproperlyConfigured (
51- f"Model { model .__module__ } .{ model .__name__ } requires a list or "
52- f"tuple 'ordering' in its Meta class"
47+ f"Model { model .__module__ } .{ model .__name__ } requires a list or tuple 'ordering' in its Meta class"
5348 )
5449 else :
5550 return prefix , field_name
@@ -94,26 +89,21 @@ def change_list_template(self):
9489 opts = self .model ._meta
9590 app_label = opts .app_label
9691 return [
97- os .path .join (
98- 'adminsortable2' , app_label , opts .model_name ,
99- 'change_list.html'
100- ),
92+ os .path .join ('adminsortable2' , app_label , opts .model_name , 'change_list.html' ),
10193 os .path .join ('adminsortable2' , app_label , 'change_list.html' ),
10294 'adminsortable2/change_list.html'
10395 ]
10496
10597 def __init__ (self , model , admin_site ):
106- self .default_order_direction , self .default_order_field = \
107- _get_default_ordering (model , self )
98+ self .default_order_direction , self .default_order_field = _get_default_ordering (model , self )
10899 super ().__init__ (model , admin_site )
109100 self .enable_sorting = False
110101 self .order_by = None
111102 if not isinstance (self .exclude , (list , tuple )):
112103 self .exclude = [self .default_order_field ]
113104 elif not self .exclude or self .default_order_field != self .exclude [0 ]:
114105 self .exclude = [self .default_order_field ] + list (self .exclude )
115- if isinstance (self .list_display_links , (list , tuple )) and \
116- len (self .list_display_links ) == 0 :
106+ if isinstance (self .list_display_links , (list , tuple )) and len (self .list_display_links ) == 0 :
117107 self .list_display_links = [self .list_display [0 ]]
118108 self ._add_reorder_method ()
119109 self .list_display = list (self .list_display )
@@ -135,8 +125,7 @@ def __init__(self, model, admin_site):
135125 ]
136126
137127 # Remove *all* occurrences of the field from `list_display_links`
138- if self .list_display_links and \
139- self .default_order_field in self .list_display_links :
128+ if self .list_display_links and self .default_order_field in self .list_display_links :
140129 self .list_display_links = [
141130 f for f in self .list_display_links if
142131 f != self .default_order_field
@@ -152,8 +141,7 @@ def __init__(self, model, admin_site):
152141 self .ordering = [f for f in self .ordering if f != rev_field ]
153142
154143 def _get_update_url_name (self ):
155- return f'{ self .model ._meta .app_label } _{ self .model ._meta .model_name } ' \
156- f'_sortable_update'
144+ return f'{ self .model ._meta .app_label } _{ self .model ._meta .model_name } _sortable_update'
157145
158146 def get_urls (self ):
159147 my_urls = [
@@ -167,35 +155,28 @@ def get_urls(self):
167155
168156 def get_actions (self , request ):
169157 actions = super ().get_actions (request )
170- paginator = self .get_paginator (
171- request , self .get_queryset (request ), self .list_per_page
172- )
173- if len (paginator .page_range ) > 1 and \
174- 'all' not in request .GET and self .enable_sorting :
158+ paginator = self .get_paginator (request , self .get_queryset (request ), self .list_per_page )
159+ if len (paginator .page_range ) > 1 and 'all' not in request .GET and self .enable_sorting :
175160 # add actions for moving items to other pages
176161 move_actions = ['move_to_exact_page' ]
177162 cur_page = int (request .GET .get ('p' , 0 )) + 1
178- if len (paginator .page_range ) > 2 and \
179- cur_page > paginator .page_range [1 ]:
163+ if len (paginator .page_range ) > 2 and cur_page > paginator .page_range [1 ]:
180164 move_actions .append ('move_to_first_page' )
181165 if cur_page > paginator .page_range [0 ]:
182166 move_actions .append ('move_to_back_page' )
183167 if cur_page < paginator .page_range [- 1 ]:
184168 move_actions .append ('move_to_forward_page' )
185- if len (paginator .page_range ) > 2 and \
186- cur_page < paginator .page_range [- 2 ]:
169+ if len (paginator .page_range ) > 2 and cur_page < paginator .page_range [- 2 ]:
187170 move_actions .append ('move_to_last_page' )
188171 for fname in move_actions :
189172 actions .update ({fname : self .get_action (fname )})
190173 return actions
191174
192175 def get_changelist (self , request , ** kwargs ):
193- first_order_direction , first_order_field_index = \
194- self ._get_first_ordering (request )
176+ first_order_direction , first_order_field_index = self ._get_first_ordering (request )
195177 if first_order_field_index == self .default_order_field_index :
196178 self .enable_sorting = True
197- self .order_by = \
198- f"{ first_order_direction } { self .default_order_field } "
179+ self .order_by = f"{ first_order_direction } { self .default_order_field } "
199180 else :
200181 self .enable_sorting = False
201182 return super ().get_changelist (request , ** kwargs )
@@ -246,9 +227,7 @@ def func(this, item):
246227 html = ''
247228 if this .enable_sorting :
248229 html = '<div class="drag js-reorder-{1}" order="{0}">' \
249- ' </div>' .format (
250- getattr (item , this .default_order_field ), item .pk
251- )
230+ ' </div>' .format (getattr (item , this .default_order_field ), item .pk )
252231 return mark_safe (html )
253232
254233 setattr (func , 'allow_tags' , True )
@@ -271,9 +250,7 @@ def update_order(self, request):
271250 if request .method != 'POST' :
272251 return HttpResponseNotAllowed ('Must be a POST request' )
273252 if not self .has_change_permission (request ):
274- return HttpResponseForbidden (
275- 'Missing permissions to perform this request'
276- )
253+ return HttpResponseForbidden ('Missing permissions to perform this request' )
277254 startorder = int (request .POST .get ('startorder' ))
278255 endorder = int (request .POST .get ('endorder' , 0 ))
279256 moved_items = list (self ._move_item (request , startorder , endorder ))
@@ -300,9 +277,7 @@ def move_to_back_page(self, request, queryset):
300277
301278 def move_to_forward_page (self , request , queryset ):
302279 self ._bulk_move (request , queryset , self .FORWARD )
303- move_to_forward_page .short_description = _ (
304- 'Move selected ... pages forward'
305- )
280+ move_to_forward_page .short_description = _ ('Move selected ... pages forward' )
306281
307282 def move_to_first_page (self , request , queryset ):
308283 self ._bulk_move (request , queryset , self .FIRST )
@@ -349,9 +324,8 @@ def move_item(self, startorder, endorder, extra_model_filters=None):
349324
350325 # noinspection PyProtectedMember
351326 raise model .MultipleObjectsReturned (
352- "Detected non-unique values in field '{rank_field}' used "
353- "for sorting this model.\n Consider to run \n "
354- " python manage.py reorder {model._meta.label}\n "
327+ "Detected non-unique values in field '{rank_field}' used for sorting this model.\n "
328+ "Consider to run \n python manage.py reorder {model._meta.label}\n "
355329 "to adjust this inconsistency."
356330 )
357331
@@ -426,8 +400,7 @@ def _bulk_move(self, request, queryset, method):
426400 raise Exception ('Invalid method' )
427401
428402 if target_page_number == current_page_number :
429- # If you want the selected items to be moved to the start
430- # of the current page, then just do not return here.
403+ # If you want the selected items to be moved to the start of the current page, then just do not return here
431404 return
432405
433406 try :
@@ -439,10 +412,7 @@ def _bulk_move(self, request, queryset, method):
439412 queryset_size = queryset .count ()
440413 page_size = page .end_index () - page .start_index () + 1
441414 if queryset_size > page_size :
442- msg = _ (
443- f"The target page size is { page_size } . "
444- f"It is too small for { queryset_size } items."
445- )
415+ msg = _ (f"The target page size is { page_size } . It is too small for { queryset_size } items." )
446416 self .message_user (request , msg , level = messages .ERROR )
447417 return
448418
@@ -481,10 +451,9 @@ def get_update_url(self, request):
481451
482452class PolymorphicSortableAdminMixin (SortableAdminMixin ):
483453 """
484- If the admin class is used for a polymorphic model, hence inherits from
485- ``PolymorphicParentModelAdmin`` rather than ``admin.ModelAdmin``, then
486- additionally inherit from ``PolymorphicSortableAdminMixin`` rather than
487- ``SortableAdminMixin``.
454+ If the admin class is used for a polymorphic model, hence inherits from ``PolymorphicParentModelAdmin``
455+ rather than ``admin.ModelAdmin``, then additionally inherit from ``PolymorphicSortableAdminMixin``
456+ rather than ``SortableAdminMixin``.
488457 """
489458 def get_max_order (self , request , obj = None ):
490459 return self .base_model .objects .aggregate (
@@ -494,19 +463,15 @@ def get_max_order(self, request, obj=None):
494463
495464class CustomInlineFormSetMixin :
496465 def __init__ (self , * args , ** kwargs ):
497- self .default_order_direction , self .default_order_field = \
498- _get_default_ordering (self .model , self )
466+ self .default_order_direction , self .default_order_field = _get_default_ordering (self .model , self )
499467
500468 if self .default_order_field not in self .form .base_fields :
501469 self .form .base_fields [self .default_order_field ] = \
502- self .model ._meta .get_field (
503- self .default_order_field
504- ).formfield ()
470+ self .model ._meta .get_field (self .default_order_field ).formfield ()
505471
506472 self .form .base_fields [self .default_order_field ].is_hidden = True
507473 self .form .base_fields [self .default_order_field ].required = False
508- self .form .base_fields [self .default_order_field ].widget = \
509- widgets .HiddenInput ()
474+ self .form .base_fields [self .default_order_field ].widget = widgets .HiddenInput ()
510475
511476 super ().__init__ (* args , ** kwargs )
512477
@@ -558,10 +523,8 @@ def get_fields(self, request, obj=None):
558523 fields .append (default_order_field )
559524 elif fields [0 ] == default_order_field :
560525 """
561- Remove the order field and add it again immediately to ensure it
562- is not on first position.
563- This ensures that django's template for tabular inline renders the
564- first column with colspan="2":
526+ Remove the order field and add it again immediately to ensure it is not on first position.
527+ This ensures that django's template for tabular inline renders the first column with colspan="2":
565528
566529 ```
567530 {% for field in inline_admin_formset.fields %}
@@ -606,13 +569,12 @@ def template(self):
606569 elif self .is_tabular :
607570 return 'adminsortable2/tabular.html'
608571 raise ImproperlyConfigured (
609- f'Class { self .__module__ } .{ self .__class__ } must also derive '
610- f'from admin.TabularInline or admin.StackedInline'
572+ f'Class { self .__module__ } .{ self .__class__ } must also derive from admin.TabularInline or '
573+ f'admin.StackedInline'
611574 )
612575
613576
614- class CustomGenericInlineFormSet (CustomInlineFormSetMixin ,
615- BaseGenericInlineFormSet ):
577+ class CustomGenericInlineFormSet (CustomInlineFormSetMixin , BaseGenericInlineFormSet ):
616578 def get_max_order (self ):
617579 query_set = self .model .objects .filter (
618580 ** {
0 commit comments