merge
17
INSTALL
@ -79,12 +79,14 @@ II. Installation on GNU/Linux and MacOSX
|
||||
1. Install requirements:
|
||||
|
||||
OpenSlides requires following programs, which should be
|
||||
installed first: Python Programming Language 2 (>= 2.5),
|
||||
virtualenv (>= 1.4.1), ReportLab Toolkit and
|
||||
Python Imaging Library (PIL):
|
||||
installed first:
|
||||
+ Python Programming Language 2 (>= 2.5),
|
||||
+ virtualenv (>= 1.4.1),
|
||||
+ ReportLab Toolkit and
|
||||
+ Python Imaging Library (PIL)
|
||||
|
||||
E.g. for ubuntu run:
|
||||
$ sudo apt-get install python python-virtualenv python-reportlab python-imagin
|
||||
$ sudo apt-get install python python-virtualenv python-reportlab python-imaging
|
||||
|
||||
2. Get OpenSlides:
|
||||
|
||||
@ -105,6 +107,9 @@ II. Installation on GNU/Linux and MacOSX
|
||||
Go to the (extracted/cloned) root directory of OpenSlides
|
||||
and create virtualenv environment:
|
||||
|
||||
$ virtualenv .venv
|
||||
|
||||
For virtualenv >= 1.7 use instead:
|
||||
$ virtualenv --system-site-packages .venv
|
||||
|
||||
4. Activate the virtual environment:
|
||||
@ -116,9 +121,11 @@ II. Installation on GNU/Linux and MacOSX
|
||||
$ pip install django django-mptt
|
||||
|
||||
If you use python < 2.6 you also have to install simplejson:
|
||||
|
||||
$ pip install simplejson
|
||||
|
||||
If requirements reportlab or PIL still missing (see 1.):
|
||||
$ pip install reportlab pil
|
||||
|
||||
6. Start OpenSlides server and open URL in your default browser:
|
||||
|
||||
$ python start.py
|
||||
|
@ -19,6 +19,16 @@ Installieren Sie OpenSlides wie hier__ beschrieben. Starten Sie den Server wie h
|
||||
.. __: chapter2.html#erster-login
|
||||
|
||||
|
||||
Ändern des Administrator-Passworts
|
||||
----------------------------------
|
||||
|
||||
Ändern Sie zuerst das Passwort des Administrators. Klicken Sie oben rechts auf „Benutzereinstellungen“ und dann im linken Seitenmenü auf „Passwort Einstellungen“. Geben Sie in die entsprechenden Felder Ihr altes Passwort ``admin`` und als neues Passwort ``geheim`` ein. Wiederholen Sie das neue Passwort im dritten Formularfeld. Bestätigen Sie die Eingabe mit ``Speichern``.
|
||||
|
||||
**TODO:** Prüfen, ob `Ticket #310 <http://dev.openslides.org/ticket/310>`_ erfüllt ist
|
||||
|
||||
.. image:: _static/images/tutorial_de_01.png
|
||||
|
||||
|
||||
Konfiguration des Systems
|
||||
-------------------------
|
||||
|
||||
@ -26,17 +36,17 @@ Zunächst sind einige Einstellungen wie die Rahmendaten der Veranstaltung und di
|
||||
|
||||
Wechseln Sie zum Tab „Konfiguration“ und geben Sie die Allgemeinen Einstellungen wie folgt ein:
|
||||
|
||||
.. image:: _static/images/tutorial_de_01.png
|
||||
.. image:: _static/images/tutorial_de_02.png
|
||||
|
||||
Klicken Sie anschließend auf ``Speichern``. Auch bei allen folgenden Eingaben dieses Tutorials müssen Sie stets auf ``Speichern`` klicken, um die Eingabe abzuschließen.
|
||||
|
||||
Klicken Sie links auf „Antrag“ und stellen Sie die Antragseinleitung und die Anzahl der Stimmzettel wie folgt ein:
|
||||
|
||||
.. image:: _static/images/tutorial_de_02.png
|
||||
.. image:: _static/images/tutorial_de_03.png
|
||||
|
||||
Klicken Sie links auf „Wahl“ und stellen Sie ebenfalls die Anzahl der Stimmzettel wie folgt ein:
|
||||
|
||||
.. image:: _static/images/tutorial_de_03.png
|
||||
.. image:: _static/images/tutorial_de_04.png
|
||||
|
||||
Bei Anträgen und Wahlen kann es unter Umständen vorkommen, dass verschieden viele Stimmzettel benötigt werden, weshalb hierfür jeweils eigene Einstellungen vorzunehmen sind.
|
||||
|
||||
@ -50,21 +60,21 @@ Nun sind die Teilnehmer und Teilnehmerinnen einzutragen. Personen, die das Syste
|
||||
|
||||
Wechseln Sie zum Tab „Teilnehmer/innen“. Klicken Sie links auf „Neue/r Teilnehmer/in“ und geben Sie einen neuen Teilnehmer wie folgt ein:
|
||||
|
||||
.. image:: _static/images/tutorial_de_04.png
|
||||
.. image:: _static/images/tutorial_de_05.png
|
||||
|
||||
Wiederholen Sie diese Schritte und geben Sie folgende weitere Teilnehmer und Teilnehmerinnen ein: Peter Müller, Franziska Meyer, Luise Schmidt und Hans Schulze.
|
||||
|
||||
Wenn Sie anschließend links auf „Alle Teilnehmer/innen“ klicken, müssten Sie folgende Übersicht sehen:
|
||||
|
||||
.. image:: _static/images/tutorial_de_05.png
|
||||
.. image:: _static/images/tutorial_de_06.png
|
||||
|
||||
*Bei Ihrer eigenen Veranstaltung lohnt es sich, zuvor alle Teilnehmer und Teilnehmerinnen in einer CSV-Datei zu erfassen und wie hier (**TODO LINK**) erläutert zu importieren.*
|
||||
|
||||
Klicken Sie nur beim Teilnehmer „Max Mustermann“ unter der Rubrik „Aktionen“ auf das Bearbeiten-Symbol |document-edit| und weisen Sie der Person die Benutzerrollen „Tagesleitung“ und „Delegierter“ zu. Um mehrere Einträge auszuwählen, halten Sie beim Anklicken die Taste ``Strg`` gedrückt.
|
||||
|
||||
.. image:: _static/images/tutorial_de_06.png
|
||||
.. image:: _static/images/tutorial_de_07.png
|
||||
|
||||
Um das Passwort von Max Mustermann neu zu setzen, klicken Sie erneut auf das Bearbeiten-Symbol |document-edit| und tragen Sie unten unter „Erst-Passwort“ ein neues, selbstgewähltes Passwort ein. Anschließend klicken Sie auf „Übernehmen“ und erst danach auf den Link „Auf Erst-Passwort zurücksetzen“. Bestätigen Sie den oben auf der Seite erscheinenden Dialog mit „Ja“. Für dieses Tutorial sei als Passwort „geheim“ gewählt.
|
||||
Um das Passwort von Max Mustermann neu zu setzen, klicken Sie erneut auf das Bearbeiten-Symbol |document-edit| und tragen Sie unten unter „Erst-Passwort“ ein neues, selbstgewähltes Passwort ein. Für dieses Tutorial sei als Passwort ``geheim`` gewählt. Anschließend klicken Sie auf „Übernehmen“ und erst danach auf den Link „Auf Erst-Passwort zurücksetzen“. Bestätigen Sie den oben auf der Seite erscheinenden Dialog mit „Ja“.
|
||||
|
||||
.. |document-edit| image:: _static/images/document-edit.png
|
||||
|
||||
@ -76,21 +86,21 @@ Vor Beginn der Veranstaltung liegen bereits zwei Anträge an die Versammlung vor
|
||||
|
||||
Wechseln Sie zum Tab „Anträge“ und klicken Sie links auf „Neuer Antrag“. Geben Sie einen Antrag wie folgt ein:
|
||||
|
||||
.. image:: _static/images/tutorial_de_07.png
|
||||
.. image:: _static/images/tutorial_de_08.png
|
||||
|
||||
Die Antragsseite müsste nun wie folgt aussehen:
|
||||
|
||||
.. image:: _static/images/tutorial_de_08.png
|
||||
.. image:: _static/images/tutorial_de_09.png
|
||||
|
||||
Da der Antrag in unserem Fall ohne weitere Voraussetzungen (formal) zulässig ist, klicken Sie rechts auf „Zulassen“. Dem Antrag wird automatisch eine fortlaufende Nummer zugewiesen.
|
||||
|
||||
Geben Sie auf die gleiche Weise einen weiteren Antrag wie folgt ein:
|
||||
|
||||
.. image:: _static/images/tutorial_de_09.png
|
||||
.. image:: _static/images/tutorial_de_10.png
|
||||
|
||||
Danach klicken Sie wieder auf „Zulassen“. Die Antragsübersicht (links bei „Alle Anträge“) müsste nun so aussehen:
|
||||
|
||||
.. image:: _static/images/tutorial_de_10.png
|
||||
.. image:: _static/images/tutorial_de_11.png
|
||||
|
||||
|
||||
Eingabe der anstehenden Wahlen/Wahlämter
|
||||
@ -98,64 +108,172 @@ Eingabe der anstehenden Wahlen/Wahlämter
|
||||
|
||||
Ebenfalls vor Veranstaltungsbeginn sind die anstehenden Wahlen vorzubereiten. Geben Sie dazu im Tab „Wahlen“ links unter „Neue Wahl“ ein Wahlamt wie folgt ein:
|
||||
|
||||
.. image:: _static/images/tutorial_de_11.png
|
||||
.. image:: _static/images/tutorial_de_12.png
|
||||
|
||||
Geben Sie auf die gleiche Weise einen weiteres Wahlamt wie folgt ein:
|
||||
|
||||
.. image:: _static/images/tutorial_de_12.png
|
||||
.. image:: _static/images/tutorial_de_13.png
|
||||
|
||||
Die Wahlübersicht (links bei „Alle Wahlen“) müsste nun so aussehen:
|
||||
|
||||
.. image:: _static/images/tutorial_de_13.png
|
||||
.. image:: _static/images/tutorial_de_14.png
|
||||
|
||||
|
||||
Eingabe der Tagesordnung
|
||||
------------------------
|
||||
|
||||
Die Tagesordnung enthält bereits drei/sieben Einträge. Fügen Sie zunächst einige weitere Einträge hinzu.
|
||||
Die Tagesordnung enthält noch keine Einträge. Legen Sie zunächst einige Einträge an.
|
||||
|
||||
Klicken Sie dazu im Tab „Tagesordnung“ auf „Neuer Eintrag“ und geben Sie den Eintrag wie folgt ein:
|
||||
|
||||
.. image:: _static/images/tutorial_de_14.png
|
||||
.. image:: _static/images/tutorial_de_15.png
|
||||
|
||||
Erweitern Sie die Tagesordnung mit folgenden weiteren Punkten: bla bla bla (**TODO**)
|
||||
Erweitern Sie die Tagesordnung mit folgenden weiteren Punkten: Bericht des Vorstandes, Satzungsänderung, Gartenfest, Sonstiges, Wahlen der Vereinsämter
|
||||
|
||||
Ziehen Sie nun mit der Maus an den gekreuzten Pfeilen des Punktes bla, um seine Position zu verändern. Richten Sie die Tagesordnung durch Verschieben der Punkte so ein, dass sie wie folgt aussieht:
|
||||
|
||||
.. image:: _static/images/tutorial_de_15.png
|
||||
.. image:: _static/images/tutorial_de_16.png
|
||||
|
||||
Klicken Sie auf ``Speichern``, um die geänderte Reihenfolge festzulegen.
|
||||
|
||||
*Zu jedem Antrag und zu jedem Wahlamt können Sie über einen Link im Seitenmenü des betreffenden Antrags oder Wahlamts auch einen eigenen Eintrag in der Tagesordnung erstellen, der direkt mit der Antrags- bzw. Wahlfolie verknüpft ist. Dies empfiehlt sich, wenn ein einzelner Antrag oder eine einzelne Wahl an einer bestimmten Stelle der Tagesordnung behandelt werden soll.*
|
||||
|
||||
Hinzufügen weitere Beamerfolien
|
||||
-------------------------------
|
||||
Ändern Sie nun den Inhalt des Tagesordnungspunktes „Bericht des Vorstandes“, indem Sie in der Zeile dieses Punktes auf das Bearbeiten-Symbol |document-edit| klicken und zusätzlich zum Titel einen Text zum Tagesordnungspunkt wie folgt eingeben:
|
||||
|
||||
Wechseln Sie zum Tab „Beamer“. Wie Sie sehen, sind alle Tagesordnungseinträge sowie die angelegten Anträge und Wahlämter bereits als Folien auswählbar.
|
||||
.. image:: _static/images/tutorial_de_17.png
|
||||
|
||||
**TODO: Weitere Folien hinzufügen.**
|
||||
.. |document-edit| image:: _static/images/document-edit.png
|
||||
|
||||
|
||||
Hinzufügen benutzerdefinierter Folien
|
||||
-------------------------------------
|
||||
|
||||
Wechseln Sie zum Tab „Projektor“. Wie Sie sehen, sind alle Tagesordnungseinträge sowie die angelegten Anträge und Wahlämter bereits als Folien auswählbar.
|
||||
|
||||
Fügen Sie noch eine benutzerdefinierte Folie mit dem Titel „Kaffeepause“ hinzu, indem Sie bei dem Fenster „Benutzerdefinierte Folien“ auf „Neue Folie“ klicken und wie schon zuvor die Folie eintragen.
|
||||
|
||||
Die Ansicht im Tab „Projektor“ müsste nun wie folgt aussehen:
|
||||
|
||||
.. image:: _static/images/tutorial_de_18.png
|
||||
|
||||
|
||||
Technische Einrichtung im Veranstaltungsraum
|
||||
--------------------------------------------
|
||||
|
||||
Richten Sie Ihren Veranstaltungsraum ein. Im Präsentationsmodus Single schließen Sie den Beamer an Ihren Computer an und schieben ein zweites Browserfenster auf den erweiterten Bildschirm. Ansonsten richten Sie ein Netzwerk ein, schließen Sie einen beliebigen Computer an den Beamer an und öffnen im Vollbildmodus die Seite mit der Beameransicht. Den entsprechend Link finden Sie bei OpenSlides im Tab „Beamer“ auf der linken Seite.
|
||||
Richten Sie Ihren Veranstaltungsraum ein. Im Präsentationsmodus Single schließen Sie den Beamer an Ihren Computer an und schieben ein zweites Browserfenster auf den erweiterten Bildschirm. Ansonsten richten Sie ein Netzwerk ein, schließen Sie einen beliebigen Computer an den Beamer an und öffnen im Vollbildmodus die Seite mit der Projektoransicht. Den entsprechend Link finden Sie bei OpenSlides im Tab „Projektor“ auf der linken Seite.
|
||||
|
||||
|
||||
Testen
|
||||
------
|
||||
|
||||
Testen Sie, ob auf dem Beamer die gewünschten Folien zu sehen sind, wenn Sie bei OpenSlides im Tab „Beamer“ verschiedene Folien auswählen. Sie können eine bestimmte Folien anwählen, indem Sie auf das jeweilige graue Beamersymbol klicken. Die jeweils aktive Folie zeigt ein blaues Symbol.
|
||||
Testen Sie, ob auf dem Beamer die gewünschten Folien zu sehen sind, wenn Sie bei OpenSlides im Tab „Projektor“ verschiedene Folien auswählen. Sie können eine bestimmte Folien anwählen, indem Sie auf den jeweiligen grauen Haken klicken. Die jeweils aktive Folie zeigt einen blauen Haken.
|
||||
|
||||
Die verschiedenen Folien müssten auf dem Beamer wie folgt aussehen:
|
||||
|
||||
.. image:: _static/images/tutorial_de_19.png
|
||||
|
||||
.. image:: _static/images/tutorial_de_20.png
|
||||
|
||||
.. image:: _static/images/tutorial_de_21.png
|
||||
|
||||
.. image:: _static/images/tutorial_de_22.png
|
||||
|
||||
.. image:: _static/images/tutorial_de_23.png
|
||||
|
||||
|
||||
|
||||
Durchführung der Veranstaltung
|
||||
++++++++++++++++++++++++++++++
|
||||
|
||||
Aufgabenteilung: Vorsitzender leitet die Versammlung, Sie steuern den Beamer, ein Dritter (Max Mustermann) sitzt am Drucker.
|
||||
|
||||
TODO: Schilder des Ablaufs während der Versammlung, klicken hin und her, Anträge, geheime Abstimmungm, Wahlzettel, Ergebnisse eintragen, bestätigen. Redezeitbegrenzung, spontane Rednerliste
|
||||
|
||||
Aufgabenteilung, ein andere macht Login als MaxMustermann, wählt die Kandidaten
|
||||
Für die Durchführung der Veranstaltung gehen wir von folgender Aufgabenteilung aus. Der Vereinsvorsitzende leitet die Versammlung und sitzt in der Mitte des Podiums. Sie sitzen in seiner Nähe und steuern den Beamer, indem Sie im Tab „Projektor“ die jeweils gewünschten Folien auswählen. Herr Max Mustermann sitzt an einem weiteren Rechner, an dem ein Drucker angeschlossen ist. Im Präsentationsmodus Single muss auch der Drucker an ihren Rechner angeschlossen sein. Die Rolle des Max Mustermann entfällt.
|
||||
|
||||
|
||||
Beginn und erste Tagesordnungspunkte
|
||||
------------------------------------
|
||||
|
||||
Zu Beginn der Versammlung wählen Sie im Tab „Projektor“ die Willkommensseite aus, so dass Ihre Ansicht und die Beameransicht wie folgt zu sehen sind:
|
||||
|
||||
.. image:: _static/images/tutorial_de_24.png
|
||||
|
||||
.. image:: _static/images/tutorial_de_25.png
|
||||
|
||||
Während die ersten Tagesordnungspunkte abgehandelt werden, wählen Sie indem Sie im Tab „Projektor“ die jeweils gewünschten Folien aus.
|
||||
|
||||
Da zwischendurch ein Fußballergebnis angezeigt werden soll, schreiben Sie im Fenster „Einblendungen“ unter „Message“ die Nachricht „Bayern 1 : 1 Dortmund“, klicken auf „Übernehmen“ und aktivieren die Einblendung, indem Sie auf den davor gestellten grauen Haken klicken.
|
||||
|
||||
Das Beamerbild sieht dann wie folgt aus:
|
||||
|
||||
.. image:: _static/images/tutorial_de_26.png
|
||||
|
||||
Schalten Sie die Einblendung wieder aus, indem Sie erneut auf den (nunmehr blauen) Haken klicken.
|
||||
|
||||
|
||||
Anträge
|
||||
-------
|
||||
|
||||
Wenn der Vorsitzende den Antrag zur Satzungsänderung aufruft, klicken Sie zunächst im Tab „Projektor“ auf den entsprechenden Haken vor dem ersten Antrag.
|
||||
|
||||
Um schnell zur Antragsverwaltung zu wechseln, können Sie auf den Titel des Antrags klicken.
|
||||
|
||||
Die Antragsansicht sieht dann wie folgt aus:
|
||||
|
||||
.. image:: _static/images/tutorial_de_27.png
|
||||
|
||||
Nach Abschluss der Diskussion ruft der Vorsitzende zur Abstimmung. Klicken Sie auf „Neue Abstimmung“ und tragen Sie das Abstimmungsergebnis wie folgt in das Formular ein:
|
||||
|
||||
.. image:: _static/images/tutorial_de_28.png
|
||||
|
||||
Der Vorsitzende stellt fest, dass der Antrag angenommen ist. Klicken Sie deshalb auf „Angenommen“.
|
||||
|
||||
Das Beamerbild sieht nun wie folgt aus:
|
||||
|
||||
.. image:: _static/images/tutorial_de_29.png
|
||||
|
||||
|
||||
Wahlen
|
||||
------
|
||||
|
||||
Wenn der Vorsitzende die Wahlen zum neuen Vorstand aufruft, klicken Sie zunächst im Tab „Projektor“ auf den entsprechenden Haken vor der ersten Wahl. Wechseln Sie dann zur Wahlansicht, indem Sie auf den Titel der Wahl klicken.
|
||||
|
||||
Die Wahlansicht sieht dann wie folgt aus:
|
||||
|
||||
.. image:: _static/images/tutorial_de_30.png
|
||||
|
||||
Es werden nun verschiedene Kandidaten vorgeschlagen, die Sie durch Auswahl eines Teilnehmers und Klick auf „Übernehmen“ auf die Kandidatenliste setzen können.
|
||||
|
||||
*Das kleine Symbol neben dem dem Auswahlformular ist ein direkter Link zur Eingabe eines neuen Teilnehmers. Die kann sehr nützlich sein, wenn kurzfristig eine Person nominiert wird, die noch nicht ins System eingetragen wurde.*
|
||||
|
||||
.. image:: _static/images/tutorial_de_31.png
|
||||
|
||||
Steht die Kandidatenauswahl fest, ändern Sie rechts den Status der Wahl auf „Im Wahlgang“. Klicken Sie anschließend unten auf „Neuer Wahlgang“, um einen ersten Wahlgang anzulegen. Da es eine geheime Wahl ist und die Stimmzettel erst ausgeteilt werden müssen, können Sie jetzt noch keine Wahlergebnisse eintragen.
|
||||
|
||||
Herr Max Mustermann, dessen Computer mit dem Drucker verbunden ist, begibt sich ins Netzwerk, ruft in seinem Browser die OpenSlides-Seite auf und loggt sich mit seinem Benutzernamen ``Max Mustermann`` und seinem Passwort ``geheim`` ein. Er klickt im Tab „Wahlen“ auf die erste Wahl und dort unten auf das Bearbeiten-Symbol |document-edit| bei ersten Wahlgang.
|
||||
|
||||
Seine Ansicht sieht dann wie folgt aus:
|
||||
|
||||
.. image:: _static/images/tutorial_de_32.png
|
||||
|
||||
.. |document-edit| image:: _static/images/document-edit.png
|
||||
|
||||
Anschließend klickt er auf „Stimmzettel als PDF“. OpenSlides liefert ihm daraufhin eine PDF-Datei, die er direkt ausdrucken kann. Die Stimmzettel können anschließend auseinandergeschnitten und verteilt werden.
|
||||
|
||||
*Bei mehrfachen Wahlen bietet es sich der Einsatz einer Hebelschere an.*
|
||||
|
||||
*Im Präsentationsmodus Single übernehmen Sie die Aufgaben des Max Mustermann selbst.*
|
||||
|
||||
Nach Auszählung der Stimmzettel tragen Sie die Ergebnisse in eben dieses Formular des ersten Wahlgangs ein:
|
||||
|
||||
.. image:: _static/images/tutorial_de_33.png
|
||||
|
||||
Klicken Sie anschließend auf den grauen Knopf bei ersten Wahlgang, um die Wahlergebnisse auf dem Beamer zu veröffentlichen.
|
||||
|
||||
.. image:: _static/images/tutorial_de_34.png
|
||||
|
||||
|
||||
Schluss der Versammlung
|
||||
-----------------------
|
||||
|
||||
Am Ende der Versammlung können Sie sich für das Protokoll einige Anhänge direkt aus OpenSlides holen. Klicken Sie jeweils im Tab „Tagesordnung“, „Anträge“ und „Wahlen“ auf die Links „Tagesordnung als PDF“, „Alle Anträge als PDF“ und „Alle Wahlen als PDF“, die sich jeweils im linken Seitenmenu befinden.
|
||||
|
||||
.. Aufgabenteilung: Vorsitzender leitet die Versammlung, Sie steuern den Beamer, ein Dritter (Max Mustermann) sitzt am Drucker. TODO: Schilder des Ablaufs während der Versammlung, klicken hin und her, Anträge, geheime Abstimmungm, Wahlzettel, Ergebnisse eintragen, bestätigen. Redezeitbegrenzung, spontane Rednerliste - Aufgabenteilung, ein andere macht Login als MaxMustermann, wählt die Kandidaten
|
||||
|
||||
|
17
extras/website/website/forms.py
Normal file
@ -0,0 +1,17 @@
|
||||
from django import forms
|
||||
|
||||
TOPIC_CHOICES = (
|
||||
('question', 'General question'),
|
||||
('bug', 'Bug report'),
|
||||
('reference', 'Add OpenSlides reference'),
|
||||
)
|
||||
|
||||
class ContactForm(forms.Form):
|
||||
error_css_class = 'error'
|
||||
required_css_class = 'required'
|
||||
topic = forms.ChoiceField(choices=TOPIC_CHOICES)
|
||||
subject = forms.CharField(max_length=100)
|
||||
message = forms.CharField()
|
||||
sender = forms.EmailField()
|
||||
cc_myself = forms.BooleanField(required=False)
|
||||
|
@ -98,8 +98,9 @@ TEMPLATE_LOADERS = (
|
||||
)
|
||||
|
||||
MIDDLEWARE_CLASSES = (
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.locale.LocaleMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
|
@ -9,6 +9,10 @@ body {
|
||||
}
|
||||
.navbar .nav > li > a {
|
||||
color: #cccccc;
|
||||
font-size: 14px;
|
||||
}
|
||||
.navbar .nav.pull-right > li > a {
|
||||
font-size: 12px;
|
||||
}
|
||||
.hero-unit {
|
||||
margin-top: -15px;
|
||||
@ -125,3 +129,26 @@ footer a:hover {
|
||||
color: #FFFFFF;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
ul.errorlist {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none outside none;
|
||||
}
|
||||
.errorlist li {
|
||||
color: #DA3939;
|
||||
font-size: 9px;
|
||||
font-style: italic;
|
||||
height: 13px;
|
||||
padding: 0;
|
||||
}
|
||||
form .error {
|
||||
color: #DA3939;
|
||||
font-weight: bold;
|
||||
}
|
||||
form p.error {
|
||||
margin-top: 0;
|
||||
}
|
||||
form .error input, form .error textarea {
|
||||
border: 1px solid #DA3939;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 9.8 KiB |
@ -31,14 +31,15 @@
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</a>
|
||||
<a class="brand" href="/" style="padding: 4px 20px;" title="Home">
|
||||
<a class="brand" href="{% url home %}" style="padding: 4px 20px;" title="Home">
|
||||
<img src="/static/img/openslides-logo_wide-light.png" height="31px">
|
||||
</a>
|
||||
<div class="nav-collapse">
|
||||
<ul class="nav">
|
||||
<li class="{% block mainmenu_about %}{% endblock %}"><a href="{% url about %}">{% trans "Über OpenSlides" %}</a></li>
|
||||
<li class="{% block mainmenu_download %}{% endblock %}"><a href="{% url download %}">{% trans "Download" %}</a></li>
|
||||
<li class="{% block mainmenu_support %}{% endblock %}"><a href="{% url support %}">{% trans "Support & Dokumentation" %}</a></li>
|
||||
<li class="{% block mainmenu_support %}{% endblock %}"><a href="{% url support %}">{% trans "Support" %}</a></li>
|
||||
<li class="{% block mainmenu_documentation %}{% endblock %}"><a href="{% url documentation %}">{% trans "Dokumentation" %}</a></li>
|
||||
<li class="{% block mainmenu_development %}{% endblock %}"><a href="{% url development %}">{% trans "Entwicklung" %}</a></li>
|
||||
</ul>
|
||||
<ul class="nav pull-right">
|
||||
@ -47,7 +48,9 @@
|
||||
{% get_available_languages as languages %}
|
||||
{% for lang_code, lang_name in languages %}
|
||||
{% language lang_code %}
|
||||
<li {% if LANGUAGE_CODE == lang_code %}class="active"{% endif %}><a href="{{lang_code}}"><i class="icon-flag icon-white"></i> {{ lang_name }}</a></li>
|
||||
<li {% if LANGUAGE_CODE == lang_code %}class="active"{% endif %}>
|
||||
<a href="{% url home %}"><i class="icon-flag icon-white"></i> {{ lang_name }}</a>
|
||||
</li>
|
||||
{% endlanguage %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
@ -90,11 +93,11 @@
|
||||
</ul>
|
||||
</div>
|
||||
<div class="span2">
|
||||
<h4>Support & Dokumentation</h4>
|
||||
<h4>Hilfe</h4>
|
||||
<ul class="unstyled">
|
||||
<li><a href="{% url support %}">Professioneller Support</a></li>
|
||||
<li><a href="#">FAQ</a></li>
|
||||
<li><a href="#">Handbuch</a></li>
|
||||
<li><a href="{% url support %}">Support</a></li>
|
||||
<li><a href="{% url documentation %}">Handbuch</a></li>
|
||||
<li><a href="{% url faq %}">FAQ</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="span2">
|
||||
@ -103,13 +106,13 @@
|
||||
<li><a href="http://dev.openslides.org">Wiki</a></li>
|
||||
<li><a href="http://dev.openslides.org/roadmap">Roadmap</a></li>
|
||||
<li><a href="http://dev.openslides.org/report/3">Tickets</a></li>
|
||||
<li><a href="http://dev.openslides.org/browser">Quellcode durchsuchen</a></li>
|
||||
<li><a href="http://dev.openslides.org/browser">Quellcode</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="span2">
|
||||
<h4>Mehr</h4>
|
||||
<ul class="unstyled">
|
||||
<li><a href="#">Spenden</a></li>
|
||||
<li><a href="{% url donate %}">Spenden</a></li>
|
||||
<li><a href="{% url contact %}">Kontakt</a></li>
|
||||
<li><a href="{% url impressum %}">Impressum</a></li>
|
||||
</ul>
|
||||
|
14
extras/website/website/templates/base_documentation.html
Normal file
@ -0,0 +1,14 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% load i18n %}
|
||||
|
||||
{% block mainmenu_documentation %}active{% endblock %}
|
||||
|
||||
{% block submenu %}
|
||||
<div class="subnav subnav-fixed">
|
||||
<ul class="nav nav-pills">
|
||||
<li class="{% block submenu_documentation %}{% endblock %}"><a href="{% url documentation %}">Handbuch</a></li>
|
||||
<li class="{% block submenu_faq %}{% endblock %}"><a href="{% url faq %}">FAQ</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endblock %}
|
@ -1,15 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% load i18n %}
|
||||
|
||||
{% block mainmenu_support %}active{% endblock %}
|
||||
|
||||
{% block submenu %}
|
||||
<div class="subnav subnav-fixed">
|
||||
<ul class="nav nav-pills">
|
||||
<li class="{% block submenu_support %}{% endblock %}"><a href="{% url support %}">Professioneller Support</a></li>
|
||||
<li><a href="#">FAQ</a></li>
|
||||
<li><a href="#">Handbuch</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endblock %}
|
@ -13,6 +13,12 @@ Kontaktmöglichkeiten zur OpenSlides Community
|
||||
|
||||
{% block content %}
|
||||
|
||||
<form action="" method="post">{% csrf_token %}
|
||||
{{ form.name_of_field.errors }}
|
||||
{{ form.as_p }}
|
||||
<input type="submit" value="Submit" />
|
||||
</form>
|
||||
|
||||
<h3>Mailinglisten</h3>
|
||||
|
||||
<p>OpenSlides bietet öffentliche Mailinglisten zur Koordination der Entwicklung
|
||||
|
21
extras/website/website/templates/documentation.html
Normal file
@ -0,0 +1,21 @@
|
||||
{% extends "base_documentation.html" %}
|
||||
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{{ block.super }} - {% trans "Handbuch" %}{% endblock %}
|
||||
{% block headline %}{% trans "Handbuch" %}{% endblock %}
|
||||
|
||||
{% block submenu_documentation %}active{% endblock %}
|
||||
|
||||
{% block lead %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="span6">
|
||||
<p>TODO</p>
|
||||
</div>
|
||||
</div>
|
||||
<p><br></p>
|
||||
<p><br></p>
|
||||
{% endblock %}
|
15
extras/website/website/templates/donate.html
Normal file
@ -0,0 +1,15 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{{ block.super }} - {% trans "Spenden" %}{% endblock %}
|
||||
{% block headline %}{% trans "Spenden" %}{% endblock %}
|
||||
|
||||
{% block mainmenu_donate %}active{% endblock %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
|
||||
<p>TODO</p>
|
||||
|
||||
{% endblock %}
|
21
extras/website/website/templates/faq.html
Normal file
@ -0,0 +1,21 @@
|
||||
{% extends "base_documentation.html" %}
|
||||
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{{ block.super }} - {% trans "FAQ" %}{% endblock %}
|
||||
{% block headline %}{% trans "FAQ" %}{% endblock %}
|
||||
|
||||
{% block submenu_faq %}active{% endblock %}
|
||||
|
||||
{% block lead %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="span6">
|
||||
<p>TODO</p>
|
||||
</div>
|
||||
</div>
|
||||
<p><br></p>
|
||||
<p><br></p>
|
||||
{% endblock %}
|
@ -1,11 +1,11 @@
|
||||
{% extends "base_support.html" %}
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{{ block.super }} - Support{% endblock %}
|
||||
{% block headline %}Support{% endblock %}
|
||||
|
||||
{% block submenu_support %}active{% endblock %}
|
||||
{% block mainmenu_support %}active{% endblock %}
|
||||
|
||||
{% block lead %}
|
||||
Die Intevation GmbH bietet Ihnen professionellen Support beim Einsatz von OpenSlides auf Ihrer Veranstaltung an.
|
||||
|
@ -1,13 +1,15 @@
|
||||
from django.conf.urls import patterns, include, url
|
||||
from django.conf.urls.i18n import i18n_patterns
|
||||
from django.views.generic import TemplateView
|
||||
from website import views
|
||||
|
||||
#from views import TemplateView
|
||||
# Uncomment the next two lines to enable the admin:
|
||||
# from django.contrib import admin
|
||||
# admin.autodiscover()
|
||||
|
||||
urlpatterns = patterns('',
|
||||
urlpatterns = i18n_patterns('',
|
||||
url(r'^i18n/', include('django.conf.urls.i18n')),
|
||||
url(r'^$', TemplateView.as_view(template_name="home.html"), name='home',),
|
||||
url(r'^about/$', TemplateView.as_view(template_name="about.html"), name='about',),
|
||||
url(r'^about/features$', TemplateView.as_view(template_name="features.html"), name='features',),
|
||||
@ -16,8 +18,11 @@ urlpatterns = patterns('',
|
||||
url(r'^about/press$', TemplateView.as_view(template_name="press.html"), name='press',),
|
||||
url(r'^download/$', TemplateView.as_view(template_name="download.html"), name='download',),
|
||||
url(r'^support/$', TemplateView.as_view(template_name="support.html"), name='support',),
|
||||
url(r'^documentation/$', TemplateView.as_view(template_name="documentation.html"), name='documentation',),
|
||||
url(r'^faq/$', TemplateView.as_view(template_name="faq.html"), name='faq',),
|
||||
url(r'^development/$', TemplateView.as_view(template_name="development.html"), name='development',),
|
||||
url(r'^contact/$', TemplateView.as_view(template_name="contact.html"), name='contact',),
|
||||
url(r'^contact/$', 'website.views.contact', name='contact',),
|
||||
url(r'^donate/$', TemplateView.as_view(template_name="donate.html"), name='donate',),
|
||||
url(r'^demo/$', TemplateView.as_view(template_name="demo.html"), name='demo',),
|
||||
url(r'^impressum/$', TemplateView.as_view(template_name="impressum.html"), name='impressum',),
|
||||
)
|
||||
|
@ -1,7 +0,0 @@
|
||||
|
||||
# Oskar
|
||||
class TemplateView(_TemplateView):
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(TemplateView, self).get_context_data(**kwargs)
|
||||
context[request] = self.request
|
||||
return context
|
@ -1,9 +1,34 @@
|
||||
from django.views.generic import TemplateView
|
||||
#from django.views.generic import TemplateView
|
||||
from django.shortcuts import render_to_response, render
|
||||
from django.http import HttpResponseRedirect
|
||||
|
||||
class TemplateView():
|
||||
from website.forms import ContactForm
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(TemplateView, self).get_context_data(**kwargs)
|
||||
print self.request
|
||||
# template_manipulation.send(sender=self.__class__, request=self.request, context=context)
|
||||
return context
|
||||
#class TemplateView(TemplateView):
|
||||
# def get_context_data(self, **kwargs):
|
||||
# context = super(TemplateView, self).get_context_data(**kwargs)
|
||||
# context[request] = self.request
|
||||
# return context
|
||||
|
||||
|
||||
def contact(request):
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
form = ContactForm(request.POST) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
subject = form.cleaned_data['subject']
|
||||
message = form.cleaned_data['message']
|
||||
sender = form.cleaned_data['sender']
|
||||
cc_myself = form.cleaned_data['cc_myself']
|
||||
recipients = ['emanuel@intevation.de']
|
||||
if cc_myself:
|
||||
recipients.append(sender)
|
||||
|
||||
from django.core.mail import send_mail
|
||||
send_mail(subject, message, sender, recipients)
|
||||
return HttpResponseRedirect('/demo/') # Redirect after POST
|
||||
else:
|
||||
form = ContactForm() # An unbound form
|
||||
|
||||
return render(request, 'contact.html', {
|
||||
'form': form,
|
||||
})
|
||||
|
@ -14,6 +14,11 @@
|
||||
<li class="{% active request '/agenda/new/' %}"><a href="{% url item_new %}">{% trans "New item" %}</a></li>
|
||||
{% endif %}
|
||||
<li><a href="{% url print_agenda %}"><img src="{% static 'images/icons/pdf.png' %}"> {% trans 'Agenda as PDF' %}</a></li>
|
||||
{% if perms.projector.can_see_projector %}
|
||||
<li>
|
||||
<a href="{% url projector_show %}"><img src="{% static 'images/icons/projector.png' %}"> {% trans 'Projector view' %}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
{# second submenu #}
|
||||
|
@ -106,7 +106,7 @@ class Application(models.Model, SlideMixin):
|
||||
if version.id > self.permitted.id:
|
||||
version.rejected = True
|
||||
version.save()
|
||||
self.writelog(pgettext("Rejected meens not permittd", "Version %d rejected")
|
||||
self.writelog(pgettext("Rejected means not permitted", "Version %d rejected")
|
||||
% (version.aid, ), user)
|
||||
return True
|
||||
return False
|
||||
|
@ -560,7 +560,7 @@ def reject_version(request, aversion_id):
|
||||
def application_import(request):
|
||||
try:
|
||||
request.user.profile
|
||||
messages.error(request, _('The import function is available for the superuser (without user profile) only.'))
|
||||
messages.error(request, _('The import function is available for the admin (without user profile) only.'))
|
||||
return redirect(reverse('application_overview'))
|
||||
except Profile.DoesNotExist:
|
||||
pass
|
||||
|
@ -1,7 +1,7 @@
|
||||
Steps to update translation for OpenSlides:
|
||||
------------------------------------------
|
||||
Instruction to update translation for OpenSlides:
|
||||
-------------------------------------------------
|
||||
|
||||
1. Go to project root directory:
|
||||
1. Go to the openslides directory (which contains the 'locale' directory):
|
||||
$ cd openslides
|
||||
|
||||
2. Update the German po file (locale/de/LC_MESSAGES/django.po):
|
||||
@ -16,8 +16,10 @@ Steps to update translation for OpenSlides:
|
||||
5. Restart server:
|
||||
$ python manage.py runserver
|
||||
|
||||
|
||||
|
||||
--
|
||||
Additional hints for internationalization (i18n) in Django:
|
||||
- http://docs.djangoproject.com/en/dev/topics/i18n/internationalization/
|
||||
- http://docs.djangoproject.com/en/dev/topics/i18n/localization/
|
||||
https://docs.djangoproject.com/en/dev/topics/i18n/
|
||||
|
||||
Note: gettext is required to extract message IDs or compile message files.
|
||||
For gettext on Windows read:
|
||||
https://docs.djangoproject.com/en/dev/topics/i18n/translation/#gettext-on-windows
|
@ -392,7 +392,7 @@ def user_import(request):
|
||||
from openslides.application.models import Application
|
||||
try:
|
||||
request.user.profile
|
||||
messages.error(request, _('The import function is available for the superuser (without user profile) only.'))
|
||||
messages.error(request, _('The import function is available for the admin (without user profile) only.'))
|
||||
return redirect(reverse('user_overview'))
|
||||
except Profile.DoesNotExist:
|
||||
pass
|
||||
@ -568,8 +568,11 @@ def login(request):
|
||||
try:
|
||||
admin = User.objects.get(pk=1)
|
||||
if admin.check_password(config['admin_password']):
|
||||
first_time_message = _("The password for the user %(user)s is "
|
||||
"%(password)s. Please change it") % {
|
||||
first_time_message = _("Installation was successfully! Use %(user)s "
|
||||
"(password: %(password)s) for first login.<br>"
|
||||
"<strong>Important:</strong> Please change the password after "
|
||||
"first login! Otherwise this message still appears for everyone "
|
||||
"and could be a security risk.") % {
|
||||
'user': html_strong(admin.username),
|
||||
'password': html_strong(config['admin_password'])}
|
||||
else:
|
||||
|