This commit is contained in:
Tobias Gerwin 2024-06-04 15:57:36 +02:00
parent b03e49233b
commit 8de9e8f241
8 changed files with 187 additions and 42 deletions

View File

@ -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');

View File

@ -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 <a href="https://www.hochtief-infrastructure.de/" target="_blank">HOCHTIEF Infrastructure GmbH</a>
als Totalunternehmer den Neubau von zwei 3-Feld-Sporthallen und eines Erweiterungsneubau für das
<a class="underline text-petrol-500" target="_blank" href="https://www.halstenbek.de/bildung-familie/schulen/wolfgang-borchert-gymnasium/">
Wolfgang-Borchert-Gymnasium</a>
in der Gemeinde Halstenbek.<br>
Im Auftrag der <a href="https://www.psp-consult.de" target="_blank" title="PSPC Public Sector Project Consultants GmbH">PSPC GmbH</a>
bin ich als integriertes Teammitglied auf AG-Seite tätig.<br>
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.<br>
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 <a class="underline text-petrol-500" href="https://ng.conject.com">conjectPM</a> (SaaS) wurde
von Oracel gekündigt und wird Ende 2024 eingestellt.<br>
Ein öffentlicher Auftraggeber stand vor der Herausforderung, rechtzeitig zwei Nachfolgeprodukte
für seine fast 500 Projekte auf conjectPM zur Verfügung zu haben.<br>
Warum zwei? - Weil rund 150 Projekte bereits abgeschlossen sind. Statt in eine neue
Kollaborationsplattform sollten diese Projekte in ein Archivsystem überführt werden.<br>
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.<br>
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.<br>
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.<br>
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.<br>
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.<br>
<a class="underline text-petrol-500" href="/projekt/whatsimmo/">Zur Projektbeschreibung</a>
'''),
"""
),
},
{
'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.<br>
<a class="underline text-petrol-500" target="_blank" href="https://www.dca-bau.de">www.dca-bau.de</a><br>
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 <a href="https://www.goldbeck.de/" target="_blank">Goldbeck</a> als Totalunternehmer den Neubau der Verwaltungszentrale - Wuppertaler Stadtwerke.
Im Auftrag der <a href="https://www.psp-consult.de" target="_blank" title="PSPC Public Sector Project Consultants GmbH">PSPC GmbH</a>
arbeite ich als integriertes Teammitglied auf der AG-Seite.<br>
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.<br>
Nach Fertigstellung im November 2023 lag im Dezember mein Beitrag bei der Mitkoordinierung der Möblierung von 450 AP sowie diverse Besprechungsräumen.<br>
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
<a href="https://www.blb.nrw.de" target="_blank">Bau- und Liegenschaftsbetrieb NRW</a> 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,

View File

@ -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<br>Mercedesstraße 12<br>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"
}

View File

@ -25,7 +25,7 @@
"Automatischer E-Mail abruf und Auftragszuordnung (IMAP-Postfach)"
],
"stack_list": [
"<a class=\"hover:text-white transition\" href=\"https://docs.djangoproject.com\" target=\"_blank\">django</a>",
"django",
"Vue.js",
"tailwindcss",
"nginx",

View File

@ -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<br>Brandenburgische Straße 27<br>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"
}

View File

@ -0,0 +1,8 @@
<div class="text-sm grid gap-4">
<p class="">
Eine ausführliche Beschreibung ist noch nicht erstellt. Wenn Sie mehr über die Aufgaben erfahren möchten,
dann nehmen Sie gerne
<a href="/#kontakt" class="underline text-petrol-500">Kontakt</a>
zu mir auf.
</p>
</div>

View File

@ -24,9 +24,9 @@
<div class="text-xs">
Immobilienmngt Beratung und IT<br>
Tobias Gerwin<br>
Oberbilker Allee 109<br>
40227 Düsseldorf<br>
Steuernummer: 133/5096/3252<br>
Mietgendorfer Ring 10<br>
14974 Ludwigsfelde<br>
Steuernummer: 050/223/02681<br>
</div>
</div>
@ -89,9 +89,16 @@
</div>
<div class="font-bold">Link:</div>
{% if link %}
<div class="col-span-3">
<a href="{{ link.href }}" target="_blank"><span class="underline">{{ link.href }}</span> ({{ link.label }})</a>
</div>
{% else %}
<div class="col-span-3">
Es steht keine GUI zur Verfügung.
</div>
{% endif %}
</div>

View File

@ -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': "<a class=\"hover:text-white transition\" href=\"https://docs.djangoproject.com\" target=\"_blank\">django</a>",
'bootstrap': "<a class=\"hover:text-white transition\" href=\"https://getbootstrap.com/\" target=\"_blank\">bootstrap</a>",
'Vue.js': "<a class=\"hover:text-white transition\" href=\"https://vuejs.org/\" target=\"_blank\">Vue.js</a>",
'tailwindcss': "<a class=\"hover:text-white transition\" href=\"https://tailwindcss.com/\" target=\"_blank\">tailwindcss</a>",
'nginx': "<a class=\"hover:text-white transition\" href=\"https://nginx.org/\" target=\"_blank\">nginx</a>",
'gunicorn': "<a class=\"hover:text-white transition\" href=\"https://gunicorn.org/\" target=\"_blank\">gunicorn</a>",
'daphne': "<a class=\"hover:text-white transition\" href=\"https://github.com/django/daphne\" target=\"_blank\">daphne</a>",
'redis': "<a class=\"hover:text-white transition\" href=\"https://redis.io/\" target=\"_blank\">redis</a>",
'SQLite': "<a class=\"hover:text-white transition\" href=\"https://www.sqlite.org\" target=\"_blank\">SQLite</a>",
'PostgreSQL': "<a class=\"hover:text-white transition\" href=\"https://www.postgresql.org/\" target=\"_blank\">PostgreSQL</a>",
'ubuntu': "<a class=\"hover:text-white transition\" href=\"https://ubuntu.com/\" target=\"_blank\">ubuntu</a>",
"django": '<a class="hover:text-white transition" href="https://docs.djangoproject.com" target="_blank">django</a>',
"bootstrap": '<a class="hover:text-white transition" href="https://getbootstrap.com/" target="_blank">bootstrap</a>',
"Vue.js": '<a class="hover:text-white transition" href="https://vuejs.org/" target="_blank">Vue.js</a>',
"tailwindcss": '<a class="hover:text-white transition" href="https://tailwindcss.com/" target="_blank">tailwindcss</a>',
"nginx": '<a class="hover:text-white transition" href="https://nginx.org/" target="_blank">nginx</a>',
"gunicorn": '<a class="hover:text-white transition" href="https://gunicorn.org/" target="_blank">gunicorn</a>',
"daphne": '<a class="hover:text-white transition" href="https://github.com/django/daphne" target="_blank">daphne</a>',
"redis": '<a class="hover:text-white transition" href="https://redis.io/" target="_blank">redis</a>',
"SQLite": '<a class="hover:text-white transition" href="https://www.sqlite.org" target="_blank">SQLite</a>',
"PostgreSQL": '<a class="hover:text-white transition" href="https://www.postgresql.org/" target="_blank">PostgreSQL</a>',
"ubuntu": '<a class="hover:text-white transition" href="https://ubuntu.com/" target="_blank">ubuntu</a>',
"RHEL8": '<a class="hover:text-white transition" href="https://developers.redhat.com/rhel8" target="_blank">RHEL8</a>',
"Selenium WebDriver": '<a class="hover:text-white transition" href="https://www.selenium.dev/documentation/webdriver/" target="_blank">Selenium WebDriver</a>',
"python3": '<a class="hover:text-white transition" href="https://www.python.org/" target="_blank">python3</a>',
"Requests": '<a class="hover:text-white transition" href="https://requests.readthedocs.io/en/latest/" target="_blank">Requests</a>',
"apexcharts": '<a class="hover:text-white transition" href="https://apexcharts.com/" target="_blank">APEXCHARTS.JS</a>',
}
@ -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)))