# Modul-Integration in das *risks* Projekt

Dieses Dokument beschreibt, wie weitere Apps (z. B. **ToDo**) in dein ISO-27001 Risk-Management Projekt (App heißt `risks`) integriert werden.
Alle Apps im Bestand sind/werden nach demselben Muster aufgebaut und registrieren sich selbst in der Navigation, wenn sie installiert sind und vorhandene Permissions passen.

---

## Schritte zur Einbindung einer neuen App

### 1. Submodul hinzufügen

Füge das gewünschte App-Repo als Git-Submodul hinzu:

```bash
git submodule add <git-url-der-app> <ziel-verzeichnis>
```

Beispiel für ToDo-App:

```bash
git submodule add https://skulldev.de/Skull-IT/todo-app.git todo
```

> Wichtig: Der Zielpfad sollte dem App-Namen entsprechen (`todo` etc).

---

### 2. App in `INSTALLED_APPS` aktivieren

In deinem Projekt unter `config/settings.py` oder dem entsprechenden Settings-Modul:

```python
INSTALLED_APPS = [
    # bestehende Apps
    "risks",
    "todo",  # neu hinzugefügte App
    # … weitere
]
```

Damit registriert Django Models, Migrations, Templates & static files der App.

---

### 3. URLs einbinden

In deiner zentralen `urls.py` (unter `config/` oder wo dein Root URLs definiert sind) muss die neue App eingebunden werden:

```python
from django.urls import include, path

urlpatterns = [
    # …
    path("todo/", include("todo.urls", namespace="todo")),
]
```

Damit werden die Views der App über `/todo/` erreichbar.

---

### 4. Navigation (automatisch)

#### Registry-Ansatz

* In `risks` existiert eine Navigation-Registry.
* Jede App registriert sich selbst in dieser Registry mit Label, URL-Name, und erforderlicher Permission.
* `risks` rendert automatisch alle registrierten Navigationseinträge im Menü, sofern installiert + Benutzer berechtigt.

#### Beispiel: Registrierung in der neuen App (`apps.py`)

```python
from django.apps import AppConfig

class TodoConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "todo"

    def ready(self):
        try:
            from risks.navigation_registry import register
            register(
                label="ToDo",
                url_name="todo:list",         # Name, wie in todo.urls
                permission="todo.view_task",  # Permission nötig
            )
        except ImportError:
            # risks App ist nicht installiert → nichts machen
            pass
```

#### Verhalten

* Ist die App **nicht installiert** → kein Menüpunkt
* Ist sie **installiert, aber User hat keine entsprechende Permission** → kein Menüpunkt
* Ist sie **installiert und hat User die Permission** → Menüpunkt erscheint automatisch

---

### 5. Base-Template-Vererbung

* Läuft die neue App **allein** (Standalone/Demo) → sie liefert ein eigenes `base.html`.
* Wenn sie im `risks` Projekt eingebunden ist → sie erbt das `base.html` aus `risks`.

Dies funktioniert über die Reihenfolge in `INSTALLED_APPS` oder über ein optionales Setting wie z. B. `TODO_BASE_TEMPLATE`, welches gesetzt werden kann, wenn `risks` das Base vorgibt.

---

### 6. Migration & Datenbankstruktur

Nach Einbindung:

```bash
python manage.py migrate
```

Stelle sicher, dass Migrationen der neuen App mitlaufen und keine Konflikte bestehen.

---

### 7. Permissions setzen

Die neue App definiert eigene Permissions via `Meta` in `models` oder explizit via Migration.

Beispiele:

* `todo.view_task` → um den Menüpunkt und Zugriffe zu erlauben
* Weitere wie `todo.add_task`, `todo.change_task`, `todo.delete_task`

Rechte können über Django Admin oder Migration vergeben werden.

---

### 8. Tests ausführen

Sicherheitshalber:

```bash
python manage.py test todo
```

So siehst du, ob die App sauber arbeitet und integriert ist.

---

### 9. Checkliste

* [ ] Submodul hinzugefügt
* [ ] App in `INSTALLED_APPS` eingetragen
* [ ] URL-Einbindung in Root URLs umgesetzt
* [ ] Neue App registriert sich in der Navigation via Registry
* [ ] Migrationen ausgeführt
* [ ] Permissions gesetzt
* [ ] Navigation erscheint/dem User sichtbar, wo nötig