From 4302dec2e08a42c2de1d1fa85b9b61060b1c6125 Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Tue, 20 Aug 2019 19:08:07 +0200
Subject: [PATCH] Implement bootstrap colour theming from settings. Closes:
 #22.

Co-authored-by: mirabilos <thorsten.glaser@teckids.org>
---
 biscuit/core/settings.py                   | 23 ++++++++++++++++++++++
 biscuit/core/static/bootstrap_colours.scss | 12 +++++++++++
 biscuit/core/templates/core/base.html      |  3 ++-
 biscuit/core/util/sass_helpers.py          |  8 ++++++++
 local.cfg                                  |  9 +++++++++
 pyproject.toml                             |  3 +++
 6 files changed, 57 insertions(+), 1 deletion(-)
 create mode 100644 biscuit/core/static/bootstrap_colours.scss
 create mode 100644 biscuit/core/util/sass_helpers.py

diff --git a/biscuit/core/settings.py b/biscuit/core/settings.py
index 289d3dcd0..34e10eab0 100644
--- a/biscuit/core/settings.py
+++ b/biscuit/core/settings.py
@@ -26,6 +26,7 @@ INSTALLED_APPS = [
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'django_global_request',
+    'sass_processor',
     'easyaudit',
     'bootstrap4',
     'fa',
@@ -38,6 +39,20 @@ INSTALLED_APPS = [
 
 INSTALLED_APPS += get_app_packages()
 
+STATICFILES_FINDERS = [
+    'django.contrib.staticfiles.finders.FileSystemFinder',
+    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
+    'sass_processor.finders.CssFinder'
+]
+
+SASS_PROCESSOR_AUTO_INCLUDE = False 
+SASS_PROCESSOR_CUSTOM_FUNCTIONS = {
+    'get-colour': 'biscuit.core.util.sass_helpers.get_colour',
+}
+SASS_PROCESSOR_INCLUDE_DIRS = [
+    LocalSetting(default='/usr/share/sass/bootstrap')
+]
+
 MIDDLEWARE = [
     'django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
@@ -150,6 +165,14 @@ ANY_JS = {
     }
 }
 
+COLOUR_PRIMARY = LocalSetting(default='#007bff')
+COLOUR_SECONDARY = LocalSetting(default='#6c757d')
+COLOUR_SUCCESS = LocalSetting(default='#28a745')
+COLOUR_INFO = LocalSetting(default='#17a2b8')
+COLOUR_WARNING = LocalSetting(default='#ffc107')
+COLOUR_DANGER = LocalSetting(default='#dc3545')
+COLOUR_LIGHT = LocalSetting(default='#f8f9fa')
+COLOUR_DARK = LocalSetting(default='#343a40')
 
 _settings = load_and_check_settings(globals())
 globals().update(_settings)
diff --git a/biscuit/core/static/bootstrap_colours.scss b/biscuit/core/static/bootstrap_colours.scss
new file mode 100644
index 000000000..faa508a70
--- /dev/null
+++ b/biscuit/core/static/bootstrap_colours.scss
@@ -0,0 +1,12 @@
+$theme-colors: (
+    "primary":    get-colour(get-setting(COLOUR_PRIMARY)),
+    "secondary":  get-colour(get-setting(COLOUR_SECONDARY)),
+    "success":    get-colour(get-setting(COLOUR_SUCCESS)),
+    "info":       get-colour(get-setting(COLOUR_INFO)),
+    "warning":    get-colour(get-setting(COLOUR_WARNING)),
+    "danger":     get-colour(get-setting(COLOUR_DANGER)),
+    "light":      get-colour(get-setting(COLOUR_LIGHT)),
+    "dark":       get-colour(get-setting(COLOUR_DARK)),
+);
+
+@import "bootstrap";
diff --git a/biscuit/core/templates/core/base.html b/biscuit/core/templates/core/base.html
index 09124833c..17db1f12e 100644
--- a/biscuit/core/templates/core/base.html
+++ b/biscuit/core/templates/core/base.html
@@ -1,12 +1,13 @@
 {# -*- engine:django -*- #}
 {% extends "bootstrap4/bootstrap4.html" %}
-{% load bootstrap4 menu_generator staticfiles font_awesome any_js %}
+{% load bootstrap4 menu_generator staticfiles font_awesome any_js sass_tags %}
 
 {% block bootstrap4_title %}BiscuIT School Information System{% endblock %}
 
 {% block bootstrap4_extra_head %}
  {% fa_css %}
  {% include_css "DataTables-Bootstrap4" %}
+ <link rel="stylesheet" href="{% sass_src 'bootstrap_colours.scss' %}" />
  <link rel="stylesheet" href="{% static 'css/style.css' %}" />
  <link rel="shortcut icon" href="#" />
 {% endblock %}
diff --git a/biscuit/core/util/sass_helpers.py b/biscuit/core/util/sass_helpers.py
new file mode 100644
index 000000000..ed864d07f
--- /dev/null
+++ b/biscuit/core/util/sass_helpers.py
@@ -0,0 +1,8 @@
+from colour import web2hex
+from sass import SassColor
+
+def get_colour(html_colour):
+    rgb = web2hex(html_colour, force_long=True)[1:]
+    r, g, b = int(rgb[0:2], 16), int(rgb[2:4], 16), int(rgb[4:6], 16)
+
+    return SassColor(r, g, b, 255)
diff --git a/local.cfg b/local.cfg
index 842f1e4a1..d0c6ff53f 100644
--- a/local.cfg
+++ b/local.cfg
@@ -16,3 +16,12 @@ BOOTSTRAP4.popper_url = "/javascript/popper.js/umd/popper.min.js"
 ANY_JS.DataTables-Bootstrap4.css_url = "/javascript/jquery-datatables/css/dataTables.bootstrap4.min.css"
 ANY_JS.DataTables-Bootstrap4.js_url = "/javascript/jquery-datatables/dataTables.bootstrap4.min.js"
 ANY_JS.DataTables.js_url = "/javascript/jquery-datatables/jquery.dataTables.js"
+COLOUR_PRIMARY = "#007bff"
+COLOUR_SECONDARY = "#6c757d"
+COLOUR_SUCCESS = "#28a745"
+COLOUR_INFO = "#17a2b8"
+COLOUR_WARNING = "#ffc107"
+COLOUR_DANGER = "#dc3545"
+COLOUR_LIGHT = "#f8f9fa"
+COLOUR_DARK = "#343a40"
+SASS_PROCESSOR_INCLUDE_DIRS.0 = "/usr/share/sass/bootstrap"
diff --git a/pyproject.toml b/pyproject.toml
index 9205ca115..5d2e5d2ac 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -31,6 +31,9 @@ django-tables2 = "^2.1"
 Pillow = "^6.1"
 django-phonenumber-field = {version = "^3.0", extras = ["phonenumbers"]}
 django-local-settings = {version = "^1.0-alpha.1", allows-prereleases = true}
+django-sass-processor = "^0.7.3"
+libsass = "^0.19.2"
+colour = "^0.1.5"
 
 [tool.poetry.dev-dependencies]
 sphinx = "^2.1"
-- 
GitLab