From aca81a1fc707fc685b81f48729f7d4627b2f4ac3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Sun, 17 May 2020 22:39:52 +0200
Subject: [PATCH] Introduce custom admin

This is the base for custom admin views (with admin design and permission checking)
Replace default admin site with custom admin site in AKModel
Use custom admin index template & apply first basic change
Introduce custom admin base template (including bootstrap loading)
Introduce Mixin for AdminViews
---
 AKModel/apps.py                       |  5 +++++
 AKModel/site.py                       | 22 ++++++++++++++++++++++
 AKModel/templates/admin/ak_index.html | 20 ++++++++++++++++++++
 AKModel/views.py                      |  8 ++++++++
 AKPlanning/settings.py                |  2 +-
 templates/admin_base.html             | 20 ++++++++++++++++++++
 6 files changed, 76 insertions(+), 1 deletion(-)
 create mode 100644 AKModel/site.py
 create mode 100644 AKModel/templates/admin/ak_index.html
 create mode 100644 templates/admin_base.html

diff --git a/AKModel/apps.py b/AKModel/apps.py
index c7d4c432..5af2af0d 100644
--- a/AKModel/apps.py
+++ b/AKModel/apps.py
@@ -1,5 +1,10 @@
 from django.apps import AppConfig
+from django.contrib.admin.apps import AdminConfig
 
 
 class AkmodelConfig(AppConfig):
     name = 'AKModel'
+
+
+class AKAdminConfig(AdminConfig):
+    default_site = 'AKModel.site.AKAdminSite'
diff --git a/AKModel/site.py b/AKModel/site.py
new file mode 100644
index 00000000..56affff9
--- /dev/null
+++ b/AKModel/site.py
@@ -0,0 +1,22 @@
+from django.contrib.admin import AdminSite
+
+from AKModel.models import Event
+
+
+class AKAdminSite(AdminSite):
+    index_template = "admin/ak_index.html"
+
+    def get_urls(self):
+        from django.urls import path
+
+        urls = super().get_urls()
+        urls += [
+            # path('...', self.admin_view(...)),
+        ]
+        return urls
+
+    def index(self, request, extra_context=None):
+        if extra_context is None:
+            extra_context = {}
+        extra_context["active_events"] = Event.objects.filter(active=True)
+        return super().index(request, extra_context)
diff --git a/AKModel/templates/admin/ak_index.html b/AKModel/templates/admin/ak_index.html
new file mode 100644
index 00000000..535ba388
--- /dev/null
+++ b/AKModel/templates/admin/ak_index.html
@@ -0,0 +1,20 @@
+{% extends "admin/index.html" %}
+
+{% load i18n tz %}
+
+{% block content %}
+    <div style="margin-bottom: 20px;">
+        <h2>{% trans "Active Events" %}:</h2>
+
+        <ul>
+            {% for event in active_events %}
+                <li>
+                    {{ event }}
+                    ({{ event.start|timezone:event.timezone|date:"d.m.y"}} -
+                    {{ event.end|timezone:event.timezone|date:"d.m.y"}})
+                </li>
+           {% endfor %}
+        </ul>
+    </div>
+{{ block.super }}
+{% endblock %}
diff --git a/AKModel/views.py b/AKModel/views.py
index 1d6b95eb..645797f3 100644
--- a/AKModel/views.py
+++ b/AKModel/views.py
@@ -1,3 +1,4 @@
+from django.contrib import admin
 from django.shortcuts import get_object_or_404
 from django.views.generic import TemplateView
 from rest_framework import viewsets, permissions, mixins
@@ -50,6 +51,13 @@ class FilterByEventSlugMixin(EventSlugMixin):
         return super().get_queryset().filter(event=self.event)
 
 
+class AdminViewMixin:
+    def get_context_data(self, **kwargs):
+        extra = admin.site.each_context(self.request)
+        extra.update(super().get_context_data(**kwargs))
+        return extra
+
+
 class AKOwnerViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
     permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,)
     serializer_class = AKOwnerSerializer
diff --git a/AKPlanning/settings.py b/AKPlanning/settings.py
index 83d1340a..f1421794 100644
--- a/AKPlanning/settings.py
+++ b/AKPlanning/settings.py
@@ -37,7 +37,7 @@ INSTALLED_APPS = [
     'AKSubmission.apps.AksubmissionConfig',
     'AKScheduling.apps.AkschedulingConfig',
     'AKPlan.apps.AkplanConfig',
-    'django.contrib.admin',
+    'AKModel.apps.AKAdminConfig',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
diff --git a/templates/admin_base.html b/templates/admin_base.html
new file mode 100644
index 00000000..cecf50f3
--- /dev/null
+++ b/templates/admin_base.html
@@ -0,0 +1,20 @@
+{% extends "admin/base_site.html" %}
+
+{% load bootstrap4 %}
+{% load fontawesome_5 %}
+
+{% block extrahead %}
+    {% bootstrap_css %}
+    {% bootstrap_javascript jquery='slim' %}
+    {% fontawesome_5_static %}
+
+    <style>
+        a.btn {
+            color: #FFFFFF;
+        }
+
+        .block-header {
+            margin-top: 20px;
+        }
+    </style>
+{% endblock %}
-- 
GitLab