Commit 399debab authored by markus scheller's avatar markus scheller
Browse files
parents 22b52edd 1c04c410
...@@ -38,20 +38,22 @@ Steps: ...@@ -38,20 +38,22 @@ Steps:
1. clone the [repository](https://git.fsmpi.rwth-aachen.de/protokollsystem/proto3) 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 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 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 4. create `config.py` with `flask create_example_config config.py` and edit it
* **do** change everything commented with `change this` * **do** change everything that is not commented out
* do **not** change the lines commented with `do not change` * 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` * 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): * define a list of authentication backends (usually one):
- use LdapManager for slapd - use LdapManager for slapd
- use ADManager for Samba - use ADManager for Samba
- write your own for anything else (see `auth.py`, just the methods `authenticate` and `groups` are required) - write your own for anything else (see `common/auth.py`, the methods `authenticate`, `groups` and `all_groups` are required)
* define the available printers (if wanted) with a list of options they should use (see lpoptions) * *MAIL* requires an SMTP(S) server, optionally with STARTTLS or TLS
* if you do not know what a MediaWiki-domain is, you probably don't need it * *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) * 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 `flask db upgrade`
5. create the database schema with `./server.py db upgrade`
6. configure your server to run the wsgi-application and the celery-server 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 * if you use systemd, example service files are located in `example-config/` in this repository
7. configure your webserver to serve the wsgi-application 7. configure your webserver to serve the wsgi-application
......
...@@ -402,8 +402,7 @@ def check_wiki( ...@@ -402,8 +402,7 @@ def check_wiki(
def check_calendar( def check_calendar(
CALENDAR_URL, CALENDAR_DEFAULT_DURATION, CALENDAR_MAX_REQUESTS, CALENDAR_URL, CALENDAR_DEFAULT_DURATION, CALENDAR_MAX_REQUESTS):
CALENDAR_TIMEZONE_MAP):
from calendarpush import Client, CalendarException from calendarpush import Client, CalendarException
try: try:
client = Client(url=CALENDAR_URL) client = Client(url=CALENDAR_URL)
...@@ -413,6 +412,10 @@ def check_calendar( ...@@ -413,6 +412,10 @@ def check_calendar(
CALENDAR_URL)) CALENDAR_URL))
def check_timezone(CALENDAR_TIMEZONE_MAP):
pass
CONFIG_SECTIONS = [ CONFIG_SECTIONS = [
ConfigSection( ConfigSection(
name="Database", name="Database",
...@@ -730,7 +733,7 @@ CONFIG_SECTIONS = [ ...@@ -730,7 +733,7 @@ CONFIG_SECTIONS = [
required=False, internal=False, required=False, internal=False,
description=( description=(
"define multiple LaTeX-templates to use with a each " "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 " "options the LATEX_LOCAL_TEMPLATES parameter is need to "
"provide the path for the templates each template must " "provide the path for the templates each template must "
"be placed in an individual folder named by its ID in " "be placed in an individual folder named by its ID in "
...@@ -897,6 +900,13 @@ CONFIG_SECTIONS = [ ...@@ -897,6 +900,13 @@ CONFIG_SECTIONS = [
description=( description=(
"Number of retries before giving a connection attempt up. " "Number of retries before giving a connection attempt up. "
"Some CalDAV servers reply randomly with errors.")), "Some CalDAV servers reply randomly with errors.")),
],
check=check_calendar,
deactivatable=True,
description="CalDAV settings"),
ConfigSection(
name="TIMEZONE",
entries=[
ConfigEntry( ConfigEntry(
name="CALENDAR_TIMEZONE_MAP", name="CALENDAR_TIMEZONE_MAP",
default={ default={
...@@ -906,9 +916,8 @@ CONFIG_SECTIONS = [ ...@@ -906,9 +916,8 @@ CONFIG_SECTIONS = [
required=False, internal=False, required=False, internal=False,
description="Timezone abbreviation map. Add as needed."), description="Timezone abbreviation map. Add as needed."),
], ],
check=check_calendar, check=check_timezone,
deactivatable=True, description="Settings for translating timezone information."),
description="CalDAV settings"),
] ]
......
...@@ -486,7 +486,7 @@ class DefaultTOP(DatabaseModel): ...@@ -486,7 +486,7 @@ class DefaultTOP(DatabaseModel):
localtop = self.get_localtop(protocol) localtop = self.get_localtop(protocol)
top = TOP( top = TOP(
protocol_id=protocol.id, name=self.name, protocol_id=protocol.id, name=self.name,
description=localtop.description) description=getattr(localtop, "description", ""))
return top return top
......
...@@ -354,12 +354,12 @@ def internal_syntax_documentation(): ...@@ -354,12 +354,12 @@ def internal_syntax_documentation():
@back.anchor @back.anchor
@login_required @login_required
def tags_syntax_documentation(): def tags_syntax_documentation():
states = {state:[] for state in list(TodoState)} states = {state:[] for state in list(TodoState)}
name_to_state = TodoState.get_name_to_state() name_to_state = TodoState.get_name_to_state()
for state_name in name_to_state: for state_name in name_to_state:
states[name_to_state[state_name]].append(state_name) states[name_to_state[state_name]].append(state_name)
return render_template( return render_template(
"documentation-syntax-tags.html", states=states) "documentation-syntax-tags.html", states=states)
@app.route("/documentation/configuration") @app.route("/documentation/configuration")
@back.anchor @back.anchor
...@@ -386,10 +386,10 @@ def todomails_configuration_documentation(): ...@@ -386,10 +386,10 @@ def todomails_configuration_documentation():
@back.anchor @back.anchor
@login_required @login_required
def settings_configuration_documentation(): def settings_configuration_documentation():
user = current_user() user = current_user()
return render_template( return render_template(
"documentation-configuration-settings.html", "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") @app.route("/types/list")
@back.anchor @back.anchor
...@@ -1809,17 +1809,9 @@ def feed_appointments_atom(protocoltype): ...@@ -1809,17 +1809,9 @@ def feed_appointments_atom(protocoltype):
mimetype="application/atom+xml") mimetype="application/atom+xml")
@app.route("/feed/appointments/ical/<int:protocoltype_id>") def make_calendar_from_protocols(protocols, summary):
@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()
]
calendar = icalendar.Calendar() calendar = icalendar.Calendar()
calendar["summary"] = protocoltype.short_name calendar["summary"] = summary
calendar["prodid"] = "Protokollsystem 3" calendar["prodid"] = "Protokollsystem 3"
calendar["version"] = "2.0" calendar["version"] = "2.0"
for protocol in protocols: for protocol in protocols:
...@@ -1830,9 +1822,9 @@ def feed_appointments_ical(protocoltype): ...@@ -1830,9 +1822,9 @@ def feed_appointments_ical(protocoltype):
event["dtstamp"] = to_datetime(start) event["dtstamp"] = to_datetime(start)
event["dtstart"] = to_datetime(start) event["dtstart"] = to_datetime(start)
event["dtend"] = to_datetime(start + timedelta(hours=3)) event["dtend"] = to_datetime(start + timedelta(hours=3))
event["summary"] = protocoltype.short_name event["summary"] = protocol.protocoltype.short_name
event["description"] = "\n".join( 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) calendar.add_component(event)
content = calendar.to_ical().decode("utf-8") content = calendar.to_ical().decode("utf-8")
for key in config.CALENDAR_TIMEZONE_MAP: for key in config.CALENDAR_TIMEZONE_MAP:
...@@ -1842,6 +1834,34 @@ def feed_appointments_ical(protocoltype): ...@@ -1842,6 +1834,34 @@ def feed_appointments_ical(protocoltype):
return Response(content.encode("utf-8"), mimetype="text/calendar") 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") @app.route("/like/new")
@login_required @login_required
@protect_csrf @protect_csrf
......
...@@ -3,22 +3,22 @@ ...@@ -3,22 +3,22 @@
<link rel="stylesheet" href="{{url_for('static', filename='css/pygments-manni.css')}}" /> <link rel="stylesheet" href="{{url_for('static', filename='css/pygments-manni.css')}}" />
{% endblock %} {% endblock %}
{% set navigation_bar = [ {% set navigation_bar = [
('sessionmanagement_documentation', '/documentation/sessionmanagement', 'Sitzungsverwaltung', [ ('sessionmanagement_documentation', 'Sitzungsverwaltung', [
('plan_sessionmanagement_documentation', '/documentation/sessionmanagement/plan', 'Planung'), ('plan_sessionmanagement_documentation', 'Planung'),
('write_sessionmanagement_documentation', '/documentation/sessionmanagement/write', 'Protokollieren'), ('write_sessionmanagement_documentation', 'Protokollieren'),
('tracking_sessionmanagement_documentation', '/documentation/sessionmanagement/tracking', 'Nachverfolgung') ('tracking_sessionmanagement_documentation', 'Nachverfolgung')
]), ]),
('syntax_documentation', '/documentation/syntax', 'Syntax', [ ('syntax_documentation', 'Syntax', [
('meta_syntax_documentation', '/documentation/syntax/meta', 'Metadaten'), ('meta_syntax_documentation', 'Metadaten'),
('top_syntax_documentation', '/documentation/syntax/top', 'Tagesordnungspunkte'), ('top_syntax_documentation', 'Tagesordnungspunkte'),
('lists_syntax_documentation', '/documentation/syntax/lists', 'Listen'), ('lists_syntax_documentation', 'Listen'),
('internal_syntax_documentation', '/documentation/syntax/internal', 'Interne Abschnitte'), ('internal_syntax_documentation', 'Interne Abschnitte'),
('tags_syntax_documentation', '/documentation/syntax/tags', 'Tags') ('tags_syntax_documentation', 'Tags')
]), ]),
('configuration_documentation', '/documentation/configuration', 'Einrichtung', [ ('configuration_documentation', 'Einrichtung', [
('types_configuration_documentation', '/documentation/configuration/types', 'Typen'), ('types_configuration_documentation', 'Typen'),
('todomails_configuration_documentation', '/documentation/configuration/todomails', 'Todo Mails'), ('todomails_configuration_documentation', 'Todo Mails'),
('settings_configuration_documentation', '/documentation/configuration/settings', 'Systemeinstellungen') ('settings_configuration_documentation', 'Systemeinstellungen')
]) ])
] -%} ] -%}
{% set active_page = active_page|default('documentation') -%} {% set active_page = active_page|default('documentation') -%}
...@@ -35,14 +35,14 @@ ...@@ -35,14 +35,14 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
<a class="navbar-brand" href="/documentation">Dokumentation</a> <a class="navbar-brand" href="{{url_for("documentation")}}">Dokumentation</a>
</div> </div>
<div class="collapse navbar-collapse" id="documentation-navigation"> <div class="collapse navbar-collapse" id="documentation-navigation">
<ul class="nav navbar-nav" style="width:100%"> <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%"> <li{% if id == active_page %} class="active"{% endif %} style="width:100%">
<div class="btn-group" 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 %} {% 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"> <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> <span class="caret"></span>
...@@ -52,9 +52,9 @@ ...@@ -52,9 +52,9 @@
</div> </div>
{% if children %} {% if children %}
<ul class="collapse{% if active_page.endswith(id) %}.in{% endif %} nav nav-pills nav-stacked" id="{{id}}-collapse"> <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 %}> <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> </li>
{% endfor %} {% endfor %}
</ul> </ul>
......
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
</div> </div>
<div class="panel-body "> <div class="panel-body ">
<p> <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> </p>
</div> </div>
</div> </div>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
{% block documentation_content %} {% block documentation_content %}
<h3>Einrichtung: Typen</h3> <h3>Einrichtung: Typen</h3>
<p> <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> </p>
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
...@@ -455,7 +455,7 @@ ...@@ -455,7 +455,7 @@
</div> </div>
</div> </div>
<p> <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> </p>
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
......
...@@ -8,10 +8,10 @@ ...@@ -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: 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> </p>
<ul> <ul>
<li><a href="configuration/types">Protokolltypen</a></li> <li><a href="{{url_for("types_configuration_documentation")}}">Protokolltypen</a></li>
<li><a href="configuration/todomails">Todo-Mails</a></li> <li><a href="{{url_for("todomails_configuration_documentation")}}">Todo-Mails</a></li>
</ul> </ul>
<p> <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> </p>
{% endblock %} {% endblock %}
...@@ -10,11 +10,11 @@ ...@@ -10,11 +10,11 @@
<h4 id="decisions">Beschlüsse</h4> <h4 id="decisions">Beschlüsse</h4>
<p> <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> </p>
{% if config.PRINTING_ACTIVE %} {% if config.PRINTING_ACTIVE %}
<p> <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> </p>
{% endif %} {% endif %}
<div class="panel panel-default"> <div class="panel panel-default">
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
<h4 id="todos">Aufgaben (Todos)</h4> <h4 id="todos">Aufgaben (Todos)</h4>
<p> <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> </p>
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
...@@ -152,7 +152,7 @@ ...@@ -152,7 +152,7 @@
</div> </div>
</div> </div>
<p> <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> </p>
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<h4 id="session_start">Mit Beginn einer Sitzung</h4> <h4 id="session_start">Mit Beginn einer Sitzung</h4>
<p> <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> </p>
<ol> <ol>
<li>Stelle sicher, dass alle mit dem Vorprotokollieren fertig sind.</li> <li>Stelle sicher, dass alle mit dem Vorprotokollieren fertig sind.</li>
...@@ -58,10 +58,10 @@ ...@@ -58,10 +58,10 @@
{% if config.ETHERPAD_ACTIVE %} {% if config.ETHERPAD_ACTIVE %}
<li>Schreibe das Protokoll im Etherpad.</li> <li>Schreibe das Protokoll im Etherpad.</li>
{% endif %} {% endif %}
<li>Fülle alle benötigten <a href="/documentation/syntax/meta">Metadatenfelder</a>.</li> <li>Fülle alle benötigten <a href="{{url_for("meta_syntax_documentation")}}">Metadatenfelder</a>.</li>
<li>Falls <a href="/documentation/syntax/tags#todo">Todos</a> erledigt sind, markiere diese als erledigt.</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="/documentation/syntax/tags#decision">Beschluss-Tag</a>.</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="/documentation/syntax/tags">Tags</a>, wo diese erforderlich sind.</li> <li>Nutze auch die anderen <a href="{{url_for("tags_syntax_documentation")}}">Tags</a>, wo diese erforderlich sind.</li>
</ul> </ul>
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
......
...@@ -5,16 +5,16 @@ ...@@ -5,16 +5,16 @@
{% block documentation_content %} {% block documentation_content %}
<h3>Sitzungsverwaltung</h3> <h3>Sitzungsverwaltung</h3>
<p> <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> </p>
<h4>Verwaltung im Detail</h4> <h4>Verwaltung im Detail</h4>
<p> <p>
Die einzelnen Funktionen des Sitzungsmanagements werden jeweils auf Unterseiten erläutert. Auch werden die Arbeitsabläufe, wie sie im System vorgesehen sind, vorgestellt. Die einzelnen Funktionen des Sitzungsmanagements werden jeweils auf Unterseiten erläutert. Auch werden die Arbeitsabläufe, wie sie im System vorgesehen sind, vorgestellt.
</p> </p>
<ul> <ul>
<li><a href="/documentation/sessionmanagement/plan">Planung</a></li> <li><a href="{{url_for("plan_sessionmanagement_documentation")}}">Planung</a></li>
<li><a href="/documentation/sessionmanagement/write">Protokollieren</a></li> <li><a href="{{url_for("write_sessionmanagement_documentation")}}">Protokollieren</a></li>
<li><a href="/documentation/sessionmanagement/tracking">Nachverfolgung</a></li> <li><a href="{{url_for("tracking_sessionmanagement_documentation")}}">Nachverfolgung</a></li>
</ul> </ul>
<p> <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. 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 @@ ...@@ -55,7 +55,7 @@
</div> </div>
<div class="panel-body "> <div class="panel-body ">
<p> <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> </p>
</div> </div>
</div> </div>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
{% block documentation_content %} {% block documentation_content %}
<h3>Syntax: Metadaten</h3> <h3>Syntax: Metadaten</h3>
<p> <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> </p>
<h4>Definition</h4> <h4>Definition</h4>
<p> <p>
...@@ -17,6 +17,6 @@ ...@@ -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> <li><code class="highlight" style="color: inherit;"><span class="nc">#Ende</span>;<span class="mi">21:42</span></code> Ende der Sitzung</li>
</ul> </ul>
<p> <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> </p>
{% endblock %} {% endblock %}
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
</div> </div>
{% endif %} {% endif %}
<p> <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>
<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. 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 @@ ...@@ -88,7 +88,7 @@
<h4 id="todo">Todo-Tag</h4> <h4 id="todo">Todo-Tag</h4>
<p> <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> </p>
<figure>