from typing import Any from django.conf import settings from django.contrib import admin from django.core.exceptions import PermissionDenied from django.db.models import QuerySet from django.http import HttpRequest, HttpResponse, HttpResponseRedirect from django.urls import path from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _ from django.views.decorators.http import require_GET from simple_history.admin import SimpleHistoryAdmin from informing.models import OrganizationalUnit from .models import (ExclusiveProgram, Location, Program, Site, UtilitySoftware, Workplace, WorkplaceType) from .tasks import populate_workplaces @admin.register(Location) class LocationAdmin(SimpleHistoryAdmin): list_display = ( "name", "description", "ip_adresses", ) filter_horizontal = ( "default_sites", "default_utility_software", ) def get_form(self, request, obj=None, **kwargs): # type: ignore if request.user.is_superuser: return super(LocationAdmin, self).get_form(request, obj, **kwargs) else: raise PermissionDenied() def delete_queryset(self, request, queryset): # type: ignore if request.user.is_superuser: for obj in queryset: obj.delete() else: raise PermissionDenied() @admin.register(WorkplaceType) class WorkplaceTypeAdmin(SimpleHistoryAdmin): change_list_template = "admin/change_list_filter_confirm_sidebar.html" list_display = ( "name", "description", "location", "is_active", ) list_filter = ( "location", "is_active", ) filter_horizontal = ( "programs", "utility_software", "sites", ) search_fields = ['name', 'description', 'location__name'] list_select_related = ('location', ) def get_form(self, request, obj=None, **kwargs): # type: ignore if request.user.is_superuser: return super(WorkplaceTypeAdmin, self).get_form(request, obj, **kwargs) else: raise PermissionDenied() def delete_queryset(self, request, queryset): # type: ignore if request.user.is_superuser: for obj in queryset: obj.delete() else: raise PermissionDenied() @admin.register(Program) class ProgramAdmin(SimpleHistoryAdmin): list_display = ("name", "description", "is_active", "order") list_filter = ("is_active", ) search_fields = [ "name", "description", "executable_path", "window_process" ] def get_form(self, request, obj=None, **kwargs): # type: ignore if request.user.is_superuser: return super(ProgramAdmin, self).get_form(request, obj, **kwargs) else: raise PermissionDenied() def delete_queryset(self, request, queryset): # type: ignore if request.user.is_superuser: for obj in queryset: obj.delete() else: raise PermissionDenied() @admin.register(ExclusiveProgram) class ExclusiveProgramAdmin(SimpleHistoryAdmin): list_display = ("name", "description", "is_active", "order", "workplace", "location") list_filter = ("is_active", "location") search_fields = ["name", "description", "location__name"] list_select_related = ('location', 'workplace') list_per_page = getattr(settings, 'LIST_PER_PAGE') def workplace(self, program: ExclusiveProgram) -> Any: queryset = Workplace.objects.all() wp = queryset.select_related("ExclusiveProgram").get( exclusive_program=program) return wp def get_form(self, request, obj=None, **kwargs): # type: ignore if request.user.is_superuser: return super(ExclusiveProgramAdmin, self).get_form(request, obj, **kwargs) else: raise PermissionDenied() def delete_queryset(self, request, queryset): # type: ignore if request.user.is_superuser: for obj in queryset: obj.delete() else: raise PermissionDenied() @admin.register(UtilitySoftware) class UtilitySoftwareAdmin(SimpleHistoryAdmin): list_display = ("name", "description", "is_active", "order") list_filter = ("is_active", ) search_fields = ["name", "description", "executable_path"] def get_form(self, request, obj=None, **kwargs): # type: ignore if request.user.is_superuser: return super(UtilitySoftwareAdmin, self).get_form(request, obj, **kwargs) else: raise PermissionDenied() def delete_queryset(self, request, queryset): # type: ignore if request.user.is_superuser: for obj in queryset: obj.delete() else: raise PermissionDenied() @admin.register(Site) class SiteAdmin(SimpleHistoryAdmin): list_display = ("name", "description", "url", "is_active", "order") list_filter = ("is_active", ) search_fields = ["name", "description", "url"] def get_form(self, request, obj=None, **kwargs): # type: ignore if request.user.is_superuser: return super(SiteAdmin, self).get_form(request, obj, **kwargs) else: raise PermissionDenied() def delete_queryset(self, request, queryset): # type: ignore if request.user.is_superuser: for obj in queryset: obj.delete() else: raise PermissionDenied() class OUFilter(admin.SimpleListFilter): title = _('Organizational unit') parameter_name = 'ou' def lookups(self, request: HttpRequest, model_admin: Any) -> Any: queryset = OrganizationalUnit.objects.all() return ((ou.pk, str(ou)) for ou in queryset) def queryset(self, request: HttpRequest, queryset: QuerySet[Workplace]) -> Any: if self.value(): ou = OrganizationalUnit.objects.filter(pk=self.value()).first() if ou: ou_wp = ou.workplaces.all().values_list('pk', flat=True) result = queryset.filter(pk__in=ou_wp) return result return queryset @admin.register(Workplace) class WorkplaceAdmin(SimpleHistoryAdmin): change_list_template = "taskbar/workplace_changelist.html" autocomplete_fields = ['workplace_type', 'exclusive_program'] list_display = ( "hostname", "workplace_name", "workplace_system", "description", "workplace_type", "exclusive_program", "is_active", "last_seen", ) list_filter = ( "workplace_type", "workplace_system", "is_active", "workplace_type__location", "process", "sub_process", OUFilter, "last_seen", ) search_fields = [ "hostname", "workplace_name", ] filter_horizontal = ("sources", "sites", "process", "sub_process") readonly_fields = [ "last_seen", 'workplace_system', ] fieldsets = ( ('', { 'classes': ('extrapretty', 'wide'), 'fields': ( 'hostname', 'description', ( 'workplace_name', 'workplace_system', ), ( 'workplace_type', 'is_active', ), 'last_seen', ), }), ('', { 'classes': ( 'extrapretty', 'collapse', ), 'fields': ( 'exclusive_program', 'sites', 'sources', 'process', 'sub_process', ), }), ) list_select_related = ( 'exclusive_program', 'workplace_type__location', ) list_per_page = getattr(settings, 'LIST_PER_PAGE') def get_urls(self) -> Any: urls = super().get_urls() my_urls = [ path('populate_workplaces/', self.populate_workplaces), ] return my_urls + urls @method_decorator(require_GET) def populate_workplaces(self, request: HttpRequest) -> HttpResponse: populate_workplaces() return HttpResponseRedirect(request.META.get('HTTP_REFERER', ''))