Commit 399debab authored by markus scheller's avatar markus scheller
parents 22b52edd 1c04c410
......@@ -38,20 +38,22 @@ Steps:
1. clone the [repository](https://git.fsmpi.rwth-aachen.de/protokollsystem/proto3)
2. create a python virtualenv and install the packages from `requirements.txt` there
3. create a database (tested with postgres and sqlite, but feel free to use whatever you like and [SQLAlchemy](http://docs.sqlalchemy.org/en/latest/dialects/index.html) supports
4. copy `config.py.example` to `config.py` and edit it
* **do** change everything commented with `change this`
* do **not** change the lines commented with `do not change`
4. create `config.py` with `flask create_example_config config.py` and edit it
* **do** change everything that is not commented out
* change commented out settings if they are wrong
* **do** change the random keys `SECRET_KEY` and `SECURITY_KEY` to something random (although the generated config already uses random values generated with `os.urandom`)
* deactivate unwanted features with `SOMETHING_ACTIVE = False`
* if you want to use a feature, set the connection configuration lines accordingly
* define a list of authentication backends (usually one):
- use LdapManager for slapd
- use ADManager for Samba
- write your own for anything else (see `auth.py`, just the methods `authenticate` and `groups` are required)
* define the available printers (if wanted) with a list of options they should use (see lpoptions)
* if you do not know what a MediaWiki-domain is, you probably don't need it
- write your own for anything else (see `common/auth.py`, the methods `authenticate`, `groups` and `all_groups` are required)
* *MAIL* requires an SMTP(S) server, optionally with STARTTLS or TLS
* *PRINTING* requires a CUPS printserver
* *ETHERPAD* requires an etherpad installation
* *WIKI* requires a MediaWiki or DokuWiki installation
* *CALENDAR* requires a CalDAV server
* fix the path to the fonts (and select which to use)
* most points should be documented in the example config
5. create the database schema with `./server.py db upgrade`
5. create the database schema with `flask db upgrade`
6. configure your server to run the wsgi-application and the celery-server
* if you use systemd, example service files are located in `example-config/` in this repository
7. configure your webserver to serve the wsgi-application
......
......@@ -402,8 +402,7 @@ def check_wiki(
def check_calendar(
CALENDAR_URL, CALENDAR_DEFAULT_DURATION, CALENDAR_MAX_REQUESTS,
CALENDAR_TIMEZONE_MAP):
CALENDAR_URL, CALENDAR_DEFAULT_DURATION, CALENDAR_MAX_REQUESTS):
from calendarpush import Client, CalendarException
try:
client = Client(url=CALENDAR_URL)
......@@ -413,6 +412,10 @@ def check_calendar(
CALENDAR_URL))
def check_timezone(CALENDAR_TIMEZONE_MAP):
pass
CONFIG_SECTIONS = [
ConfigSection(
name="Database",
......@@ -730,7 +733,7 @@ CONFIG_SECTIONS = [
required=False, internal=False,
description=(
"define multiple LaTeX-templates to use with a each "
"protocol type individually overiding the general LATEX "
"protocol type individually overriding the general LATEX "
"options the LATEX_LOCAL_TEMPLATES parameter is need to "
"provide the path for the templates each template must "
"be placed in an individual folder named by its ID in "
......@@ -897,6 +900,13 @@ CONFIG_SECTIONS = [
description=(
"Number of retries before giving a connection attempt up. "
"Some CalDAV servers reply randomly with errors.")),
],
check=check_calendar,
deactivatable=True,
description="CalDAV settings"),
ConfigSection(
name="TIMEZONE",
entries=[
ConfigEntry(
name="CALENDAR_TIMEZONE_MAP",
default={
......@@ -906,9 +916,8 @@ CONFIG_SECTIONS = [
required=False, internal=False,
description="Timezone abbreviation map. Add as needed."),
],
check=check_calendar,
deactivatable=True,
description="CalDAV settings"),
check=check_timezone,
description="Settings for translating timezone information."),
]
......
......@@ -486,7 +486,7 @@ class DefaultTOP(DatabaseModel):
localtop = self.get_localtop(protocol)
top = TOP(
protocol_id=protocol.id, name=self.name,
description=localtop.description)
description=getattr(localtop, "description", ""))
return top
......
......@@ -354,12 +354,12 @@ def internal_syntax_documentation():
@back.anchor
@login_required
def tags_syntax_documentation():
states = {state:[] for state in list(TodoState)}
name_to_state = TodoState.get_name_to_state()
for state_name in name_to_state:
states[name_to_state[state_name]].append(state_name)
return render_template(
"documentation-syntax-tags.html", states=states)
states = {state:[] for state in list(TodoState)}
name_to_state = TodoState.get_name_to_state()
for state_name in name_to_state:
states[name_to_state[state_name]].append(state_name)
return render_template(
"documentation-syntax-tags.html", states=states)
@app.route("/documentation/configuration")
@back.anchor
......@@ -386,10 +386,10 @@ def todomails_configuration_documentation():
@back.anchor
@login_required
def settings_configuration_documentation():
user = current_user()
return render_template(
user = current_user()
return render_template(
"documentation-configuration-settings.html",
system_administrator=(user is not None and config.ADMIN_GROUP in user.groups))
system_administrator=(user is not None and config.ADMIN_GROUP in user.groups))
@app.route("/types/list")
@back.anchor
......@@ -1809,17 +1809,9 @@ def feed_appointments_atom(protocoltype):
mimetype="application/atom+xml")
@app.route("/feed/appointments/ical/<int:protocoltype_id>")
@db_lookup(ProtocolType)
def feed_appointments_ical(protocoltype):
if not protocoltype.has_public_anonymous_view_right():
abort(403)
protocols = [
protocol for protocol in protocoltype.protocols
if not protocol.is_done()
]
def make_calendar_from_protocols(protocols, summary):
calendar = icalendar.Calendar()
calendar["summary"] = protocoltype.short_name
calendar["summary"] = summary
calendar["prodid"] = "Protokollsystem 3"
calendar["version"] = "2.0"
for protocol in protocols:
......@@ -1830,9 +1822,9 @@ def feed_appointments_ical(protocoltype):
event["dtstamp"] = to_datetime(start)
event["dtstart"] = to_datetime(start)
event["dtend"] = to_datetime(start + timedelta(hours=3))
event["summary"] = protocoltype.short_name
event["summary"] = protocol.protocoltype.short_name
event["description"] = "\n".join(
top.name for top in protocol.get_tops())
top.name for top in protocol.get_tops() if top.name is not None)
calendar.add_component(event)
content = calendar.to_ical().decode("utf-8")
for key in config.CALENDAR_TIMEZONE_MAP:
......@@ -1842,6 +1834,34 @@ def feed_appointments_ical(protocoltype):
return Response(content.encode("utf-8"), mimetype="text/calendar")
@app.route("/feed/appointments/ical/<int:protocoltype_id>")
@db_lookup(ProtocolType)
def feed_appointments_ical(protocoltype):
if not protocoltype.has_public_anonymous_view_right():
abort(403)
protocols = [
protocol for protocol in protocoltype.protocols
if not protocol.is_done()
]
return make_calendar_from_protocols(protocols, protocoltype.short_name)
@app.route("/feed/appointments/ical/")
def feed_all_appointments_ical():
user = current_user()
types = [
protocoltype for protocoltype in ProtocolType.query.all()
if (protocoltype.has_private_view_right(user)
or protocoltype.has_public_view_right(user)
or protocoltype.is_public)]
protocols = [
protocol
for protocoltype in types
for protocol in protocoltype.protocols
]
return make_calendar_from_protocols(protocols, "Sitzungskalender")
@app.route("/like/new")
@login_required
@protect_csrf
......
......@@ -3,22 +3,22 @@
<link rel="stylesheet" href="{{url_for('static', filename='css/pygments-manni.css')}}" />
{% endblock %}
{% set navigation_bar = [
('sessionmanagement_documentation', '/documentation/sessionmanagement', 'Sitzungsverwaltung', [
('plan_sessionmanagement_documentation', '/documentation/sessionmanagement/plan', 'Planung'),
('write_sessionmanagement_documentation', '/documentation/sessionmanagement/write', 'Protokollieren'),
('tracking_sessionmanagement_documentation', '/documentation/sessionmanagement/tracking', 'Nachverfolgung')
('sessionmanagement_documentation', 'Sitzungsverwaltung', [
('plan_sessionmanagement_documentation', 'Planung'),
('write_sessionmanagement_documentation', 'Protokollieren'),
('tracking_sessionmanagement_documentation', 'Nachverfolgung')
]),
('syntax_documentation', '/documentation/syntax', 'Syntax', [
('meta_syntax_documentation', '/documentation/syntax/meta', 'Metadaten'),
('top_syntax_documentation', '/documentation/syntax/top', 'Tagesordnungspunkte'),
('lists_syntax_documentation', '/documentation/syntax/lists', 'Listen'),
('internal_syntax_documentation', '/documentation/syntax/internal', 'Interne Abschnitte'),
('tags_syntax_documentation', '/documentation/syntax/tags', 'Tags')
('syntax_documentation', 'Syntax', [
('meta_syntax_documentation', 'Metadaten'),
('top_syntax_documentation', 'Tagesordnungspunkte'),
('lists_syntax_documentation', 'Listen'),
('internal_syntax_documentation', 'Interne Abschnitte'),
('tags_syntax_documentation', 'Tags')
]),
('configuration_documentation', '/documentation/configuration', 'Einrichtung', [
('types_configuration_documentation', '/documentation/configuration/types', 'Typen'),
('todomails_configuration_documentation', '/documentation/configuration/todomails', 'Todo Mails'),
('settings_configuration_documentation', '/documentation/configuration/settings', 'Systemeinstellungen')
('configuration_documentation', 'Einrichtung', [
('types_configuration_documentation', 'Typen'),
('todomails_configuration_documentation', 'Todo Mails'),
('settings_configuration_documentation', 'Systemeinstellungen')
])
] -%}
{% set active_page = active_page|default('documentation') -%}
......@@ -35,14 +35,14 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/documentation">Dokumentation</a>
<a class="navbar-brand" href="{{url_for("documentation")}}">Dokumentation</a>
</div>
<div class="collapse navbar-collapse" id="documentation-navigation">
<ul class="nav navbar-nav" style="width:100%">
{% for id, url, caption, children in navigation_bar %}
{% for id, caption, children in navigation_bar %}
<li{% if id == active_page %} class="active"{% endif %} style="width:100%">
<div class="btn-group" style="width:100%">
<a class="btn btn-{% if id == active_page %}primary{% else %}default{% endif %}{% if children %} col-xs-10{% endif %}" href="{{url|e}}" role="button" style="font-weight: bold; text-align:left; border: none; padding: 10px 15px">{{caption|e}}</a>
<a class="btn btn-{% if id == active_page %}primary{% else %}default{% endif %}{% if children %} col-xs-10{% endif %}" href="{{url_for(id)}}" role="button" style="font-weight: bold; text-align:left; border: none; padding: 10px 15px">{{caption|e}}</a>
{% if children %}
<button class="btn btn-{% if id == active_page %}primary{% else %}default{% endif %} col-xs-2" type="button" data-toggle="collapse" role="button" data-target="#{{id}}-collapse" aria-expanded="true" style="float:right; border:none; padding: 10px 15px">
<span class="caret"></span>
......@@ -52,9 +52,9 @@
</div>
{% if children %}
<ul class="collapse{% if active_page.endswith(id) %}.in{% endif %} nav nav-pills nav-stacked" id="{{id}}-collapse">
{% for child_id, child_url, child_caption in children %}
{% for child_id, child_caption in children %}
<li{% if child_id == active_page %} class="active"{% endif %}>
<a href="{{child_url|e}}" style="padding-left: 30px">{{child_caption|e}}</a>
<a href="{{url_for(child_id)}}" style="padding-left: 30px">{{child_caption|e}}</a>
</li>
{% endfor %}
</ul>
......
......@@ -65,7 +65,7 @@
</div>
<div class="panel-body ">
<p>
Das Versenden von E-Mails zu offenen Aufgaben ist hier bisher noch nicht vorgesehen. Um den automatischen E-Mailversand nutzen zu können, wende dich bitte an die <a href="mailto:{{config.ADMIN_MAIL}}">Admins</a> und lasse die <a href="/documentation/configuration/settings">Konfiguration</a> durch sie entsprechend anpassen.
Das Versenden von E-Mails zu offenen Aufgaben ist hier bisher noch nicht vorgesehen. Um den automatischen E-Mailversand nutzen zu können, wende dich bitte an die <a href="mailto:{{config.ADMIN_MAIL}}">Admins</a> und lasse die <a href="{{url_for("settings_configuration_documentation")}}">Konfiguration</a> durch sie entsprechend anpassen.
</p>
</div>
</div>
......
......@@ -5,7 +5,7 @@
{% block documentation_content %}
<h3>Einrichtung: Typen</h3>
<p>
Damit Protokolle im Protokollsystem überhaupt <a href="/documentation/sessionmanagement/write">geschrieben</a> und <a href="/documentation/sessionmanagement/plan">Sitzungen verwaltet</a> werden können, ist es unerlässlich entsprechende Protokolltypen anzulegen. Auf der <a href="{{url_for('list_types')}}">Protokolltypen-Übersichtsseite</a> werden die Typen aufgelistet, wobei nur die Typen angezeigt werden, deren Protokolle man sehen darf (weiteres hierzu unter <a href="#rechte">Rechtekonfiguration</a>).
Damit Protokolle im Protokollsystem überhaupt <a href="{{url_for("write_sessionmanagement_documentation")}}">geschrieben</a> und <a href="{{url_for("plan_sessionmanagement_documentation")}}">Sitzungen verwaltet</a> werden können, ist es unerlässlich entsprechende Protokolltypen anzulegen. Auf der <a href="{{url_for('list_types')}}">Protokolltypen-Übersichtsseite</a> werden die Typen aufgelistet, wobei nur die Typen angezeigt werden, deren Protokolle man sehen darf (weiteres hierzu unter <a href="#rechte">Rechtekonfiguration</a>).
</p>
<div class="panel panel-default">
<div class="panel-heading">
......@@ -455,7 +455,7 @@
</div>
</div>
<p>
Die Konfiguration eines Metadatenfeldes beinhaltet immer den Anzeigenamen (Name) und den beim <a href="/documentation/syntax/meta">Protokollieren zu verwendenden Namen</a> des Feldes (Key). Des weiteren ist es möglich einen Standardwert für das Metadatenfelder zu hinterlegen, welcher beim Erstellen einer neuen Sitzung in das Feld geschrieben wird, so fern es als Planungsrelevant (vorher) markiert wurde. Zudem ist es möglich Metadaten nur in der internen Version eines Protokolls anzuzeigen, wenn das entsprechende Feld als intern festgelegt wurde.
Die Konfiguration eines Metadatenfeldes beinhaltet immer den Anzeigenamen (Name) und den beim <a href="{{url_for("meta_syntax_documentation")}}">Protokollieren zu verwendenden Namen</a> des Feldes (Key). Des weiteren ist es möglich einen Standardwert für das Metadatenfelder zu hinterlegen, welcher beim Erstellen einer neuen Sitzung in das Feld geschrieben wird, so fern es als Planungsrelevant (vorher) markiert wurde. Zudem ist es möglich Metadaten nur in der internen Version eines Protokolls anzuzeigen, wenn das entsprechende Feld als intern festgelegt wurde.
</p>
<div class="panel panel-default">
<div class="panel-heading">
......
......@@ -8,10 +8,10 @@
Eine wichtige Eigenschaft des Protokollsystems ist die Konfigurierbarkeit. Das System lässt sich individuell auf die Bedürfnisse der eigenen Organisationseinheit anpassen. Einige Einstellungen können direkt über die Weboberfläche vorgenommen werden und stehen allen Benutzern zur Verfügung. Dazu gehören:
</p>
<ul>
<li><a href="configuration/types">Protokolltypen</a></li>
<li><a href="configuration/todomails">Todo-Mails</a></li>
<li><a href="{{url_for("types_configuration_documentation")}}">Protokolltypen</a></li>
<li><a href="{{url_for("todomails_configuration_documentation")}}">Todo-Mails</a></li>
</ul>
<p>
Andere Einstellungen werden direkt bei der Installation und Einrichtung des Protokollsystems durch die <a href="mailto:{{config.ADMIN_MAIL}}">Admins</a> vorgenommen. Zu diesen <a href="configuration/settings">Systemeinstellungen</a> zählen unter anderem Features wie das automatische Versenden von E-Mails oder die Nutzung eines Etherpads zum Schreiben von Protokollen.
Andere Einstellungen werden direkt bei der Installation und Einrichtung des Protokollsystems durch die <a href="mailto:{{config.ADMIN_MAIL}}">Admins</a> vorgenommen. Zu diesen <a href="{{url_for("settings_configuration_documentation")}}">Systemeinstellungen</a> zählen unter anderem Features wie das automatische Versenden von E-Mails oder die Nutzung eines Etherpads zum Schreiben von Protokollen.
</p>
{% endblock %}
......@@ -10,11 +10,11 @@
<h4 id="decisions">Beschlüsse</h4>
<p>
Alle in den Protollen festgehaltenen Beschlüsse werden in der <a href="{{url_for('list_decisions')}}">Beschlussübersicht</a> angezeigt. Neben dem Beschlusstext beinhaltet die Übersicht die zu den Beschlüssen gehörenden Protokoll sowie die <a href="/documentation/configuration/types#decision_categories">Beschlusskategorie</a>. In den einzelnen Protokollen werdend die Beschlüsse ebenfalls zusammengefasst dargestellt, um einen Überbrlick über alle Beschlüsse der betrefenden Sitzung zu erhalten.
Alle in den Protollen festgehaltenen Beschlüsse werden in der <a href="{{url_for('list_decisions')}}">Beschlussübersicht</a> angezeigt. Neben dem Beschlusstext beinhaltet die Übersicht die zu den Beschlüssen gehörenden Protokoll sowie die <a href="{{url_for("types_configuration_documentation")}}#decision_categories">Beschlusskategorie</a>. In den einzelnen Protokollen werdend die Beschlüsse ebenfalls zusammengefasst dargestellt, um einen Überbrlick über alle Beschlüsse der betrefenden Sitzung zu erhalten.
</p>
{% if config.PRINTING_ACTIVE %}
<p>
Beschlüsse können direkt aus dem Protokollsystem an den im <a href="/documentation/configuration/types">Protokolltyp</a> hinterlegten Drucker durch klicken auf „Drucken“ zum Drucken gesendet werden, so dass gedruckte Beschlüsse beispielsweise mit Kassenanweisungen abgeheftet werden können.
Beschlüsse können direkt aus dem Protokollsystem an den im <a href="{{url_for("types_configuration_documentation")}}">Protokolltyp</a> hinterlegten Drucker durch klicken auf „Drucken“ zum Drucken gesendet werden, so dass gedruckte Beschlüsse beispielsweise mit Kassenanweisungen abgeheftet werden können.
</p>
{% endif %}
<div class="panel panel-default">
......@@ -79,7 +79,7 @@
<h4 id="todos">Aufgaben (Todos)</h4>
<p>
Einzelne Aufgaben, die während oder außerhalb einer Sitzung vergeben werden, können mit dem Protokollsystem über mehrere Protokolle hinweg verwaltet werden. Offene Todos werden dabei automatisch in die Protokollvorlage eingefügt, falls diese einen <a href="/documentation/configuration/types">Standard-TOP</a> „Todos“ beinhaltet. Darüberhinaus können alle Todos auf der entsprechenden <a href="{{url_for('list_todos')}}">Übersichtsseite</a> eingesehen werden.
Einzelne Aufgaben, die während oder außerhalb einer Sitzung vergeben werden, können mit dem Protokollsystem über mehrere Protokolle hinweg verwaltet werden. Offene Todos werden dabei automatisch in die Protokollvorlage eingefügt, falls diese einen <a href="{{url_for("types_configuration_documentation")}}">Standard-TOP</a> „Todos“ beinhaltet. Darüberhinaus können alle Todos auf der entsprechenden <a href="{{url_for('list_todos')}}">Übersichtsseite</a> eingesehen werden.
</p>
<div class="panel panel-default">
<div class="panel-heading">
......@@ -152,7 +152,7 @@
</div>
</div>
<p>
Aufgaben können im Protokollsystem auch außerhalb eines Protokolls direkt auf der <a href="{{url_for('list_todos')}}">Übersichtsseite</a> über die Schaltfläche „neu“ angelegt werden. Zu jeder Aufgabe sollte mindestens eine Person zugeordnet werden, die das Todo erledigt. Werden mehrere Personen angegeben, so sind diese durch Kommata oder Leerzeichen zu trennen. In aller Regel wird für jede Person ein internes Personenkürzel für die Zuweisung einer Aufgabe genutzt. Damit diese Personen eine Benachrichtigung über das neue Todo erhalten, sollten zu jedem internen Personenkürzel eine <a href="/documentation/configuration/todomails">E-Mailadresse</a> hinterlegt werden.
Aufgaben können im Protokollsystem auch außerhalb eines Protokolls direkt auf der <a href="{{url_for('list_todos')}}">Übersichtsseite</a> über die Schaltfläche „neu“ angelegt werden. Zu jeder Aufgabe sollte mindestens eine Person zugeordnet werden, die das Todo erledigt. Werden mehrere Personen angegeben, so sind diese durch Kommata oder Leerzeichen zu trennen. In aller Regel wird für jede Person ein internes Personenkürzel für die Zuweisung einer Aufgabe genutzt. Damit diese Personen eine Benachrichtigung über das neue Todo erhalten, sollten zu jedem internen Personenkürzel eine <a href="{{url_for("todomails_configuration_documentation")}}">E-Mailadresse</a> hinterlegt werden.
</p>
<div class="panel panel-default">
<div class="panel-heading">
......
......@@ -18,7 +18,7 @@
<h4 id="session_start">Mit Beginn einer Sitzung</h4>
<p>
Kurz bevor die Sitzung los geht oder mit dem Beginn der Sitzung wird das Protokoll erzeugt und die offenen <a href="/documentation/syntax/meta">Metadaten</a> ausgefüllt. Um dies zu erreichen werden die folgenden Schritte durchgeführt.
Kurz bevor die Sitzung los geht oder mit dem Beginn der Sitzung wird das Protokoll erzeugt und die offenen <a href="{{url_for("meta_syntax_documentation")}}">Metadaten</a> ausgefüllt. Um dies zu erreichen werden die folgenden Schritte durchgeführt.
</p>
<ol>
<li>Stelle sicher, dass alle mit dem Vorprotokollieren fertig sind.</li>
......@@ -58,10 +58,10 @@
{% if config.ETHERPAD_ACTIVE %}
<li>Schreibe das Protokoll im Etherpad.</li>
{% endif %}
<li>Fülle alle benötigten <a href="/documentation/syntax/meta">Metadatenfelder</a>.</li>
<li>Falls <a href="/documentation/syntax/tags#todo">Todos</a> erledigt sind, markiere diese als erledigt.</li>
<li>Erfasse Beschlüsse die während einer Sitzung getroffen werden mit dem <a href="/documentation/syntax/tags#decision">Beschluss-Tag</a>.</li>
<li>Nutze auch die anderen <a href="/documentation/syntax/tags">Tags</a>, wo diese erforderlich sind.</li>
<li>Fülle alle benötigten <a href="{{url_for("meta_syntax_documentation")}}">Metadatenfelder</a>.</li>
<li>Falls <a href="{{url_for("tags_syntax_documentation")}}#todo">Todos</a> erledigt sind, markiere diese als erledigt.</li>
<li>Erfasse Beschlüsse die während einer Sitzung getroffen werden mit dem <a href="{{url_for("tags_syntax_documentation")}}#decision">Beschluss-Tag</a>.</li>
<li>Nutze auch die anderen <a href="{{url_for("tags_syntax_documentation")}}">Tags</a>, wo diese erforderlich sind.</li>
</ul>
<div class="panel panel-default">
<div class="panel-heading">
......
......@@ -5,16 +5,16 @@
{% block documentation_content %}
<h3>Sitzungsverwaltung</h3>
<p>
Ein wesentlicher Bestandteil des Protokollsystems ist das Sitzungsmanagement. Neben dem <a href="/documentation/sessionmanagement/plan">Planen und Anlegen</a> verschiedener Sitzungstermine kann zu jeder Sitzung ein <a href="/documentation/sessionmanagement/write">Protokoll</a> verfasst und anschließend durch das System ausgegeben werden. Die <a href="/documentation/sessionmanagement/tracking">Nachverfolgung</a> von Ergebnissen ist im System in Form von Beschlüssen und Todos möglich.
Ein wesentlicher Bestandteil des Protokollsystems ist das Sitzungsmanagement. Neben dem <a href="{{url_for("plan_sessionmanagement_documentation")}}">Planen und Anlegen</a> verschiedener Sitzungstermine kann zu jeder Sitzung ein <a href="{{url_for("write_sessionmanagement_documentation")}}">Protokoll</a> verfasst und anschließend durch das System ausgegeben werden. Die <a href="{{url_for("tracking_sessionmanagement_documentation")}}">Nachverfolgung</a> von Ergebnissen ist im System in Form von Beschlüssen und Todos möglich.
</p>
<h4>Verwaltung im Detail</h4>
<p>
Die einzelnen Funktionen des Sitzungsmanagements werden jeweils auf Unterseiten erläutert. Auch werden die Arbeitsabläufe, wie sie im System vorgesehen sind, vorgestellt.
</p>
<ul>
<li><a href="/documentation/sessionmanagement/plan">Planung</a></li>
<li><a href="/documentation/sessionmanagement/write">Protokollieren</a></li>
<li><a href="/documentation/sessionmanagement/tracking">Nachverfolgung</a></li>
<li><a href="{{url_for("plan_sessionmanagement_documentation")}}">Planung</a></li>
<li><a href="{{url_for("write_sessionmanagement_documentation")}}">Protokollieren</a></li>
<li><a href="{{url_for("tracking_sessionmanagement_documentation")}}">Nachverfolgung</a></li>
</ul>
<p>
Sollten die genannten Arbeitsabläufe nicht nachvollziehbar oder fehlerhaft sein, dann kontaktiere bitte das Entwicklungsteam der Software. Als Tipp: Je genauer du ein Problem beschreiben kannst, desto einfacher machst du es den betroffenen Personen selbiges zu fixen und desto schneller hast du eine Lösung.
......
......@@ -55,7 +55,7 @@
</div>
<div class="panel-body ">
<p>
Die Verwendung von internen Abschnitte ist hier bisher noch nicht vorgesehen. Um interne Abschnitte nutzen zu können, wende dich bitte an die <a href="mailto:{{config.ADMIN_MAIL}}">Admins</a> und lasse die <a href="/documentation/configuration/settings">Konfiguration</a> durch sie entsprechend anpassen.
Die Verwendung von internen Abschnitte ist hier bisher noch nicht vorgesehen. Um interne Abschnitte nutzen zu können, wende dich bitte an die <a href="mailto:{{config.ADMIN_MAIL}}">Admins</a> und lasse die <a href="{{url_for("settings_configuration_documentation")}}">Konfiguration</a> durch sie entsprechend anpassen.
</p>
</div>
</div>
......
......@@ -5,7 +5,7 @@
{% block documentation_content %}
<h3>Syntax: Metadaten</h3>
<p>
In einem Protokoll repräsentieren die Metadaten allgemeine Informationen rund um eine Sitzung. Die Metadaten stehen immer am Anfang eines Protokolls. Zu den Metadaten zählen das Datum der Sitzung, der Beginn und das Ende sowie weitere pro <a href="/documentation/configuration/types">Protokolltyp</a> konfigurierte <a href="/documentation/configuration/types#meta">Metadatenfelder</a>, wie beispielsweise der Ort, die Anwesenden oder die Protokollführung. Alle <a href="/documentation/configuration/types#meta">Metadatenfelder</a> werden beim Erzeugen der Protokollvorlage durch das System automatisch in das Protokoll übertragen. Dies schließt auch den Inhalt der Felder ein, so weit dieser vor <a href="/documentation/sessionmanagement/plan">Beginn der Sitzung</a> eingegeben wurde.
In einem Protokoll repräsentieren die Metadaten allgemeine Informationen rund um eine Sitzung. Die Metadaten stehen immer am Anfang eines Protokolls. Zu den Metadaten zählen das Datum der Sitzung, der Beginn und das Ende sowie weitere pro <a href="{{url_for("types_configuration_documentation")}}">Protokolltyp</a> konfigurierte <a href="{{url_for("types_configuration_documentation")}}#meta">Metadatenfelder</a>, wie beispielsweise der Ort, die Anwesenden oder die Protokollführung. Alle <a href="{{url_for("types_configuration_documentation")}}#meta">Metadatenfelder</a> werden beim Erzeugen der Protokollvorlage durch das System automatisch in das Protokoll übertragen. Dies schließt auch den Inhalt der Felder ein, so weit dieser vor <a href="{{url_for("plan_sessionmanagement_documentation")}}">Beginn der Sitzung</a> eingegeben wurde.
</p>
<h4>Definition</h4>
<p>
......@@ -17,6 +17,6 @@
<li><code class="highlight" style="color: inherit;"><span class="nc">#Ende</span>;<span class="mi">21:42</span></code> Ende der Sitzung</li>
</ul>
<p>
Wurden <a href="/documentation/configuration/types#meta">Metadatenfelder</a> im <a href="/documentation/configuration/types">Protokolltyp</a> konfigurierte so muss als <code class="highlight" style="color: inherit;"><span class="nc">Name</span></code> der festgelegte Key verwendet werden. Dabei muss die Groß- und Kleinschreibung beachtet werden.
Wurden <a href="{{url_for("types_configuration_documentation")}}#meta">Metadatenfelder</a> im <a href="{{url_for("types_configuration_documentation")}}">Protokolltyp</a> konfigurierte so muss als <code class="highlight" style="color: inherit;"><span class="nc">Name</span></code> der festgelegte Key verwendet werden. Dabei muss die Groß- und Kleinschreibung beachtet werden.
</p>
{% endblock %}
......@@ -72,7 +72,7 @@
</div>
{% endif %}
<p>
Ein Beschluss kann mit <a href="/documentation/configuration/types#decision_categories">Beschlusskategorien</a> versehen werden, um Beschlüsse zu einzelnen Themen zusammenfassen zu können. Des Versehen mit Kategorien ist jedoch kein muss. <a href="/documentation/configuration/types#decision_categories">Kategorien</a> müssen vor der Verwendung in den Einstellungen des Protokolltyps definiert werden. Danach können Beschlüsse durch die Angabe der Kategorie entsprechend zugeordnet werden, z.B. <code class="highlight" style="color: inherit;"><span class="nt">[</span>…;<span class="sx">finanzwirksam</span>;…<span class="nt">]</span></code>.
Ein Beschluss kann mit <a href="{{url_for("types_configuration_documentation")}}#decision_categories">Beschlusskategorien</a> versehen werden, um Beschlüsse zu einzelnen Themen zusammenfassen zu können. Des Versehen mit Kategorien ist jedoch kein muss. <a href="{{url_for("types_configuration_documentation")}}#decision_categories">Kategorien</a> müssen vor der Verwendung in den Einstellungen des Protokolltyps definiert werden. Danach können Beschlüsse durch die Angabe der Kategorie entsprechend zugeordnet werden, z.B. <code class="highlight" style="color: inherit;"><span class="nt">[</span>…;<span class="sx">finanzwirksam</span>;…<span class="nt">]</span></code>.
</p>
<p>
Es empfiehlt sich Beschlüsse klar, einfach, eindeutig und auch kontextlos verständlich zu formulieren. Sind die Beschlüsse im Rahmen einer Abstimmung ergangen, so empfiehlt es sich das Abstimmungsergebnis am Ende des Beschlusses in der Form (Ja/Nein/Enthaltung) anzugeben.
......@@ -88,7 +88,7 @@
<h4 id="todo">Todo-Tag</h4>
<p>
Soll in einer Sitzung die Vergebene einer <a href="/documentation/sessionmanagement/tracking#todos">Aufgabe</a> an eine oder mehrere Personen (oder AG, AK, …) festgehalten werden, so kann mittels des Tags <code class="highlight" style="color: inherit;"><span class="nt">todo</span></code> diese Aufgabe im Protokoll festgehalten werden. Neben dem Namen der Person, welche die Aufgabe erledigen möchte, wird die Aufgabe innerhalb des Tags festgehalten. Die Aufgabe ist nach der Sitzung in der <a href="{{url_for('list_todos')}}">Todo-Übersicht</a> und nur im internen Protokoll einsehbar.
Soll in einer Sitzung die Vergabe einer <a href="{{url_for("tracking_sessionmanagement_documentation")}}#todos">Aufgabe</a> an eine oder mehrere Personen (oder AG, AK, …) festgehalten werden, so kann mittels des Tags <code class="highlight" style="color: inherit;"><span class="nt">todo</span></code> diese Aufgabe im Protokoll festgehalten werden. Neben dem Namen der Person, welche die Aufgabe erledigen möchte, wird die Aufgabe innerhalb des Tags festgehalten. Die Aufgabe ist nach der Sitzung in der <a href="{{url_for('list_todos')}}">Todo-Übersicht</a> und nur im internen Protokoll einsehbar.
</p>
<figure>
<pre class="highlight"><code><span class="nt">[todo</span>;<span class="sx">Name</span>;<span class="sx">Aufgabe</span>;<span class="sx">Argument 1</span>;<span class="sx">Argument 2</span>;…<span class="nt">]</span></code></pre>
......@@ -100,7 +100,7 @@
Eine bereits bestehende und noch offene Aufgabe wird automatisch in ein neues Protokoll eingefügt, wenn der TOP „Todos“ auf der Tagesordnung steht (der TOP also im Protokoll enthalten ist). Zusätzlich erhält die Aufgabe dann als optionales Argument eine ID: <code class="highlight" style="color: inherit;"><span class="nt">[</span>…;<span class="kr">id</span> <span class="mi">1338</span><span class="nt">]</span></code>. Wird dieser Todo dann während des Protokollierens geändert, passiert das auch im Protokollsystem.
</p>
<p>
In einem weiteren optionalen Argument kann außerdem der Status einer Aufgabe, z.B. <code class="highlight" style="color: inherit;"><span class="nt">[</span>…;<span class="kr">done</span>;…<span class="nt">]</span></code> angegeben werden. Die Groß- und Kleinschreibung spielen bei der Verwendung keine Rolle. Wenn der Status ein Datum benötigt, muss dieser immer mit angegeben und hat die Form: <code class="highlight" style="color: inherit;"><span class="nt">[</span>…;<span class="mi">dd.mm.yyyy</span>;…<span class="nt">]</span></code>. Bei der Angabe des Datums ist es unerheblich, an welcher Stelle innerhalb des Tags es auftacht. Eine Auflistung der verwendbaren Status-Begriffe und ob Status ein Datum benötigt, ist in der folgenden Tabelle angegeben.
In einem weiteren optionalen Argument kann außerdem der Status einer Aufgabe, z.B. <code class="highlight" style="color: inherit;"><span class="nt">[</span>…;<span class="kr">done</span>;…<span class="nt">]</span></code> angegeben werden. Die Groß- und Kleinschreibung spielen bei der Verwendung keine Rolle. Wenn der Status ein Datum benötigt, muss dieses immer mit angegeben werden und hat die Form: <code class="highlight" style="color: inherit;"><span class="nt">[</span>…;<span class="mi">dd.mm.yyyy</span>;…<span class="nt">]</span></code>. Bei der Angabe des Datums ist es unerheblich, an welcher Stelle innerhalb des Tags es auftaucht. Eine Auflistung der verwendbaren Status-Begriffe und ob Status ein Datum benötigt, ist in der folgenden Tabelle angegeben.
</p>
<table class="table table-striped">
<thead>
......@@ -111,11 +111,11 @@
</tr>
</thead>
<tbody>
{% for state, posibilities in states.items() %}
{% for state, possibilities in states.items() %}
<tr>
<td>{{state.get_name()}}</td>
<td><span class="glyphicon glyphicon-{% if state.needs_date() %}ok{% else %}remove{% endif %}" aria-hidden="true"></span></td>
<td>{{posibilities|map("code_key")|join(", ")|safe}}</td>
<td>{{possibilities|map("code_key")|join(", ")|safe}}</td>
</tr>
{% endfor %}
</tbody>
......@@ -141,7 +141,7 @@
<h4 id="session">Sitzungs-Tag</h4>
<p>
Werden während einer Sitzung bereits Termine für zukünfigt Sitzungen desselben Typs festgelegt, so können diese direkt aus dem Protokoll heraus angelegt und im Protokoll entsprechend hervorgehoben werden. Es wird der Tag des Types <code class="highlight" style="color: inherit;"><span class="nt">sitzung</span></code> genutzt. Als Argument muss mindestens das Datum übergeben werden und es hat die Form: <code class="highlight" style="color: inherit;"><span class="nt">[</span>…;<span class="mi">dd.mm.yyyy</span>;…<span class="nt">]</span></code>. Optional kann zusätzlich eine Uhrzeit in folgender Form angegeben werden: <code class="highlight" style="color: inherit;"><span class="nt">[</span>…;<span class="mi">h:mm</span><span class="nt">]</span></code>.
Werden während einer Sitzung bereits Termine für zukünfige Sitzungen desselben Typs festgelegt, so können diese direkt aus dem Protokoll heraus angelegt und im Protokoll entsprechend hervorgehoben werden. Es wird der Tag des Types <code class="highlight" style="color: inherit;"><span class="nt">sitzung</span></code> genutzt. Als Argument muss mindestens das Datum übergeben werden und es hat die Form: <code class="highlight" style="color: inherit;"><span class="nt">[</span>…;<span class="mi">dd.mm.yyyy</span>;…<span class="nt">]</span></code>. Optional kann zusätzlich eine Uhrzeit in folgender Form angegeben werden: <code class="highlight" style="color: inherit;"><span class="nt">[</span>…;<span class="mi">h:mm</span><span class="nt">]</span></code>.
</p>
<figure>
<pre class="highlight"><code><span class="nt">[sitzung</span>;<span class="mi">Datum</span>;<span class="mi">Uhrzeit</span><span class="nt">]</span></code></pre>
......
......@@ -5,16 +5,16 @@
{% block documentation_content %}
<h3>Syntax: Tagesordnungspunkte</h3>
<p>
Ein wichtiges Elements in jedem Protokoll sind Tagesordnungspunkte. Sie sind in einem Protokoll stehts die oberste Gliederungsebene. In den meisten Fällen stehen diese Punkte bereits vor Beginn der Sitzung fest und wurden entsprechend vorher <a href="/documentation/sessionmanagement/plan#prepare">eingepflegt</a>.
Ein wichtiges Elements in jedem Protokoll sind Tagesordnungspunkte. Sie sind in einem Protokoll stehts die oberste Gliederungsebene. In den meisten Fällen stehen diese Punkte bereits vor Beginn der Sitzung fest und wurden entsprechend vorher <a href="{{url_for("plan_sessionmanagement_documentation")}}#prepare">eingepflegt</a>.
</p>
<p>
Beim Erstellen der Protokollvorlage durch das System werden die bereits <a href="/documentation/sessionmanagement/plan#prepare">angelegten TOPs</a> mit dem vorprotokollierten Inhalt in der Tagesordnung festgelegten Reihenfolge übertragen. Während des Schreibens des Protokolls können jeder Zeit Tagesordnungspunkte hinzugefügt oder entfernt werden.
Beim Erstellen der Protokollvorlage durch das System werden die bereits <a href="{{url_for("plan_sessionmanagement_documentation")}}#prepare">angelegten TOPs</a> mit dem vorprotokollierten Inhalt in der Tagesordnung festgelegten Reihenfolge übertragen. Während des Schreibens des Protokolls können jeder Zeit Tagesordnungspunkte hinzugefügt oder entfernt werden.
</p>
<h4>Definition</h4>
<div class="row">
<div class="col-sm-9">
<p>
In Protokollsystax wird ein Tagesordnungspunkt stets von geschweiften Klammern eingeschlossen. An die öffnende Klammer schließt sich das Schlüsselwort <code>TOP</code> an. Abgesetzt mit einem Leerzeichen folgt der Titel des TOPs. Nach einem Zeilenumbruach als in einer neuen Zeile beginnt dann der Inhalt des Tagesordnungspunkts. Durch die Verwendung von sogenannten <a href="lists">Listen</a> kann die Mitschrift in einem Tagesordnungspunkt strukturiert werden.
In Protokollsystax wird ein Tagesordnungspunkt stets von geschweiften Klammern eingeschlossen. An die öffnende Klammer schließt sich das Schlüsselwort <code>TOP</code> an. Abgesetzt mit einem Leerzeichen folgt der Titel des TOPs. Nach einem Zeilenumbruch als in einer neuen Zeile beginnt dann der Inhalt des Tagesordnungspunkts. Durch die Verwendung von sogenannten <a href="lists">Listen</a> kann die Mitschrift in einem Tagesordnungspunkt strukturiert werden.
</p>
<div class="panel panel-default">
<div class="panel-heading">
......
......@@ -5,7 +5,7 @@
{% block documentation_content %}
<h3>Syntax</h3>
<p>
Das Herz des Protokollsystems ist die eigentliche Protokollsyntax, aus dem systemintern ein druckbares Dokument und menschenlesbarer Webseiteninhalt erstellt wird. Die Systax sieht eine Strukturierung des Prokolls vor. Ein Dokument beginn mit einigen Metadaten, danach kommen nacheinander die Tagesordnungspunkte, die strukturiert diskuiterte Punkte enthalten. Darüberhinaus gibt es Tags, mit denen unter anderem URLs, Beschlüsse oder ToDos markiert werden können.
Das Herz des Protokollsystems ist die eigentliche Protokollsyntax, aus dem systemintern ein druckbares Dokument und menschenlesbarer Webseiteninhalt erstellt wird. Die Systax sieht eine Strukturierung des Protokolls vor. Ein Dokument beginn mit einigen Metadaten, danach kommen nacheinander die Tagesordnungspunkte, die strukturiert diskutierte Punkte enthalten. Darüberhinaus gibt es Tags, mit denen unter anderem URLs, Beschlüsse oder ToDos markiert werden können.
</p>
<h4>Allgemeine Grundsätze</h4>
<p>
......@@ -14,17 +14,27 @@
<ul>
<li>Jede geschweifte oder eckige Klammer die aufgemacht wird, wird sofort wieder geschlossen und anschließend der Inhalt zwischen die Klammern geschrieben.</li>
<li>Jeder Zeilenumbruch erzeugt eine neue Zeile im Protokoll.</li>
<li>Beachte die geschützten Begriffe: <code class="highlight" style="color: inherit;"><span class="nc">#Datum</span></code> <code class="highlight" style="color: inherit;"><span class="nc">#Beginn</span></code> <code class="highlight" style="color: inherit;"><span class="nc">#Ende</span></code> <code class="highlight" style="color: inherit;"><span class="kr">TOP</span></code> <code class="highlight" style="color: inherit;"><span class="kr">private</span></code> <code class="highlight" style="color: inherit;"><span class="kr">todo</span></code> <code class="highlight" style="color: inherit;"><span class="kr">id</span></code> <code class="highlight" style="color: inherit;"><span class="kr">beschluss</span></code> <code class="highlight" style="color: inherit;"><span class="kr">url</span></code> <code class="highlight" style="color: inherit;"><span class="kr">footnote</span></code> <code class="highlight" style="color: inherit;"><span class="kr">sitzung</span></code></li>
<li>Beachte die geschützten Begriffe:
{% for term in ["#Datum", "#Beginn", "#Ende"] %}
<code class="highlight" style="color: inherit;">
<span class="nc">{{term}}</span>
</code>
{% endfor %}
{% for term in ["TOP", "private", "todo", "id", "beschluss", "url", "footnote", "sitzung"] %}
<code class="highlight" style="color: inherit;">
<span class="kr">{{term}}</span>
</code>
{% endfor %}
</ul>
<h4>Der Syntax im Detail</h4>
<p>
Um die Funktionsweise und das Verhalten des Protokollsystems bei der Umwandlung eines Protokolls zu verstehen, wird auf den Unterseiten auf die einzelnen Elemente der Protokollsyntax näher eingegangen.
</p>
<ul>
<li><a href="/documentation/syntax/meta">Metadaten</a></li>
<li><a href="/documentation/syntax/top">Tagesordnungspunkte</a></li>
<li><a href="/documentation/syntax/lists">Listen</a></li>
<li><a href="/documentation/syntax/internal">Interne Abschnitte</a></li>
<li><a href="/documentation/syntax/tags">Tags</a></li>
<li><a href="{{url_for("meta_syntax_documentation")}}">Metadaten</a></li>
<li><a href="{{url_for("top_syntax_documentation")}}">Tagesordnungspunkte</a></li>
<li><a href="{{url_for("lists_syntax_documentation")}}">Listen</a></li>
<li><a href="{{url_for("internal_syntax_documentation")}}">Interne Abschnitte</a></li>
<li><a href="{{url_for("tags_syntax_documentation")}}">Tags</a></li>
</ul>
{% endblock %}
......@@ -3,37 +3,37 @@
{% block title %}Dokumentation{% endblock %}
{% block documentation_content %}
<h3>Protokollsystem 3 - Das Protokollsystem</h3>
<p>
<h3>Protokollsystem 3 - Das Protokollsystem</h3>
<p>
Das Protokollsystem dient der Planung von Sitzungen und Verwaltung von Protokollen. Die anstehenden Sitzungen der nächsten Woche sind auf der <a href="{{url_for('index')}}">Startseite</a>, alle Protokolle unter <a href="{{url_for('list_protocols')}}">Protokolle</a> zu finden.
</p>
<p>
Des weiteren können die Sitzungen mittels Todos und einer Beschlussdatenbank nach verfolgt werden. Die eigenen offenen Todos werden auf der <a href="{{url_for('index')}}">Startseite</a> angezeigt, alle Todos sind unter <a href="{{url_for('list_todos')}}">Todos</a> zu finden. Die Beschlüsse finden sich in der <a href="{{url_for('list_decisions')}}">Beschlussdatenbank</a>.
</p>
<h3>Dokumentation</h3>
Dieser Dokumentation können Beschreibungen zu nahezu allen wichtigen Systemfunktionen entnommen werden. Gegliedert sind die Themen wie folgt:
<ul>
<li><a href="/documentation/sessionmanagement">Sitzungsverwaltung</a><ul>
<li><a href="/documentation/sessionmanagement/plan">Planung</a></li>
<li><a href="/documentation/sessionmanagement/write">Protokollieren</a></li>
<li><a href="/documentation/sessionmanagement/tracking">Nachverfolgung</a></li>
</ul></li>
<li><a href="/documentation/syntax">Syntax</a><ul>
<li><a href="/documentation/syntax/meta">Metadaten</a></li>
<li><a href="/documentation/syntax/top">Tagesordnungspunkte</a></li>
<li><a href="/documentation/syntax/lists">Listen</a></li>
<li><a href="/documentation/syntax/internal">Interne Abschnitte</a></li>
<li><a href="/documentation/syntax/tags">Tags</a></li>
</ul></li>
<li><a href="/documentation/configuration">Einrichtung</a><ul>
<li><a href="/documentation/configuration/types">Typen</a></li>
<li><a href="/documentation/configuration/todomails">Todo Mails</a></li>
<li><a href="/documentation/configuration/settings">Systemeinstellungen</a></li>
</ul></li>
</ul>
<p>
Sollten deine Fragen nach dem Studium der Dokumentation noch offen sein, wende dich an jemand erfahreneren oder die <a href="mailto:{{config.ADMIN_MAIL}}">Admins</a>. Offene Punkte innerhalb der Dokumentation können dann durch die Admins zur Behebung auch an die Entwickler der Software weitergegeben werden.
</p>
</p>
<p>
Des weiteren können die Sitzungen mittels Todos und einer Beschlussdatenbank nach verfolgt werden. Die eigenen offenen Todos werden auf der <a href="{{url_for('index')}}">Startseite</a> angezeigt, alle Todos sind unter <a href="{{url_for('list_todos')}}">Todos</a> zu finden. Die Beschlüsse finden sich in der <a href="{{url_for('list_decisions')}}">Beschlussdatenbank</a>.
</p>
<h3>Dokumentation</h3>
Dieser Dokumentation können Beschreibungen zu nahezu allen wichtigen Systemfunktionen entnommen werden. Gegliedert sind die Themen wie folgt:
<ul>
<li><a href="{{url_for("sessionmanagement_documentation")}}">Sitzungsverwaltung</a><ul>
<li><a href="{{url_for("plan_sessionmanagement_documentation")}}">Planung</a></li>
<li><a href="{{url_for("write_sessionmanagement_documentation")}}">Protokollieren</a></li>
<li><a href="{{url_for("tracking_sessionmanagement_documentation")}}">Nachverfolgung</a></li>
</ul></li>
<li><a href="{{url_for("syntax_documentation")}}">Syntax</a><ul>
<li><a href="{{url_for("meta_syntax_documentation")}}">Metadaten</a></li>
<li><a href="{{url_for("top_syntax_documentation")}}">Tagesordnungspunkte</a></li>
<li><a href="{{url_for("lists_syntax_documentation")}}">Listen</a></li>
<li><a href="{{url_for("internal_syntax_documentation")}}">Interne Abschnitte</a></li>
<li><a href="{{url_for("tags_syntax_documentation")}}">Tags</a></li>
</ul></li>
<li><a href="{{url_for("configuration_documentation")}}">Einrichtung</a><ul>
<li><a href="{{url_for("types_configuration_documentation")}}">Typen</a></li>
<li><a href="{{url_for("todomails_configuration_documentation")}}">Todo Mails</a></li>
<li><a href="{{url_for("settings_configuration_documentation")}}">Systemeinstellungen</a></li>
</ul></li>
</ul>
<p>
Sollten deine Fragen nach dem Studium der Dokumentation noch offen sein, wende dich an jemand erfahreneren oder die <a href="mailto:{{config.ADMIN_MAIL}}">Admins</a>. Offene Punkte innerhalb der Dokumentation können dann durch die Admins zur Behebung auch an die Entwickler der Software weitergegeben werden.
</p>
<h3 id="fehler">Fehlerbehandlung</h3>
<ul>
<li>Typische Web-Fehler (404, 500, etc.) sollten nicht auftreten. Wenn sie es doch tun, wende dich bitte an die <a href="mailto:{{config.ADMIN_MAIL}}">Admins</a></li>
......@@ -43,9 +43,9 @@
{% if git_revision %}
<h3 id="version">Version</h4>
<p>
<p>
Dieses Protokollsystem nutzt die Software <a href="{{git_revision.url}}">„Protokollsystem 3“</a> in der Version vom <a href="{{git_revision.url}}/commit/{{git_revision.hash}}">{{git_revision.date|datify}}</a>.<br/>
Alle Änderungen, die seitdem hinzugekommen sind, kannst du <a href="{{git_revision.url}}/compare/{{git_revision.hash}}...master">hier</a> sehen.
</p>
</p>
{% endif %}
{% endblock %}