Roundup: Unterschied zwischen den Versionen
KKeine Bearbeitungszusammenfassung |
|||
(12 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt) | |||
Zeile 3: | Zeile 3: | ||
Die allgemeine Installationsanleitung für roundup findet man unter http://roundup-tracker.org/docs/installation.html | Die allgemeine Installationsanleitung für roundup findet man unter http://roundup-tracker.org/docs/installation.html | ||
Im Folgenden soll die Installation bei Hostsharing in einem | Im Folgenden soll die Installation bei Hostsharing in einem WEB-Paket im cgi-bin einer Domain '''ohne eigene httpd.conf''' beschrieben werden. | ||
Das Beispiel beschreibt die nötigen Schritte für den Domain-Admin innerhalb des | Das Beispiel beschreibt die nötigen Schritte für den Domain-Admin innerhalb des WEB-Paketes. | ||
=== Neueste Quellen per | === Neueste Quellen per Mercurial besorgen === | ||
<syntaxhighlight lang=shell> | |||
hg clone http://hg.code.sf.net/p/roundup/code /home/pacs/xyz00/users/USERNAME/roundup | |||
</syntaxhighlight> | |||
=== Installation der tracker-Software === | === Installation der tracker-Software === | ||
<syntaxhighlight lang=shell> | |||
python setup.py install --prefix=/home/pacs/xyz00/users/USERNAME/roundup/install --install-scripts=/home/pacs/xyz00/users/USERNAME/roundup/bin | |||
</syntaxhighlight> | |||
=== Anpassen der Umgebungsvariablen === | === Anpassen der Umgebungsvariablen === | ||
Zeile 19: | Zeile 23: | ||
In der bash-Umgebung: | In der bash-Umgebung: | ||
<syntaxhighlight lang=shell> | |||
export PATH=$PATH:/home/pacs/xyz00/users/USERNAME/roundup/bin | |||
export PYTHONPATH=$PYTHONPATH:/home/pacs/xyz00/users/USERNAME/roundup/install/lib/python2.5/site-packages/ | |||
</syntaxhighlight> | |||
Am besten trägt man diese beiden Zeilen in der Datei <code>.bash_profile</code> ein, dann stehen die Pfade beim starten der Shell direkt zur Verfügung: | Am besten trägt man diese beiden Zeilen in der Datei <code>.bash_profile</code> ein, dann stehen die Pfade beim starten der Shell direkt zur Verfügung: | ||
<syntaxhighlight lang=shell> | |||
nano ~/.bash_profile | |||
</syntaxhighlight> | |||
=== Installation eines neuen Trackers === | === Installation eines neuen Trackers === | ||
<syntaxhighlight lang=shell> | |||
/home/pacs/xyz00/users/USERNAME/roundup/bin/roundup-admin install | |||
</syntaxhighlight> | |||
bzw. | bzw. | ||
<syntaxhighlight lang=shell> | |||
roundup-admin install | |||
</syntaxhighlight> | |||
(Wenn man die Umgebungsvariablen wie im Abschnitt zuvor beschrieben konfiguriert hat.) | (Wenn man die Umgebungsvariablen wie im Abschnitt zuvor beschrieben konfiguriert hat.) | ||
Zeile 39: | Zeile 50: | ||
Dabei werden folgende Eingaben abgefragt (Eingaben nur beispielhaft): | Dabei werden folgende Eingaben abgefragt (Eingaben nur beispielhaft): | ||
<syntaxhighlight lang=ini line> | |||
Enter tracker home: /pfad/zum/tracker/home | |||
Templates: minimal, classic | |||
Select template [classic]: classic | |||
Back ends: anydbm, mysql, sqlite, postgresql | |||
Select backend [anydbm]: sqlite | |||
</syntaxhighlight> | |||
"tracker home" bezeichnet dabei ein Verzeichnis das man zuvor in seinem Home angelegt hat. Man kann auch mehrere Tracker-Instanzen parallel betreiben, die eigene "tracker home" bekommen. | |||
Beispiel: ~/roundup-tracker-projects/my-first-tracker | |||
Beim Betrieb mit Mysql (um Backups zu ermöglichen die sicher konsistent sind): | |||
* bei "Select backend" mysql angeben | |||
* mit hsadmin einen DB-User erzeugen | |||
* mit hsadmin eine DB erzeugen und den DB-User zuweisen | |||
* DB, DB-User und Passwort des DB-Users sowie localhost als host (siehe nachfolgender Abschnitt) in config.ini in der Sektion rdbms angeben. | |||
==== Tracker anpassen ==== | ==== Tracker anpassen ==== | ||
<syntaxhighlight lang=shell> | |||
nano /home/pacs/xyz00/users/USERNAME/roundup/tracker/TRACKERNAME/config.ini | |||
</syntaxhighlight> | |||
Hier müssen zumindest diese Variablen angepasst werden: | Hier müssen zumindest diese Variablen angepasst werden: | ||
<syntaxhighlight lang=ini line> | |||
admin_email = mail@example.com | |||
dispatcher_email = mail@example.com | |||
name = TRACKERBESCHREIBUNG | |||
web = http(s)://SUBDOMAIN.example.com/ | |||
email = mail@example.com | |||
domain = example.com | |||
host = localhost | |||
</syntaxhighlight> | |||
Optional kann man das logging in eine Datei aktivieren: | Optional kann man das logging in eine Datei aktivieren: | ||
<syntaxhighlight lang=ini line> | |||
filename = /home/pacs/xyz00/users/USERNAME/TRACKERNAME.log | |||
</syntaxhighlight> | |||
==== Datenbank initialisieren ==== | ==== Datenbank initialisieren ==== | ||
<syntaxhighlight lang=shell> | |||
/home/pacs/xyz00/users/USERNAME/roundup/bin/roundup-admin initialise | |||
</syntaxhighlight> | |||
bzw. | bzw. | ||
<syntaxhighlight lang=shell> | |||
roundup-admin initialise | |||
</syntaxhighlight> | |||
( | (Nachdem man die Umgebungsvariablen wie oben beschrieben konfiguriert hat.) | ||
=== Subdomain anlegen === | === Subdomain anlegen === | ||
< | <syntaxhighlight lang=shell> | ||
mkdir /home/pacs/xyz00/users/USERNAME/doms/example.com/subs(-ssl)/Subdomain | |||
</syntaxhighlight> | |||
Ein eigenes cgi-verzeichnis für die neue subdomain: | Ein eigenes cgi-verzeichnis für die neue subdomain: | ||
< | <syntaxhighlight lang=shell> | ||
mkdir /home/pacs/xyz00/users/USERNAME/doms/example.com/cgi(-ssl)/SUBDOMAIN | |||
</syntaxhighlight> | |||
=== Konfiguration '''mit''' eigener httpd.conf === | === Konfiguration '''mit''' eigener httpd.conf === | ||
Zeile 93: | Zeile 123: | ||
==== cgi-frontend kopieren ==== | ==== cgi-frontend kopieren ==== | ||
<syntaxhighlight lang=shell> | |||
cp /home/pacs/xyz00/users/USERNAME/roundup/frontends/roundup.cgi /home/pacs/xyz00/users/USERNAME/doms/example.com/cgi/SUBDOMAIN/ | |||
</syntaxhighlight> | |||
==== cgi-frontend anpassen ==== | ==== cgi-frontend anpassen ==== | ||
< | <syntaxhighlight lang=php line> | ||
# nano /home/pacs/xyz00/users/USERNAME/doms/example.com/cgi/SUBDOMAIN/roundup.cgi | |||
TRACKER_HOMES = { | |||
'TRACKERNAME': '/home/pacs/xyz00/users/USERNAME/roundup/tracker/TRACKERNAME', | |||
} | |||
</syntaxhighlight> | |||
==== .htaccess-Datei für cgi konfigurieren ==== | ==== .htaccess-Datei für cgi konfigurieren ==== | ||
< | <syntaxhighlight lang=apache line> | ||
# nano /home/pacs/xyz00/users/USERNAME/doms/example.com/subs/SUBDOMAIN/.htaccess | |||
RewriteEngine On | |||
RewriteBase / | |||
RewriteRule ^(.*) /cgi-bin/SUBDOMAIN/roundup.cgi/$1 | |||
</syntaxhighlight> | |||
'''!! ENDE ungetester Abschnitt !!''' | '''!! ENDE ungetester Abschnitt !!''' | ||
Zeile 119: | Zeile 155: | ||
Ohne eigene httpd.conf benötigt man einen Wrapper (s. [[Flup]]). | Ohne eigene httpd.conf benötigt man einen Wrapper (s. [[Flup]]). | ||
Dies legt man in seinem cgi- | Dies legt man in seinem cgi(-ssl) für die subdomain als <code>roundup_stub</code> ab: | ||
<syntaxhighlight lang=python line> | |||
#!/usr/bin/env python | |||
import sys | |||
sys.path.append("/home/pacs/'''xyz00'''/users/'''USERNAME'''/roundup/install/lib/python2.7/site-packages") | |||
from flup.server.cgi import WSGIServer | |||
# obtain the WSGI request dispatcher | |||
from roundup.cgi.wsgi_handler import RequestDispatcher | |||
tracker_home = '/home/pacs/'''xyz00'''/users/'''USERNAME'''/roundup/tracker/'''TRACKERNAME'''' | |||
app = RequestDispatcher(tracker_home) | |||
WSGIServer(app).run() | |||
</syntaxhighlight> | |||
Die '''hervorgehobenen Stellen''' sind an die eigenen Gegebenheiten anzupassen. | Die '''hervorgehobenen Stellen''' sind an die eigenen Gegebenheiten anzupassen. | ||
Zeile 135: | Zeile 173: | ||
Anschließend muss man den Wrapper ausführbar machen: | Anschließend muss man den Wrapper ausführbar machen: | ||
<syntaxhighlight lang=shell> | |||
chmod 755 roundup_stub | |||
</syntaxhighlight> | |||
Wenn es Fehlern kommt, kann man debugging-Meldungen an den Browser ausgeben lassen. Dazu ergänzt man unter der Zeile "sys.path.append..." | Wenn es Fehlern kommt, kann man debugging-Meldungen an den Browser ausgeben lassen. Dazu ergänzt man unter der Zeile "sys.path.append..." | ||
<syntaxhighlight lang=javascript line> | |||
import cgitb | |||
cgitb.enable() | |||
</syntaxhighlight> | |||
==== .htaccess-Datei für cgi konfigurieren ==== | ==== .htaccess-Datei für cgi konfigurieren ==== | ||
< | <syntaxhighlight lang=apache line> | ||
# nano /home/pacs/xyz00/users/USERNAME/doms/example.com/subs(ssl)/SUBDOMAIN/.htaccess | |||
RewriteEngine On | |||
RewriteBase / | |||
RewriteRule ^(.*) /cgi-bin/SUBDOMAIN/roundup_stub/$1 | |||
</syntaxhighlight> | |||
== Individualisierung der tracker == | == Individualisierung der tracker == | ||
Zeile 155: | Zeile 199: | ||
Das Datenbank-Schema liegt z.B. unter | Das Datenbank-Schema liegt z.B. unter | ||
<syntaxhighlight lang=shell> | |||
/home/pacs/xyz00/users/USERNAME/tracker/TRACKERNAME/schema.py | |||
</syntaxhighlight> | |||
Die Datenbank-Initialisierungs-Datei liegt unter | Die Datenbank-Initialisierungs-Datei liegt unter | ||
<syntaxhighlight lang=shell> | |||
/home/pacs/xyz00/users/USERNAME/tracker/TRACKERNAME/initial_data.py | |||
</syntaxhighlight> | |||
Zum Übernehmen der Änderungen an der Datenbank muss man die Datenbank neu initialisieren. '''Achtung: Dabei gehen alle Daten in der DB verloren!''' | Zum Übernehmen der Änderungen an der Datenbank muss man die Datenbank neu initialisieren. '''Achtung: Dabei gehen alle Daten in der DB verloren!''' | ||
<syntaxhighlight lang=shell> | |||
roundup-admin initialise | |||
</syntaxhighlight> | |||
Details zur Individualisierung nennt die Unterseite "Docs" -> "Customising Roundup" (http://roundup-tracker.org/docs/customizing.html). | Details zur Individualisierung nennt die Unterseite "Docs" -> "Customising Roundup" (http://roundup-tracker.org/docs/customizing.html). | ||
Zeile 170: | Zeile 220: | ||
Um nur manuell ergänzte Benutzer zuzulassen, muss man der Rolle Anonymous das Recht "Register" nehmen. Das bewerkstelligt man durch auskommentieren der letzten Zeile in diesem Abschnitt der datei <code>/home/pacs/xyz00/users/USERNAME/roundup/tracker/TRACKERNAME/schema.py</code> | Um nur manuell ergänzte Benutzer zuzulassen, muss man der Rolle Anonymous das Recht "Register" nehmen. Das bewerkstelligt man durch auskommentieren der letzten Zeile in diesem Abschnitt der datei <code>/home/pacs/xyz00/users/USERNAME/roundup/tracker/TRACKERNAME/schema.py</code> | ||
<syntaxhighlight lang=python line> | |||
# Assign the appropriate permissions to the anonymous user's Anonymous | |||
# Role. Choices here are: | |||
# - Allow anonymous users to register | |||
db.security.addPermissionToRole('Anonymous', 'Register', 'user') | |||
</syntaxhighlight> | |||
=== Anzeige der issues nur für eingeloggte Benutzer === | === Anzeige der issues nur für eingeloggte Benutzer === | ||
Zeile 179: | Zeile 231: | ||
Damit nur eingeloggte Benutzer die issues (Aufgaben) sehen können, muss man der Rolle Anonymous das Recht "View" nehmen. Das bewerkstelligt man durch auskommentieren der letzten beiden Zeilen in diesem Abschnitt der datei <code>/home/pacs/xyz00/users/USERNAME/roundup/tracker/TRACKERNAME/schema.py</code> | Damit nur eingeloggte Benutzer die issues (Aufgaben) sehen können, muss man der Rolle Anonymous das Recht "View" nehmen. Das bewerkstelligt man durch auskommentieren der letzten beiden Zeilen in diesem Abschnitt der datei <code>/home/pacs/xyz00/users/USERNAME/roundup/tracker/TRACKERNAME/schema.py</code> | ||
<syntaxhighlight lang=python line> | |||
# Allow anonymous users access to view issues (and the related, linked | |||
# information) | |||
for cl in 'issue', 'file', 'msg', 'keyword', 'priority', 'status': | |||
db.security.addPermissionToRole('Anonymous', 'View', cl) | |||
</syntaxhighlight> | |||
=== Logo einfügen === | === Logo einfügen === | ||
Zeile 191: | Zeile 245: | ||
Bearbeitet werden muss die Datei | Bearbeitet werden muss die Datei | ||
<syntaxhighlight lang=shell> | |||
/pfad/zum/tracker/html/page.html | |||
</syntaxhighlight> | |||
in der Tabellenzelle | in der Tabellenzelle | ||
<syntaxhighlight lang=html line> | |||
<td class="page-header-left"><code>&nbsp;</code></td> | |||
</syntaxhighlight> | |||
Wenn ein Logo mit einem Link hinterlegt wird, erscheint standardmäßig ein blauer Rahmen um die Grafik. Das kann unerwünscht sein. Unterdrücken kann man diesen Rahmen mit dem Zusatz | Wenn ein Logo mit einem Link hinterlegt wird, erscheint standardmäßig ein blauer Rahmen um die Grafik. Das kann unerwünscht sein. Unterdrücken kann man diesen Rahmen mit dem Zusatz | ||
<syntaxhighlight lang=html line> | |||
a img | |||
{ | |||
border: none; | |||
} | |||
</syntaxhighlight> | |||
in der Datei | in der Datei <code>/pfad/zum/tracker/html/style.css</code> | ||
Zeile 214: | Zeile 268: | ||
Damit die Priorität etwas hervorsticht, kann man die Kategorien farblich absetzen. Es bietet sich an, eine Legende vor und hinter der Aufgaben (issue) Liste einzufügen. Wir formatieren die Legende später per CSS, daher geben wir ihr auch eine CSS-Klasse mit. | Damit die Priorität etwas hervorsticht, kann man die Kategorien farblich absetzen. Es bietet sich an, eine Legende vor und hinter der Aufgaben (issue) Liste einzufügen. Wir formatieren die Legende später per CSS, daher geben wir ihr auch eine CSS-Klasse mit. | ||
<syntaxhighlight lang=html line> | |||
<table class="color-reference"> | |||
<tr> | <tr> | ||
<td>Legende:</td> | <td>Legende:</td> | ||
Zeile 223: | Zeile 278: | ||
<td class="priority-wish" i18n:translate="">wish</td> | <td class="priority-wish" i18n:translate="">wish</td> | ||
</tr> | </tr> | ||
</table> | |||
</syntaxhighlight> | |||
Dies bewerkstelligt man in der Datei <code>/pfad/zum/tracker/html/issue.index.html</code> | |||
Dies bewerkstelligt man in der Datei | |||
an den Stellen | an den Stellen | ||
<syntaxhighlight lang=html line> | |||
<tal:block tal:define="batch request/batch" tal:condition="context/is_view_ok"> | |||
<table class="list"> | |||
<tr> | <tr> | ||
</syntaxhighlight> | |||
(= über der Aufgaben-Liste) | (= über der Aufgaben-Liste) | ||
und | und | ||
<syntaxhighlight lang=html line> | |||
</metal:index> | </metal:index> | ||
</table> | </table> | ||
<a tal:attributes="href python:request.indexargs_url('issue', | <a tal:attributes="href python:request.indexargs_url('issue', | ||
{'@action':'export_csv'})" i18n:translate="">Download as CSV</a> | {'@action':'export_csv'})" i18n:translate="">Download as CSV</a> | ||
</syntaxhighlight> | |||
(= unter der Aufgaben-Liste) | (= unter der Aufgaben-Liste) | ||
Zeile 249: | Zeile 304: | ||
Der fertige Abschnitt '''über''' der Aufgaben-Liste sieht dann so aus: | Der fertige Abschnitt '''über''' der Aufgaben-Liste sieht dann so aus: | ||
<syntaxhighlight lang=html line> | |||
<code><tal:block tal:define="batch request/batch" tal:condition="context/is_view_ok"> | <code><tal:block tal:define="batch request/batch" tal:condition="context/is_view_ok"> | ||
<table class="color-reference"> | <table class="color-reference"> | ||
Zeile 263: | Zeile 318: | ||
<table class="list"> | <table class="list"> | ||
<tr></code> | <tr></code> | ||
</syntaxhighlight> | |||
Der fertige Abschnitt '''unter''' der Aufgaben-Liste sieht dann so aus: | Der fertige Abschnitt '''unter''' der Aufgaben-Liste sieht dann so aus: | ||
<syntaxhighlight lang=html line> | |||
</metal:index> | |||
</table> | </table> | ||
<table class="color-reference"> | <table class="color-reference"> | ||
Zeile 282: | Zeile 338: | ||
<a tal:attributes="href python:request.indexargs_url('issue', | <a tal:attributes="href python:request.indexargs_url('issue', | ||
{'@action':'export_csv'})" i18n:translate="">Download as CSV</a></code> | {'@action':'export_csv'})" i18n:translate="">Download as CSV</a></code> | ||
</syntaxhighlight> | |||
Damit auch die Aufgaben in der entsprechenden Farbe erscheinen, passt man noch die Datei | Damit auch die Aufgaben in der entsprechenden Farbe erscheinen, passt man noch die Datei | ||
<syntaxhighlight lang=output> | |||
/pfad/zum/tracker/html/issue.index.html | |||
</syntaxhighlight> | |||
an. Die Zeilen | an. Die Zeilen | ||
<syntaxhighlight lang=html line> | |||
<tr> | <tr> | ||
<td tal:condition="request/show/priority" | <td tal:condition="request/show/priority" | ||
tal:content="python:i.priority.plain() or default"> </td> | tal:content="python:i.priority.plain() or default"> </td> | ||
</syntaxhighlight> | |||
ändert man in | ändert man in | ||
<syntaxhighlight lang=html line> | |||
<tr | <tr tal:attributes="class string:priority-${i/priority/plain}"> | ||
<td tal:condition="request/show/priority" | <td tal:condition="request/show/priority" | ||
tal:content="python:i.priority.plain() or default"> </td> | tal:content="python:i.priority.plain() or default"> </td> | ||
</syntaxhighlight> | |||
Zum Schluss muss man noch die CSS-Formatierungen ergänzen in der Datei | |||
<syntaxhighlight lang=output> | |||
/pfad/zum/tracker/html/style.css | |||
</syntaxhighlight> | |||
Hier ist z.B. ein solcher Block einzufügen: | |||
<syntaxhighlight lang=css line> | |||
tr.priority-critical td, .priority-critical | |||
{ | |||
background-color: #FF8989; | |||
color: #ffffff; | |||
} | |||
tr.priority-critical td a:link | |||
{ | |||
color: #ffffff; | |||
font-weight: bold; | |||
} | |||
tr.priority-urgent td, .priority-urgent | |||
{ | |||
background-color: #FFD089; | |||
} | |||
tr.priority-bug td, .priority-bug | |||
{ | |||
background-color: #FFFE89 | |||
} | |||
tr.priority-feature td, .priority-feature | |||
{ | |||
background-color: #C0DDFF; | |||
} | |||
tr.priority-wish td, .priority-wish | |||
{ | |||
background-color: #C0FFCC; | |||
} | |||
table.color-reference | |||
{ | |||
margin-top: 10px; | |||
margin-bottom: 30px; | |||
} | |||
.color-reference td | |||
{ | |||
width: 100px; | |||
text-align: center; | |||
font-weight: bold; | |||
border: 1px solid #ababab; | |||
} | |||
</syntaxhighlight> | |||
Das Ergebnis sieht so aus: | Das Ergebnis sieht so aus: | ||
[[Datei:Roundup_legende.jpg]] | [[Datei:Roundup_legende.jpg]] | ||
=== Menüpunkt für "Erledigte" Aufgaben ergänzen === | === Menüpunkt für "Erledigte" Aufgaben ergänzen === | ||
Zeile 354: | Zeile 411: | ||
In der Datei | In der Datei | ||
<syntaxhighlight lang=output> | |||
/pfad/zum/tracker/html/page.html | |||
</syntaxhighlight> | |||
ist diese Textstelle | ist diese Textstelle | ||
<syntaxhighlight lang=html line> | |||
status_notresolved string:-1,1,2,3,4,5,6,7; | |||
</syntaxhighlight> | |||
um eine Zeile zu erweitern: | um eine Zeile zu erweitern: | ||
<syntaxhighlight lang=html line> | |||
status_notresolved string:-1,1,2,3,4,5,6,7; | |||
status_resolved string:8; | |||
</syntaxhighlight> | |||
Außerdem ist noch | Außerdem ist noch | ||
<syntaxhighlight lang=html> | |||
i18n:translate="">Show All</a><br> | |||
</syntaxhighlight> | |||
zu ersetzen durch: | zu ersetzen durch: | ||
<syntaxhighlight lang=html> | |||
i18n:translate="">Show All</a><br> | |||
<a href="#" | |||
tal:attributes="href python:request.indexargs_url('issue', { | |||
'@sort': '-activity', | |||
'@group': 'priority', | |||
'@filter': 'status', | |||
'@columns': columns_showall, | |||
'@search_text': '', | |||
'status': status_resolved, | |||
'@dispname': i18n.gettext('Erledigte anzeigen'), | |||
})" | |||
i18n:translate="">erledigte anzeigen</a><br> | |||
</syntaxhighlight> | |||
TODO: Kann jemand an dieser Stelle beschreiben wie man den Text unter Berücksichtigung der Internationalisierung angibt. | |||
Das Ergebnis: | Das Ergebnis: | ||
Zeile 398: | Zeile 461: | ||
[[Kategorie:Glossar]] | [[Kategorie:Glossar]] | ||
[[Kategorie:Software]] | [[Kategorie:Software]] | ||
[[Kategorie:Python]] |
Aktuelle Version vom 28. Juni 2024, 10:54 Uhr
Installation roundup issue tracker (cgi-bin)
Die allgemeine Installationsanleitung für roundup findet man unter http://roundup-tracker.org/docs/installation.html
Im Folgenden soll die Installation bei Hostsharing in einem WEB-Paket im cgi-bin einer Domain ohne eigene httpd.conf beschrieben werden. Das Beispiel beschreibt die nötigen Schritte für den Domain-Admin innerhalb des WEB-Paketes.
Neueste Quellen per Mercurial besorgen
hg clone http://hg.code.sf.net/p/roundup/code /home/pacs/xyz00/users/USERNAME/roundup
Installation der tracker-Software
python setup.py install --prefix=/home/pacs/xyz00/users/USERNAME/roundup/install --install-scripts=/home/pacs/xyz00/users/USERNAME/roundup/bin
Anpassen der Umgebungsvariablen
In der bash-Umgebung:
export PATH=$PATH:/home/pacs/xyz00/users/USERNAME/roundup/bin
export PYTHONPATH=$PYTHONPATH:/home/pacs/xyz00/users/USERNAME/roundup/install/lib/python2.5/site-packages/
Am besten trägt man diese beiden Zeilen in der Datei .bash_profile
ein, dann stehen die Pfade beim starten der Shell direkt zur Verfügung:
nano ~/.bash_profile
Installation eines neuen Trackers
/home/pacs/xyz00/users/USERNAME/roundup/bin/roundup-admin install
bzw.
roundup-admin install
(Wenn man die Umgebungsvariablen wie im Abschnitt zuvor beschrieben konfiguriert hat.)
Dabei werden folgende Eingaben abgefragt (Eingaben nur beispielhaft):
Enter tracker home: /pfad/zum/tracker/home
Templates: minimal, classic
Select template [classic]: classic
Back ends: anydbm, mysql, sqlite, postgresql
Select backend [anydbm]: sqlite
"tracker home" bezeichnet dabei ein Verzeichnis das man zuvor in seinem Home angelegt hat. Man kann auch mehrere Tracker-Instanzen parallel betreiben, die eigene "tracker home" bekommen. Beispiel: ~/roundup-tracker-projects/my-first-tracker
Beim Betrieb mit Mysql (um Backups zu ermöglichen die sicher konsistent sind):
- bei "Select backend" mysql angeben
- mit hsadmin einen DB-User erzeugen
- mit hsadmin eine DB erzeugen und den DB-User zuweisen
- DB, DB-User und Passwort des DB-Users sowie localhost als host (siehe nachfolgender Abschnitt) in config.ini in der Sektion rdbms angeben.
Tracker anpassen
nano /home/pacs/xyz00/users/USERNAME/roundup/tracker/TRACKERNAME/config.ini
Hier müssen zumindest diese Variablen angepasst werden:
admin_email = mail@example.com
dispatcher_email = mail@example.com
name = TRACKERBESCHREIBUNG
web = http(s)://SUBDOMAIN.example.com/
email = mail@example.com
domain = example.com
host = localhost
Optional kann man das logging in eine Datei aktivieren:
filename = /home/pacs/xyz00/users/USERNAME/TRACKERNAME.log
Datenbank initialisieren
/home/pacs/xyz00/users/USERNAME/roundup/bin/roundup-admin initialise
bzw.
roundup-admin initialise
(Nachdem man die Umgebungsvariablen wie oben beschrieben konfiguriert hat.)
Subdomain anlegen
mkdir /home/pacs/xyz00/users/USERNAME/doms/example.com/subs(-ssl)/Subdomain
Ein eigenes cgi-verzeichnis für die neue subdomain:
mkdir /home/pacs/xyz00/users/USERNAME/doms/example.com/cgi(-ssl)/SUBDOMAIN
Konfiguration mit eigener httpd.conf
!! Dieser Abschnitt ist mangels eigener httpd.conf ungetestet !!
cgi-frontend kopieren
cp /home/pacs/xyz00/users/USERNAME/roundup/frontends/roundup.cgi /home/pacs/xyz00/users/USERNAME/doms/example.com/cgi/SUBDOMAIN/
cgi-frontend anpassen
# nano /home/pacs/xyz00/users/USERNAME/doms/example.com/cgi/SUBDOMAIN/roundup.cgi
TRACKER_HOMES = {
'TRACKERNAME': '/home/pacs/xyz00/users/USERNAME/roundup/tracker/TRACKERNAME',
}
.htaccess-Datei für cgi konfigurieren
# nano /home/pacs/xyz00/users/USERNAME/doms/example.com/subs/SUBDOMAIN/.htaccess
RewriteEngine On
RewriteBase /
RewriteRule ^(.*) /cgi-bin/SUBDOMAIN/roundup.cgi/$1
!! ENDE ungetester Abschnitt !!
Konfiguration ohne eigene httpd.conf
WSGI-Interface einbinden
Ohne eigene httpd.conf benötigt man einen Wrapper (s. Flup).
Dies legt man in seinem cgi(-ssl) für die subdomain als roundup_stub
ab:
#!/usr/bin/env python
import sys
sys.path.append("/home/pacs/'''xyz00'''/users/'''USERNAME'''/roundup/install/lib/python2.7/site-packages")
from flup.server.cgi import WSGIServer
# obtain the WSGI request dispatcher
from roundup.cgi.wsgi_handler import RequestDispatcher
tracker_home = '/home/pacs/'''xyz00'''/users/'''USERNAME'''/roundup/tracker/'''TRACKERNAME''''
app = RequestDispatcher(tracker_home)
WSGIServer(app).run()
Die hervorgehobenen Stellen sind an die eigenen Gegebenheiten anzupassen.
Anschließend muss man den Wrapper ausführbar machen:
chmod 755 roundup_stub
Wenn es Fehlern kommt, kann man debugging-Meldungen an den Browser ausgeben lassen. Dazu ergänzt man unter der Zeile "sys.path.append..."
import cgitb
cgitb.enable()
.htaccess-Datei für cgi konfigurieren
# nano /home/pacs/xyz00/users/USERNAME/doms/example.com/subs(ssl)/SUBDOMAIN/.htaccess
RewriteEngine On
RewriteBase /
RewriteRule ^(.*) /cgi-bin/SUBDOMAIN/roundup_stub/$1
Individualisierung der tracker
Die Tracker kann man individuell an die eigenen Wünsche anpassen.
Das Datenbank-Schema liegt z.B. unter
/home/pacs/xyz00/users/USERNAME/tracker/TRACKERNAME/schema.py
Die Datenbank-Initialisierungs-Datei liegt unter
/home/pacs/xyz00/users/USERNAME/tracker/TRACKERNAME/initial_data.py
Zum Übernehmen der Änderungen an der Datenbank muss man die Datenbank neu initialisieren. Achtung: Dabei gehen alle Daten in der DB verloren!
roundup-admin initialise
Details zur Individualisierung nennt die Unterseite "Docs" -> "Customising Roundup" (http://roundup-tracker.org/docs/customizing.html).
Registrieren verhindern
Um nur manuell ergänzte Benutzer zuzulassen, muss man der Rolle Anonymous das Recht "Register" nehmen. Das bewerkstelligt man durch auskommentieren der letzten Zeile in diesem Abschnitt der datei /home/pacs/xyz00/users/USERNAME/roundup/tracker/TRACKERNAME/schema.py
# Assign the appropriate permissions to the anonymous user's Anonymous
# Role. Choices here are:
# - Allow anonymous users to register
db.security.addPermissionToRole('Anonymous', 'Register', 'user')
Anzeige der issues nur für eingeloggte Benutzer
Damit nur eingeloggte Benutzer die issues (Aufgaben) sehen können, muss man der Rolle Anonymous das Recht "View" nehmen. Das bewerkstelligt man durch auskommentieren der letzten beiden Zeilen in diesem Abschnitt der datei /home/pacs/xyz00/users/USERNAME/roundup/tracker/TRACKERNAME/schema.py
# Allow anonymous users access to view issues (and the related, linked
# information)
for cl in 'issue', 'file', 'msg', 'keyword', 'priority', 'status':
db.security.addPermissionToRole('Anonymous', 'View', cl)
Logo einfügen
In der linken oberen Ecke ist Platz für ein eigenes Logo oder eine Überschrift.
Bearbeitet werden muss die Datei
/pfad/zum/tracker/html/page.html
in der Tabellenzelle
<td class="page-header-left"><code>&nbsp;</code></td>
Wenn ein Logo mit einem Link hinterlegt wird, erscheint standardmäßig ein blauer Rahmen um die Grafik. Das kann unerwünscht sein. Unterdrücken kann man diesen Rahmen mit dem Zusatz
a img
{
border: none;
}
in der Datei /pfad/zum/tracker/html/style.css
Kategorien farblich absetzen
Damit die Priorität etwas hervorsticht, kann man die Kategorien farblich absetzen. Es bietet sich an, eine Legende vor und hinter der Aufgaben (issue) Liste einzufügen. Wir formatieren die Legende später per CSS, daher geben wir ihr auch eine CSS-Klasse mit.
<table class="color-reference">
<tr>
<td>Legende:</td>
<td class="priority-critical" i18n:translate="">critical</td>
<td class="priority-urgent" i18n:translate="">urgent</td>
<td class="priority-bug" i18n:translate="">bug</td>
<td class="priority-feature" i18n:translate="">feature</td>
<td class="priority-wish" i18n:translate="">wish</td>
</tr>
</table>
Dies bewerkstelligt man in der Datei /pfad/zum/tracker/html/issue.index.html
an den Stellen
<tal:block tal:define="batch request/batch" tal:condition="context/is_view_ok">
<table class="list">
<tr>
(= über der Aufgaben-Liste)
und
</metal:index>
</table>
<a tal:attributes="href python:request.indexargs_url('issue',
{'@action':'export_csv'})" i18n:translate="">Download as CSV</a>
(= unter der Aufgaben-Liste)
Der fertige Abschnitt über der Aufgaben-Liste sieht dann so aus:
<code><tal:block tal:define="batch request/batch" tal:condition="context/is_view_ok">
<table class="color-reference">
<tr>
<td>Legende:</td>
<td class="priority-critical" i18n:translate="">critical</td>
<td class="priority-urgent" i18n:translate="">urgent</td>
<td class="priority-bug" i18n:translate="">bug</td>
<td class="priority-feature" i18n:translate="">feature</td>
<td class="priority-wish" i18n:translate="">wish</td>
</tr>
</table>
<table class="list">
<tr></code>
Der fertige Abschnitt unter der Aufgaben-Liste sieht dann so aus:
</metal:index>
</table>
<table class="color-reference">
<tr>
<td>Legende:</td>
<td class="priority-critical" i18n:translate="">critical</td>
<td class="priority-urgent" i18n:translate="">urgent</td>
<td class="priority-bug" i18n:translate="">bug</td>
<td class="priority-feature" i18n:translate="">feature</td>
<td class="priority-wish" i18n:translate="">wish</td>
</tr>
</table>
<a tal:attributes="href python:request.indexargs_url('issue',
{'@action':'export_csv'})" i18n:translate="">Download as CSV</a></code>
Damit auch die Aufgaben in der entsprechenden Farbe erscheinen, passt man noch die Datei
/pfad/zum/tracker/html/issue.index.html
an. Die Zeilen
<tr>
<td tal:condition="request/show/priority"
tal:content="python:i.priority.plain() or default"> </td>
ändert man in
<tr tal:attributes="class string:priority-${i/priority/plain}">
<td tal:condition="request/show/priority"
tal:content="python:i.priority.plain() or default"> </td>
Zum Schluss muss man noch die CSS-Formatierungen ergänzen in der Datei
/pfad/zum/tracker/html/style.css
Hier ist z.B. ein solcher Block einzufügen:
tr.priority-critical td, .priority-critical
{
background-color: #FF8989;
color: #ffffff;
}
tr.priority-critical td a:link
{
color: #ffffff;
font-weight: bold;
}
tr.priority-urgent td, .priority-urgent
{
background-color: #FFD089;
}
tr.priority-bug td, .priority-bug
{
background-color: #FFFE89
}
tr.priority-feature td, .priority-feature
{
background-color: #C0DDFF;
}
tr.priority-wish td, .priority-wish
{
background-color: #C0FFCC;
}
table.color-reference
{
margin-top: 10px;
margin-bottom: 30px;
}
.color-reference td
{
width: 100px;
text-align: center;
font-weight: bold;
border: 1px solid #ababab;
}
Das Ergebnis sieht so aus:
Menüpunkt für "Erledigte" Aufgaben ergänzen
In der Datei
/pfad/zum/tracker/html/page.html
ist diese Textstelle
status_notresolved string:-1,1,2,3,4,5,6,7;
um eine Zeile zu erweitern:
status_notresolved string:-1,1,2,3,4,5,6,7;
status_resolved string:8;
Außerdem ist noch
i18n:translate="">Show All</a><br>
zu ersetzen durch:
i18n:translate="">Show All</a><br>
<a href="#"
tal:attributes="href python:request.indexargs_url('issue', {
'@sort': '-activity',
'@group': 'priority',
'@filter': 'status',
'@columns': columns_showall,
'@search_text': '',
'status': status_resolved,
'@dispname': i18n.gettext('Erledigte anzeigen'),
})"
i18n:translate="">erledigte anzeigen</a><br>
TODO: Kann jemand an dieser Stelle beschreiben wie man den Text unter Berücksichtigung der Internationalisierung angibt.
Das Ergebnis: