PyInventory/inventory/admin/base.py

105 wiersze
3.1 KiB
Python

from adminsortable2.admin import SortableInlineAdminMixin
from django.contrib import admin
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
from reversion_compare.admin import CompareVersionAdmin
from inventory.forms import OnlyUserRelationsModelForm
class UserInlineMixin:
def get_queryset(self, request):
qs = super().get_queryset(request)
if not request.user.is_superuser:
# Display only own created entries
qs = qs.filter(user=request.user)
return qs
class BaseUserAdmin(CompareVersionAdmin):
form = OnlyUserRelationsModelForm
def get_changelist(self, request, **kwargs):
self.request = request
self.user = request.user
return super().get_changelist(request, **kwargs)
def save_model(self, request, obj, form, change):
if obj.user_id is None:
obj.user = request.user
super().save_model(request, obj, form, change)
def get_queryset(self, request):
qs = super().get_queryset(request)
qs = qs.select_related(
'user',
)
if not request.user.is_superuser:
# Display only own created entries
qs = qs.filter(user=request.user)
return qs
def get_list_filter(self, request):
list_filter = self.list_filter
if request.user.is_superuser:
# Superuser sees entries from all users -> Add "By user" filter
list_filter = list(list_filter)
list_filter.insert(0, 'user')
return list_filter
def get_list_display(self, request):
list_display = self.list_display
if request.user.is_superuser:
# Superuser sees entries from all users -> Display the user in change list
list_display = list(list_display)
list_display.insert(0, 'user')
return list_display
class BaseImageModelInline(UserInlineMixin, SortableInlineAdminMixin, admin.TabularInline):
def preview(self, instance):
return format_html(
(
'<a href="{url}" title="{name}"'
' target="_blank" class="image_file_input_preview">'
'<img style="width:9em;" src="{url}"></a>'
),
url=instance.image.url,
name=instance.name,
)
extra = 0
fields = ('position', 'preview', 'image', 'name', 'tags')
readonly_fields = ('preview',)
class BaseFileModelInline(UserInlineMixin, SortableInlineAdminMixin, admin.TabularInline):
extra = 0
fields = ('position', 'file', 'name', 'tags')
class LimitTreeDepthListFilter(admin.SimpleListFilter):
title = _('Limit tree depth')
parameter_name = 'level'
def lookups(self, request, model_admin):
return (
('1', _('Only root')),
('2', _('Root + first sub')),
('3', _('Root + first + second sub')),
)
def queryset(self, request, queryset):
level = self.value()
if level:
level = int(level)
return queryset.filter(level__lte=level)