production-taskbar / backend / taskbar / admin.py
admin.py
Raw
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', ''))