diff --git a/INSTALL b/INSTALL index ce9cefb23..516f99eef 100644 --- a/INSTALL +++ b/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 diff --git a/docs/de/chapter3.rst b/docs/de/chapter3.rst index 1f737d176..3b2989a13 100644 --- a/docs/de/chapter3.rst +++ b/docs/de/chapter3.rst @@ -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 `_ 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 diff --git a/extras/website/website/forms.py b/extras/website/website/forms.py new file mode 100644 index 000000000..f7c81ca86 --- /dev/null +++ b/extras/website/website/forms.py @@ -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) + diff --git a/extras/website/website/settings.py b/extras/website/website/settings.py index 34f449087..78c5f5ee3 100644 --- a/extras/website/website/settings.py +++ b/extras/website/website/settings.py @@ -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', diff --git a/extras/website/website/static/css/style.css b/extras/website/website/static/css/style.css index 6c236ee66..e6108954f 100755 --- a/extras/website/website/static/css/style.css +++ b/extras/website/website/static/css/style.css @@ -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; +} diff --git a/extras/website/website/static/img/references/aej-logo.png b/extras/website/website/static/img/references/aej-logo.png index 8006a447a..36e813030 100644 Binary files a/extras/website/website/static/img/references/aej-logo.png and b/extras/website/website/static/img/references/aej-logo.png differ diff --git a/extras/website/website/static/img/references/esg-logo.png b/extras/website/website/static/img/references/esg-logo.png index 7c1053a43..2fcb41475 100644 Binary files a/extras/website/website/static/img/references/esg-logo.png and b/extras/website/website/static/img/references/esg-logo.png differ diff --git a/extras/website/website/static/img/references/gruene-logo.png b/extras/website/website/static/img/references/gruene-logo.png index 11b81ecd8..4e0052e87 100644 Binary files a/extras/website/website/static/img/references/gruene-logo.png and b/extras/website/website/static/img/references/gruene-logo.png differ diff --git a/extras/website/website/static/img/references/piraten-logo.png b/extras/website/website/static/img/references/piraten-logo.png index c0455b557..a7e65037d 100644 Binary files a/extras/website/website/static/img/references/piraten-logo.png and b/extras/website/website/static/img/references/piraten-logo.png differ diff --git a/extras/website/website/templates/base.html b/extras/website/website/templates/base.html index b4e9a5ccd..daf8d9224 100644 --- a/extras/website/website/templates/base.html +++ b/extras/website/website/templates/base.html @@ -31,14 +31,15 @@ - +
-

Support & Dokumentation

+

Hilfe

@@ -103,13 +106,13 @@
  • Wiki
  • Roadmap
  • Tickets
  • -
  • Quellcode durchsuchen
  • +
  • Quellcode
  • Mehr

    @@ -125,4 +128,4 @@ - \ No newline at end of file + diff --git a/extras/website/website/templates/base_documentation.html b/extras/website/website/templates/base_documentation.html new file mode 100644 index 000000000..f32e358c9 --- /dev/null +++ b/extras/website/website/templates/base_documentation.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% load i18n %} + +{% block mainmenu_documentation %}active{% endblock %} + +{% block submenu %} + +{% endblock %} \ No newline at end of file diff --git a/extras/website/website/templates/base_support.html b/extras/website/website/templates/base_support.html deleted file mode 100644 index 98af45a35..000000000 --- a/extras/website/website/templates/base_support.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base.html" %} - -{% load i18n %} - -{% block mainmenu_support %}active{% endblock %} - -{% block submenu %} - -{% endblock %} \ No newline at end of file diff --git a/extras/website/website/templates/contact.html b/extras/website/website/templates/contact.html index 1d0895361..f88500af1 100644 --- a/extras/website/website/templates/contact.html +++ b/extras/website/website/templates/contact.html @@ -13,6 +13,12 @@ Kontaktmöglichkeiten zur OpenSlides Community {% block content %} +
    {% csrf_token %} +{{ form.name_of_field.errors }} +{{ form.as_p }} + +
    +

    Mailinglisten

    OpenSlides bietet öffentliche Mailinglisten zur Koordination der Entwicklung @@ -71,4 +77,4 @@ Kanal: #openslides

    Bitte nutzen Sie unser Ticketsystem um Problem mit OpenSlides zu berichten.

    -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/extras/website/website/templates/documentation.html b/extras/website/website/templates/documentation.html new file mode 100644 index 000000000..2be59993b --- /dev/null +++ b/extras/website/website/templates/documentation.html @@ -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 %} +
    +
    +

    TODO

    +
    +
    +


    +


    +{% endblock %} diff --git a/extras/website/website/templates/donate.html b/extras/website/website/templates/donate.html new file mode 100644 index 000000000..b6222a163 --- /dev/null +++ b/extras/website/website/templates/donate.html @@ -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 %} + +

    TODO

    + +{% endblock %} \ No newline at end of file diff --git a/extras/website/website/templates/faq.html b/extras/website/website/templates/faq.html new file mode 100644 index 000000000..cec9357f8 --- /dev/null +++ b/extras/website/website/templates/faq.html @@ -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 %} +
    +
    +

    TODO

    +
    +
    +


    +


    +{% endblock %} diff --git a/extras/website/website/templates/support.html b/extras/website/website/templates/support.html index 5134f1d4d..c64c34ba3 100644 --- a/extras/website/website/templates/support.html +++ b/extras/website/website/templates/support.html @@ -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. diff --git a/extras/website/website/urls.py b/extras/website/website/urls.py index 1911684ca..28e86146e 100644 --- a/extras/website/website/urls.py +++ b/extras/website/website/urls.py @@ -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',), ) diff --git a/extras/website/website/utils.py b/extras/website/website/utils.py deleted file mode 100644 index 62815b463..000000000 --- a/extras/website/website/utils.py +++ /dev/null @@ -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 \ No newline at end of file diff --git a/extras/website/website/views.py b/extras/website/website/views.py index 76b50a6bf..11e935f80 100644 --- a/extras/website/website/views.py +++ b/extras/website/website/views.py @@ -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 \ No newline at end of file +#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, + }) diff --git a/openslides/agenda/templates/agenda/base_agenda.html b/openslides/agenda/templates/agenda/base_agenda.html index 1da6ca241..c2d17c4f6 100644 --- a/openslides/agenda/templates/agenda/base_agenda.html +++ b/openslides/agenda/templates/agenda/base_agenda.html @@ -14,6 +14,11 @@
  • {% trans "New item" %}
  • {% endif %}
  • {% trans 'Agenda as PDF' %}
  • + {% if perms.projector.can_see_projector %} +
  • + {% trans 'Projector view' %} +
  • + {% endif %} {# second submenu #} diff --git a/openslides/application/models.py b/openslides/application/models.py index 7abb8922a..911b4fb84 100644 --- a/openslides/application/models.py +++ b/openslides/application/models.py @@ -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 diff --git a/openslides/application/views.py b/openslides/application/views.py index ad4ab436c..dc8db38f9 100644 --- a/openslides/application/views.py +++ b/openslides/application/views.py @@ -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 diff --git a/openslides/locale/README.txt b/openslides/locale/README.txt index b3f4dbd8d..0205dffc5 100644 --- a/openslides/locale/README.txt +++ b/openslides/locale/README.txt @@ -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): @@ -15,9 +15,11 @@ 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/ \ No newline at end of file +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 \ No newline at end of file diff --git a/openslides/locale/de/LC_MESSAGES/django.mo b/openslides/locale/de/LC_MESSAGES/django.mo index e57b7865d..4cf8ef59e 100644 Binary files a/openslides/locale/de/LC_MESSAGES/django.mo and b/openslides/locale/de/LC_MESSAGES/django.mo differ diff --git a/openslides/participant/views.py b/openslides/participant/views.py index bb8cfefbb..0024116c4 100644 --- a/openslides/participant/views.py +++ b/openslides/participant/views.py @@ -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.
    " + "Important: 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: