1
0
Fork 0
django-changelist-inline/django_changelist_inline/admin.py

150 lines
4.4 KiB
Python

# -*- coding: utf-8 -*-
# django-changelist-inline v1.0.2 | (c) 2021-present Tomek Wójcik | MIT License
import copy
from django.contrib import admin
from django.contrib.admin.options import InlineModelAdmin
from django.contrib.admin.views.main import ChangeList
from django.http import QueryDict
from django.urls import reverse
class InlineChangeList(ChangeList):
def __init__(self, request, *args, **kwargs):
super().__init__(request, *args, **kwargs)
self.formset = None
self.add_url = self.model_admin.get_add_url(request)
self.show_all_url = self.model_admin.get_show_all_url(request)
self.toolbar_links = self.model_admin.get_toolbar_links(request)
@property
def has_toolbar(self):
return any([
self.add_url is not None,
self.show_all_url is not None,
self.toolbar_links is not None,
])
class ChangelistInlineModelAdmin(admin.ModelAdmin):
def __init__(self, parent_instance, *args, **kwargs):
super().__init__(*args, **kwargs)
self.parent_instance = parent_instance
self.list_editable = ()
self.list_filter = ()
self.search_fields = ()
self.date_hierarchy = None
self.sortable_by = ()
self.show_full_result_count = False
if hasattr(self, 'search_help_text') is True:
self.search_help_text = None
def get_actions(self, request):
return []
def get_changelist(self, request, **kwargs):
return InlineChangeList
@property
def title(self):
return self.model._meta.verbose_name_plural
@property
def no_results_message(self):
return f'0 {self.model._meta.verbose_name_plural}'
def get_add_url(self, request):
if self.has_add_permission(request):
return reverse('admin:{app_label}_{model_name}_add'.format(
app_label=self.model._meta.app_label,
model_name=self.model._meta.model_name,
))
return None
def get_show_all_url(self, request):
if self.has_view_permission(request, obj=None):
return reverse('admin:{app_label}_{model_name}_changelist'.format(
app_label=self.model._meta.app_label,
model_name=self.model._meta.model_name,
))
return None
def get_toolbar_links(self, request):
return None
class ChangelistInline(InlineModelAdmin):
template = 'django_changelist_inline/changelist_inline.html'
class Media:
css = {
'all': [
'admin/css/changelists.css',
'django_changelist_inline/css/changelist_inline.css',
],
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.request = None
self.changelist_model_admin = None
def has_add_permission(self, request, obj=None):
return False
def has_change_permission(self, request, obj=None):
return False
def has_delete_permission(self, request, obj=None):
return False
def bind(self, request, parent_instance):
internal_request = copy.copy(request)
internal_request.GET = QueryDict(mutable=False)
internal_request.POST = QueryDict(mutable=False)
self.request = internal_request
self.changelist_model_admin = self.ChangelistModelAdmin(
parent_instance,
self.model,
self.admin_site,
)
@property
def changelist(self):
can_view = self.changelist_model_admin.has_view_or_change_permission(
self.request, obj=None,
)
if not can_view:
return None
result = self.changelist_model_admin.get_changelist_instance(
self.request,
)
return result
class ChangelistInlineAdminMixin:
def get_inline_instances(self, request, obj=None):
inline_instances = super().get_inline_instances(request, obj=obj)
if obj is None:
return [
inline_instance for inline_instance in inline_instances
if not isinstance(inline_instance, ChangelistInline)
]
else:
for inline_instance in inline_instances:
if isinstance(inline_instance, ChangelistInline):
inline_instance.bind(request, obj)
return inline_instances
class ChangelistInlineAdmin(ChangelistInlineAdminMixin, admin.ModelAdmin):
pass