diff --git a/compose/production/django/start b/compose/production/django/start
index 80e9786..297e610 100644
--- a/compose/production/django/start
+++ b/compose/production/django/start
@@ -5,6 +5,6 @@ set -o pipefail
set -o nounset
-python /app/manage.py compress
python /app/manage.py collectstatic --noinput
+python /app/manage.py compress
/usr/local/bin/gunicorn config.wsgi --bind 0.0.0.0:5000 --chdir=/app
diff --git a/config/settings/base.py b/config/settings/base.py
index a7d9a5f..9edcc14 100644
--- a/config/settings/base.py
+++ b/config/settings/base.py
@@ -142,6 +142,8 @@ STATIC_ROOT = str(ROOT_DIR("staticfiles"))
STATIC_URL = "/static/"
# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS
STATICFILES_DIRS = [str(APPS_DIR.path("static"))]
+STATICFILES_STORAGE = 'schickmacher.storage.WhiteNoiseStaticFilesStorage'
+
# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders
STATICFILES_FINDERS = [
"django.contrib.staticfiles.finders.FileSystemFinder",
diff --git a/schickmacher/renderer/templatetags/__init__.py b/schickmacher/renderer/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/schickmacher/renderer/templatetags/extra_filters.py b/schickmacher/renderer/templatetags/extra_filters.py
new file mode 100644
index 0000000..b05ae2e
--- /dev/null
+++ b/schickmacher/renderer/templatetags/extra_filters.py
@@ -0,0 +1,8 @@
+from django import template
+import re
+
+register = template.Library()
+
+@register.filter
+def escape_css_content(value):
+ return re.sub(r'''['"\n\\]''', lambda m: '\{:06X}'.format(ord(m.group())), value)
diff --git a/schickmacher/renderer/tests/test_extra_filters.py b/schickmacher/renderer/tests/test_extra_filters.py
new file mode 100644
index 0000000..6c4925d
--- /dev/null
+++ b/schickmacher/renderer/tests/test_extra_filters.py
@@ -0,0 +1,12 @@
+from schickmacher.renderer.templatetags.extra_filters import escape_css_content
+
+# we use the padded 6 digit css escape sequences
+# https://www.w3.org/International/questions/qa-escapes
+def test_css_content():
+ assert escape_css_content("head\"tail") == "head\\000022tail"
+ assert escape_css_content("head\'tail") == "head\\000027tail"
+ assert escape_css_content("head\\tail") == "head\\00005Ctail"
+ assert escape_css_content("head\ntail") == "head\\00000Atail"
+ assert escape_css_content("\"\"") == "\\000022\\000022"
+ assert escape_css_content("\\\\") == "\\00005C\\00005C"
+ assert escape_css_content("ABCD1234
") == "ABCD1234"
diff --git a/schickmacher/static/images/banner.jpg b/schickmacher/static/images/banner.jpg
index 8d7aab8..a81a37e 100644
Binary files a/schickmacher/static/images/banner.jpg and b/schickmacher/static/images/banner.jpg differ
diff --git a/schickmacher/static/images/banner.svg b/schickmacher/static/images/banner.svg
deleted file mode 100644
index d5d62ef..0000000
--- a/schickmacher/static/images/banner.svg
+++ /dev/null
@@ -1,700 +0,0 @@
-
-
-
diff --git a/schickmacher/static/images/favicons/favicon.ico b/schickmacher/static/images/favicons/favicon.ico
index a40e91d..33f5cbc 100644
Binary files a/schickmacher/static/images/favicons/favicon.ico and b/schickmacher/static/images/favicons/favicon.ico differ
diff --git a/schickmacher/static/images/logo.png b/schickmacher/static/images/logo.png
deleted file mode 100644
index 1c1086a..0000000
Binary files a/schickmacher/static/images/logo.png and /dev/null differ
diff --git a/schickmacher/static/images/qabel-kl.png b/schickmacher/static/images/qabel-kl.png
deleted file mode 100644
index 5164222..0000000
Binary files a/schickmacher/static/images/qabel-kl.png and /dev/null differ
diff --git a/schickmacher/static/sass/colors.scss b/schickmacher/static/sass/colors.scss
index 3631571..191c1d6 100644
--- a/schickmacher/static/sass/colors.scss
+++ b/schickmacher/static/sass/colors.scss
@@ -1,2 +1,2 @@
-$orange: rgb(255, 105, 15);
+$orange: rgb(74, 60, 255);
diff --git a/schickmacher/static/sass/project.scss b/schickmacher/static/sass/project.scss
index bf4ec76..787c6a5 100644
--- a/schickmacher/static/sass/project.scss
+++ b/schickmacher/static/sass/project.scss
@@ -3,7 +3,7 @@
// project specific CSS goes here
////////////////////////////////
- //Variables//
+//Variables//
////////////////////////////////
// Alert colors
@@ -16,7 +16,7 @@ $dark-pink: #eed3d7;
$red: #b94a48;
////////////////////////////////
- //Alerts//
+//Alerts//
////////////////////////////////
// bootstrap alert CSS, translated to the django-standard levels of
@@ -34,6 +34,16 @@ $red: #b94a48;
color: $red;
}
+.markdownx {
+ display: flex;
+ column-gap: 2.5em;
+}
+
+.markdownx-editor {
+ width: 50%;
+}
+
.markdownx-preview {
+ width: 50%;
@import 'render';
}
diff --git a/schickmacher/static/sass/render.scss b/schickmacher/static/sass/render.scss
index 193da10..d4babcd 100644
--- a/schickmacher/static/sass/render.scss
+++ b/schickmacher/static/sass/render.scss
@@ -12,7 +12,7 @@
}
@bottom-center {
- content: 'qabel.de';
+ content: '';
font-weight: bold;
color: $orange;
}
diff --git a/schickmacher/storage.py b/schickmacher/storage.py
new file mode 100644
index 0000000..a89f6e9
--- /dev/null
+++ b/schickmacher/storage.py
@@ -0,0 +1,5 @@
+from whitenoise.storage import CompressedManifestStaticFilesStorage
+
+
+class WhiteNoiseStaticFilesStorage(CompressedManifestStaticFilesStorage):
+ manifest_strict = False
\ No newline at end of file
diff --git a/schickmacher/templates/renderer/render_form.html b/schickmacher/templates/renderer/render_form.html
index f0db677..cb7e8b0 100644
--- a/schickmacher/templates/renderer/render_form.html
+++ b/schickmacher/templates/renderer/render_form.html
@@ -17,7 +17,5 @@
{% csrf_token %}
{{ form|crispy }}
-
{{ form.media }}
-
{% endblock %}
diff --git a/schickmacher/templates/renderer/rendered.html b/schickmacher/templates/renderer/rendered.html
index 2ca154b..d3f0198 100644
--- a/schickmacher/templates/renderer/rendered.html
+++ b/schickmacher/templates/renderer/rendered.html
@@ -1,4 +1,4 @@
-{% load static compress tz %}
+{% load extra_filters %}{% load static compress tz %}
@@ -16,7 +16,7 @@
content: "{{ date | date:'d.m.Y' }}";
}
@top-left {
- content: "{{ title }}"
+ content: "{{ title | escape_css_content | safe }}"
}
@top-right-corner {
}
diff --git a/test.md b/test.md
index a9b6a6d..6acc5a5 100644
--- a/test.md
+++ b/test.md
@@ -1,167 +1,3 @@
-# Lead Developer
- - Jahrgang: 1988
- - Ausbildung: Bachelor of Science Informatik, Leibniz Universität Hannover
-
-## Fachkenntnisse
-### Softwareentwicklung
-#### Kernkompetenzen
- - Agile Development, Test-Driven-Development
- - Reactive Design, Microservices
- - Clean Architecture, Domain Driven Development
- - OpenSource Lizenzen im kommerziellen Einsatz
-
-#### Tiefgreifende Erfahrung
- - Testmanagement und -automatisierung (xUnit, Selenium, pytest, Espresso, etc)
- - Logisches Datenbankdesign, relational und NoSQL (PostgreSQL, MySQL / MariaDB, SQLite, MongoDB, Redis, Elasticsearch)
- - Android App-Entwicklung (RxJava, MVVM, Jetpack, Architecture Components, USB-CDC)
- - Python (Django, Django-Rest-Framework, Tornado), Kotlin, Java (Spring Boot), PHP (Yii, Zend Framework 3), Ruby (Rails)
- - Web-Frontends mit Angular (Material Design, Redux), jQuery, TypeScript, JavaScript
-
-#### Grundlegende Erfahrung
- - Oracle DB, C++ (embedded development), .NET, C#, Haskell, Go
-
-### Infrastruktur
- - Deployment und Integration bei Amazon Web Services (S3, EC2) und Firebase
- - Git, SVN, Mercurial
- - JetBrains Toolchain (Hub, YouTrack, Teamcity, Upsource), Jenkins, Jira, GoCD, Redmine
- - Linux Server, nginx, Docker, Docker-Compose
-
-### Datenschutz/Datensicherheit
- - Privacy by Design in der Praxis, DSGVO-Zusammenhänge
- - Implementation intern entwickelter Kryptographieprotokolle, Entwicklung und Review von Kryptographieprotokollen
- - Auditierung von Full-Stack Webanwendungen
-
-### Wissensvermittlung
- - Konzeption von Präsentationen und Vorträgen, Durchführung von Präsentationen und Vorträgen
- - Entwicklerschulungen, Beratung für Software-Architektur, Security by Design und Teamleitung
-
-## Weitere Kenntnisse
-### Branchen
- - Universitäten
- - Veranstaltungsbranche
- - Medizinbranche
- - Büroelektronik
- - Telekommunikationsbranche
-
-### Sprachen
- - Deutsch (Muttersprache)
- - Englisch (fließend)
-
-## Ausgewählte Projekte
-### 2019
-#### Niedersächsische Tierseuchenkasse, Hannover
-Diverse Module einer Website mit Integration von Services Dritter
-
-Technologien
- - PHP 7.2, Zend Framework 3, PHPUnit
- - Bootstrap 3, jQuery
- - Docker
- - MySQL/MariaDB
-
-
-### 2019
-#### Arconic Fastening Systems, Hildesheim
-Informationsflussanalyse und Erarbeitung von Optimierungspotenzialen im Kontext von Industrie 4.0 in einem
-Hauptfertigungsstandort anhand von Interviews und bestehender Dokumentation
- - Interdisziplinäre Zusammenarbeit mit dem Institut für Integrierte Produktion Hannover
-
-### 2018
-#### Büroelektronik Konzern, Hannover
-Implementierung eines Mock-Ups zur Demonstration eines neuen kryptographischen
-Konzepts und seiner Anwendungsmöglichkeiten
- - Entwicklung eines Mock-Ups
-Technologien
- - Angular, Clarity Design
-
-#### Büroelektronik Konzern, Hannover
-Privacy Firewall zur Einstufung personenbezogener Daten in
-Unternehmensnetzwerken als Teil eines Großprojekts
- - Entwicklung einer Server Applikation
- - Beratung in den Bereichen Natural Language Processing und KI
- - Review der Gesamtarchitektur mit Bezug auf IT-Security und Performance / Skalierung
-
-Technologien
- - Python, MQTT
- - spaCy - Industrial Streng Natural Language Processing
-
-### 2017 - 2018
-#### Softwareentwicklungsbranche, Hannover
-Entwicklung einer sicheren Telekommikationslösung mit IoT-Komponenten
- - Software-Entwicklung (Android, Embedded, Webserver)
- - Leitung eines verteilten und interdisziplinären Teams
-
-Technologien
- - C++ auf ARM32
- - Kotlin, Python, Django
- - Angular, Typescript, Clarity Design
- - WebSockets, WebRTC
- - USB-CDC mit Android Device als USB-Host
- - Protobuf, serielle Protokolle
- - Docker
-
-### 2017
-#### Frankiermaschinenhersteller, Berlin
-Auditing einer umfangreichen online Software für digitale Signaturen
- - Durchführung der Auditierung
- - Coaching der Teamleitung (insb. Testing, Teamführung und Kommunikation
-mit der Projektleitung)
- - Beratung bzgl. Verbesserung der vorhanden Entwicklungsprozesse
-hinsichtlich agile Development
-
-#### Büroelektronik Konzern, Hannover
-Entwicklung eines Demonstrators für eine smarte Arbeitsumgebung unter
-Berücksichtigung von Privacy-by-design and default Vorgaben
- - Software Entwicklung
-
-Technologien
- - MQTT, IoT
- - Windows 10 C# .NET App
-
-#### Büroelektronik Konzern, Hannover
-Entwicklung eines Demonstrators zum Einsatz von Attribute-Based-Credentials zur anonymen Authentifizierung und Authorisierung von Mitarbeitern mithilfe von Smart Devices
- - Software-Entwicklung
- - Konzept-Entwicklung - Attribute-Based-Credentials im Enterprise Umfeld
-
-Technologien
- - Python, Flask
- - Angular, Material Design
- - Android, Kotlin, AndroidWear (Smartwatches), NFC
-
-### 2015 - 2016
-#### Qabel GmbH (internes Projekt), Hannover
-Kryptographie-Plattform zur sicheren Kommunikation mit Ende-zu-Ende Verschlüsselung und Dokumentenablage in der Amazon Cloud mit Client-Anwendungen für Android und Windows/Mac/Linux
-
-Technologien
- - Java, Kotlin, Android
- - Python, Django
- - Docker
- - Angular
- - PostgreSQL, SQLite
-
-### 2011 - 2014
-#### Event Software Hersteller, Hannover
-Entwicklung einer modularen und skalierbaren Webanwendung zur Organisation von Veranstaltungen wie beispielsweise Messen
- - Performance-optimiertes ORM auf Basis von MongoDB und Redis
- - Massen-Email-Versand in Hintergrundprozessen
-
-Technologien
- - Python
- - PHP, Yii-Framework
- - MongoDB, Redis
- - HTML 5, CSS3, jQuery, DataTables
-
-### 2008 - 2012
-#### Juristische Fakultät, Leibniz Universität Hannover
-Administration, Webentwicklung und Druck-Layouting
-
-Technologien
- - PHP
- - Python
- - LaTeX
- - MySQL
-
-***
-
# Markdown Test Page
* [Headings](#Headings)