Repository files navigation

Dokumentation Firmenprojekt im SRZ: Intectainment - communication is key

Intectainment

Ziel des Projektes

Intectainment ist ein Infotainment-System, das, ähnlich zu anderen sozialen Netzwerken, Kommunikation und das Veröffentlichen von Inhalten ermöglicht. Dazu kann jeder Nutzer einen Kanal (ggf. mit Beschreibung) erstellen, auf dem er Informationen herausgibt. Diese Kanäle können von anderen Usern abonniert werden, welche sich die entsprechenden Zusammenhänge auf ihren Startseiten anzeigen lassen können. Jede Startseite besteht aus einzelnen Kacheln, welche Posts abonnierter Kanäle anzeigen; somit ist auch jede Startseite individuell und für den entsprechenden Nutzer angepasst. Alle Posts eines jeden Kanals sind ähnlich strukturiert: mithilfe der Markdown-Syntax lassen sich einfache und übersichtliche Texte schreiben, in denen sich auch Formatierungen, Links, Bilder usw. einbinden lassen. Weitere Funktionen umfassen das Merken und spätere Abrufen von Posts sowie das Redigieren (insb. durch Löschen) von Posts durch eine Redaktion. Intectainment soll den Austausch zwischen Mitarbeitern in einer Firma unterstützen und verbessern.

Deployment

Anforderungen

Intectainment benötigt eine SQL-Datenbankanbindung, eine Python Runtime (getestet auf Python 3.10) sowie einen LDAP-Server zur Nutzerauthentifizierung.

Lokales Aufsetzten für Development

  1. Installieren der Python-Bibliotheken
pip install -r requirements-dev.txt
  1. Setzen der Umgebungsvariablen (siehe Konfiguration)

  2. Zum starten folgenden Befehl ausführen:

    • beim erstmaligen Ausführen wird die Datenbank aufgesetzt
python run.py

Für ein richtiges Deployment sollte nicht der flaskinterne Webserver, sondern das Webserverinterface uWSGI verwendet werden. Eine Beispielimplementation mit NGINX ist auch in der Production Dockerfile einzusehen.

Aufsetzen per Docker

docker build -f "Dockerfile.prod" -t intectainment:latest .
docker run -p 80:80 --env INTECTAINMENT_LDAP_SERVER=ldap://localhost -d intectainment

Für die volle Liste von env-Parametern siehe auch Konfiguration. Um Posts und Bilder dauerhaft zu speichern muss der Pfad /Intectainment/Intectainment/content als Volume festgelegt werden.

Aufsetzen mit docker-compose

In der Standardeinstellung wird ein Intectainment-Server sowohl als auch ein LDAP-Server mit Admin-Panel aufgesetzt. Um die Installation anzupassen müssen einfach die Enstellungen in der docker compose-Datei bearbeitet werden.

docker-compose up

Konfiguration

Die Einstellungen können sowohl durch systemweite Umgebungsvariablen als auch in der .env-Datei festgelegt werden. Existiert eine systemweite Umgebungsvariable so überschreibt diese den Wert welcher in der .env-Datei festgelegt wird.

NameBeschreibungDefault Wert
INTECTAINMENT_DB_URIDie Database-URI dient zur Verbindung zur Datenbank. Für Kompatibilität siehe auch SqlAlchemy-URIssqlite:///content/database.db
INTECTAINMENT_SECRETFlask verwendet diesen Wert zur Verschlüsselung von Sessions o.ä. Sollte auf jeden Fall geheim beiben
INTECTAINMENT_LDAP_SERVERURL für den LDAP-Server zur Nutzerauthentifizierung
INTECTAINMENT_LDAP_ROOTSearch Base DN für alle Operationendc=intecsoft,dc=de
INTECTAINMENT_LDAP_USER_DNSearch Path für Nutzerou=users
INTECTAINMENT_LDAP_GROUP_DNSearch Path für Gruppenou=groups
INTECTAINMENT_LDAP_USER_IDNutzer RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_IDGruppen RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_OBJ_CLASSobject-class der Gruppen zur NutzerauthentifizierungposixGroup
INTECTAINMENT_LDAP_GROUP_MEMBER_ATTRAttribut einer Gruppe welches die zugewiesenen Nutzer beinhaltetmemberUid
INTECTAINMENT_LDAP_PERMISSIONSEin python dict welches einen LDAP-Gruppen-Namen zu einem Permission-Level mappt{'user': 10, 'moderator': 100, 'admin': 255}
INTECTAINMENT_LDAP_ELEVATED_USERUser-DN welche zur Berechtigungs-Bestimmung benötigt wird
INTECTAINMENT_LDAP_ELEVATED_PWDPasswort für den elevated user

Einfügung eines Testdatensatzes

Durch das Ausführen der Example-Content-Datei werden einige Beispieldatensätze eingefügt die zur Demonstration des Projektes verwendet werden können.

Umsetzung

Libraries und Frameworks

Die Backend-Verwaltung wird mithilfe des Frameworks Flask und dessen Erweiterung Flask-SQLAlchemy gestaltet. Flask ermöglicht das dynamische Erstellen von Websites und das Abrufen/Eintragen von Informationen aus bzw. in einer Datenbank mit Nutzung von Python-Code. Wir haben uns für die Nutzung des Frameworks entschieden, da es das Anzeigen von gleichförmigen, aber unterschiedlichen Daten (also z. B. Posts, Kanäle und Dashboards, welche alle der gleichen Struktur folgen, jedoch trotzdem verschiedene Eigenschaften haben) deutlich vereinfacht.

Zur Nutzerauthentifizierung und Berechtigungsbestimmung verwenden wir LDAP.

Das Frontend basiert hauptsächlich auf dem Framework Bootstrap 5.

Die live-Übersetzung von Markdown in HTML wurde mit dem Converter Showdown umgesetzt.

Datenbankarchitektur

Die wichtigsten Daten von Intectainment, welche die Grundlage für das System bilden, sind unten dargestellt. DatabaseModel.PNGAbb. 1: Vereinfachtes Datenbankmodell von Intectainment

Alle essentiellen Funktionen - Nutzerprofile, Kanäle und Posts sowie deren Erweiterungen (namentlich Abonnements, Kategorien und das Merken von Veröffentlichungen) - werden so wie hier dargestellt realisiert. Die Darstellung umfasst jedoch nur die Grundlagen des Backend-Systems und besitzt somit keinen Anspruch auf Vollständigkeit.

Wichtige Abläufe

Erstellen von Kanälen

Jeder Nutzer kann Kanäle erstellen, die gemeinschaftlich von allen Mitarbeitern des Unternehmens genutzt und betrieben werden. Den Kanälen kann bei ihrer Erstellung eine Kategorie zugewiesen werden (z. B. C++, IoT, Web-Development usw.), die die Suche nach und das Entdecken von Kanälen erleichtert. Wie bereits erwähnt, werden alle Kanäle nicht von einzelnen Usern, sondern von der gesamten Mitarbeiterschaft betrieben. Das bedeutet, dass jeder angemeldete Nutzer auf einem beliebigen Kanal Posts verfassen und veröffentlichen kann. Dies soll dabei helfen, dass jeder Nutzer Texte zu für ihn interessanten Themen verfassen kann und keine Konkurrenz zwischen verschiedenen Kanälen zum gleichen Themea entsteht.

Kanalansicht und -navigation

Kanalansicht.PNGAbb. 3: Beispielansicht eines Kanals inklusive der neuesten Posts

Wählt man einen Kanal aus, wird eine Vorschau der aktuellsten Posts angezeigt, welche die ersten Zeilen des Textes umfasst. Über die Schaltfläche "Zum Post" lässt sich der Text in voller Länge aufrufen. Dort kann man diesen auch als Favoriten markieren und ggf. bearbeiten. Als angemeldeter Nutzer kann man Kanäle abonnieren bzw. deabonnieren, aber auch Posts erstellen und auf dem entsprechenden Kanal veröffentlichen. Ist man der Ersteller des Kanals, kann man auch die Einstellungen (z. B. Beschreibung, Kategorie und Kanalbild) anpassen.

Erstellen und Bearbeiten von Posts

Posterstellung.PNGAbb. 4: Beispielansicht eines Posts während der Erstellung

Nach der Auswahl des Kanals, auf welchem der entsprechende Post erscheinen soll, kann der Nutzer mithilfe der Markdown-Syntax einen Text verfassen, welcher in Echtzeit zu HTML konvertiert und neben dem Eingabefeld angezeigt wird. Für das Hochladen von Bildern gibt es eine eigene Schaltfläche; mit dieser kann man Bilder auf dem genutzten Server hochladen und über einen eigens dafür generierten Link im Text einbinden. Alternativ ist auch das Einbinden ein Bildern aus externen Quellen möglich. Bei der Veröffentlichung wird der Posts als Markdown-Datei auf dem Server gespeichert. In der Datenbank wird zudem eine Verlinkung zu der Datei eingetragen, welche zusätzliche Informationen wie das Datum der Erstellung, den Kanal und das Datum der letzten Bearbeitung speichert. Auch nach der Veröffentlichung kann der User, welcher den Post erstellt hat, diesen in beliebigem Maße bearbeiten bzw. löschen.

Redaktion und Moderation

Um die Verwaltung des Systems kümmert sich mit den Administratoren auch eine Redaktion. Diese ist die einzige Instanz, welche - neben dem entsprechenden Nutzer - Posts und Kanäle bearbeiten kann.

Erweiterungsmöglichkeiten

Intectainment stellt als soziale Plattform ein Projekt mit vielen verschiedenen Erweiterungsmöglichkeiten dar, weswegen im folgenden Abschnitt nur einige, besonders bedeutsame beleuchtet werden können.

Nutzung auf Displays

Als Sammelpunkt für Informationen über und Geschehnisse im Unternehmen wäre auch die Nutzung von Intectainment auf Bildschirmen (z. B. im Eingangsbereich oder auf den Gängen der jeweiligen Firma) ohne Nutzerinput denkbar. Ein eigens für diese Aufgabe eingerichtetes Dashboard würde die aktuell wichtigsten Informationen bereitstellen. Diese Bildschirme könnten für verschiedene Nutzergruppen angepasst werden: während neue Kunden sich einen Überblick über das Unternehmen verschaffen wollen, sind für Entwickler Updates von Projekten oder Änderungen im Zeitplan eher von Bedeutung. Die Positionierung der Displays im Gebäude wäre dann von der entsprechenden Zielgruppe abhängig.

About

Intectainment ist ein Infotainmentsystem, welches in Zusammenarbeit mit der intecsoft group entstanden ist und den Informationsaustausch zwischen Kollegen verbessern soll.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Dokumentation Firmenprojekt im SRZ: Intectainment - communication is key

Intectainment

Ziel des Projektes

Intectainment ist ein Infotainment-System, das, ähnlich zu anderen sozialen Netzwerken, Kommunikation und das Veröffentlichen von Inhalten ermöglicht. Dazu kann jeder Nutzer einen Kanal (ggf. mit Beschreibung) erstellen, auf dem er Informationen herausgibt. Diese Kanäle können von anderen Usern abonniert werden, welche sich die entsprechenden Zusammenhänge auf ihren Startseiten anzeigen lassen können. Jede Startseite besteht aus einzelnen Kacheln, welche Posts abonnierter Kanäle anzeigen; somit ist auch jede Startseite individuell und für den entsprechenden Nutzer angepasst. Alle Posts eines jeden Kanals sind ähnlich strukturiert: mithilfe der Markdown-Syntax lassen sich einfache und übersichtliche Texte schreiben, in denen sich auch Formatierungen, Links, Bilder usw. einbinden lassen. Weitere Funktionen umfassen das Merken und spätere Abrufen von Posts sowie das Redigieren (insb. durch Löschen) von Posts durch eine Redaktion. Intectainment soll den Austausch zwischen Mitarbeitern in einer Firma unterstützen und verbessern.

Deployment

Anforderungen

Intectainment benötigt eine SQL-Datenbankanbindung, eine Python Runtime (getestet auf Python 3.10) sowie einen LDAP-Server zur Nutzerauthentifizierung.

Lokales Aufsetzten für Development

  1. Installieren der Python-Bibliotheken
pip install -r requirements-dev.txt
  1. Setzen der Umgebungsvariablen (siehe Konfiguration)

  2. Zum starten folgenden Befehl ausführen:

    • beim erstmaligen Ausführen wird die Datenbank aufgesetzt
python run.py

Für ein richtiges Deployment sollte nicht der flaskinterne Webserver, sondern das Webserverinterface uWSGI verwendet werden. Eine Beispielimplementation mit NGINX ist auch in der Production Dockerfile einzusehen.

Aufsetzen per Docker

docker build -f "Dockerfile.prod" -t intectainment:latest .
docker run -p 80:80 --env INTECTAINMENT_LDAP_SERVER=ldap://localhost -d intectainment

Für die volle Liste von env-Parametern siehe auch Konfiguration. Um Posts und Bilder dauerhaft zu speichern muss der Pfad /Intectainment/Intectainment/content als Volume festgelegt werden.

Aufsetzen mit docker-compose

In der Standardeinstellung wird ein Intectainment-Server sowohl als auch ein LDAP-Server mit Admin-Panel aufgesetzt. Um die Installation anzupassen müssen einfach die Enstellungen in der docker compose-Datei bearbeitet werden.

docker-compose up

Konfiguration

Die Einstellungen können sowohl durch systemweite Umgebungsvariablen als auch in der .env-Datei festgelegt werden. Existiert eine systemweite Umgebungsvariable so überschreibt diese den Wert welcher in der .env-Datei festgelegt wird.

NameBeschreibungDefault Wert
INTECTAINMENT_DB_URIDie Database-URI dient zur Verbindung zur Datenbank. Für Kompatibilität siehe auch SqlAlchemy-URIssqlite:///content/database.db
INTECTAINMENT_SECRETFlask verwendet diesen Wert zur Verschlüsselung von Sessions o.ä. Sollte auf jeden Fall geheim beiben
INTECTAINMENT_LDAP_SERVERURL für den LDAP-Server zur Nutzerauthentifizierung
INTECTAINMENT_LDAP_ROOTSearch Base DN für alle Operationendc=intecsoft,dc=de
INTECTAINMENT_LDAP_USER_DNSearch Path für Nutzerou=users
INTECTAINMENT_LDAP_GROUP_DNSearch Path für Gruppenou=groups
INTECTAINMENT_LDAP_USER_IDNutzer RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_IDGruppen RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_OBJ_CLASSobject-class der Gruppen zur NutzerauthentifizierungposixGroup
INTECTAINMENT_LDAP_GROUP_MEMBER_ATTRAttribut einer Gruppe welches die zugewiesenen Nutzer beinhaltetmemberUid
INTECTAINMENT_LDAP_PERMISSIONSEin python dict welches einen LDAP-Gruppen-Namen zu einem Permission-Level mappt{'user': 10, 'moderator': 100, 'admin': 255}
INTECTAINMENT_LDAP_ELEVATED_USERUser-DN welche zur Berechtigungs-Bestimmung benötigt wird
INTECTAINMENT_LDAP_ELEVATED_PWDPasswort für den elevated user

Einfügung eines Testdatensatzes

Durch das Ausführen der Example-Content-Datei werden einige Beispieldatensätze eingefügt die zur Demonstration des Projektes verwendet werden können.

Umsetzung

Libraries und Frameworks

Die Backend-Verwaltung wird mithilfe des Frameworks Flask und dessen Erweiterung Flask-SQLAlchemy gestaltet. Flask ermöglicht das dynamische Erstellen von Websites und das Abrufen/Eintragen von Informationen aus bzw. in einer Datenbank mit Nutzung von Python-Code. Wir haben uns für die Nutzung des Frameworks entschieden, da es das Anzeigen von gleichförmigen, aber unterschiedlichen Daten (also z. B. Posts, Kanäle und Dashboards, welche alle der gleichen Struktur folgen, jedoch trotzdem verschiedene Eigenschaften haben) deutlich vereinfacht.

Zur Nutzerauthentifizierung und Berechtigungsbestimmung verwenden wir LDAP.

Das Frontend basiert hauptsächlich auf dem Framework Bootstrap 5.

Die live-Übersetzung von Markdown in HTML wurde mit dem Converter Showdown umgesetzt.

Datenbankarchitektur

Die wichtigsten Daten von Intectainment, welche die Grundlage für das System bilden, sind unten dargestellt. DatabaseModel.PNGAbb. 1: Vereinfachtes Datenbankmodell von Intectainment

Alle essentiellen Funktionen - Nutzerprofile, Kanäle und Posts sowie deren Erweiterungen (namentlich Abonnements, Kategorien und das Merken von Veröffentlichungen) - werden so wie hier dargestellt realisiert. Die Darstellung umfasst jedoch nur die Grundlagen des Backend-Systems und besitzt somit keinen Anspruch auf Vollständigkeit.

Wichtige Abläufe

Erstellen von Kanälen

Jeder Nutzer kann Kanäle erstellen, die gemeinschaftlich von allen Mitarbeitern des Unternehmens genutzt und betrieben werden. Den Kanälen kann bei ihrer Erstellung eine Kategorie zugewiesen werden (z. B. C++, IoT, Web-Development usw.), die die Suche nach und das Entdecken von Kanälen erleichtert. Wie bereits erwähnt, werden alle Kanäle nicht von einzelnen Usern, sondern von der gesamten Mitarbeiterschaft betrieben. Das bedeutet, dass jeder angemeldete Nutzer auf einem beliebigen Kanal Posts verfassen und veröffentlichen kann. Dies soll dabei helfen, dass jeder Nutzer Texte zu für ihn interessanten Themen verfassen kann und keine Konkurrenz zwischen verschiedenen Kanälen zum gleichen Themea entsteht.

Kanalansicht und -navigation

Kanalansicht.PNGAbb. 3: Beispielansicht eines Kanals inklusive der neuesten Posts

Wählt man einen Kanal aus, wird eine Vorschau der aktuellsten Posts angezeigt, welche die ersten Zeilen des Textes umfasst. Über die Schaltfläche "Zum Post" lässt sich der Text in voller Länge aufrufen. Dort kann man diesen auch als Favoriten markieren und ggf. bearbeiten. Als angemeldeter Nutzer kann man Kanäle abonnieren bzw. deabonnieren, aber auch Posts erstellen und auf dem entsprechenden Kanal veröffentlichen. Ist man der Ersteller des Kanals, kann man auch die Einstellungen (z. B. Beschreibung, Kategorie und Kanalbild) anpassen.

Erstellen und Bearbeiten von Posts

Posterstellung.PNGAbb. 4: Beispielansicht eines Posts während der Erstellung

Nach der Auswahl des Kanals, auf welchem der entsprechende Post erscheinen soll, kann der Nutzer mithilfe der Markdown-Syntax einen Text verfassen, welcher in Echtzeit zu HTML konvertiert und neben dem Eingabefeld angezeigt wird. Für das Hochladen von Bildern gibt es eine eigene Schaltfläche; mit dieser kann man Bilder auf dem genutzten Server hochladen und über einen eigens dafür generierten Link im Text einbinden. Alternativ ist auch das Einbinden ein Bildern aus externen Quellen möglich. Bei der Veröffentlichung wird der Posts als Markdown-Datei auf dem Server gespeichert. In der Datenbank wird zudem eine Verlinkung zu der Datei eingetragen, welche zusätzliche Informationen wie das Datum der Erstellung, den Kanal und das Datum der letzten Bearbeitung speichert. Auch nach der Veröffentlichung kann der User, welcher den Post erstellt hat, diesen in beliebigem Maße bearbeiten bzw. löschen.

Redaktion und Moderation

Um die Verwaltung des Systems kümmert sich mit den Administratoren auch eine Redaktion. Diese ist die einzige Instanz, welche - neben dem entsprechenden Nutzer - Posts und Kanäle bearbeiten kann.

Erweiterungsmöglichkeiten

Intectainment stellt als soziale Plattform ein Projekt mit vielen verschiedenen Erweiterungsmöglichkeiten dar, weswegen im folgenden Abschnitt nur einige, besonders bedeutsame beleuchtet werden können.

Nutzung auf Displays

Als Sammelpunkt für Informationen über und Geschehnisse im Unternehmen wäre auch die Nutzung von Intectainment auf Bildschirmen (z. B. im Eingangsbereich oder auf den Gängen der jeweiligen Firma) ohne Nutzerinput denkbar. Ein eigens für diese Aufgabe eingerichtetes Dashboard würde die aktuell wichtigsten Informationen bereitstellen. Diese Bildschirme könnten für verschiedene Nutzergruppen angepasst werden: während neue Kunden sich einen Überblick über das Unternehmen verschaffen wollen, sind für Entwickler Updates von Projekten oder Änderungen im Zeitplan eher von Bedeutung. Die Positionierung der Displays im Gebäude wäre dann von der entsprechenden Zielgruppe abhängig.

About

Intectainment ist ein Infotainmentsystem, welches in Zusammenarbeit mit der intecsoft group entstanden ist und den Informationsaustausch zwischen Kollegen verbessern soll.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Dokumentation Firmenprojekt im SRZ: Intectainment - communication is key

Intectainment

Ziel des Projektes

Intectainment ist ein Infotainment-System, das, ähnlich zu anderen sozialen Netzwerken, Kommunikation und das Veröffentlichen von Inhalten ermöglicht. Dazu kann jeder Nutzer einen Kanal (ggf. mit Beschreibung) erstellen, auf dem er Informationen herausgibt. Diese Kanäle können von anderen Usern abonniert werden, welche sich die entsprechenden Zusammenhänge auf ihren Startseiten anzeigen lassen können. Jede Startseite besteht aus einzelnen Kacheln, welche Posts abonnierter Kanäle anzeigen; somit ist auch jede Startseite individuell und für den entsprechenden Nutzer angepasst. Alle Posts eines jeden Kanals sind ähnlich strukturiert: mithilfe der Markdown-Syntax lassen sich einfache und übersichtliche Texte schreiben, in denen sich auch Formatierungen, Links, Bilder usw. einbinden lassen. Weitere Funktionen umfassen das Merken und spätere Abrufen von Posts sowie das Redigieren (insb. durch Löschen) von Posts durch eine Redaktion. Intectainment soll den Austausch zwischen Mitarbeitern in einer Firma unterstützen und verbessern.

Deployment

Anforderungen

Intectainment benötigt eine SQL-Datenbankanbindung, eine Python Runtime (getestet auf Python 3.10) sowie einen LDAP-Server zur Nutzerauthentifizierung.

Lokales Aufsetzten für Development

  1. Installieren der Python-Bibliotheken
pip install -r requirements-dev.txt
  1. Setzen der Umgebungsvariablen (siehe Konfiguration)

  2. Zum starten folgenden Befehl ausführen:

    • beim erstmaligen Ausführen wird die Datenbank aufgesetzt
python run.py

Für ein richtiges Deployment sollte nicht der flaskinterne Webserver, sondern das Webserverinterface uWSGI verwendet werden. Eine Beispielimplementation mit NGINX ist auch in der Production Dockerfile einzusehen.

Aufsetzen per Docker

docker build -f "Dockerfile.prod" -t intectainment:latest .
docker run -p 80:80 --env INTECTAINMENT_LDAP_SERVER=ldap://localhost -d intectainment

Für die volle Liste von env-Parametern siehe auch Konfiguration. Um Posts und Bilder dauerhaft zu speichern muss der Pfad /Intectainment/Intectainment/content als Volume festgelegt werden.

Aufsetzen mit docker-compose

In der Standardeinstellung wird ein Intectainment-Server sowohl als auch ein LDAP-Server mit Admin-Panel aufgesetzt. Um die Installation anzupassen müssen einfach die Enstellungen in der docker compose-Datei bearbeitet werden.

docker-compose up

Konfiguration

Die Einstellungen können sowohl durch systemweite Umgebungsvariablen als auch in der .env-Datei festgelegt werden. Existiert eine systemweite Umgebungsvariable so überschreibt diese den Wert welcher in der .env-Datei festgelegt wird.

NameBeschreibungDefault Wert
INTECTAINMENT_DB_URIDie Database-URI dient zur Verbindung zur Datenbank. Für Kompatibilität siehe auch SqlAlchemy-URIssqlite:///content/database.db
INTECTAINMENT_SECRETFlask verwendet diesen Wert zur Verschlüsselung von Sessions o.ä. Sollte auf jeden Fall geheim beiben
INTECTAINMENT_LDAP_SERVERURL für den LDAP-Server zur Nutzerauthentifizierung
INTECTAINMENT_LDAP_ROOTSearch Base DN für alle Operationendc=intecsoft,dc=de
INTECTAINMENT_LDAP_USER_DNSearch Path für Nutzerou=users
INTECTAINMENT_LDAP_GROUP_DNSearch Path für Gruppenou=groups
INTECTAINMENT_LDAP_USER_IDNutzer RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_IDGruppen RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_OBJ_CLASSobject-class der Gruppen zur NutzerauthentifizierungposixGroup
INTECTAINMENT_LDAP_GROUP_MEMBER_ATTRAttribut einer Gruppe welches die zugewiesenen Nutzer beinhaltetmemberUid
INTECTAINMENT_LDAP_PERMISSIONSEin python dict welches einen LDAP-Gruppen-Namen zu einem Permission-Level mappt{'user': 10, 'moderator': 100, 'admin': 255}
INTECTAINMENT_LDAP_ELEVATED_USERUser-DN welche zur Berechtigungs-Bestimmung benötigt wird
INTECTAINMENT_LDAP_ELEVATED_PWDPasswort für den elevated user

Einfügung eines Testdatensatzes

Durch das Ausführen der Example-Content-Datei werden einige Beispieldatensätze eingefügt die zur Demonstration des Projektes verwendet werden können.

Umsetzung

Libraries und Frameworks

Die Backend-Verwaltung wird mithilfe des Frameworks Flask und dessen Erweiterung Flask-SQLAlchemy gestaltet. Flask ermöglicht das dynamische Erstellen von Websites und das Abrufen/Eintragen von Informationen aus bzw. in einer Datenbank mit Nutzung von Python-Code. Wir haben uns für die Nutzung des Frameworks entschieden, da es das Anzeigen von gleichförmigen, aber unterschiedlichen Daten (also z. B. Posts, Kanäle und Dashboards, welche alle der gleichen Struktur folgen, jedoch trotzdem verschiedene Eigenschaften haben) deutlich vereinfacht.

Zur Nutzerauthentifizierung und Berechtigungsbestimmung verwenden wir LDAP.

Das Frontend basiert hauptsächlich auf dem Framework Bootstrap 5.

Die live-Übersetzung von Markdown in HTML wurde mit dem Converter Showdown umgesetzt.

Datenbankarchitektur

Die wichtigsten Daten von Intectainment, welche die Grundlage für das System bilden, sind unten dargestellt. DatabaseModel.PNGAbb. 1: Vereinfachtes Datenbankmodell von Intectainment

Alle essentiellen Funktionen - Nutzerprofile, Kanäle und Posts sowie deren Erweiterungen (namentlich Abonnements, Kategorien und das Merken von Veröffentlichungen) - werden so wie hier dargestellt realisiert. Die Darstellung umfasst jedoch nur die Grundlagen des Backend-Systems und besitzt somit keinen Anspruch auf Vollständigkeit.

Wichtige Abläufe

Erstellen von Kanälen

Jeder Nutzer kann Kanäle erstellen, die gemeinschaftlich von allen Mitarbeitern des Unternehmens genutzt und betrieben werden. Den Kanälen kann bei ihrer Erstellung eine Kategorie zugewiesen werden (z. B. C++, IoT, Web-Development usw.), die die Suche nach und das Entdecken von Kanälen erleichtert. Wie bereits erwähnt, werden alle Kanäle nicht von einzelnen Usern, sondern von der gesamten Mitarbeiterschaft betrieben. Das bedeutet, dass jeder angemeldete Nutzer auf einem beliebigen Kanal Posts verfassen und veröffentlichen kann. Dies soll dabei helfen, dass jeder Nutzer Texte zu für ihn interessanten Themen verfassen kann und keine Konkurrenz zwischen verschiedenen Kanälen zum gleichen Themea entsteht.

Kanalansicht und -navigation

Kanalansicht.PNGAbb. 3: Beispielansicht eines Kanals inklusive der neuesten Posts

Wählt man einen Kanal aus, wird eine Vorschau der aktuellsten Posts angezeigt, welche die ersten Zeilen des Textes umfasst. Über die Schaltfläche "Zum Post" lässt sich der Text in voller Länge aufrufen. Dort kann man diesen auch als Favoriten markieren und ggf. bearbeiten. Als angemeldeter Nutzer kann man Kanäle abonnieren bzw. deabonnieren, aber auch Posts erstellen und auf dem entsprechenden Kanal veröffentlichen. Ist man der Ersteller des Kanals, kann man auch die Einstellungen (z. B. Beschreibung, Kategorie und Kanalbild) anpassen.

Erstellen und Bearbeiten von Posts

Posterstellung.PNGAbb. 4: Beispielansicht eines Posts während der Erstellung

Nach der Auswahl des Kanals, auf welchem der entsprechende Post erscheinen soll, kann der Nutzer mithilfe der Markdown-Syntax einen Text verfassen, welcher in Echtzeit zu HTML konvertiert und neben dem Eingabefeld angezeigt wird. Für das Hochladen von Bildern gibt es eine eigene Schaltfläche; mit dieser kann man Bilder auf dem genutzten Server hochladen und über einen eigens dafür generierten Link im Text einbinden. Alternativ ist auch das Einbinden ein Bildern aus externen Quellen möglich. Bei der Veröffentlichung wird der Posts als Markdown-Datei auf dem Server gespeichert. In der Datenbank wird zudem eine Verlinkung zu der Datei eingetragen, welche zusätzliche Informationen wie das Datum der Erstellung, den Kanal und das Datum der letzten Bearbeitung speichert. Auch nach der Veröffentlichung kann der User, welcher den Post erstellt hat, diesen in beliebigem Maße bearbeiten bzw. löschen.

Redaktion und Moderation

Um die Verwaltung des Systems kümmert sich mit den Administratoren auch eine Redaktion. Diese ist die einzige Instanz, welche - neben dem entsprechenden Nutzer - Posts und Kanäle bearbeiten kann.

Erweiterungsmöglichkeiten

Intectainment stellt als soziale Plattform ein Projekt mit vielen verschiedenen Erweiterungsmöglichkeiten dar, weswegen im folgenden Abschnitt nur einige, besonders bedeutsame beleuchtet werden können.

Nutzung auf Displays

Als Sammelpunkt für Informationen über und Geschehnisse im Unternehmen wäre auch die Nutzung von Intectainment auf Bildschirmen (z. B. im Eingangsbereich oder auf den Gängen der jeweiligen Firma) ohne Nutzerinput denkbar. Ein eigens für diese Aufgabe eingerichtetes Dashboard würde die aktuell wichtigsten Informationen bereitstellen. Diese Bildschirme könnten für verschiedene Nutzergruppen angepasst werden: während neue Kunden sich einen Überblick über das Unternehmen verschaffen wollen, sind für Entwickler Updates von Projekten oder Änderungen im Zeitplan eher von Bedeutung. Die Positionierung der Displays im Gebäude wäre dann von der entsprechenden Zielgruppe abhängig.

About

Intectainment ist ein Infotainmentsystem, welches in Zusammenarbeit mit der intecsoft group entstanden ist und den Informationsaustausch zwischen Kollegen verbessern soll.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Dokumentation Firmenprojekt im SRZ: Intectainment - communication is key

Intectainment

Ziel des Projektes

Intectainment ist ein Infotainment-System, das, ähnlich zu anderen sozialen Netzwerken, Kommunikation und das Veröffentlichen von Inhalten ermöglicht. Dazu kann jeder Nutzer einen Kanal (ggf. mit Beschreibung) erstellen, auf dem er Informationen herausgibt. Diese Kanäle können von anderen Usern abonniert werden, welche sich die entsprechenden Zusammenhänge auf ihren Startseiten anzeigen lassen können. Jede Startseite besteht aus einzelnen Kacheln, welche Posts abonnierter Kanäle anzeigen; somit ist auch jede Startseite individuell und für den entsprechenden Nutzer angepasst. Alle Posts eines jeden Kanals sind ähnlich strukturiert: mithilfe der Markdown-Syntax lassen sich einfache und übersichtliche Texte schreiben, in denen sich auch Formatierungen, Links, Bilder usw. einbinden lassen. Weitere Funktionen umfassen das Merken und spätere Abrufen von Posts sowie das Redigieren (insb. durch Löschen) von Posts durch eine Redaktion. Intectainment soll den Austausch zwischen Mitarbeitern in einer Firma unterstützen und verbessern.

Deployment

Anforderungen

Intectainment benötigt eine SQL-Datenbankanbindung, eine Python Runtime (getestet auf Python 3.10) sowie einen LDAP-Server zur Nutzerauthentifizierung.

Lokales Aufsetzten für Development

  1. Installieren der Python-Bibliotheken
pip install -r requirements-dev.txt
  1. Setzen der Umgebungsvariablen (siehe Konfiguration)

  2. Zum starten folgenden Befehl ausführen:

    • beim erstmaligen Ausführen wird die Datenbank aufgesetzt
python run.py

Für ein richtiges Deployment sollte nicht der flaskinterne Webserver, sondern das Webserverinterface uWSGI verwendet werden. Eine Beispielimplementation mit NGINX ist auch in der Production Dockerfile einzusehen.

Aufsetzen per Docker

docker build -f "Dockerfile.prod" -t intectainment:latest .
docker run -p 80:80 --env INTECTAINMENT_LDAP_SERVER=ldap://localhost -d intectainment

Für die volle Liste von env-Parametern siehe auch Konfiguration. Um Posts und Bilder dauerhaft zu speichern muss der Pfad /Intectainment/Intectainment/content als Volume festgelegt werden.

Aufsetzen mit docker-compose

In der Standardeinstellung wird ein Intectainment-Server sowohl als auch ein LDAP-Server mit Admin-Panel aufgesetzt. Um die Installation anzupassen müssen einfach die Enstellungen in der docker compose-Datei bearbeitet werden.

docker-compose up

Konfiguration

Die Einstellungen können sowohl durch systemweite Umgebungsvariablen als auch in der .env-Datei festgelegt werden. Existiert eine systemweite Umgebungsvariable so überschreibt diese den Wert welcher in der .env-Datei festgelegt wird.

NameBeschreibungDefault Wert
INTECTAINMENT_DB_URIDie Database-URI dient zur Verbindung zur Datenbank. Für Kompatibilität siehe auch SqlAlchemy-URIssqlite:///content/database.db
INTECTAINMENT_SECRETFlask verwendet diesen Wert zur Verschlüsselung von Sessions o.ä. Sollte auf jeden Fall geheim beiben
INTECTAINMENT_LDAP_SERVERURL für den LDAP-Server zur Nutzerauthentifizierung
INTECTAINMENT_LDAP_ROOTSearch Base DN für alle Operationendc=intecsoft,dc=de
INTECTAINMENT_LDAP_USER_DNSearch Path für Nutzerou=users
INTECTAINMENT_LDAP_GROUP_DNSearch Path für Gruppenou=groups
INTECTAINMENT_LDAP_USER_IDNutzer RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_IDGruppen RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_OBJ_CLASSobject-class der Gruppen zur NutzerauthentifizierungposixGroup
INTECTAINMENT_LDAP_GROUP_MEMBER_ATTRAttribut einer Gruppe welches die zugewiesenen Nutzer beinhaltetmemberUid
INTECTAINMENT_LDAP_PERMISSIONSEin python dict welches einen LDAP-Gruppen-Namen zu einem Permission-Level mappt{'user': 10, 'moderator': 100, 'admin': 255}
INTECTAINMENT_LDAP_ELEVATED_USERUser-DN welche zur Berechtigungs-Bestimmung benötigt wird
INTECTAINMENT_LDAP_ELEVATED_PWDPasswort für den elevated user

Einfügung eines Testdatensatzes

Durch das Ausführen der Example-Content-Datei werden einige Beispieldatensätze eingefügt die zur Demonstration des Projektes verwendet werden können.

Umsetzung

Libraries und Frameworks

Die Backend-Verwaltung wird mithilfe des Frameworks Flask und dessen Erweiterung Flask-SQLAlchemy gestaltet. Flask ermöglicht das dynamische Erstellen von Websites und das Abrufen/Eintragen von Informationen aus bzw. in einer Datenbank mit Nutzung von Python-Code. Wir haben uns für die Nutzung des Frameworks entschieden, da es das Anzeigen von gleichförmigen, aber unterschiedlichen Daten (also z. B. Posts, Kanäle und Dashboards, welche alle der gleichen Struktur folgen, jedoch trotzdem verschiedene Eigenschaften haben) deutlich vereinfacht.

Zur Nutzerauthentifizierung und Berechtigungsbestimmung verwenden wir LDAP.

Das Frontend basiert hauptsächlich auf dem Framework Bootstrap 5.

Die live-Übersetzung von Markdown in HTML wurde mit dem Converter Showdown umgesetzt.

Datenbankarchitektur

Die wichtigsten Daten von Intectainment, welche die Grundlage für das System bilden, sind unten dargestellt. DatabaseModel.PNGAbb. 1: Vereinfachtes Datenbankmodell von Intectainment

Alle essentiellen Funktionen - Nutzerprofile, Kanäle und Posts sowie deren Erweiterungen (namentlich Abonnements, Kategorien und das Merken von Veröffentlichungen) - werden so wie hier dargestellt realisiert. Die Darstellung umfasst jedoch nur die Grundlagen des Backend-Systems und besitzt somit keinen Anspruch auf Vollständigkeit.

Wichtige Abläufe

Erstellen von Kanälen

Jeder Nutzer kann Kanäle erstellen, die gemeinschaftlich von allen Mitarbeitern des Unternehmens genutzt und betrieben werden. Den Kanälen kann bei ihrer Erstellung eine Kategorie zugewiesen werden (z. B. C++, IoT, Web-Development usw.), die die Suche nach und das Entdecken von Kanälen erleichtert. Wie bereits erwähnt, werden alle Kanäle nicht von einzelnen Usern, sondern von der gesamten Mitarbeiterschaft betrieben. Das bedeutet, dass jeder angemeldete Nutzer auf einem beliebigen Kanal Posts verfassen und veröffentlichen kann. Dies soll dabei helfen, dass jeder Nutzer Texte zu für ihn interessanten Themen verfassen kann und keine Konkurrenz zwischen verschiedenen Kanälen zum gleichen Themea entsteht.

Kanalansicht und -navigation

Kanalansicht.PNGAbb. 3: Beispielansicht eines Kanals inklusive der neuesten Posts

Wählt man einen Kanal aus, wird eine Vorschau der aktuellsten Posts angezeigt, welche die ersten Zeilen des Textes umfasst. Über die Schaltfläche "Zum Post" lässt sich der Text in voller Länge aufrufen. Dort kann man diesen auch als Favoriten markieren und ggf. bearbeiten. Als angemeldeter Nutzer kann man Kanäle abonnieren bzw. deabonnieren, aber auch Posts erstellen und auf dem entsprechenden Kanal veröffentlichen. Ist man der Ersteller des Kanals, kann man auch die Einstellungen (z. B. Beschreibung, Kategorie und Kanalbild) anpassen.

Erstellen und Bearbeiten von Posts

Posterstellung.PNGAbb. 4: Beispielansicht eines Posts während der Erstellung

Nach der Auswahl des Kanals, auf welchem der entsprechende Post erscheinen soll, kann der Nutzer mithilfe der Markdown-Syntax einen Text verfassen, welcher in Echtzeit zu HTML konvertiert und neben dem Eingabefeld angezeigt wird. Für das Hochladen von Bildern gibt es eine eigene Schaltfläche; mit dieser kann man Bilder auf dem genutzten Server hochladen und über einen eigens dafür generierten Link im Text einbinden. Alternativ ist auch das Einbinden ein Bildern aus externen Quellen möglich. Bei der Veröffentlichung wird der Posts als Markdown-Datei auf dem Server gespeichert. In der Datenbank wird zudem eine Verlinkung zu der Datei eingetragen, welche zusätzliche Informationen wie das Datum der Erstellung, den Kanal und das Datum der letzten Bearbeitung speichert. Auch nach der Veröffentlichung kann der User, welcher den Post erstellt hat, diesen in beliebigem Maße bearbeiten bzw. löschen.

Redaktion und Moderation

Um die Verwaltung des Systems kümmert sich mit den Administratoren auch eine Redaktion. Diese ist die einzige Instanz, welche - neben dem entsprechenden Nutzer - Posts und Kanäle bearbeiten kann.

Erweiterungsmöglichkeiten

Intectainment stellt als soziale Plattform ein Projekt mit vielen verschiedenen Erweiterungsmöglichkeiten dar, weswegen im folgenden Abschnitt nur einige, besonders bedeutsame beleuchtet werden können.

Nutzung auf Displays

Als Sammelpunkt für Informationen über und Geschehnisse im Unternehmen wäre auch die Nutzung von Intectainment auf Bildschirmen (z. B. im Eingangsbereich oder auf den Gängen der jeweiligen Firma) ohne Nutzerinput denkbar. Ein eigens für diese Aufgabe eingerichtetes Dashboard würde die aktuell wichtigsten Informationen bereitstellen. Diese Bildschirme könnten für verschiedene Nutzergruppen angepasst werden: während neue Kunden sich einen Überblick über das Unternehmen verschaffen wollen, sind für Entwickler Updates von Projekten oder Änderungen im Zeitplan eher von Bedeutung. Die Positionierung der Displays im Gebäude wäre dann von der entsprechenden Zielgruppe abhängig.

About

Intectainment ist ein Infotainmentsystem, welches in Zusammenarbeit mit der intecsoft group entstanden ist und den Informationsaustausch zwischen Kollegen verbessern soll.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Dokumentation Firmenprojekt im SRZ: Intectainment - communication is key

Intectainment

Ziel des Projektes

Intectainment ist ein Infotainment-System, das, ähnlich zu anderen sozialen Netzwerken, Kommunikation und das Veröffentlichen von Inhalten ermöglicht. Dazu kann jeder Nutzer einen Kanal (ggf. mit Beschreibung) erstellen, auf dem er Informationen herausgibt. Diese Kanäle können von anderen Usern abonniert werden, welche sich die entsprechenden Zusammenhänge auf ihren Startseiten anzeigen lassen können. Jede Startseite besteht aus einzelnen Kacheln, welche Posts abonnierter Kanäle anzeigen; somit ist auch jede Startseite individuell und für den entsprechenden Nutzer angepasst. Alle Posts eines jeden Kanals sind ähnlich strukturiert: mithilfe der Markdown-Syntax lassen sich einfache und übersichtliche Texte schreiben, in denen sich auch Formatierungen, Links, Bilder usw. einbinden lassen. Weitere Funktionen umfassen das Merken und spätere Abrufen von Posts sowie das Redigieren (insb. durch Löschen) von Posts durch eine Redaktion. Intectainment soll den Austausch zwischen Mitarbeitern in einer Firma unterstützen und verbessern.

Deployment

Anforderungen

Intectainment benötigt eine SQL-Datenbankanbindung, eine Python Runtime (getestet auf Python 3.10) sowie einen LDAP-Server zur Nutzerauthentifizierung.

Lokales Aufsetzten für Development

  1. Installieren der Python-Bibliotheken
pip install -r requirements-dev.txt
  1. Setzen der Umgebungsvariablen (siehe Konfiguration)

  2. Zum starten folgenden Befehl ausführen:

    • beim erstmaligen Ausführen wird die Datenbank aufgesetzt
python run.py

Für ein richtiges Deployment sollte nicht der flaskinterne Webserver, sondern das Webserverinterface uWSGI verwendet werden. Eine Beispielimplementation mit NGINX ist auch in der Production Dockerfile einzusehen.

Aufsetzen per Docker

docker build -f "Dockerfile.prod" -t intectainment:latest .
docker run -p 80:80 --env INTECTAINMENT_LDAP_SERVER=ldap://localhost -d intectainment

Für die volle Liste von env-Parametern siehe auch Konfiguration. Um Posts und Bilder dauerhaft zu speichern muss der Pfad /Intectainment/Intectainment/content als Volume festgelegt werden.

Aufsetzen mit docker-compose

In der Standardeinstellung wird ein Intectainment-Server sowohl als auch ein LDAP-Server mit Admin-Panel aufgesetzt. Um die Installation anzupassen müssen einfach die Enstellungen in der docker compose-Datei bearbeitet werden.

docker-compose up

Konfiguration

Die Einstellungen können sowohl durch systemweite Umgebungsvariablen als auch in der .env-Datei festgelegt werden. Existiert eine systemweite Umgebungsvariable so überschreibt diese den Wert welcher in der .env-Datei festgelegt wird.

NameBeschreibungDefault Wert
INTECTAINMENT_DB_URIDie Database-URI dient zur Verbindung zur Datenbank. Für Kompatibilität siehe auch SqlAlchemy-URIssqlite:///content/database.db
INTECTAINMENT_SECRETFlask verwendet diesen Wert zur Verschlüsselung von Sessions o.ä. Sollte auf jeden Fall geheim beiben
INTECTAINMENT_LDAP_SERVERURL für den LDAP-Server zur Nutzerauthentifizierung
INTECTAINMENT_LDAP_ROOTSearch Base DN für alle Operationendc=intecsoft,dc=de
INTECTAINMENT_LDAP_USER_DNSearch Path für Nutzerou=users
INTECTAINMENT_LDAP_GROUP_DNSearch Path für Gruppenou=groups
INTECTAINMENT_LDAP_USER_IDNutzer RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_IDGruppen RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_OBJ_CLASSobject-class der Gruppen zur NutzerauthentifizierungposixGroup
INTECTAINMENT_LDAP_GROUP_MEMBER_ATTRAttribut einer Gruppe welches die zugewiesenen Nutzer beinhaltetmemberUid
INTECTAINMENT_LDAP_PERMISSIONSEin python dict welches einen LDAP-Gruppen-Namen zu einem Permission-Level mappt{'user': 10, 'moderator': 100, 'admin': 255}
INTECTAINMENT_LDAP_ELEVATED_USERUser-DN welche zur Berechtigungs-Bestimmung benötigt wird
INTECTAINMENT_LDAP_ELEVATED_PWDPasswort für den elevated user

Einfügung eines Testdatensatzes

Durch das Ausführen der Example-Content-Datei werden einige Beispieldatensätze eingefügt die zur Demonstration des Projektes verwendet werden können.

Umsetzung

Libraries und Frameworks

Die Backend-Verwaltung wird mithilfe des Frameworks Flask und dessen Erweiterung Flask-SQLAlchemy gestaltet. Flask ermöglicht das dynamische Erstellen von Websites und das Abrufen/Eintragen von Informationen aus bzw. in einer Datenbank mit Nutzung von Python-Code. Wir haben uns für die Nutzung des Frameworks entschieden, da es das Anzeigen von gleichförmigen, aber unterschiedlichen Daten (also z. B. Posts, Kanäle und Dashboards, welche alle der gleichen Struktur folgen, jedoch trotzdem verschiedene Eigenschaften haben) deutlich vereinfacht.

Zur Nutzerauthentifizierung und Berechtigungsbestimmung verwenden wir LDAP.

Das Frontend basiert hauptsächlich auf dem Framework Bootstrap 5.

Die live-Übersetzung von Markdown in HTML wurde mit dem Converter Showdown umgesetzt.

Datenbankarchitektur

Die wichtigsten Daten von Intectainment, welche die Grundlage für das System bilden, sind unten dargestellt. DatabaseModel.PNGAbb. 1: Vereinfachtes Datenbankmodell von Intectainment

Alle essentiellen Funktionen - Nutzerprofile, Kanäle und Posts sowie deren Erweiterungen (namentlich Abonnements, Kategorien und das Merken von Veröffentlichungen) - werden so wie hier dargestellt realisiert. Die Darstellung umfasst jedoch nur die Grundlagen des Backend-Systems und besitzt somit keinen Anspruch auf Vollständigkeit.

Wichtige Abläufe

Erstellen von Kanälen

Jeder Nutzer kann Kanäle erstellen, die gemeinschaftlich von allen Mitarbeitern des Unternehmens genutzt und betrieben werden. Den Kanälen kann bei ihrer Erstellung eine Kategorie zugewiesen werden (z. B. C++, IoT, Web-Development usw.), die die Suche nach und das Entdecken von Kanälen erleichtert. Wie bereits erwähnt, werden alle Kanäle nicht von einzelnen Usern, sondern von der gesamten Mitarbeiterschaft betrieben. Das bedeutet, dass jeder angemeldete Nutzer auf einem beliebigen Kanal Posts verfassen und veröffentlichen kann. Dies soll dabei helfen, dass jeder Nutzer Texte zu für ihn interessanten Themen verfassen kann und keine Konkurrenz zwischen verschiedenen Kanälen zum gleichen Themea entsteht.

Kanalansicht und -navigation

Kanalansicht.PNGAbb. 3: Beispielansicht eines Kanals inklusive der neuesten Posts

Wählt man einen Kanal aus, wird eine Vorschau der aktuellsten Posts angezeigt, welche die ersten Zeilen des Textes umfasst. Über die Schaltfläche "Zum Post" lässt sich der Text in voller Länge aufrufen. Dort kann man diesen auch als Favoriten markieren und ggf. bearbeiten. Als angemeldeter Nutzer kann man Kanäle abonnieren bzw. deabonnieren, aber auch Posts erstellen und auf dem entsprechenden Kanal veröffentlichen. Ist man der Ersteller des Kanals, kann man auch die Einstellungen (z. B. Beschreibung, Kategorie und Kanalbild) anpassen.

Erstellen und Bearbeiten von Posts

Posterstellung.PNGAbb. 4: Beispielansicht eines Posts während der Erstellung

Nach der Auswahl des Kanals, auf welchem der entsprechende Post erscheinen soll, kann der Nutzer mithilfe der Markdown-Syntax einen Text verfassen, welcher in Echtzeit zu HTML konvertiert und neben dem Eingabefeld angezeigt wird. Für das Hochladen von Bildern gibt es eine eigene Schaltfläche; mit dieser kann man Bilder auf dem genutzten Server hochladen und über einen eigens dafür generierten Link im Text einbinden. Alternativ ist auch das Einbinden ein Bildern aus externen Quellen möglich. Bei der Veröffentlichung wird der Posts als Markdown-Datei auf dem Server gespeichert. In der Datenbank wird zudem eine Verlinkung zu der Datei eingetragen, welche zusätzliche Informationen wie das Datum der Erstellung, den Kanal und das Datum der letzten Bearbeitung speichert. Auch nach der Veröffentlichung kann der User, welcher den Post erstellt hat, diesen in beliebigem Maße bearbeiten bzw. löschen.

Redaktion und Moderation

Um die Verwaltung des Systems kümmert sich mit den Administratoren auch eine Redaktion. Diese ist die einzige Instanz, welche - neben dem entsprechenden Nutzer - Posts und Kanäle bearbeiten kann.

Erweiterungsmöglichkeiten

Intectainment stellt als soziale Plattform ein Projekt mit vielen verschiedenen Erweiterungsmöglichkeiten dar, weswegen im folgenden Abschnitt nur einige, besonders bedeutsame beleuchtet werden können.

Nutzung auf Displays

Als Sammelpunkt für Informationen über und Geschehnisse im Unternehmen wäre auch die Nutzung von Intectainment auf Bildschirmen (z. B. im Eingangsbereich oder auf den Gängen der jeweiligen Firma) ohne Nutzerinput denkbar. Ein eigens für diese Aufgabe eingerichtetes Dashboard würde die aktuell wichtigsten Informationen bereitstellen. Diese Bildschirme könnten für verschiedene Nutzergruppen angepasst werden: während neue Kunden sich einen Überblick über das Unternehmen verschaffen wollen, sind für Entwickler Updates von Projekten oder Änderungen im Zeitplan eher von Bedeutung. Die Positionierung der Displays im Gebäude wäre dann von der entsprechenden Zielgruppe abhängig.

About

Intectainment ist ein Infotainmentsystem, welches in Zusammenarbeit mit der intecsoft group entstanden ist und den Informationsaustausch zwischen Kollegen verbessern soll.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Dokumentation Firmenprojekt im SRZ: Intectainment - communication is key

Intectainment

Ziel des Projektes

Intectainment ist ein Infotainment-System, das, ähnlich zu anderen sozialen Netzwerken, Kommunikation und das Veröffentlichen von Inhalten ermöglicht. Dazu kann jeder Nutzer einen Kanal (ggf. mit Beschreibung) erstellen, auf dem er Informationen herausgibt. Diese Kanäle können von anderen Usern abonniert werden, welche sich die entsprechenden Zusammenhänge auf ihren Startseiten anzeigen lassen können. Jede Startseite besteht aus einzelnen Kacheln, welche Posts abonnierter Kanäle anzeigen; somit ist auch jede Startseite individuell und für den entsprechenden Nutzer angepasst. Alle Posts eines jeden Kanals sind ähnlich strukturiert: mithilfe der Markdown-Syntax lassen sich einfache und übersichtliche Texte schreiben, in denen sich auch Formatierungen, Links, Bilder usw. einbinden lassen. Weitere Funktionen umfassen das Merken und spätere Abrufen von Posts sowie das Redigieren (insb. durch Löschen) von Posts durch eine Redaktion. Intectainment soll den Austausch zwischen Mitarbeitern in einer Firma unterstützen und verbessern.

Deployment

Anforderungen

Intectainment benötigt eine SQL-Datenbankanbindung, eine Python Runtime (getestet auf Python 3.10) sowie einen LDAP-Server zur Nutzerauthentifizierung.

Lokales Aufsetzten für Development

  1. Installieren der Python-Bibliotheken
pip install -r requirements-dev.txt
  1. Setzen der Umgebungsvariablen (siehe Konfiguration)

  2. Zum starten folgenden Befehl ausführen:

    • beim erstmaligen Ausführen wird die Datenbank aufgesetzt
python run.py

Für ein richtiges Deployment sollte nicht der flaskinterne Webserver, sondern das Webserverinterface uWSGI verwendet werden. Eine Beispielimplementation mit NGINX ist auch in der Production Dockerfile einzusehen.

Aufsetzen per Docker

docker build -f "Dockerfile.prod" -t intectainment:latest .
docker run -p 80:80 --env INTECTAINMENT_LDAP_SERVER=ldap://localhost -d intectainment

Für die volle Liste von env-Parametern siehe auch Konfiguration. Um Posts und Bilder dauerhaft zu speichern muss der Pfad /Intectainment/Intectainment/content als Volume festgelegt werden.

Aufsetzen mit docker-compose

In der Standardeinstellung wird ein Intectainment-Server sowohl als auch ein LDAP-Server mit Admin-Panel aufgesetzt. Um die Installation anzupassen müssen einfach die Enstellungen in der docker compose-Datei bearbeitet werden.

docker-compose up

Konfiguration

Die Einstellungen können sowohl durch systemweite Umgebungsvariablen als auch in der .env-Datei festgelegt werden. Existiert eine systemweite Umgebungsvariable so überschreibt diese den Wert welcher in der .env-Datei festgelegt wird.

NameBeschreibungDefault Wert
INTECTAINMENT_DB_URIDie Database-URI dient zur Verbindung zur Datenbank. Für Kompatibilität siehe auch SqlAlchemy-URIssqlite:///content/database.db
INTECTAINMENT_SECRETFlask verwendet diesen Wert zur Verschlüsselung von Sessions o.ä. Sollte auf jeden Fall geheim beiben
INTECTAINMENT_LDAP_SERVERURL für den LDAP-Server zur Nutzerauthentifizierung
INTECTAINMENT_LDAP_ROOTSearch Base DN für alle Operationendc=intecsoft,dc=de
INTECTAINMENT_LDAP_USER_DNSearch Path für Nutzerou=users
INTECTAINMENT_LDAP_GROUP_DNSearch Path für Gruppenou=groups
INTECTAINMENT_LDAP_USER_IDNutzer RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_IDGruppen RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_OBJ_CLASSobject-class der Gruppen zur NutzerauthentifizierungposixGroup
INTECTAINMENT_LDAP_GROUP_MEMBER_ATTRAttribut einer Gruppe welches die zugewiesenen Nutzer beinhaltetmemberUid
INTECTAINMENT_LDAP_PERMISSIONSEin python dict welches einen LDAP-Gruppen-Namen zu einem Permission-Level mappt{'user': 10, 'moderator': 100, 'admin': 255}
INTECTAINMENT_LDAP_ELEVATED_USERUser-DN welche zur Berechtigungs-Bestimmung benötigt wird
INTECTAINMENT_LDAP_ELEVATED_PWDPasswort für den elevated user

Einfügung eines Testdatensatzes

Durch das Ausführen der Example-Content-Datei werden einige Beispieldatensätze eingefügt die zur Demonstration des Projektes verwendet werden können.

Umsetzung

Libraries und Frameworks

Die Backend-Verwaltung wird mithilfe des Frameworks Flask und dessen Erweiterung Flask-SQLAlchemy gestaltet. Flask ermöglicht das dynamische Erstellen von Websites und das Abrufen/Eintragen von Informationen aus bzw. in einer Datenbank mit Nutzung von Python-Code. Wir haben uns für die Nutzung des Frameworks entschieden, da es das Anzeigen von gleichförmigen, aber unterschiedlichen Daten (also z. B. Posts, Kanäle und Dashboards, welche alle der gleichen Struktur folgen, jedoch trotzdem verschiedene Eigenschaften haben) deutlich vereinfacht.

Zur Nutzerauthentifizierung und Berechtigungsbestimmung verwenden wir LDAP.

Das Frontend basiert hauptsächlich auf dem Framework Bootstrap 5.

Die live-Übersetzung von Markdown in HTML wurde mit dem Converter Showdown umgesetzt.

Datenbankarchitektur

Die wichtigsten Daten von Intectainment, welche die Grundlage für das System bilden, sind unten dargestellt. DatabaseModel.PNGAbb. 1: Vereinfachtes Datenbankmodell von Intectainment

Alle essentiellen Funktionen - Nutzerprofile, Kanäle und Posts sowie deren Erweiterungen (namentlich Abonnements, Kategorien und das Merken von Veröffentlichungen) - werden so wie hier dargestellt realisiert. Die Darstellung umfasst jedoch nur die Grundlagen des Backend-Systems und besitzt somit keinen Anspruch auf Vollständigkeit.

Wichtige Abläufe

Erstellen von Kanälen

Jeder Nutzer kann Kanäle erstellen, die gemeinschaftlich von allen Mitarbeitern des Unternehmens genutzt und betrieben werden. Den Kanälen kann bei ihrer Erstellung eine Kategorie zugewiesen werden (z. B. C++, IoT, Web-Development usw.), die die Suche nach und das Entdecken von Kanälen erleichtert. Wie bereits erwähnt, werden alle Kanäle nicht von einzelnen Usern, sondern von der gesamten Mitarbeiterschaft betrieben. Das bedeutet, dass jeder angemeldete Nutzer auf einem beliebigen Kanal Posts verfassen und veröffentlichen kann. Dies soll dabei helfen, dass jeder Nutzer Texte zu für ihn interessanten Themen verfassen kann und keine Konkurrenz zwischen verschiedenen Kanälen zum gleichen Themea entsteht.

Kanalansicht und -navigation

Kanalansicht.PNGAbb. 3: Beispielansicht eines Kanals inklusive der neuesten Posts

Wählt man einen Kanal aus, wird eine Vorschau der aktuellsten Posts angezeigt, welche die ersten Zeilen des Textes umfasst. Über die Schaltfläche "Zum Post" lässt sich der Text in voller Länge aufrufen. Dort kann man diesen auch als Favoriten markieren und ggf. bearbeiten. Als angemeldeter Nutzer kann man Kanäle abonnieren bzw. deabonnieren, aber auch Posts erstellen und auf dem entsprechenden Kanal veröffentlichen. Ist man der Ersteller des Kanals, kann man auch die Einstellungen (z. B. Beschreibung, Kategorie und Kanalbild) anpassen.

Erstellen und Bearbeiten von Posts

Posterstellung.PNGAbb. 4: Beispielansicht eines Posts während der Erstellung

Nach der Auswahl des Kanals, auf welchem der entsprechende Post erscheinen soll, kann der Nutzer mithilfe der Markdown-Syntax einen Text verfassen, welcher in Echtzeit zu HTML konvertiert und neben dem Eingabefeld angezeigt wird. Für das Hochladen von Bildern gibt es eine eigene Schaltfläche; mit dieser kann man Bilder auf dem genutzten Server hochladen und über einen eigens dafür generierten Link im Text einbinden. Alternativ ist auch das Einbinden ein Bildern aus externen Quellen möglich. Bei der Veröffentlichung wird der Posts als Markdown-Datei auf dem Server gespeichert. In der Datenbank wird zudem eine Verlinkung zu der Datei eingetragen, welche zusätzliche Informationen wie das Datum der Erstellung, den Kanal und das Datum der letzten Bearbeitung speichert. Auch nach der Veröffentlichung kann der User, welcher den Post erstellt hat, diesen in beliebigem Maße bearbeiten bzw. löschen.

Redaktion und Moderation

Um die Verwaltung des Systems kümmert sich mit den Administratoren auch eine Redaktion. Diese ist die einzige Instanz, welche - neben dem entsprechenden Nutzer - Posts und Kanäle bearbeiten kann.

Erweiterungsmöglichkeiten

Intectainment stellt als soziale Plattform ein Projekt mit vielen verschiedenen Erweiterungsmöglichkeiten dar, weswegen im folgenden Abschnitt nur einige, besonders bedeutsame beleuchtet werden können.

Nutzung auf Displays

Als Sammelpunkt für Informationen über und Geschehnisse im Unternehmen wäre auch die Nutzung von Intectainment auf Bildschirmen (z. B. im Eingangsbereich oder auf den Gängen der jeweiligen Firma) ohne Nutzerinput denkbar. Ein eigens für diese Aufgabe eingerichtetes Dashboard würde die aktuell wichtigsten Informationen bereitstellen. Diese Bildschirme könnten für verschiedene Nutzergruppen angepasst werden: während neue Kunden sich einen Überblick über das Unternehmen verschaffen wollen, sind für Entwickler Updates von Projekten oder Änderungen im Zeitplan eher von Bedeutung. Die Positionierung der Displays im Gebäude wäre dann von der entsprechenden Zielgruppe abhängig.

About

Intectainment ist ein Infotainmentsystem, welches in Zusammenarbeit mit der intecsoft group entstanden ist und den Informationsaustausch zwischen Kollegen verbessern soll.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Dokumentation Firmenprojekt im SRZ: Intectainment - communication is key

Intectainment

Ziel des Projektes

Intectainment ist ein Infotainment-System, das, ähnlich zu anderen sozialen Netzwerken, Kommunikation und das Veröffentlichen von Inhalten ermöglicht. Dazu kann jeder Nutzer einen Kanal (ggf. mit Beschreibung) erstellen, auf dem er Informationen herausgibt. Diese Kanäle können von anderen Usern abonniert werden, welche sich die entsprechenden Zusammenhänge auf ihren Startseiten anzeigen lassen können. Jede Startseite besteht aus einzelnen Kacheln, welche Posts abonnierter Kanäle anzeigen; somit ist auch jede Startseite individuell und für den entsprechenden Nutzer angepasst. Alle Posts eines jeden Kanals sind ähnlich strukturiert: mithilfe der Markdown-Syntax lassen sich einfache und übersichtliche Texte schreiben, in denen sich auch Formatierungen, Links, Bilder usw. einbinden lassen. Weitere Funktionen umfassen das Merken und spätere Abrufen von Posts sowie das Redigieren (insb. durch Löschen) von Posts durch eine Redaktion. Intectainment soll den Austausch zwischen Mitarbeitern in einer Firma unterstützen und verbessern.

Deployment

Anforderungen

Intectainment benötigt eine SQL-Datenbankanbindung, eine Python Runtime (getestet auf Python 3.10) sowie einen LDAP-Server zur Nutzerauthentifizierung.

Lokales Aufsetzten für Development

  1. Installieren der Python-Bibliotheken
pip install -r requirements-dev.txt
  1. Setzen der Umgebungsvariablen (siehe Konfiguration)

  2. Zum starten folgenden Befehl ausführen:

    • beim erstmaligen Ausführen wird die Datenbank aufgesetzt
python run.py

Für ein richtiges Deployment sollte nicht der flaskinterne Webserver, sondern das Webserverinterface uWSGI verwendet werden. Eine Beispielimplementation mit NGINX ist auch in der Production Dockerfile einzusehen.

Aufsetzen per Docker

docker build -f "Dockerfile.prod" -t intectainment:latest .
docker run -p 80:80 --env INTECTAINMENT_LDAP_SERVER=ldap://localhost -d intectainment

Für die volle Liste von env-Parametern siehe auch Konfiguration. Um Posts und Bilder dauerhaft zu speichern muss der Pfad /Intectainment/Intectainment/content als Volume festgelegt werden.

Aufsetzen mit docker-compose

In der Standardeinstellung wird ein Intectainment-Server sowohl als auch ein LDAP-Server mit Admin-Panel aufgesetzt. Um die Installation anzupassen müssen einfach die Enstellungen in der docker compose-Datei bearbeitet werden.

docker-compose up

Konfiguration

Die Einstellungen können sowohl durch systemweite Umgebungsvariablen als auch in der .env-Datei festgelegt werden. Existiert eine systemweite Umgebungsvariable so überschreibt diese den Wert welcher in der .env-Datei festgelegt wird.

NameBeschreibungDefault Wert
INTECTAINMENT_DB_URIDie Database-URI dient zur Verbindung zur Datenbank. Für Kompatibilität siehe auch SqlAlchemy-URIssqlite:///content/database.db
INTECTAINMENT_SECRETFlask verwendet diesen Wert zur Verschlüsselung von Sessions o.ä. Sollte auf jeden Fall geheim beiben
INTECTAINMENT_LDAP_SERVERURL für den LDAP-Server zur Nutzerauthentifizierung
INTECTAINMENT_LDAP_ROOTSearch Base DN für alle Operationendc=intecsoft,dc=de
INTECTAINMENT_LDAP_USER_DNSearch Path für Nutzerou=users
INTECTAINMENT_LDAP_GROUP_DNSearch Path für Gruppenou=groups
INTECTAINMENT_LDAP_USER_IDNutzer RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_IDGruppen RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_OBJ_CLASSobject-class der Gruppen zur NutzerauthentifizierungposixGroup
INTECTAINMENT_LDAP_GROUP_MEMBER_ATTRAttribut einer Gruppe welches die zugewiesenen Nutzer beinhaltetmemberUid
INTECTAINMENT_LDAP_PERMISSIONSEin python dict welches einen LDAP-Gruppen-Namen zu einem Permission-Level mappt{'user': 10, 'moderator': 100, 'admin': 255}
INTECTAINMENT_LDAP_ELEVATED_USERUser-DN welche zur Berechtigungs-Bestimmung benötigt wird
INTECTAINMENT_LDAP_ELEVATED_PWDPasswort für den elevated user

Einfügung eines Testdatensatzes

Durch das Ausführen der Example-Content-Datei werden einige Beispieldatensätze eingefügt die zur Demonstration des Projektes verwendet werden können.

Umsetzung

Libraries und Frameworks

Die Backend-Verwaltung wird mithilfe des Frameworks Flask und dessen Erweiterung Flask-SQLAlchemy gestaltet. Flask ermöglicht das dynamische Erstellen von Websites und das Abrufen/Eintragen von Informationen aus bzw. in einer Datenbank mit Nutzung von Python-Code. Wir haben uns für die Nutzung des Frameworks entschieden, da es das Anzeigen von gleichförmigen, aber unterschiedlichen Daten (also z. B. Posts, Kanäle und Dashboards, welche alle der gleichen Struktur folgen, jedoch trotzdem verschiedene Eigenschaften haben) deutlich vereinfacht.

Zur Nutzerauthentifizierung und Berechtigungsbestimmung verwenden wir LDAP.

Das Frontend basiert hauptsächlich auf dem Framework Bootstrap 5.

Die live-Übersetzung von Markdown in HTML wurde mit dem Converter Showdown umgesetzt.

Datenbankarchitektur

Die wichtigsten Daten von Intectainment, welche die Grundlage für das System bilden, sind unten dargestellt. DatabaseModel.PNGAbb. 1: Vereinfachtes Datenbankmodell von Intectainment

Alle essentiellen Funktionen - Nutzerprofile, Kanäle und Posts sowie deren Erweiterungen (namentlich Abonnements, Kategorien und das Merken von Veröffentlichungen) - werden so wie hier dargestellt realisiert. Die Darstellung umfasst jedoch nur die Grundlagen des Backend-Systems und besitzt somit keinen Anspruch auf Vollständigkeit.

Wichtige Abläufe

Erstellen von Kanälen

Jeder Nutzer kann Kanäle erstellen, die gemeinschaftlich von allen Mitarbeitern des Unternehmens genutzt und betrieben werden. Den Kanälen kann bei ihrer Erstellung eine Kategorie zugewiesen werden (z. B. C++, IoT, Web-Development usw.), die die Suche nach und das Entdecken von Kanälen erleichtert. Wie bereits erwähnt, werden alle Kanäle nicht von einzelnen Usern, sondern von der gesamten Mitarbeiterschaft betrieben. Das bedeutet, dass jeder angemeldete Nutzer auf einem beliebigen Kanal Posts verfassen und veröffentlichen kann. Dies soll dabei helfen, dass jeder Nutzer Texte zu für ihn interessanten Themen verfassen kann und keine Konkurrenz zwischen verschiedenen Kanälen zum gleichen Themea entsteht.

Kanalansicht und -navigation

Kanalansicht.PNGAbb. 3: Beispielansicht eines Kanals inklusive der neuesten Posts

Wählt man einen Kanal aus, wird eine Vorschau der aktuellsten Posts angezeigt, welche die ersten Zeilen des Textes umfasst. Über die Schaltfläche "Zum Post" lässt sich der Text in voller Länge aufrufen. Dort kann man diesen auch als Favoriten markieren und ggf. bearbeiten. Als angemeldeter Nutzer kann man Kanäle abonnieren bzw. deabonnieren, aber auch Posts erstellen und auf dem entsprechenden Kanal veröffentlichen. Ist man der Ersteller des Kanals, kann man auch die Einstellungen (z. B. Beschreibung, Kategorie und Kanalbild) anpassen.

Erstellen und Bearbeiten von Posts

Posterstellung.PNGAbb. 4: Beispielansicht eines Posts während der Erstellung

Nach der Auswahl des Kanals, auf welchem der entsprechende Post erscheinen soll, kann der Nutzer mithilfe der Markdown-Syntax einen Text verfassen, welcher in Echtzeit zu HTML konvertiert und neben dem Eingabefeld angezeigt wird. Für das Hochladen von Bildern gibt es eine eigene Schaltfläche; mit dieser kann man Bilder auf dem genutzten Server hochladen und über einen eigens dafür generierten Link im Text einbinden. Alternativ ist auch das Einbinden ein Bildern aus externen Quellen möglich. Bei der Veröffentlichung wird der Posts als Markdown-Datei auf dem Server gespeichert. In der Datenbank wird zudem eine Verlinkung zu der Datei eingetragen, welche zusätzliche Informationen wie das Datum der Erstellung, den Kanal und das Datum der letzten Bearbeitung speichert. Auch nach der Veröffentlichung kann der User, welcher den Post erstellt hat, diesen in beliebigem Maße bearbeiten bzw. löschen.

Redaktion und Moderation

Um die Verwaltung des Systems kümmert sich mit den Administratoren auch eine Redaktion. Diese ist die einzige Instanz, welche - neben dem entsprechenden Nutzer - Posts und Kanäle bearbeiten kann.

Erweiterungsmöglichkeiten

Intectainment stellt als soziale Plattform ein Projekt mit vielen verschiedenen Erweiterungsmöglichkeiten dar, weswegen im folgenden Abschnitt nur einige, besonders bedeutsame beleuchtet werden können.

Nutzung auf Displays

Als Sammelpunkt für Informationen über und Geschehnisse im Unternehmen wäre auch die Nutzung von Intectainment auf Bildschirmen (z. B. im Eingangsbereich oder auf den Gängen der jeweiligen Firma) ohne Nutzerinput denkbar. Ein eigens für diese Aufgabe eingerichtetes Dashboard würde die aktuell wichtigsten Informationen bereitstellen. Diese Bildschirme könnten für verschiedene Nutzergruppen angepasst werden: während neue Kunden sich einen Überblick über das Unternehmen verschaffen wollen, sind für Entwickler Updates von Projekten oder Änderungen im Zeitplan eher von Bedeutung. Die Positionierung der Displays im Gebäude wäre dann von der entsprechenden Zielgruppe abhängig.

About

Intectainment ist ein Infotainmentsystem, welches in Zusammenarbeit mit der intecsoft group entstanden ist und den Informationsaustausch zwischen Kollegen verbessern soll.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Dokumentation Firmenprojekt im SRZ: Intectainment - communication is key

Intectainment

Ziel des Projektes

Intectainment ist ein Infotainment-System, das, ähnlich zu anderen sozialen Netzwerken, Kommunikation und das Veröffentlichen von Inhalten ermöglicht. Dazu kann jeder Nutzer einen Kanal (ggf. mit Beschreibung) erstellen, auf dem er Informationen herausgibt. Diese Kanäle können von anderen Usern abonniert werden, welche sich die entsprechenden Zusammenhänge auf ihren Startseiten anzeigen lassen können. Jede Startseite besteht aus einzelnen Kacheln, welche Posts abonnierter Kanäle anzeigen; somit ist auch jede Startseite individuell und für den entsprechenden Nutzer angepasst. Alle Posts eines jeden Kanals sind ähnlich strukturiert: mithilfe der Markdown-Syntax lassen sich einfache und übersichtliche Texte schreiben, in denen sich auch Formatierungen, Links, Bilder usw. einbinden lassen. Weitere Funktionen umfassen das Merken und spätere Abrufen von Posts sowie das Redigieren (insb. durch Löschen) von Posts durch eine Redaktion. Intectainment soll den Austausch zwischen Mitarbeitern in einer Firma unterstützen und verbessern.

Deployment

Anforderungen

Intectainment benötigt eine SQL-Datenbankanbindung, eine Python Runtime (getestet auf Python 3.10) sowie einen LDAP-Server zur Nutzerauthentifizierung.

Lokales Aufsetzten für Development

  1. Installieren der Python-Bibliotheken
pip install -r requirements-dev.txt
  1. Setzen der Umgebungsvariablen (siehe Konfiguration)

  2. Zum starten folgenden Befehl ausführen:

    • beim erstmaligen Ausführen wird die Datenbank aufgesetzt
python run.py

Für ein richtiges Deployment sollte nicht der flaskinterne Webserver, sondern das Webserverinterface uWSGI verwendet werden. Eine Beispielimplementation mit NGINX ist auch in der Production Dockerfile einzusehen.

Aufsetzen per Docker

docker build -f "Dockerfile.prod" -t intectainment:latest .
docker run -p 80:80 --env INTECTAINMENT_LDAP_SERVER=ldap://localhost -d intectainment

Für die volle Liste von env-Parametern siehe auch Konfiguration. Um Posts und Bilder dauerhaft zu speichern muss der Pfad /Intectainment/Intectainment/content als Volume festgelegt werden.

Aufsetzen mit docker-compose

In der Standardeinstellung wird ein Intectainment-Server sowohl als auch ein LDAP-Server mit Admin-Panel aufgesetzt. Um die Installation anzupassen müssen einfach die Enstellungen in der docker compose-Datei bearbeitet werden.

docker-compose up

Konfiguration

Die Einstellungen können sowohl durch systemweite Umgebungsvariablen als auch in der .env-Datei festgelegt werden. Existiert eine systemweite Umgebungsvariable so überschreibt diese den Wert welcher in der .env-Datei festgelegt wird.

NameBeschreibungDefault Wert
INTECTAINMENT_DB_URIDie Database-URI dient zur Verbindung zur Datenbank. Für Kompatibilität siehe auch SqlAlchemy-URIssqlite:///content/database.db
INTECTAINMENT_SECRETFlask verwendet diesen Wert zur Verschlüsselung von Sessions o.ä. Sollte auf jeden Fall geheim beiben
INTECTAINMENT_LDAP_SERVERURL für den LDAP-Server zur Nutzerauthentifizierung
INTECTAINMENT_LDAP_ROOTSearch Base DN für alle Operationendc=intecsoft,dc=de
INTECTAINMENT_LDAP_USER_DNSearch Path für Nutzerou=users
INTECTAINMENT_LDAP_GROUP_DNSearch Path für Gruppenou=groups
INTECTAINMENT_LDAP_USER_IDNutzer RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_IDGruppen RDN-Attributcn
INTECTAINMENT_LDAP_GROUP_OBJ_CLASSobject-class der Gruppen zur NutzerauthentifizierungposixGroup
INTECTAINMENT_LDAP_GROUP_MEMBER_ATTRAttribut einer Gruppe welches die zugewiesenen Nutzer beinhaltetmemberUid
INTECTAINMENT_LDAP_PERMISSIONSEin python dict welches einen LDAP-Gruppen-Namen zu einem Permission-Level mappt{'user': 10, 'moderator': 100, 'admin': 255}
INTECTAINMENT_LDAP_ELEVATED_USERUser-DN welche zur Berechtigungs-Bestimmung benötigt wird
INTECTAINMENT_LDAP_ELEVATED_PWDPasswort für den elevated user

Einfügung eines Testdatensatzes

Durch das Ausführen der Example-Content-Datei werden einige Beispieldatensätze eingefügt die zur Demonstration des Projektes verwendet werden können.

Umsetzung

Libraries und Frameworks

Die Backend-Verwaltung wird mithilfe des Frameworks Flask und dessen Erweiterung Flask-SQLAlchemy gestaltet. Flask ermöglicht das dynamische Erstellen von Websites und das Abrufen/Eintragen von Informationen aus bzw. in einer Datenbank mit Nutzung von Python-Code. Wir haben uns für die Nutzung des Frameworks entschieden, da es das Anzeigen von gleichförmigen, aber unterschiedlichen Daten (also z. B. Posts, Kanäle und Dashboards, welche alle der gleichen Struktur folgen, jedoch trotzdem verschiedene Eigenschaften haben) deutlich vereinfacht.

Zur Nutzerauthentifizierung und Berechtigungsbestimmung verwenden wir LDAP.

Das Frontend basiert hauptsächlich auf dem Framework Bootstrap 5.

Die live-Übersetzung von Markdown in HTML wurde mit dem Converter Showdown umgesetzt.

Datenbankarchitektur

Die wichtigsten Daten von Intectainment, welche die Grundlage für das System bilden, sind unten dargestellt. DatabaseModel.PNGAbb. 1: Vereinfachtes Datenbankmodell von Intectainment

Alle essentiellen Funktionen - Nutzerprofile, Kanäle und Posts sowie deren Erweiterungen (namentlich Abonnements, Kategorien und das Merken von Veröffentlichungen) - werden so wie hier dargestellt realisiert. Die Darstellung umfasst jedoch nur die Grundlagen des Backend-Systems und besitzt somit keinen Anspruch auf Vollständigkeit.

Wichtige Abläufe

Erstellen von Kanälen

Jeder Nutzer kann Kanäle erstellen, die gemeinschaftlich von allen Mitarbeitern des Unternehmens genutzt und betrieben werden. Den Kanälen kann bei ihrer Erstellung eine Kategorie zugewiesen werden (z. B. C++, IoT, Web-Development usw.), die die Suche nach und das Entdecken von Kanälen erleichtert. Wie bereits erwähnt, werden alle Kanäle nicht von einzelnen Usern, sondern von der gesamten Mitarbeiterschaft betrieben. Das bedeutet, dass jeder angemeldete Nutzer auf einem beliebigen Kanal Posts verfassen und veröffentlichen kann. Dies soll dabei helfen, dass jeder Nutzer Texte zu für ihn interessanten Themen verfassen kann und keine Konkurrenz zwischen verschiedenen Kanälen zum gleichen Themea entsteht.

Kanalansicht und -navigation

Kanalansicht.PNGAbb. 3: Beispielansicht eines Kanals inklusive der neuesten Posts

Wählt man einen Kanal aus, wird eine Vorschau der aktuellsten Posts angezeigt, welche die ersten Zeilen des Textes umfasst. Über die Schaltfläche "Zum Post" lässt sich der Text in voller Länge aufrufen. Dort kann man diesen auch als Favoriten markieren und ggf. bearbeiten. Als angemeldeter Nutzer kann man Kanäle abonnieren bzw. deabonnieren, aber auch Posts erstellen und auf dem entsprechenden Kanal veröffentlichen. Ist man der Ersteller des Kanals, kann man auch die Einstellungen (z. B. Beschreibung, Kategorie und Kanalbild) anpassen.

Erstellen und Bearbeiten von Posts

Posterstellung.PNGAbb. 4: Beispielansicht eines Posts während der Erstellung

Nach der Auswahl des Kanals, auf welchem der entsprechende Post erscheinen soll, kann der Nutzer mithilfe der Markdown-Syntax einen Text verfassen, welcher in Echtzeit zu HTML konvertiert und neben dem Eingabefeld angezeigt wird. Für das Hochladen von Bildern gibt es eine eigene Schaltfläche; mit dieser kann man Bilder auf dem genutzten Server hochladen und über einen eigens dafür generierten Link im Text einbinden. Alternativ ist auch das Einbinden ein Bildern aus externen Quellen möglich. Bei der Veröffentlichung wird der Posts als Markdown-Datei auf dem Server gespeichert. In der Datenbank wird zudem eine Verlinkung zu der Datei eingetragen, welche zusätzliche Informationen wie das Datum der Erstellung, den Kanal und das Datum der letzten Bearbeitung speichert. Auch nach der Veröffentlichung kann der User, welcher den Post erstellt hat, diesen in beliebigem Maße bearbeiten bzw. löschen.

Redaktion und Moderation

Um die Verwaltung des Systems kümmert sich mit den Administratoren auch eine Redaktion. Diese ist die einzige Instanz, welche - neben dem entsprechenden Nutzer - Posts und Kanäle bearbeiten kann.

Erweiterungsmöglichkeiten

Intectainment stellt als soziale Plattform ein Projekt mit vielen verschiedenen Erweiterungsmöglichkeiten dar, weswegen im folgenden Abschnitt nur einige, besonders bedeutsame beleuchtet werden können.

Nutzung auf Displays

Als Sammelpunkt für Informationen über und Geschehnisse im Unternehmen wäre auch die Nutzung von Intectainment auf Bildschirmen (z. B. im Eingangsbereich oder auf den Gängen der jeweiligen Firma) ohne Nutzerinput denkbar. Ein eigens für diese Aufgabe eingerichtetes Dashboard würde die aktuell wichtigsten Informationen bereitstellen. Diese Bildschirme könnten für verschiedene Nutzergruppen angepasst werden: während neue Kunden sich einen Überblick über das Unternehmen verschaffen wollen, sind für Entwickler Updates von Projekten oder Änderungen im Zeitplan eher von Bedeutung. Die Positionierung der Displays im Gebäude wäre dann von der entsprechenden Zielgruppe abhängig.

About

Intectainment ist ein Infotainmentsystem, welches in Zusammenarbeit mit der intecsoft group entstanden ist und den Informationsaustausch zwischen Kollegen verbessern soll.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages