diff --git a/homepage/home/templates/kontakt.html b/homepage/home/templates/kontakt.html index 011c7a3..9267410 100644 --- a/homepage/home/templates/kontakt.html +++ b/homepage/home/templates/kontakt.html @@ -141,7 +141,7 @@ document.getElementById('loadingAnimation').classList.remove('hidden'); - fetch('/kontakt', options) + fetch('/kontakt/', options) .then(response => response.json()) .then(data => { document.getElementById('loadingAnimation').classList.add('hidden'); diff --git a/homepage/home/views.py b/homepage/home/views.py index 2c6b55e..7a9a706 100644 --- a/homepage/home/views.py +++ b/homepage/home/views.py @@ -14,8 +14,6 @@ import json import sys - - def datenschutz(request): return render(request, 'datenschutz.html', {}) @@ -54,52 +52,105 @@ def index(request): education['lfd'] = i i += 1 - experiences: list = [ { - 'label': 'WhatsImmo', - 'time': '10-11/2022', - 'content': mark_safe(''' + "label": "Wolfgang-Borchert-Gymnasium Halstenbek", + "time": "02/2024 - today()", + "content": mark_safe( + """ + Im Rahmen eines ÖPP Verfahrens plant, realisiert und betreibt die HOCHTIEF Infrastructure GmbH + als Totalunternehmer den Neubau von zwei 3-Feld-Sporthallen und eines Erweiterungsneubau für das + + Wolfgang-Borchert-Gymnasium + in der Gemeinde Halstenbek.
+ Im Auftrag der PSPC GmbH + bin ich als integriertes Teammitglied auf AG-Seite tätig.
+ Beide Teilprojekte befinden sich noch in der Planungsphase. + Im Teilprojekt Sporthalle wurde Anfang Mai 2024 der Bauantrag eingereicht. Der Erweiterungsneubau des Gymnasiums + läuft nach und befindet sich derzeit in der LPh 3.
+ Eine besondere Herausforderung bei diesem Projekt ist die Einbindung der Politik. + Für die Gemeinde Halstenbek ist es das größte Projekt. + """ + ), + }, + { + "label": "exportConject", + "time": "02/2023 - today()", + "content": mark_safe( + """ + Die Bauprojektplattform conjectPM (SaaS) wurde + von Oracel gekündigt und wird Ende 2024 eingestellt.
+ Ein öffentlicher Auftraggeber stand vor der Herausforderung, rechtzeitig zwei Nachfolgeprodukte + für seine fast 500 Projekte auf conjectPM zur Verfügung zu haben.
+ Warum zwei? - Weil rund 150 Projekte bereits abgeschlossen sind. Statt in eine neue + Kollaborationsplattform sollten diese Projekte in ein Archivsystem überführt werden.
+ Da das von Oracel angebotene "Archiv" in Form einer zugesandten Festplatte ohne Metadaten + als unzureichend zu bewerten ist, programmierte ich ein Tool, das über die REST-Api und einen + WebCrawler eine vollständige Datensicherung ermöglicht.
+ Für die restlichen, noch laufenden Projekte steht die Datenmigration im Lastenheft des neuen + Plattformbetreibers. Als externer Sparringspartner des angestellten Projektleiters unterstützte + ich die IT-Abteilung meines Kunden während des gesamten Prozesses. Von der ersten + Angebotsauswertung über unzählige Bieter- und Aufklärungsfragen bis hin zu den + Verhandlungsgesprächen. Anfang 2024 konnte der Zuschlag erteilt werden. Derzeit läuft die + Datenmigration der laufenden Projekte. Mit meiner Expertise aus der Sicherung der zu + archivierenden Projekte stelle ich wesentliche Weichen im Prozess und kontrolliere die + Vollständigkeit der Datenmigrationen für meinen Auftraggeber. + """ + ), + }, + { + "label": "WhatsImmo", + "time": "10-11/2022", + "content": mark_safe( + """ WhatsImmo bietet eine hierarchische Organisation aller Informationen im Bereich des Immobilienmanagements. Von Liegenschaften über Gebäude, Stockwerke und Bereiche bis hin zu Räumen.
Beliebig viele Kontakte, Bilder und typisierte Dateien (Verträge, Schriftverkehr, Rechnungen, etc.) können erfasst werden. Durch das responsive Design sind die Daten von jedem Endgerät aus leicht zugänglich.
Aufträge werden in der angeschlossenen Auftragsverwaltung nachverfolgt. Die Auftragsverwaltung ist in Chat-Gruppen organisiert. Die Mitarbeiter:innen zur Auftragserfüllung sind Teilnehmer:innen der Chat-Gruppe und erhalten in Echtzeit über das WebSocket-Protokoll neue Nachrichten.
Als Progressive Web App (PWA) ist eine einfache Installation auf dem Smartphone (derzeit nur Android) möglich und bietet somit den Komfort einer nativen App.
Zur Projektbeschreibung - '''), + """ + ), }, { - 'label': 'DCA-BAU.DE', - 'time': '2021-2022 ...', - 'content': mark_safe(''' + "label": "DCA-BAU.DE", + "time": "2021-2022 ...", + "content": mark_safe( + """ Als SaaS Lösung bietet dieses digitale Bautagebuch die Möglichkeit, die Baustellendokumentation in einem System zu erfassen und die somit strukturiert vorliegenden Daten direkt auszuwerten.
www.dca-bau.de
Im Rahmen der Erstentwicklung hatte ich zur Unterstützung einen Frontend-Developer angestellt. Die laufende Wartung liegt bei mir. - ''') + """ + ), }, { - 'label': 'Projektsteuerung Neubau WSW Zentrale', - 'time': '2020-today()', - 'content': mark_safe(''' + "label": "Projektsteuerung Neubau WSW Zentrale", + "time": "2020-2023", + "content": mark_safe( + """ Im Rahmen eines ÖPP Verfahrens plant, realisiert und betreibt Goldbeck als Totalunternehmer den Neubau der Verwaltungszentrale - Wuppertaler Stadtwerke. Im Auftrag der PSPC GmbH arbeite ich als integriertes Teammitglied auf der AG-Seite.
Im Rahmen der Vergabe bewertete ich die Betreiberkonzepte der Bieter. - In der Realisierung liegt der Steuerungsschwerpunkt bei der Konkretisierung und Durchgesetzung des vertraglichen Leistungssolls und dem Inbetriebnahmemanagement. - ''') + In der Realisierung liegt der Steuerungsschwerpunkt bei der Konkretisierung und Durchgesetzung des vertraglichen Leistungssolls und dem Inbetriebnahmemanagement.
+ Nach Fertigstellung im November 2023 lag im Dezember mein Beitrag bei der Mitkoordinierung der Möblierung von 450 AP sowie diverse Besprechungsräumen.
+ Seit Januar läuft der reguläre Bürobetrieb und ich stehe im Hintergrund für Fragestellung der Sorte "Wie war das noch gleich, ..." zur Verfügung. + """ + ), }, { - 'label': 'Abteilungsleiter Gebäudemanagement', - 'time': '2017-2019', - 'content': mark_safe(''' + "label": "Abteilungsleiter Gebäudemanagement", + "time": "2017-2019", + "content": mark_safe( + """ Beim Bau- und Liegenschaftsbetrieb NRW führte ich 5 Teams mit insgesamt 37 Mitarbeiter:innen. Als Gebäudemanagement-Abteilung der Niederlassung Dortmund betreuten wir rd. 250 Liegenschaften. - ''') + """ + ), }, - ] i:int = 0 @@ -107,7 +158,6 @@ def index(request): experience['index'] = i i += 1 - skills:list = [ { 'label': "Zielorientiert", @@ -131,7 +181,6 @@ def index(request): skill['lfd'] = i i += 1 - context:dict = { 'educations': educations, 'experiences': experiences, diff --git a/homepage/projekte/referenzen/exportConject.json b/homepage/projekte/referenzen/exportConject.json new file mode 100644 index 0000000..866f2e7 --- /dev/null +++ b/homepage/projekte/referenzen/exportConject.json @@ -0,0 +1,34 @@ +{ + "title": "exportConject", + "tags": [ + "Projektmanagement", "Konzeptionierung", "Programmierung", "Datenmigration", "WebCrawling", "Rest-API", "Reverse-Engeneering", "Datenmodell" + ], + "short_description": "Datensicherung von einer SaaS Plattform.", + + "participant": "Bau- und Liegenschaftsbetrieb NRW", + "participant_logo": "https://www.blb.nrw.de/_assets/c2230c973e5d427bfa14813e38f195ba/Images/blb-nrw-logo.svg", + "participant_link": "https://www.blb.nrw.de/", + "participant_head": "Bau- und Liegenschaftsbetrieb des Landes Nordrhein-Westfalen
Mercedesstraße 12
40470 Düsseldorf", + "time": "02/2023 - 11/2023", + "effort": "~15 AT", + + "functions": [ + "Automatischer Export aller Dokumente inkl. der Dokumentenversionen", + "Automatischer Export aller Pläne inkl. der Planrevisionen", + "Automatischer Export aller Nachrichten und Anhänge", + "Automatischer Export aller zugehörigen Meta-Daten", + "Strukturierte Speicherung in einer sqlite3 Datenbank je Projekt", + "Zusammenführung der sqlite3 Datenbanken in eine konsolidierte PostgreSQL" + ], + "stack_list": [ + "python3", + "Requests", + "SQLite", + "PostgreSQL", + "REHL8", + "Selenium WebDriver" + ], + + "quote": "", + "quote_author": "Dr. Jörg Mangels" +} \ No newline at end of file diff --git a/homepage/projekte/referenzen/whatsimmo.json b/homepage/projekte/referenzen/whatsimmo.json index 837fb54..fd7ef64 100644 --- a/homepage/projekte/referenzen/whatsimmo.json +++ b/homepage/projekte/referenzen/whatsimmo.json @@ -25,7 +25,7 @@ "Automatischer E-Mail abruf und Auftragszuordnung (IMAP-Postfach)" ], "stack_list": [ - "django", + "django", "Vue.js", "tailwindcss", "nginx", diff --git a/homepage/projekte/referenzen/wu-rechner.json b/homepage/projekte/referenzen/wu-rechner.json new file mode 100644 index 0000000..e05ae39 --- /dev/null +++ b/homepage/projekte/referenzen/wu-rechner.json @@ -0,0 +1,30 @@ +{ + "title": "wu-rechner", + "tags": [ + "Konzeptionierung", "Programmierung" + ], + "short_description": "Web App für die Wirtschaftlichkeitsuntersuchung verschiedener Realisierungsvarianten eines Immobilienprojekts.", + + "participant": "PSPC Public Sector Project Consultants GmbH", + "participant_logo": "https://test.wu-rechner.de/static/wuRechner/img/logo.svg", + "participant_link": "https://www.psp-consult.de", + "participant_head": "PSPC Public Sector Project Consultants GmbH
Brandenburgische Straße 27
10707 Berlin", + "time": "01/2023 - today()", + "effort": "~20 AT", + + "functions": [ + ], + "stack_list": [ + "django", + "Vue.js", + "SQLite", + "tailwindcss", + "nginx", + "gunicorn", + "ubuntu", + "apexcharts" + ], + + "quote": "", + "quote_author": "Dr. Corinna Hilbig" +} \ No newline at end of file diff --git a/homepage/projekte/templates/default.html b/homepage/projekte/templates/default.html new file mode 100644 index 0000000..ac42c98 --- /dev/null +++ b/homepage/projekte/templates/default.html @@ -0,0 +1,8 @@ +
+

+ Eine ausführliche Beschreibung ist noch nicht erstellt. Wenn Sie mehr über die Aufgaben erfahren möchten, + dann nehmen Sie gerne + Kontakt + zu mir auf. +

+
\ No newline at end of file diff --git a/homepage/projekte/templates/referenz.html b/homepage/projekte/templates/referenz.html index 77dba4f..4ccbb3f 100644 --- a/homepage/projekte/templates/referenz.html +++ b/homepage/projekte/templates/referenz.html @@ -24,9 +24,9 @@
Immobilienmngt Beratung und IT
Tobias Gerwin
- Oberbilker Allee 109
- 40227 Düsseldorf
- Steuernummer: 133/5096/3252
+ Mietgendorfer Ring 10
+ 14974 Ludwigsfelde
+ Steuernummer: 050/223/02681
@@ -89,9 +89,16 @@
Link:
+ {% if link %}
{{ link.href }} ({{ link.label }})
+ {% else %} +
+ Es steht keine GUI zur Verfügung. +
+ + {% endif %} diff --git a/homepage/projekte/views.py b/homepage/projekte/views.py index bf03e60..011ebe7 100644 --- a/homepage/projekte/views.py +++ b/homepage/projekte/views.py @@ -1,6 +1,7 @@ from django.shortcuts import render from django.utils.safestring import mark_safe from django.template.loader import render_to_string +from django.template.exceptions import TemplateDoesNotExist from django.http import Http404 from pathlib import Path @@ -12,17 +13,22 @@ import os REFERENZ_DIR = Path(__file__).resolve().parent STACK_LINK = { - 'django': "django", - 'bootstrap': "bootstrap", - 'Vue.js': "Vue.js", - 'tailwindcss': "tailwindcss", - 'nginx': "nginx", - 'gunicorn': "gunicorn", - 'daphne': "daphne", - 'redis': "redis", - 'SQLite': "SQLite", - 'PostgreSQL': "PostgreSQL", - 'ubuntu': "ubuntu", + "django": 'django', + "bootstrap": 'bootstrap', + "Vue.js": 'Vue.js', + "tailwindcss": 'tailwindcss', + "nginx": 'nginx', + "gunicorn": 'gunicorn', + "daphne": 'daphne', + "redis": 'redis', + "SQLite": 'SQLite', + "PostgreSQL": 'PostgreSQL', + "ubuntu": 'ubuntu', + "RHEL8": 'RHEL8', + "Selenium WebDriver": 'Selenium WebDriver', + "python3": 'python3', + "Requests": 'Requests', + "apexcharts": 'APEXCHARTS.JS', } @@ -48,22 +54,33 @@ def index(request): return render(request, 'referenzen.html', {'referenzList': referenzList}) - def referenz(request, name): if not os.path.exists(os.path.join(REFERENZ_DIR, 'referenzen', f'{name}.json')): raise Http404 - with open(os.path.join(REFERENZ_DIR, 'referenzen', f'{name}.json'), "r") as f: context = json.loads(f.read()) context.update({ 'filename': name, 'participant_head': mark_safe(context['participant_head']), - 'case_study': render_to_string(name+'.html', {}), + # 'case_study': render_to_string(name+'.html', {}), }) + try: + context.update( + { + "case_study": render_to_string(name + ".html", {}), + } + ) + except TemplateDoesNotExist: + context.update( + { + "case_study": render_to_string("default.html", {}), + } + ) + save_stack_list:list = [] for stack in context['stack_list']: save_stack_list.append(mark_safe(STACK_LINK.get(stack, stack)))