Commit 399debab authored by markus scheller's avatar markus scheller
Browse files
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 %}
......@@ -4,17 +4,17 @@
{% block documentation_content %}
<h3>Sitzungsverwaltung: Planung</h3>
<p>
Im Vorfeld einer Sitzung sollten verschiedene Tätigkeiten vorgenommen werden. Hierbei ist zu unterscheiden ob zu einem geplanten Sitzungstermin bereits ein Protokoll existiert oder nicht. Zu bereits existierenden und noch nicht geschriebenen Protokollen kann die Tagesordnung verwaltet werden.
</p>
<h4>Nicht existierendes Protokoll</h4>
<p>
<p>
Im Vorfeld einer Sitzung sollten verschiedene Tätigkeiten vorgenommen werden. Hierbei ist zu unterscheiden ob zu einem geplanten Sitzungstermin bereits ein Protokoll existiert oder nicht. Zu bereits existierenden und noch nicht geschriebenen Protokollen kann die Tagesordnung verwaltet werden.
</p>
<h4>Nicht existierendes Protokoll</h4>
<p>
Versichere dich zuerst auf der <a href="{{url_for("list_protocols")}}">Protokollübersichtsseite</a>, dass das Protokoll nicht bereits existiert. Sollte das Protokoll noch nicht existieren, so führe die folgenden Schritte aus um es anzulegen.
</p>
</p>
<ol>
<li>Gehe auf <a href="{{url_for("new_protocol")}}">Neues Protokoll</a>.</li>
<li>Wähle bei „Typ“ den <a href="/documentation/configuration/types">Typ der Sitzung</a> aus.</li>
<li>Wähle bei „Typ“ den <a href="{{url_for("types_configuration_documentation")}}">Typ der Sitzung</a> aus.</li>
<li>Gib das Datum der Sitzung und ggf. einen Startzeitpunkt ein.</li>
<li>Klicke auf Anlegen.</li>
</ol>
......@@ -45,13 +45,13 @@
</form>
</div>
</div>
<h4 id="find">Existierendes Protokoll finden</h4>
<h4 id="find">Existierendes Protokoll finden</h4>
<p>
Ist das Protokoll bereits angelegt, so kann es auf zwei verschiedenen Wegen gefunden werden. Zum einen über die Übersicht der nächsten Sitzungen auf der Startseite und zum anderen auf der Protokollübersichtsseite.
<br/>
Um ein Protokoll auf der Protokollübersichtsseite zu finden:
</p>
Ist das Protokoll bereits angelegt, so kann es auf zwei verschiedenen Wegen gefunden werden. Zum einen über die Übersicht der nächsten Sitzungen auf der Startseite und zum anderen auf der Protokollübersichtsseite.
<br/>
Um ein Protokoll auf der Protokollübersichtsseite zu finden:
</p>
<ol>
<li>Gehe auf <a href="{{url_for("list_protocols")}}">Protokolle</a>,</li>
<li>Wähle die Sitzung aus - noch ausstehende Sitzungen sind ganz oben.</a>
......@@ -99,155 +99,155 @@
<td class="hidden-sm hidden-md hidden-lg"><a href="#">Versammlung</a><br>11. März 2018</td>
<td class="hidden-xs"><a href="#example_protocoll_overview">Versammlung</a></td>
<td class="hidden-xs">11. März 2018</td>
<td class="hidden-sm hidden-md hidden-lg"><span class="glyphicon glyphicon-pencil"></span></td>
<td class="hidden-sm hidden-md hidden-lg"><span class="glyphicon glyphicon-pencil"></span></td>
<td class="hidden-xs"><span class="glyphicon glyphicon-pencil"></span> Geplant</td>
<td class="">
<div class="btn-group btn-group-xs">
</div>
</td>
<div class="btn-group btn-group-xs">
</div>
</td>
</tr>
<tr>
<td class="hidden-sm hidden-md hidden-lg"><a href="#">Sitzung</a><br>08. März 2018</td>
<td class="hidden-xs"><a href="#example_protocoll_overview">Sitzung</a></td>
<td class="hidden-xs">08. März 2018</td>
<td class="hidden-sm hidden-md hidden-lg"><span class="glyphicon glyphicon-pencil"></span></td>
<td class="hidden-sm hidden-md hidden-lg"><span class="glyphicon glyphicon-pencil"></span></td>
<td class="hidden-xs"><span class="glyphicon glyphicon-pencil"></span> Geplant</td>
<td class="">
<div class="btn-group btn-group-xs">
</div>
</td>
<div class="btn-group btn-group-xs">
</div>
</td>
</tr>
<tr>
<td class="hidden-sm hidden-md hidden-lg"><a href="#">Arbeitsgruppe</a><br>02. März 2018</td>
<td class="hidden-xs"><a href="#example_protocoll_overview">Arbeitsgruppe</a></td>
<td class="hidden-xs">02. März 2018</td>
<td class="hidden-sm hidden-md hidden-lg"><span class="glyphicon glyphicon-unchecked"></span></td>
<td class="hidden-xs"><span class="glyphicon glyphicon-unchecked"></span> Fertig</td>
<td class="hidden-xs"><span class="glyphicon glyphicon-unchecked"></span> Fertig</td>
<td class="">
<div class="btn-group btn-group-xs">
<a href="#example_protocoll_overview" class="btn btn-success"><span class="glyphicon glyphicon-download"></span></a>
</div>
</td>
<div class="btn-group btn-group-xs">
<a href="#example_protocoll_overview" class="btn btn-success"><span class="glyphicon glyphicon-download"></span></a>
</div>
</td>
</tr>
<tr>
<td class="hidden-sm hidden-md hidden-lg"><a href="#">Sitzung</a><br>01. März 2018</td>
<td class="hidden-xs"><a href="#example_protocoll_overview">Sitzung</a></td>
<td class="hidden-xs">01. März 2018</td>
<td class="hidden-sm hidden-md hidden-lg"><span class="glyphicon glyphicon-unchecked"></span></td>
<td class="hidden-xs"><span class="glyphicon glyphicon-unchecked"></span> Fertig</td>
<td class="hidden-xs"><span class="glyphicon glyphicon-unchecked"></span> Fertig</td>
<td class="">
<div class="btn-group btn-group-xs">
<a href="#example_protocoll_overview" class="btn btn-success"><span class="glyphicon glyphicon-download"></span></a>
</div>
</td>
<div class="btn-group btn-group-xs">
<a href="#example_protocoll_overview" class="btn btn-success"><span class="glyphicon glyphicon-download"></span></a>
</div>
</td>
</tr>
<tr>
<td class="hidden-sm hidden-md hidden-lg"><a href="#">Sitzung</a><br>22. Februar 2018</td>
<td class="hidden-xs"><a href="#example_protocoll_overview">Sitzung</a></td>
<td class="hidden-xs">22. Februar 2018</td>
<td class="hidden-sm hidden-md hidden-lg"><span class="glyphicon glyphicon-check"></span></td>
<td class="hidden-xs"><span class="glyphicon glyphicon-check"></span> Veröffentlicht</td>
<td class="hidden-xs"><span class="glyphicon glyphicon-check"></span> Veröffentlicht</td>
<td class="">
<div class="btn-group btn-group-xs">
<a href="#example_protocoll_overview" class="btn btn-success"><span class="glyphicon glyphicon-download"></span></a>
</div>
</td>
<div class="btn-group btn-group-xs">
<a href="#example_protocoll_overview" class="btn btn-success"><span class="glyphicon glyphicon-download"></span></a>
</div>
</td>
</tr>
<tr>
<td class="hidden-sm hidden-md hidden-lg"><a href="#">Arbeitsgruppe</a><br>15. Februar 2018</td>
<td class="hidden-xs"><a href="#example_protocoll_overview">Arbeitsgruppe</a></td>
<td class="hidden-xs">15. Februar 2018</td>
<td class="hidden-sm hidden-md hidden-lg"><span class="glyphicon glyphicon-check"></span></td>
<td class="hidden-xs"><span class="glyphicon glyphicon-check"></span> Veröffentlicht</td>
<td class="hidden-xs"><span class="glyphicon glyphicon-check"></span> Veröffentlicht</td>
<td class="">
<div class="btn-group btn-group-xs">
<a href="#example_protocoll_overview" class="btn btn-success"><span class="glyphicon glyphicon-download"></span></a>
</div>
</td>
<div class="btn-group btn-group-xs">
<a href="#example_protocoll_overview" class="btn btn-success"><span class="glyphicon glyphicon-download"></span></a>
</div>
</td>
</tr>
</tbody>
</table>
<div align="center">
<span class="glyphicon glyphicon-pencil"></span> Geplant,
<span class="glyphicon glyphicon-unchecked"></span> Fertig,
<span class="glyphicon glyphicon-check"></span> Veröffentlicht
</div>
<div align="center">
<span class="glyphicon glyphicon-pencil"></span> Geplant,
<span class="glyphicon glyphicon-unchecked"></span> Fertig,
<span class="glyphicon glyphicon-check"></span> Veröffentlicht
</div>
</div>
</div>
<h4 id="prepare">Existierendes Protokoll vorbereiten</h4>
<p>
Soll ein bereits existierendes Protokoll für die Sitzung vorbereitet oder angepasst werden, so ist das Protokoll entsprechend wie <a href="#find">oben</a> dargestellt aufzurufen. Auf der Seite der Sitzung werden neben verschiedenen sogenannten <a href="/documentation/configuration/types#meta">Metadaten</a>, wie Datum und Uhrzeit der Sitzung, auch die Tagesordnung dargestellt.
<br/>
Haben sich in den für die Sitzung angegebenen Metadaten Fehler eingeschlichen oder soll die Sitzung beispielsweise verschoben werden, so können diese Protokolldaten wie folgt bearbeitet und aktualisiert werden.
</p>
<ol>
<h4 id="prepare">Existierendes Protokoll vorbereiten</h4>
<p>
Soll ein bereits existierendes Protokoll für die Sitzung vorbereitet oder angepasst werden, so ist das Protokoll entsprechend wie <a href="#find">oben</a> dargestellt aufzurufen. Auf der Seite der Sitzung werden neben verschiedenen sogenannten <a href="{{url_for("types_configuration_documentation")}}#meta">Metadaten</a>, wie Datum und Uhrzeit der Sitzung, auch die Tagesordnung dargestellt.
<br/>
Haben sich in den für die Sitzung angegebenen Metadaten Fehler eingeschlichen oder soll die Sitzung beispielsweise verschoben werden, so können diese Protokolldaten wie folgt bearbeitet und aktualisiert werden.
</p>
<ol>
<li>Klicke auf Editieren.</li>
<li>Passe die Daten auf der neu geladenen Seite entsprechend an.</li>
<li>Speichere die Ändernungen durch das Klicken auf Ändern.</li>
</ol>
<div class="panel panel-default">
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title"><a data-toggle="collapse" href="#example_update_protocoll">Beispiel - Protokolldaten aktualisieren</a></h5>
</div>
<ul id="example_update_protocoll" class="list-group panel-collapse collapse">
<li class="list-group-item">
<div class="btn-group">
{% if config.ETHERPAD_ACTIVE %}
<a class="btn btn-primary" href="#example_update_protocoll">Aus Etherpad</a>
{% endif %}
<a class="btn btn-default" href="#example_update_protocoll">Editieren</a>
{% if config.ETHERPAD_ACTIVE %}
<a class="btn btn-primary" href="#example_update_protocoll" onclick="return confirm('Bist du dir sicher, dass du das Template bereits in das Etherpad kopieren willst? Die Sitzung ist erst einigen Tagen.');">Etherpad</a>
{% endif %}
<a class="btn btn-default" href="#example_update_protocoll">Vorlage</a>
{% if config.MAIL_ACTIVE %}
<a class="btn btn-default" href="#example_update_protocoll" onclick="return confirm('Bist du dir sicher, dass du manuell eine Einladung verschicken willst? Dies wird auch automatisch geschehen.');">Einladung versenden</a>
{% endif %}
<a class="btn btn-default" href="#example_update_protocoll">Typ</a>
</div>
</li>
<li class="list-group-item">
<form role="form" class="">
<div class="form-group ">
<label for="date" class="control-label"><label for="date">Datum</label></label>
<input class="form-control" id="date" name="date" placeholder="Datum" title="" value="2018-03-14" type="date">
</div>
<div class="form-group ">
<label for="start_time" class="control-label"><label for="start_time">Beginn (%H:%M)</label></label>
<input class="form-control" id="start_time" name="start_time" placeholder="Beginn (%H:%M)" title="" value="17:00" type="text">
</div>
<div class="form-group ">
<label for="end_time" class="control-label"><label for="end_time">Ende (%H:%M)</label></label>
<input class="form-control" id="end_time" name="end_time" placeholder="Ende (%H:%M)" title="" value="" type="text">
</div>
<div class="checkbox ">
<label>
<input id="done" name="done" value="y" type="checkbox"> <label for="done">Fertig</label>
</label>
</div>
<div id="done-description" style="display:none" class="field-description"></div>
<div class="checkbox ">
<label>
<input id="public" name="public" value="y" type="checkbox"> <label for="public">Veröffentlicht</label>
</label>
</div>
<div id="public-description" style="display:none" class="field-description"></div>
<button type="button" class="btn btn-default">Ändern</button>
</form>
</li>
<div class="btn-group">
{% if config.ETHERPAD_ACTIVE %}
<a class="btn btn-primary" href="#example_update_protocoll">Aus Etherpad</a>
{% endif %}
<a class="btn btn-default" href="#example_update_protocoll">Editieren</a>
{% if config.ETHERPAD_ACTIVE %}
<a class="btn btn-primary" href="#example_update_protocoll" onclick="return confirm('Bist du dir sicher, dass du das Template bereits in das Etherpad kopieren willst? Die Sitzung ist erst einigen Tagen.');">Etherpad</a>
{% endif %}
<a class="btn btn-default" href="#example_update_protocoll">Vorlage</a>
{% if config.MAIL_ACTIVE %}
<a class="btn btn-default" href="#example_update_protocoll" onclick="return confirm('Bist du dir sicher, dass du manuell eine Einladung verschicken willst? Dies wird auch automatisch geschehen.');">Einladung versenden</a>
{% endif %}
<a class="btn btn-default" href="#example_update_protocoll">Typ</a>
</div>
</li>
<li class="list-group-item">
<form role="form" class="">
<div class="form-group ">
<label for="date" class="control-label"><label for="date">Datum</label></label>
<input class="form-control" id="date" name="date" placeholder="Datum" title="" value="2018-03-14" type="date">
</div>
<div class="form-group ">
<label for="start_time" class="control-label"><label for="start_time">Beginn (%H:%M)</label></label>
<input class="form-control" id="start_time" name="start_time" placeholder="Beginn (%H:%M)" title="" value="17:00" type="text">
</div>
<div class="form-group ">
<label for="end_time" class="control-label"><label for="end_time">Ende (%H:%M)</label></label>
<input class="form-control" id="end_time" name="end_time" placeholder="Ende (%H:%M)" title="" value="" type="text">
</div>
<div class="checkbox ">
<label>
<input id="done" name="done" value="y" type="checkbox"> <label for="done">Fertig</label>
</label>
</div>
<div id="done-description" style="display:none" class="field-description"></div>
<div class="checkbox ">
<label>
<input id="public" name="public" value="y" type="checkbox"> <label for="public">Veröffentlicht</label>
</label>
</div>
<div id="public-description" style="display:none" class="field-description"></div>
<button type="button" class="btn btn-default">Ändern</button>
</form>
</li>
</ul>