# Roundup (Bugtracker)

Roundup ist ein freier, webbasierter Issuetracker mit umfassender Mail-Schnittstelle. Er ist in der Programmiersprache Python implementiert und leicht erweiterbar. Von seiner Community wird Roundup als Issue-Tracker bezeichnet, da sich das Konzept nicht nur auf Bugs, sondern auf Vorgänge bzw. Aufgaben im Allgemeinen anwenden lässt.

## Entwicklung

Roundup basiert auf einem preisgekrönten Design von Ka-Ping Yee und wurde lange unter der Leitung von Richard Jones weiterentwickelt. Inzwischen gibt es viele weitere Entwickler wie u. a. Ezio Melotti, Berndhard Reiter, Ralf Schlatterbeck, Anatoly Techtonik und John P. Rouillard. Anatoly Techtonik gab die am 11. Januar 2016 erschienene Version 1.5.1 heraus; Rouillard die Versionen 1.6.0 (Juli 2018) – 2.3.0 (Juli 2023).

## Funktionsumfang

In der Standard-Konfiguration hat Roundup folgenden Funktionsumfang:
* eine webbasierte Oberfläche zur Bearbeitung der Vorgänge bzw. Aufgaben (engl. issues), und zur Suche nach solchen. Ab Version 1.4.21 enthält Roundup zusätzlich eine Vorlage (engl. Template) mit responsive Design auf der Basis von Bootstrap
* ein Mail-Gateway, das es erlaubt, Vorgänge bzw. Aufgaben zu erstellen und zu bearbeiten
* eine Datenbank-Abstraktionsschicht, die gegenwärtig u. a. PostgreSQL, MySQL und SQLite unterstützt
* jeder Vorgang bzw. jede Aufgabe hat seine eigene Interessentenliste (nosy-Liste), die zur Benachrichtigung per E-Mail verwendet wird
* ein auf Rollen, Klassen und Objekten basierendes Berechtigungssystem
* einen interaktiven Kommandozeilen-Interpreter (engl. shell) zum Erstellen und Einspielen von Backups sowie zum Bearbeiten der Objekte
Der Funktionsumfang lässt sich leicht durch selbst programmierte Erweiterungen (sogenannte Detektoren; siehe unten) an neue Anforderungen anpassen.
Roundup lässt sich sowohl als eigenständiger Serverprozess betreiben als auch über mod python oder (notfalls) als CGI-Skript mit Hilfe von z. B. dem Webserver Programm apache.

## Konzepte

Roundup ist in hohem Maße anpassbar:

### Datenbankschema

Das Schema beschreibt Klassen von Objekten. In dem als Vorlage mitgelieferten Muster namens classic gibt es zum Beispiel die Klassen issue (Vorgang), msg (Nachricht), user (Benutzer), file (Dateianhang). Leicht lassen sich weitere Klassen (z. B. Kunde, Produkt, Standort) oder Beziehungen (engl. link) zwischen Klassen ergänzen.
Das Datenbankschema wird in einer Python-Datei im Wurzelverzeichnis der jeweiligen Bugtracker-Instanz festgelegt; dieses Schema wird von Roundup beim Start (bzw., wenn nicht als eigenständiger Serverprozess betrieben), des Apache-Servers eingelesen. Wenn dabei Änderungen festgestellt werden (z. B. in Form neuer Felder), werden die Tabellen der zugrundeliegenden relationalen Datenbank automatisch erweitert.

### Seiten-Templates

Roundup verwendet die von Zope bekannte Template Attribute Language (TAL), um HTML- oder XHTML-Seiten zu erzeugen. Manche Templates (Schablonen) sind universell verwendbar, wie z. B. _generic.index.html, das (berechtigten Usern) die Bearbeitung der Einträge aller Klassen erlaubt, die über kein eigenes index-Template verfügen.
Trifft eine Anfrage für „issue123“ ein, so wird zunächst dieser Designator in die Klasse „issue“ und die ID „123“ zerlegt; als Template-Auswahl wird „item“ angenommen, sofern kein anderes angegeben wurde. Es wird zunächst nach der Template-Datei issue.item.html gesucht; ist diese nicht vorhanden, wird alternativ _generic.item.html verwendet. Nur falls dieses auch fehlt, tritt ein Fehler auf.

### Detektoren

Viele Funktionen von Roundup, incl. mancher Standardfunktionen, werden mit Hilfe von sogenannten Detektoren realisiert, die im Unterverzeichnis „detectors“ der Tracker-Instanz abgelegt werden. Es handelt sich um Python-Funktionen, denen das zu ändernde (soweit schon vorhanden) Objekt sowie die Änderungen an den Attributwerten zur Verfügung stehen.
Detektoren werden in Auditoren und Reaktoren unterteilt. Die Auditoren dienen in erster Linie dazu, vor der Ausführung einer Transaktion automatisch bestimmte Änderungen vorzunehmen. Zum Beispiel wird in der Standardkonfiguration ein Anwender (engl. user) zur Interessenten-Liste (engl. nosy list) hinzugefügt, wenn ihm ein Vorgang bzw. eine Aufgabe (engl. issue) zur Bearbeitung zugewiesen wird. Es können auch unerlaubte Änderungen zurückgewiesen und (zumindest in der Web-Oberfläche) der Anwender zur Korrektur seiner Eingaben aufgefordert werden. Die Reaktoren werden nach den Auditoren ausgeführt und dienen z. B. dazu, neue Nachrichten bzw. Kommentare in einem Vorgang automatisch per E-Mail an alle Mitglieder der jeweiligen Interessenten-Liste zu verschicken.
Detektoren werden ausgelöst, wenn eine der Aktionen
* „create“ (erzeugen eines Objekts)
* „set“ (ändern von Attributen)
* „retire“ (deaktivieren) und
* „restore“ (reaktivieren)
ausgeführt (bzw. der Versuch unternommen) wird. Sie lassen sich verwenden, um auch komplexe Verwaltungsarbeitsabläufe (engl. workflow) abzubilden.

### Erweiterungen

Im Instanz-Unterverzeichnis „extensions“ können weitere Funktionen abgelegt werden, die für erweiterte Funktionalitäten benötigt werden, die z. B. mit den Mitteln der TAL allein nicht realisierbar sind; auch neue Aktionen sind möglich.
Module mit Funktionen, die sowohl von Detektoren als auch von Erweiterungen verwendet werden können, können im Instanz-Unterverzeichnis „lib“ abgelegt werden.