Die Grundlage: Die richtige Verzeichnisstruktur für eine Odoo-Erweiterung
Bevor wir mit der eigentlichen Entwicklung beginnen, ist es wichtig, die grundlegende Verzeichnisstruktur für eine Odoo-Erweiterung zu verstehen. Odoo erwartet, dass jede Erweiterung (bzw. jedes Modul) einem bestimmten Aufbau folgt, damit sie korrekt geladen und verarbeitet werden kann. Das bedeutet: Auch wenn wir lediglich eine bestehende App – wie die HR-App – anpassen möchten, legen wir unser eigenes, unabhängiges Modul an. So stellen wir sicher, dass wir keine Core-Dateien überschreiben und die Wartbarkeit des Systems erhalten bleibt.
Ein typisches Modulverzeichnis besteht aus folgenden zentralen Komponenten:
my_hr_extension/
├── __init__.py
├── __manifest__.py
├── models/
│ └── employee.py
├── views/
│ └── employee_list_view.xml
Die __manifest__.py: Das Herzstück jedes Moduls
Jedes Odoo-Modul benötigt eine __manifest__.py
-Datei – sie ist sozusagen der Steckbrief deiner Erweiterung. Hier definiert man, was das Modul tut, auf welchen Apps oder Modulen es aufbaut und welche Komponenten beim Laden berücksichtigt werden sollen. Ohne diese Datei erkennt Odoo dein Modul nicht.
Ein Beispiel für unsere HR-Erweiterung könnte so aussehen:
{
'name': 'HR Employee List Extension',
'version': '18.0.1.0.0',
'summary': 'Erweiterung der HR-App um eine benutzerdefinierte Listenansicht und ein Zusatzfeld',
'author': 'Dein Name oder Unternehmen',
'category': 'Human Resources',
'depends': ['hr'],
'data': [
'views/employee_list_view.xml',
],
'installable': True,
'application': False,
}
Erweiterung des Datenmodells: Ein benutzerdefiniertes Feld für Mitarbeiter:innen
Nachdem die Modulstruktur steht und das Manifest definiert ist, erweitern wir nun das Datenmodell der HR-App um ein eigenes benutzerdefiniertes Feld. In unserem Fall möchten wir jedem Mitarbeitereintrag ein zusätzliches Feld hinzufügen – zum Beispiel einen internen „Status“ oder eine simple Kennzeichnung.
Der Schlüssel dabei: Wir erben das bestehende Modell (hr.employee
) und erweitern es über eine eigene Python-Klasse innerhalb unseres Moduls. So bleiben die Standardfunktionalitäten unberührt, und unsere Änderungen sind jederzeit rückbaubar oder anpassbar.
Hier ein Beispielcode, der in der Datei models/employee.py
liegt:
from odoo import models, fields
class Employee(models.Model):
_inherit = 'hr.employee'
custom_status = fields.Char(string='Interner Status')
Anpassung der Benutzeroberfläche: Benutzerdefiniertes Feld
Damit unser neues Feld custom_status
im Odoo-Backend sichtbar wird, müssen wir die Benutzeroberfläche entsprechend anpassen. Dazu definieren wir eine neue XML-Ansicht, in der wir das Feld in der Mitarbeiterlistenansicht anzeigen.
Odoo verwendet XML-Dateien zur Definition von Views. In unserem Modul legen wir unter views/employee_list_view.xml
eine neue View-Datei an:
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_employee_tree_custom" model="ir.ui.view">
<field name="name">hr.employee.tree.custom</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form" />
<field name="arch" type="xml">
<xpath expr="//page[@name='personal_information']" position="inside">
<group string="Meine benutzerdefinierten Felder" name="custom_fields">
<field name="custom_status"/>
</group>
</xpath>
</field>
</record>
</odoo>

Von Kanban zu Liste: Die Standardansicht der Mitarbeiterübersicht umstellen
Standardmäßig zeigt Odoo die Mitarbeiterübersicht der HR-App im Kanban-Layout – mit Kacheln, Bildern und wenigen Details. Für viele Anwendungsfälle ist jedoch eine Listenansicht übersichtlicher und effizienter, z. B. wenn man mit vielen Datensätzen arbeitet oder zusätzliche Felder auf einen Blick sehen möchte.
Zum Glück lässt sich die Standarddarstellung relativ einfach ändern – ohne die bestehende Logik zu überschreiben. Wir nutzen dazu das Prinzip der Aktionserweiterung in Odoo. Ziel ist es, die Standard-Aktion der HR-App so zu verändern, dass beim Öffnen der Mitarbeiterliste automatisch die Listenansicht anstelle der Kanban-Ansicht verwendet wird.
Dazu ergänzen wir folgende Definition in unserer XML-Datei (employee_list_view.xml
):
<record id="hr.act_hr_employee_kanban_view" model="ir.actions.act_window.view">
<field name="sequence" eval="15"/>
</record>
<record id="hr.act_hr_employee_tree_view" model="ir.actions.act_window.view">
<field name="sequence" eval="10"/>
</record>

Manifest anpassen: Alles für die Installation vorbereiten
Nachdem wir unser Modul um eine Modell-Erweiterung und eine benutzerdefinierte Ansicht ergänzt haben, müssen wir nun sicherstellen, dass alle relevanten Dateien in der __manifest__.py
-Datei korrekt referenziert sind. Nur so weiß Odoo, welche Komponenten geladen werden sollen.
Falls du dem Beispiel aus den vorherigen Abschnitten gefolgt bist, sollte deine __manifest__.py
nun so oder so ähnlich aussehen:
{
'name': 'HR Employee List Extension',
'version': '15.0.1.0.0',
'summary': 'Erweiterung der HR-App um eine benutzerdefinierte Listenansicht und ein Zusatzfeld',
'author': 'Dein Name oder Unternehmen',
'category': 'Human Resources',
'depends': ['hr'],
'data': [
'views/employee_list_view.xml',
],
'installable': True,
'application': False,
}
Nicht vergessen: Die __init__.py-Dateien – das Bindeglied zwischen Odoo und deinem Code
Damit Odoo überhaupt erkennt, welche Python-Dateien in deinem Modul enthalten sind und ausgeführt werden sollen, müssen entsprechende __init__.py
-Dateien vorhanden sein. Diese Dateien dienen als Einstiegspunkte für das Python-Modul und stellen sicher, dass deine Klassen und Erweiterungen korrekt geladen werden.
Du brauchst zwei __init__.py
-Dateien:
-
Im Stammverzeichnis deines Moduls (
my_hr_extension/__init__.py
) - Im
models/
-Verzeichnis selbst (my_hr_extension/models/__init__.py
)
# my_hr_extension/__init__.py
# Hier importierst du den models-Ordner, damit Odoo weiß, dass sich darin ausführbarer Code befindet:
from . import models
# my_hr_extension/models/__init__.py
# Hier importierst du die konkreten Python-Dateien mit den Modell-Erweiterungen. In unserem Fall:
from . import employee
Installation des Moduls: Die Erweiterung in Odoo aktivieren
Nachdem wir nun unser Modul vollständig aufgebaut haben – inklusive Datenmodell, Views, Manifest und Initialisierungsdateien – fehlt nur noch ein letzter Schritt: die Installation in Odoo.
Hier sind die Schritte zur erfolgreichen Aktivierung deiner Erweiterung:
1. Modulverzeichnis platzieren
Kopiere deinen Modulordner (z. B. my_hr_extension/
) in das Odoo-Addons-Verzeichnis. Der Pfad kann je nach System unterschiedlich sein, häufig liegt er z. B. unter:
/odoo/custom_addons/
Falls du ein eigenes Verzeichnis verwendest, achte darauf, dass dieses in der odoo.conf
-Datei unter addons_path
eingetragen ist.
2. Server neu starten
Starte deinen Odoo-Server neu, damit das neue Modul erkannt wird:
./odoo-bin -d deine_datenbank -u my_hr_extension
Alternativ kannst du den Server einfach neu starten und das Modul später manuell über das Backend installieren.
3. Modul im Backend sichtbar machen
Melde dich im Odoo-Backend an, wechsle in den App Store (Menüpunkt Apps) und klicke auf "Apps aktualisieren" bzw. "Update Apps List" (du musst ggf. den Entwicklermodus aktivieren).
Danach kannst du im Suchfeld nach deinem Modulnamen suchen – z. B. „HR Employee List Extension“ – und es über einen Klick auf "Installieren" aktivieren.
4. Änderungen überprüfen
Sobald die Installation abgeschlossen ist:
-
Öffne die HR-App → Mitarbeiterübersicht.
-
Die Standard-Kanban-Ansicht sollte nun durch die Listenansicht ersetzt sein.
-
Dein benutzerdefiniertes Feld (z. B.
Interner Status
) sollte als Spalte sichtbar sein.
Wenn du die Ansicht oder Datenstruktur später änderst, kannst du dein Modul jederzeit mit folgendem Befehl aktualisieren:
./odoo-bin -d deine_datenbank -u my_hr_extension
Fazit: Saubere Odoo-Erweiterungen für nachhaltige Entwicklungen
Mit dieser einfachen, aber wirkungsvollen Erweiterung haben wir gezeigt, wie sich bestehende Odoo-Module gezielt und sauber anpassen lassen – ganz ohne die Kernlogik zu verändern. Durch die modulare Struktur und das Vererbungssystem von Odoo ist es möglich, Funktionalität flexibel zu erweitern und gleichzeitig update-sicher zu bleiben.
Wir haben Schritt für Schritt gelernt:
-
wie eine eigene Odoo-Erweiterung strukturiert ist,
-
wie man das Datenmodell eines bestehenden Moduls erweitert,
-
wie Ansichten angepasst und Standardverhalten (z. B. die Kanban-Ansicht) verändert werden können,
-
und wie man das eigene Modul korrekt installiert und im Backend aktiviert.
Diese Vorgehensweise ist nicht nur technisch sauber, sondern auch langfristig wartbar – besonders in größeren Projekten oder produktiven Odoo-Installationen. Statt direkt im Core-Code Änderungen vorzunehmen, setzt du auf eine klar abgegrenzte Erweiterung, die unabhängig gepflegt und bei Bedarf leicht angepasst werden kann.
Ob du nur kleine Optimierungen einführen oder komplexe Funktionen integrieren willst: Der modulare Weg ist in Odoo immer der nachhaltigste.