Merge pull request #23 from emanuelschuetze/master

prepare 1.3-beta1 release
This commit is contained in:
Oskar Hahn 2012-10-31 00:27:13 -07:00
commit 0397849a79
15 changed files with 260 additions and 221 deletions

1
.gitignore vendored
View File

@ -11,3 +11,4 @@ docs/_build/*
*.egg-info *.egg-info
build/* build/*
dist/* dist/*
.DS_Store

View File

@ -1,4 +1,4 @@
Installation Instructions for OpenSlides 1.2 Installation Instructions for OpenSlides 1.3
============================================ ============================================
Content Content
@ -48,7 +48,7 @@ I. Installation on Windows (32/64bit)
easy_install django django-mptt reportlab pil easy_install django django-mptt reportlab pil
If you use a 64bit version of Python, you have to install reportlab If you use a 64bit version of Python, you have to install reportlab
and pil not by using easy_install but manually. and PIL manually - without using easy_install.
2. Get OpenSlides: 2. Get OpenSlides:
@ -56,13 +56,12 @@ I. Installation on Windows (32/64bit)
OR OR
b) Clone development version from mercurial repository b) Clone development version from OpenSlides' github repository
http://hg.openslides.org. This requires Mercurial source control https://github.com/OpenSlides/OpenSlides.
management (hg), see http://mercurial.selenic.com. This requires Git, see http://git-scm.com/.
Open command line (cmd) and run: Open command line (cmd) and run:
hg clone http://hg.openslides.org OpenSlides git clone git://github.com/OpenSlides/OpenSlides.git
3. Start OpenSlides server and open URL in your default browser: 3. Start OpenSlides server and open URL in your default browser:

View File

@ -2,7 +2,7 @@
English README file for OpenSlides English README file for OpenSlides
================================== ==================================
This is OpenSlides, version 1.2 (2012-07-25). This is OpenSlides, version 1.3-beta1 (2012-10-30).
What is OpenSlides? What is OpenSlides?
@ -47,17 +47,27 @@ Command line options
-------------------- --------------------
The following command line options are available: The following command line options are available:
-h, --help
Shows all options
-a, --address=ADDRESS -a, --address=ADDRESS
Changes the address on which the server will listen for connections Changes the address on which the server will listen for connections
-p, --port -p PORT, --port=PORT
Changes the port on which the server will listen for connections Changes the port on which the server will listen for connections
--syncdb --syncdb
Create/ update the database Creates/updates database before starting the server
--reset-admin --reset-admin
This will reset the password of the user Resets the password to 'admin' for user 'admin'
-s SETTINGS, --settings=SETTINGS
Sets the path to the settings file.
--no-reload
Does not reload the development server
Example 1: Openslides should only be accessible on this computer: Example 1: Openslides should only be accessible on this computer:
openslides.exe -a 127.0.0.1 openslides.exe -a 127.0.0.1
@ -82,4 +92,3 @@ Browsers:
IE 7+ IE 7+
Chrome Chrome
Safari Safari

View File

@ -5,7 +5,7 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
VERSION = (1, 3, 0, 'alpha', 1) VERSION = (1, 3, 0, 'beta', 1)
def get_version(version=None): def get_version(version=None):
@ -16,7 +16,7 @@ def get_version(version=None):
if version is None: if version is None:
version = VERSION version = VERSION
assert len(version) == 5 assert len(version) == 5
assert version[3] in ('alpha', 'beta', 'rc', 'final') assert version[3] in ('dev', 'alpha', 'beta', 'rc', 'final')
# Now build the two parts of the version number: # Now build the two parts of the version number:
# main = X.Y[.Z] # main = X.Y[.Z]
@ -27,16 +27,17 @@ def get_version(version=None):
main = '.'.join(str(x) for x in version[:main_parts]) main = '.'.join(str(x) for x in version[:main_parts])
if version[3] != 'final': if version[3] != 'final':
mapping = {'alpha': 'a', 'beta': 'b', 'rc': 'c'} if version[3] == 'dev':
sub = mapping[version[3]] + str(version[4]) try:
try: git_head_path = '.git/' + open('.git/HEAD', 'r').read()[5:].rstrip()
git_head_path = '.git/' + open('.git/HEAD', 'r').read()[5:].rstrip() except IOError:
except IOError: git_commit_id = 'unknown'
git_commit_id = 'unknown' else:
import os
git_commit_id = open(os.path.abspath(git_head_path), 'r').read().rstrip()
sub = '-%s%s' % (version[3], git_commit_id)
else: else:
import os sub = '-' + version[3] + str(version[4])
git_commit_id = open(os.path.abspath(git_head_path), 'r').read().rstrip()
sub = '%s commit %s' % (sub, git_commit_id)
else: else:
sub = '' sub = ''

View File

@ -81,13 +81,13 @@ def default_config(sender, key, **kwargs):
return { return {
'event_name': 'OpenSlides', 'event_name': 'OpenSlides',
'event_description': 'event_description':
_('Presentation system for agenda, motions and elections'), _('Presentation and assembly system'),
'event_date': '', 'event_date': '',
'event_location': '', 'event_location': '',
'event_organizer': '', 'event_organizer': '',
'presentation': '', 'presentation': '',
'frontpage_title': _('Welcome'), 'frontpage_title': _('Welcome to OpenSlides'),
'frontpage_welcometext': _('Welcome to OpenSlides!'), 'frontpage_welcometext': _('[Place for your welcome text.]'),
'show_help_text': True, 'show_help_text': True,
'help_text': _("Get professional support for OpenSlides on %s.") % 'help_text': _("Get professional support for OpenSlides on %s.") %
"<a href='http://openslides.org/' target='_blank'> \ "<a href='http://openslides.org/' target='_blank'> \

View File

@ -7,10 +7,10 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: OpenSlides 1.x\n" "Project-Id-Version: OpenSlides 1.x\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-10-24 12:51+0200\n" "POT-Creation-Date: 2012-10-30 22:38+0100\n"
"PO-Revision-Date: 2012-07-28 11:07+0200\n" "PO-Revision-Date: 2012-07-28 11:07+0200\n"
"Last-Translator: Oskar Hahn <mail@oshahn.de>\n" "Last-Translator: Emanuel Schuetze <emanuel@intevation.de>\n"
"Language-Team: Deutsch <mail@oshahn.de>\n" "Language-Team: support@openslides.de\n"
"Language: de\n" "Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -30,12 +30,12 @@ msgid "Parent item"
msgstr "Elternelement" msgstr "Elternelement"
#: agenda/models.py:42 config/forms.py:61 motion/forms.py:22 #: agenda/models.py:42 config/forms.py:61 motion/forms.py:22
#: motion/models.py:544 motion/templates/motion/view.html:246 #: motion/models.py:540 motion/templates/motion/view.html:246
#: projector/models.py:32 #: projector/models.py:32
msgid "Title" msgid "Title"
msgstr "Titel" msgstr "Titel"
#: agenda/models.py:43 motion/forms.py:23 motion/models.py:545 #: agenda/models.py:43 motion/forms.py:23 motion/models.py:541
#: motion/templates/motion/view.html:247 projector/models.py:33 #: motion/templates/motion/view.html:247 projector/models.py:33
msgid "Text" msgid "Text"
msgstr "Text" msgstr "Text"
@ -225,8 +225,8 @@ msgstr "Möchten Sie die geänderte Reihenfolge der Einträge speichern?"
#: assignment/views.py:576 assignment/templates/assignment/view.html:166 #: assignment/views.py:576 assignment/templates/assignment/view.html:166
#: assignment/templates/assignment/view.html:170 #: assignment/templates/assignment/view.html:170
#: assignment/templates/projector/Assignment.html:78 #: assignment/templates/projector/Assignment.html:78
#: assignment/templates/projector/Assignment.html:82 motion/models.py:578 #: assignment/templates/projector/Assignment.html:82 motion/models.py:574
#: motion/views.py:778 motion/views.py:829 #: motion/views.py:804 motion/views.py:855
#: motion/templates/motion/view.html:79 #: motion/templates/motion/view.html:79
#: motion/templates/projector/Motion.html:37 utils/utils.py:53 #: motion/templates/projector/Motion.html:37 utils/utils.py:53
#: utils/views.py:111 #: utils/views.py:111
@ -235,8 +235,8 @@ msgstr "Ja"
#: agenda/templates/agenda/overview.html:47 assignment/models.py:300 #: agenda/templates/agenda/overview.html:47 assignment/models.py:300
#: assignment/views.py:577 assignment/templates/assignment/view.html:167 #: assignment/views.py:577 assignment/templates/assignment/view.html:167
#: assignment/templates/projector/Assignment.html:79 motion/models.py:578 #: assignment/templates/projector/Assignment.html:79 motion/models.py:574
#: motion/views.py:778 motion/views.py:830 #: motion/views.py:804 motion/views.py:856
#: motion/templates/motion/view.html:80 #: motion/templates/motion/view.html:80
#: motion/templates/projector/Motion.html:38 utils/utils.py:53 #: motion/templates/projector/Motion.html:38 utils/utils.py:53
#: utils/views.py:111 #: utils/views.py:111
@ -385,7 +385,7 @@ msgstr "Abgeschlossen"
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
#: assignment/models.py:55 #: assignment/models.py:55 participant/models.py:114
msgid "Description" msgid "Description"
msgstr "Beschreibung" msgstr "Beschreibung"
@ -393,7 +393,7 @@ msgstr "Beschreibung"
msgid "Comment on the ballot paper" msgid "Comment on the ballot paper"
msgstr "Kommentar für den Stimmzettel" msgstr "Kommentar für den Stimmzettel"
#: assignment/models.py:69 motion/models.py:339 #: assignment/models.py:69 motion/models.py:335
#, python-format #, python-format
msgid "%s is not a valid status." msgid "%s is not a valid status."
msgstr "%s ist kein gültiger Status." msgstr "%s ist kein gültiger Status."
@ -438,7 +438,7 @@ msgstr "Darf selbst für Wahlen kandidieren"
msgid "Can manage assignment" msgid "Can manage assignment"
msgstr "Darf Wahlen verwalten" msgstr "Darf Wahlen verwalten"
#: assignment/models.py:301 motion/models.py:579 #: assignment/models.py:301 motion/models.py:575
msgid "Abstain" msgid "Abstain"
msgstr "Enthaltung" msgstr "Enthaltung"
@ -471,9 +471,9 @@ msgstr "Neue Wahl wurde erfolgreich angelegt."
msgid "Election was successfully modified." msgid "Election was successfully modified."
msgstr "Wahl wurde erfolgreich geändert." msgstr "Wahl wurde erfolgreich geändert."
#: assignment/views.py:138 motion/views.py:256 motion/views.py:637 #: assignment/views.py:138 motion/views.py:257 motion/views.py:663
#: participant/views.py:463 participant/views.py:486 utils/views.py:210 #: participant/views.py:457 participant/views.py:480 utils/views.py:225
#: utils/views.py:228 utils/views.py:252 #: utils/views.py:243 utils/views.py:267
msgid "Please check the form for errors." msgid "Please check the form for errors."
msgstr "Bitte kontrollieren Sie das Formular nach Fehlern." msgstr "Bitte kontrollieren Sie das Formular nach Fehlern."
@ -572,7 +572,7 @@ msgstr "Wahlen: %s"
msgid "Candidates" msgid "Candidates"
msgstr "Kandidaten/innen" msgstr "Kandidaten/innen"
#: assignment/views.py:410 motion/views.py:771 #: assignment/views.py:410 motion/views.py:797
#: motion/templates/motion/view.html:44 #: motion/templates/motion/view.html:44
msgid "Vote results" msgid "Vote results"
msgstr "Abstimmungsergebnis" msgstr "Abstimmungsergebnis"
@ -613,7 +613,7 @@ msgstr "Ungültige Stimmen"
#: assignment/templates/assignment/view.html:202 #: assignment/templates/assignment/view.html:202
#: assignment/templates/assignment/view.html:207 #: assignment/templates/assignment/view.html:207
#: assignment/templates/projector/Assignment.html:111 #: assignment/templates/projector/Assignment.html:111
#: assignment/templates/projector/Assignment.html:117 motion/views.py:778 #: assignment/templates/projector/Assignment.html:117 motion/views.py:804
#: motion/templates/motion/poll_view.html:35 #: motion/templates/motion/poll_view.html:35
#: motion/templates/motion/view.html:84 #: motion/templates/motion/view.html:84
#: motion/templates/projector/Motion.html:42 poll/models.py:76 #: motion/templates/projector/Motion.html:42 poll/models.py:76
@ -646,8 +646,8 @@ msgid "%d available posts"
msgstr "%d verfügbare Posten" msgstr "%d verfügbare Posten"
#: assignment/views.py:577 assignment/templates/assignment/view.html:168 #: assignment/views.py:577 assignment/templates/assignment/view.html:168
#: assignment/templates/projector/Assignment.html:80 motion/views.py:778 #: assignment/templates/projector/Assignment.html:80 motion/views.py:804
#: motion/views.py:831 motion/templates/motion/view.html:81 #: motion/views.py:857 motion/templates/motion/view.html:81
#: motion/templates/projector/Motion.html:39 #: motion/templates/projector/Motion.html:39
msgid "Abstention" msgid "Abstention"
msgstr "Enthaltung" msgstr "Enthaltung"
@ -712,7 +712,7 @@ msgstr "Wahl-Einstellungen"
#: assignment/templates/assignment/overview.html:14 #: assignment/templates/assignment/overview.html:14
#: assignment/templates/assignment/overview.html:27 #: assignment/templates/assignment/overview.html:27
#: assignment/templates/assignment/view.html:11 #: assignment/templates/assignment/view.html:11
#: assignment/templates/projector/Assignment.html:18 motion/views.py:749 #: assignment/templates/projector/Assignment.html:18 motion/views.py:775
#: motion/templates/motion/overview.html:20 #: motion/templates/motion/overview.html:20
#: motion/templates/motion/overview.html:40 #: motion/templates/motion/overview.html:40
#: motion/templates/motion/view.html:34 #: motion/templates/motion/view.html:34
@ -815,7 +815,7 @@ msgid "was not a <br> candidate"
msgstr "war kein Kandidat" msgstr "war kein Kandidat"
#: assignment/templates/assignment/view.html:190 #: assignment/templates/assignment/view.html:190
#: assignment/templates/projector/Assignment.html:101 motion/views.py:778 #: assignment/templates/projector/Assignment.html:101 motion/views.py:804
#: motion/templates/motion/view.html:82 #: motion/templates/motion/view.html:82
#: motion/templates/projector/Motion.html:40 #: motion/templates/projector/Motion.html:40
msgid "Invalid" msgid "Invalid"
@ -859,16 +859,16 @@ msgid "Can manage configuration"
msgstr "Darf die Konfiguration verwalten" msgstr "Darf die Konfiguration verwalten"
#: config/models.py:84 #: config/models.py:84
msgid "Presentation system for agenda, motions and elections" msgid "Presentation and assembly system"
msgstr "Präsentationssystem für Tagesordnung, Anträge und Wahlen" msgstr "Präsentations- und Versammlungssystem"
#: config/models.py:89 templates/base.html:30 #: config/models.py:89
msgid "Welcome" msgid "Welcome to OpenSlides"
msgstr "Willkommen" msgstr "Willkommen bei OpenSlides"
#: config/models.py:90 participant/models.py:192 #: config/models.py:90
msgid "Welcome to OpenSlides!" msgid "[Place for your welcome text.]"
msgstr "Willkommen bei OpenSlides!" msgstr "[Platz für Ihren Begrüßungstext.]"
#: config/models.py:92 #: config/models.py:92
#, python-format #, python-format
@ -881,7 +881,7 @@ msgstr "Allgemein"
#: config/models.py:131 config/templates/config/version.html:5 #: config/models.py:131 config/templates/config/version.html:5
#: config/templates/config/version.html:8 #: config/templates/config/version.html:8
#: config/templates/config/version.html:11 motion/views.py:763 #: config/templates/config/version.html:11 motion/views.py:789
#: motion/templates/motion/view.html:214 motion/templates/motion/view.html:244 #: motion/templates/motion/view.html:214 motion/templates/motion/view.html:244
msgid "Version" msgid "Version"
msgstr "Version" msgstr "Version"
@ -919,7 +919,7 @@ msgstr "Startseite"
msgid "System" msgid "System"
msgstr "System" msgstr "System"
#: motion/forms.py:25 motion/models.py:546 motion/views.py:797 #: motion/forms.py:25 motion/models.py:542 motion/views.py:823
#: motion/templates/motion/view.html:229 motion/templates/motion/view.html:249 #: motion/templates/motion/view.html:229 motion/templates/motion/view.html:249
#: motion/templates/projector/Motion.html:77 #: motion/templates/projector/Motion.html:77
msgid "Reason" msgid "Reason"
@ -933,7 +933,7 @@ msgstr "Triviale Änderung"
msgid "Trivial changes don't create a new version." msgid "Trivial changes don't create a new version."
msgstr "Triviale Änderungen erzeugen keine neue Version." msgstr "Triviale Änderungen erzeugen keine neue Version."
#: motion/forms.py:44 motion/views.py:736 motion/templates/motion/view.html:22 #: motion/forms.py:44 motion/views.py:762 motion/templates/motion/view.html:22
msgid "Supporters" msgid "Supporters"
msgstr "Unterstützer/innen" msgstr "Unterstützer/innen"
@ -1022,7 +1022,7 @@ msgstr "Verworfen (nicht zulässig)"
msgid "Needs Review" msgid "Needs Review"
msgstr "Benötigt Review" msgstr "Benötigt Review"
#: motion/models.py:66 motion/views.py:716 #: motion/models.py:66 motion/views.py:742
#: motion/templates/motion/overview.html:41 #: motion/templates/motion/overview.html:41
#: motion/templates/motion/view.html:18 #: motion/templates/motion/view.html:18
#: motion/templates/projector/Motion.html:55 #: motion/templates/projector/Motion.html:55
@ -1034,11 +1034,6 @@ msgstr "Antragsteller/in"
msgid "Version %d authorized" msgid "Version %d authorized"
msgstr "Version %d zugelassen" msgstr "Version %d zugelassen"
#: motion/models.py:110
msgctxt "Rejected means not authorized"
msgid "Version %d rejected"
msgstr "Version %d zurückgewiesen"
#: motion/models.py:139 #: motion/models.py:139
msgid "Searching for supporters." msgid "Searching for supporters."
msgstr "Auf Unterstützersuche." msgstr "Auf Unterstützersuche."
@ -1073,37 +1068,37 @@ msgstr "Unterstützer/innen gelöscht"
msgid "Status reseted to: %s" msgid "Status reseted to: %s"
msgstr "Status zurückgesetzt auf: %s" msgstr "Status zurückgesetzt auf: %s"
#: motion/models.py:268 #: motion/models.py:265
#, python-format #, python-format
msgid "Supporter: +%s" msgid "Supporter: +%s"
msgstr "Unterstützer/in: +%s" msgstr "Unterstützer/in: +%s"
#: motion/models.py:282 #: motion/models.py:278
#, python-format #, python-format
msgid "Supporter: -%s" msgid "Supporter: -%s"
msgstr "Unterstützer/in: -%s" msgstr "Unterstützer/in: -%s"
#: motion/models.py:299 #: motion/models.py:295
#, python-format #, python-format
msgid "Number set: %s" msgid "Number set: %s"
msgstr "Nummer gesetzt: %s" msgstr "Nummer gesetzt: %s"
#: motion/models.py:312 #: motion/models.py:308
#, python-format #, python-format
msgid "Version %s authorized" msgid "Version %s authorized"
msgstr "Version %s zugelassen" msgstr "Version %s zugelassen"
#: motion/models.py:326 #: motion/models.py:322
#, python-format #, python-format
msgid "Version %s not authorized" msgid "Version %s not authorized"
msgstr "Version %s nicht zugelassen" msgstr "Version %s nicht zugelassen"
#: motion/models.py:342 #: motion/models.py:338
#, python-format #, python-format
msgid "The motion status is already '%s.'" msgid "The motion status is already '%s.'"
msgstr "Der Antragsstatus ist bereits '%s'." msgstr "Der Antragsstatus ist bereits '%s'."
#: motion/models.py:350 #: motion/models.py:346
#, python-format #, python-format
msgid "" msgid ""
"The motion status is: '%(currentstatus)s'. You can not set the status to " "The motion status is: '%(currentstatus)s'. You can not set the status to "
@ -1112,75 +1107,75 @@ msgstr ""
"Der Antragsstatus ist: '%(currentstatus)s'. Sie können den Status nicht auf " "Der Antragsstatus ist: '%(currentstatus)s'. Sie können den Status nicht auf "
"'%(newstatus)s' setzen." "'%(newstatus)s' setzen."
#: motion/models.py:358 #: motion/models.py:354
msgid "Status modified" msgid "Status modified"
msgstr "Status geändert" msgstr "Status geändert"
#: motion/models.py:450 #: motion/models.py:446
msgid "by" msgid "by"
msgstr "von" msgstr "von"
#: motion/models.py:458 motion/templates/motion/view.html:210 #: motion/models.py:454 motion/templates/motion/view.html:210
#: motion/templates/motion/widget.html:27 #: motion/templates/motion/widget.html:27
#: motion/templates/projector/Motion.html:65 #: motion/templates/projector/Motion.html:65
msgid "no number" msgid "no number"
msgstr "ohne Nummer" msgstr "ohne Nummer"
#: motion/models.py:459 motion/templates/motion/overview.html:32 #: motion/models.py:455 motion/templates/motion/overview.html:32
#: motion/templates/motion/widget.html:23 #: motion/templates/motion/widget.html:23
msgid "motion" msgid "motion"
msgstr "Antrag" msgstr "Antrag"
#: motion/models.py:484 #: motion/models.py:480
msgid "Poll created" msgid "Poll created"
msgstr "Abstimmung erstellt" msgstr "Abstimmung erstellt"
#: motion/models.py:535 #: motion/models.py:531
msgid "Can see motions" msgid "Can see motions"
msgstr "Darf Anträge sehen" msgstr "Darf Anträge sehen"
#: motion/models.py:536 #: motion/models.py:532
msgid "Can create motions" msgid "Can create motions"
msgstr "Darf Anträge erstellen" msgstr "Darf Anträge erstellen"
#: motion/models.py:537 #: motion/models.py:533
msgid "Can support motions" msgid "Can support motions"
msgstr "Darf Anträge unterstützen" msgstr "Darf Anträge unterstützen"
#: motion/models.py:538 #: motion/models.py:534
msgid "Can manage motions" msgid "Can manage motions"
msgstr "Darf Anträge verwalten" msgstr "Darf Anträge verwalten"
#: motion/models.py:605 #: motion/models.py:601
msgid "The assembly may decide," msgid "The assembly may decide,"
msgstr "Die Versammlung möge beschließen," msgstr "Die Versammlung möge beschließen,"
#: motion/models.py:608 motion/views.py:666 motion/views.py:891 #: motion/models.py:604 motion/views.py:692 motion/views.py:917
#: motion/templates/motion/base_motion.html:9 #: motion/templates/motion/base_motion.html:9
#: motion/templates/motion/overview.html:7 #: motion/templates/motion/overview.html:7
#: motion/templates/motion/overview.html:10 #: motion/templates/motion/overview.html:10
msgid "Motions" msgid "Motions"
msgstr "Anträge" msgstr "Anträge"
#: motion/views.py:179 #: motion/views.py:180
msgid "You have not the necessary rights to create or edit motions." msgid "You have not the necessary rights to create or edit motions."
msgstr "" msgstr ""
"Sie haben nicht die nötigen Rechte, um Anträge zu erstellen oder zu " "Sie haben nicht die nötigen Rechte, um Anträge zu erstellen oder zu "
"bearbeiten." "bearbeiten."
#: motion/views.py:184 #: motion/views.py:185
msgid "You can not edit this motion." msgid "You can not edit this motion."
msgstr "Sie dürfen diesen Antrag nicht bearbeiten." msgstr "Sie dürfen diesen Antrag nicht bearbeiten."
#: motion/views.py:247 #: motion/views.py:248
msgid "New motion was successfully created." msgid "New motion was successfully created."
msgstr "Neuer Antrag wurde erfolgreich angelegt." msgstr "Neuer Antrag wurde erfolgreich angelegt."
#: motion/views.py:249 #: motion/views.py:250
msgid "Motion was successfully modified." msgid "Motion was successfully modified."
msgstr "Antrag wurde erfolgreich geändert." msgstr "Antrag wurde erfolgreich geändert."
#: motion/views.py:263 #: motion/views.py:264
msgid "" msgid ""
"Attention: Do you really want to edit this motion? The supporters will " "Attention: Do you really want to edit this motion? The supporters will "
"<b>not</b> be removed automatically because you can manage motions. Please " "<b>not</b> be removed automatically because you can manage motions. Please "
@ -1190,7 +1185,7 @@ msgstr ""
"werden <b>nicht</b> automatisch entfernt, da Sie Anträge verwalten dürfen. " "werden <b>nicht</b> automatisch entfernt, da Sie Anträge verwalten dürfen. "
"Prüfen Sie, ob die Unterstützungen noch gültig sind." "Prüfen Sie, ob die Unterstützungen noch gültig sind."
#: motion/views.py:265 #: motion/views.py:266
#, python-format #, python-format
msgid "" msgid ""
"Attention: Do you really want to edit this motion? All <b>%s</b> supporters " "Attention: Do you really want to edit this motion? All <b>%s</b> supporters "
@ -1199,132 +1194,148 @@ msgstr ""
"Wollen Sie den Antrag wirklich ändern? Alle <b>%s</b> Unterstützer/innen " "Wollen Sie den Antrag wirklich ändern? Alle <b>%s</b> Unterstützer/innen "
"werden dann automatisch entfernt. Versuchen Sie diese erneut zu gewinnen." "werden dann automatisch entfernt. Versuchen Sie diese erneut zu gewinnen."
#: motion/views.py:297 #: motion/views.py:298
msgid "Motion number was successfully set." msgid "Motion number was successfully set."
msgstr "Antragsnummer wurde erfolgreich gesetzt." msgstr "Antragsnummer wurde erfolgreich gesetzt."
#: motion/views.py:313 #: motion/views.py:314
msgid "Motion was successfully authorized." msgid "Motion was successfully authorized."
msgstr "Antrag wurde erfolgreich zugelassen." msgstr "Antrag wurde erfolgreich zugelassen."
#: motion/views.py:328 #: motion/views.py:329
msgid "Motion was successfully rejected." msgid "Motion was successfully rejected."
msgstr "Antrag wurde erfolgreich verworfen." msgstr "Antrag wurde erfolgreich verworfen."
#: motion/views.py:344 #: motion/views.py:345
#, python-format #, python-format
msgid "Motion status was set to: <b>%s</b>." msgid "Motion status was set to: <b>%s</b>."
msgstr "Antragsstatus wurde gesetzt auf: <b>%s</b>." msgstr "Antragsstatus wurde gesetzt auf: <b>%s</b>."
#: motion/views.py:360 #: motion/views.py:361
msgid "Motion status was reset." msgid "Motion status was reset."
msgstr "Antragsstatus wurde zurückgesetzt." msgstr "Antragsstatus wurde zurückgesetzt."
#: motion/views.py:374
msgid "You have support the motion successfully."
msgstr "Sie haben den Antrag erfolgreich unterstützt."
#: motion/views.py:388 #: motion/views.py:388
msgid "You have unsupport the motion successfully." msgid "You can not support this motion."
msgstr "Sie haben dem Antrag erfolgreich Ihre Unterstützung entzogen." msgstr "Sie dürfen diesen Antrag nicht unterstützen."
#: motion/views.py:391
msgid "You can not unsupport this motion."
msgstr "Sie dürfen Ihre Unterstützung für diesen Antrag nicht entziehen."
#: motion/views.py:402 #: motion/views.py:402
msgid "Do you really want to support this motion?"
msgstr "Wollen Sie wirklich diesen Antrag unterstützen?"
#: motion/views.py:404
msgid "Do you really want to unsupport this motion?"
msgstr "Wollen Sie wirklich Ihre Unterstützung für diesen Antrag entziehen?"
#: motion/views.py:415
msgid "You have supported this motion successfully."
msgstr "Sie haben den Antrag erfolgreich unterstützt."
#: motion/views.py:417
msgid "You have unsupported this motion successfully."
msgstr "Sie haben dem Antrag erfolgreich Ihre Unterstützung entzogen."
#: motion/views.py:431
msgid "New vote was successfully created." msgid "New vote was successfully created."
msgstr "Neue Abstimmung erfolgreich angelegt." msgstr "Neue Abstimmung erfolgreich angelegt."
#: motion/views.py:418 #: motion/views.py:447
msgid "Poll deleted" msgid "Poll deleted"
msgstr "Abstimmung gelöscht" msgstr "Abstimmung gelöscht"
#: motion/views.py:419 #: motion/views.py:448
msgid "Poll was successfully deleted." msgid "Poll was successfully deleted."
msgstr "Abstimmung wurde erfolgreich gelöscht." msgstr "Abstimmung wurde erfolgreich gelöscht."
#: motion/views.py:421 #: motion/views.py:450
#, python-format #, python-format
msgid "the %s. poll" msgid "the %s. poll"
msgstr "die %s. Abstimmung" msgstr "die %s. Abstimmung"
#: motion/views.py:462 motion/views.py:471 #: motion/views.py:491 motion/views.py:500
#, python-format #, python-format
msgid "You can not delete motion <b>%s</b>." msgid "You can not delete motion <b>%s</b>."
msgstr "Sie können Antrag <b>%s</b> nicht löschen." msgstr "Sie können Antrag <b>%s</b> nicht löschen."
#: motion/views.py:467 motion/views.py:475 #: motion/views.py:496 motion/views.py:504
#, python-format #, python-format
msgid "Motion <b>%s</b> was successfully deleted." msgid "Motion <b>%s</b> was successfully deleted."
msgstr "Antrag <b>%s</b> wurde erfolgreich gelöscht." msgstr "Antrag <b>%s</b> wurde erfolgreich gelöscht."
#: motion/views.py:477 #: motion/views.py:506
msgid "Invalid request" msgid "Invalid request"
msgstr "Ungültige Anfrage" msgstr "Ungültige Anfrage"
#: motion/views.py:501 #: motion/views.py:530
msgid "Poll was updated" msgid "Poll was updated"
msgstr "Abstimmung wurde aktualisiert" msgstr "Abstimmung wurde aktualisiert"
#: motion/views.py:518 #: motion/views.py:547
#, python-format #, python-format
msgid "Version <b>%s</b> accepted." msgid "Version <b>%s</b> accepted."
msgstr "Version <b>%s</b> akzeptiert." msgstr "Version <b>%s</b> akzeptiert."
#: motion/views.py:520 #: motion/views.py:549
#, python-format #, python-format
msgid "Do you really want to authorize version <b>%s</b>?" msgid "Do you really want to authorize version <b>%s</b>?"
msgstr "Soll Version <b>%s</b> wirklich zugelassen werden?" msgstr "Soll Version <b>%s</b> wirklich zugelassen werden?"
#: motion/views.py:530 #: motion/views.py:559
#, python-format #, python-format
msgid "Version <b>%s</b> rejected." msgid "Version <b>%s</b> rejected."
msgstr "Version <b>%s</b> zurückgewiesen." msgstr "Version <b>%s</b> zurückgewiesen."
#: motion/views.py:532 #: motion/views.py:561
msgid "ERROR by rejecting the version." msgid "ERROR by rejecting the version."
msgstr "FEHLER beim Zurückweisen der Version." msgstr "FEHLER beim Zurückweisen der Version."
#: motion/views.py:534 #: motion/views.py:563
#, python-format #, python-format
msgid "Do you really want to reject version <b>%s</b>?" msgid "Do you really want to reject version <b>%s</b>?"
msgstr "Soll Version <b>%s</b> wirklich zurückgewiesen werden?" msgstr "Soll Version <b>%s</b> wirklich zurückgewiesen werden?"
#: motion/views.py:564 motion/views.py:568 motion/views.py:574 #: motion/views.py:593 motion/views.py:597 motion/views.py:603
#: motion/views.py:577 participant/api.py:76 #: motion/views.py:606 participant/api.py:76
#, python-format #, python-format
msgid "Ignoring malformed line %d in import file." msgid "Ignoring malformed line %d in import file."
msgstr "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert." msgstr "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert."
#: motion/views.py:623 #: motion/views.py:649
#, python-format #, python-format
msgid "%d motion was successfully imported." msgid "%d motion was successfully imported."
msgid_plural "%d motions were successfully imported." msgid_plural "%d motions were successfully imported."
msgstr[0] "%d Antrag wurde erfolgreich importiert." msgstr[0] "%d Antrag wurde erfolgreich importiert."
msgstr[1] "%d Anträge wurden erfolgreich importiert." msgstr[1] "%d Anträge wurden erfolgreich importiert."
#: motion/views.py:626 #: motion/views.py:652
#, python-format #, python-format
msgid "%d motion was successfully modified." msgid "%d motion was successfully modified."
msgid_plural "%d motions were successfully modified." msgid_plural "%d motions were successfully modified."
msgstr[0] "%d Antrag wurde erfolgreich geändert." msgstr[0] "%d Antrag wurde erfolgreich geändert."
msgstr[1] "%d Anträge wurden erfolgreich geändert." msgstr[1] "%d Anträge wurden erfolgreich geändert."
#: motion/views.py:629 #: motion/views.py:655
#, python-format #, python-format
msgid "%d new user was added." msgid "%d new user was added."
msgid_plural "%d new users were added." msgid_plural "%d new users were added."
msgstr[0] "%d neuer Nutzer wurde erstellt." msgstr[0] "%d neuer Nutzer wurde erstellt."
msgstr[1] "%d neue Nutzer wurden erstellt." msgstr[1] "%d neue Nutzer wurden erstellt."
#: motion/views.py:633 participant/api.py:92 #: motion/views.py:659 participant/api.py:92
msgid "Import aborted because of severe errors in the input file." msgid "Import aborted because of severe errors in the input file."
msgstr "Import auf Grund von schweren Fehlern in der Quelldatei abgebrochen." msgstr "Import auf Grund von schweren Fehlern in der Quelldatei abgebrochen."
#: motion/views.py:635 participant/api.py:94 #: motion/views.py:661 participant/api.py:94
msgid "Import file has wrong character encoding, only UTF-8 is supported!" msgid "Import file has wrong character encoding, only UTF-8 is supported!"
msgstr "" msgstr ""
"Die Quelldatei benutzt eine ungültige Zeichenkodierung, es wird nur UTF-8 " "Die Quelldatei benutzt eine ungültige Zeichenkodierung, es wird nur UTF-8 "
"wird unterstützt!" "wird unterstützt!"
#: motion/views.py:639 #: motion/views.py:665
msgid "" msgid ""
"Attention: Existing motions will be modified if you import new motions with " "Attention: Existing motions will be modified if you import new motions with "
"the same number." "the same number."
@ -1332,7 +1343,7 @@ msgstr ""
"Achtung: Existierende Anträge werden geändert wenn Sie neue Anträge mit " "Achtung: Existierende Anträge werden geändert wenn Sie neue Anträge mit "
"identischer Nummer importieren." "identischer Nummer importieren."
#: motion/views.py:640 #: motion/views.py:666
msgid "" msgid ""
"Attention: Importing an motions without a number multiple times will create " "Attention: Importing an motions without a number multiple times will create "
"duplicates." "duplicates."
@ -1340,7 +1351,7 @@ msgstr ""
"Achtung: Bei mehrfachem Import eines Antrags ohne Nummer können Duplikate " "Achtung: Bei mehrfachem Import eines Antrags ohne Nummer können Duplikate "
"entstehen." "entstehen."
#: motion/views.py:673 motion/views.py:811 #: motion/views.py:699 motion/views.py:837
#: motion/templates/motion/poll_view.html:7 #: motion/templates/motion/poll_view.html:7
#: motion/templates/motion/poll_view.html:12 #: motion/templates/motion/poll_view.html:12
#: motion/templates/motion/view.html:7 motion/templates/motion/view.html:206 #: motion/templates/motion/view.html:7 motion/templates/motion/view.html:206
@ -1350,21 +1361,21 @@ msgstr ""
msgid "Motion" msgid "Motion"
msgstr "Antrag" msgstr "Antrag"
#: motion/views.py:687 motion/templates/motion/overview.html:84 #: motion/views.py:713 motion/templates/motion/overview.html:84
msgid "No motions available." msgid "No motions available."
msgstr "Keine Anträge vorhanden." msgstr "Keine Anträge vorhanden."
#: motion/views.py:692 motion/views.py:694 motion/views.py:709 #: motion/views.py:718 motion/views.py:720 motion/views.py:735
#: motion/views.py:711 motion/templates/motion/base_motion.html:24 #: motion/views.py:737 motion/templates/motion/base_motion.html:24
#: motion/templates/projector/Motion.html:63 #: motion/templates/projector/Motion.html:63
msgid "Motion No." msgid "Motion No."
msgstr "Antrag Nr." msgstr "Antrag Nr."
#: motion/views.py:726 #: motion/views.py:752
msgid "Signature" msgid "Signature"
msgstr "Unterschrift" msgstr "Unterschrift"
#: motion/views.py:777 motion/templates/motion/base_motion.html:55 #: motion/views.py:803 motion/templates/motion/base_motion.html:55
#: motion/templates/motion/poll_view.html:8 #: motion/templates/motion/poll_view.html:8
#: motion/templates/motion/poll_view.html:13 #: motion/templates/motion/poll_view.html:13
#: motion/templates/motion/view.html:66 motion/templates/motion/view.html:74 #: motion/templates/motion/view.html:66 motion/templates/motion/view.html:74
@ -1372,20 +1383,21 @@ msgstr "Unterschrift"
msgid "Vote" msgid "Vote"
msgstr "Abstimmung" msgstr "Abstimmung"
#: motion/views.py:811 #: motion/views.py:837
msgid "Poll" msgid "Poll"
msgstr "Abstimmung" msgstr "Abstimmung"
#: motion/views.py:825 #: motion/views.py:851
#, python-format
msgid "Motion No. %s" msgid "Motion No. %s"
msgstr "Antrag Nr. %s" msgstr "Antrag Nr. %s"
#: motion/views.py:827 #: motion/views.py:853
#, python-format #, python-format
msgid "%d. Vote" msgid "%d. Vote"
msgstr "%d. Abstimmung" msgstr "%d. Abstimmung"
#: motion/views.py:884 #: motion/views.py:910
msgid "Motion settings successfully saved." msgid "Motion settings successfully saved."
msgstr "Antrags-Einstellungen wurden erfolgreich gespeichert." msgstr "Antrags-Einstellungen wurden erfolgreich gespeichert."
@ -1429,7 +1441,7 @@ msgstr "Antrag als PDF"
#: motion/templates/motion/base_motion.html:49 #: motion/templates/motion/base_motion.html:49
msgid "Show Motion" msgid "Show Motion"
msgstr "Zeige Antrag" msgstr "Antrag projizieren"
#: motion/templates/motion/config.html:5 motion/templates/motion/config.html:8 #: motion/templates/motion/config.html:5 motion/templates/motion/config.html:8
msgid "Motion settings" msgid "Motion settings"
@ -1653,12 +1665,16 @@ msgid "User groups"
msgstr "Benutzerrollen" msgstr "Benutzerrollen"
#: participant/forms.py:44 #: participant/forms.py:44
msgid "Persmissions" msgid "Permissions"
msgstr "Rechte" msgstr "Rechte"
#: participant/forms.py:47 #: participant/forms.py:47 participant/views.py:495
msgid "Users" #: participant/templates/participant/base_participant.html:12
msgstr "Benutzer" #: participant/templates/participant/overview.html:7
#: participant/templates/participant/overview.html:18
#: participant/templates/participant/overview.html:62
msgid "Participants"
msgstr "Teilnehmer/innen"
#: participant/forms.py:83 #: participant/forms.py:83
msgid "You can not edit the name for the anonymous user" msgid "You can not edit the name for the anonymous user"
@ -1678,8 +1694,12 @@ msgid "Printed in PDF of first time passwords only."
msgstr "Erscheint nur im PDF der Erst-Passwörter" msgstr "Erscheint nur im PDF der Erst-Passwörter"
#: participant/forms.py:118 #: participant/forms.py:118
msgid "Sort users by first name" msgid "Sort participants by first name"
msgstr "Sortiere Teilnehmer beim Vornamen" msgstr "Teilnehmer/innen nach Vornamen sortieren"
#: participant/forms.py:119
msgid "Disable for sorting by last name"
msgstr "Deaktivieren für Sortierung nach Nachnamen"
#: participant/models.py:29 participant/templates/participant/overview.html:25 #: participant/models.py:29 participant/templates/participant/overview.html:25
msgid "Male" msgid "Male"
@ -1711,7 +1731,7 @@ msgid "Detail"
msgstr "Detail" msgstr "Detail"
#: participant/models.py:42 #: participant/models.py:42
msgid "Will be shown behind the name." msgid "Will be shown after the name."
msgstr "Wird nach dem Namen angezeigt." msgstr "Wird nach dem Namen angezeigt."
#: participant/models.py:45 participant/templates/participant/overview.html:24 #: participant/models.py:45 participant/templates/participant/overview.html:24
@ -1719,8 +1739,8 @@ msgid "Gender"
msgstr "Geschlecht" msgstr "Geschlecht"
#: participant/models.py:45 participant/models.py:48 participant/models.py:51 #: participant/models.py:45 participant/models.py:48 participant/models.py:51
msgid "Only for filter the userlist." msgid "Only for filtering the participant list."
msgstr "Nur zum Filtern der Benutzerliste." msgstr "Nur zum Filtern der Teilnehmerliste."
#: participant/models.py:48 #: participant/models.py:48
msgid "Typ" msgid "Typ"
@ -1748,6 +1768,18 @@ msgstr "Darf die Teilnehmer/inen sehen"
msgid "Can manage participant" msgid "Can manage participant"
msgstr "Darf die Teilnehmer/inen verwalten" msgstr "Darf die Teilnehmer/inen verwalten"
#: participant/models.py:113
msgid "Use this user group as participant"
msgstr "Verwende diese Benutzerrolle als Teilnehmer/in"
#: participant/models.py:113
msgid "For example as submitter of a motion."
msgstr "Zum Beispiel als Antragsteller."
#: participant/models.py:192
msgid "Welcome to OpenSlides!"
msgstr "Willkommen bei OpenSlides!"
#: participant/views.py:212 #: participant/views.py:212
msgid "Participant-list" msgid "Participant-list"
msgstr "Teilnehmerliste" msgstr "Teilnehmerliste"
@ -1810,16 +1842,16 @@ msgstr "%d neue Teilnehmer/innen wurden erfolgreich importiert."
msgid "Do you really want to reset the password?" msgid "Do you really want to reset the password?"
msgstr "Soll das Passwort wirklich zurückgesetzt werden?" msgstr "Soll das Passwort wirklich zurückgesetzt werden?"
#: participant/views.py:346 #: participant/views.py:343
#, python-format #, python-format
msgid "The Password for %s was successfully reset." msgid "The Password for %s was successfully reset."
msgstr "Das Passwort für %s wurde erfolgreich zurückgesetzt." msgstr "Das Passwort für %s wurde erfolgreich zurückgesetzt."
#: participant/views.py:428 #: participant/views.py:422
msgid "Participants settings successfully saved." msgid "Participants settings successfully saved."
msgstr "Teilnehmer/innen-Einstellungen wurden erfolgreich gespeichert." msgstr "Teilnehmer/innen-Einstellungen wurden erfolgreich gespeichert."
#: participant/views.py:438 #: participant/views.py:432
#, python-format #, python-format
msgid "" msgid ""
"Installation was successfully! Use %(user)s (password: %(password)s) for " "Installation was successfully! Use %(user)s (password: %(password)s) for "
@ -1832,21 +1864,13 @@ msgstr ""
"Sie das Passwort nach der ersten Anmeldung! Anderenfalls erscheint diese " "Sie das Passwort nach der ersten Anmeldung! Anderenfalls erscheint diese "
"Meldung weiterhin für alle und ist ein Sicherheitsrisiko." "Meldung weiterhin für alle und ist ein Sicherheitsrisiko."
#: participant/views.py:461 #: participant/views.py:455
msgid "User settings successfully saved." msgid "User settings successfully saved."
msgstr "Nutzereinstellungen wurden erfolgreich gespeichert." msgstr "Nutzereinstellungen wurden erfolgreich gespeichert."
#: participant/views.py:483 #: participant/views.py:477
msgid "Password successfully changed." msgid "Password successfully changed."
msgstr "Password wurde erfolgreich geändert." msgstr "Passwort wurde erfolgreich geändert."
#: participant/views.py:501
#: participant/templates/participant/base_participant.html:12
#: participant/templates/participant/overview.html:7
#: participant/templates/participant/overview.html:18
#: participant/templates/participant/overview.html:62
msgid "Participants"
msgstr "Teilnehmer/innen"
#: participant/templates/participant/base_participant.html:15 #: participant/templates/participant/base_participant.html:15
msgid "All participants" msgid "All participants"
@ -2034,23 +2058,23 @@ msgstr "Darf den Projektor sehen"
msgid "Can see the dashboard" msgid "Can see the dashboard"
msgstr "Darf das Dashboard sehen" msgstr "Darf das Dashboard sehen"
#: projector/views.py:185 #: projector/views.py:202
msgid "Errors in the form" msgid "Errors in the form"
msgstr "Fehler im Formular" msgstr "Fehler im Formular"
#: projector/views.py:361 projector/templates/projector/dashboard.html:17 #: projector/views.py:378 projector/templates/projector/dashboard.html:17
msgid "Dashboard" msgid "Dashboard"
msgstr "Dashboard" msgstr "Dashboard"
#: projector/views.py:378 #: projector/views.py:406
msgid "Projector live view" msgid "Projector live view"
msgstr "Projektor-Live-Ansicht" msgstr "Projektor-Live-Ansicht"
#: projector/views.py:404 #: projector/views.py:432
msgid "Overlays" msgid "Overlays"
msgstr "Einblendungen" msgstr "Einblendungen"
#: projector/views.py:417 #: projector/views.py:445
msgid "Custom Slides" msgid "Custom Slides"
msgstr "Benutzerdefinierte Folien" msgstr "Benutzerdefinierte Folien"
@ -2075,7 +2099,6 @@ msgid "Projector view"
msgstr "Projektor-Ansicht" msgstr "Projektor-Ansicht"
#: projector/templates/projector/control_countdown.html:6 #: projector/templates/projector/control_countdown.html:6
msgctxt "seconds"
msgid "s" msgid "s"
msgstr "s" msgstr "s"
@ -2158,6 +2181,10 @@ msgstr "Startseite"
msgid "Logout" msgid "Logout"
msgstr "Abmelden" msgstr "Abmelden"
#: templates/base.html:30
msgid "Welcome"
msgstr "Willkommen"
#: templates/front_page.html:12 #: templates/front_page.html:12
msgid "You have access to the following pages:" msgid "You have access to the following pages:"
msgstr "Sie haben Zugriff auf folgende Seiten:" msgstr "Sie haben Zugriff auf folgende Seiten:"
@ -2176,7 +2203,7 @@ msgstr "Gedruckt am: %s"
msgid "Page %s" msgid "Page %s"
msgstr "Seite %s" msgstr "Seite %s"
#: utils/utils.py:66 utils/views.py:271 #: utils/utils.py:66 utils/views.py:290
#, python-format #, python-format
msgid "Do you really want to delete %s?" msgid "Do you really want to delete %s?"
msgstr "Soll %s wirklich gelöscht werden?" msgstr "Soll %s wirklich gelöscht werden?"
@ -2193,22 +2220,22 @@ msgstr "Sind Sie sicher?"
msgid "Thank you for your answer" msgid "Thank you for your answer"
msgstr "Danke für Ihre Antwort" msgstr "Danke für Ihre Antwort"
#: utils/views.py:232 #: utils/views.py:247
#, python-format #, python-format
msgid "%s was successfully modified." msgid "%s was successfully modified."
msgstr "%s wurde erfolgreich bearbeitet." msgstr "%s wurde erfolgreich bearbeitet."
#: utils/views.py:263 #: utils/views.py:278
#, python-format #, python-format
msgid "%s was successfully created." msgid "%s was successfully created."
msgstr "%s wurde erfolgreich angelegt." msgstr "%s wurde erfolgreich angelegt."
#: utils/views.py:274 #: utils/views.py:296
#, python-format #, python-format
msgid "%s was successfully deleted." msgid "%s was successfully deleted."
msgstr "%s wurde erfolgreich gelöscht." msgstr "%s wurde erfolgreich gelöscht."
#: utils/views.py:305 #: utils/views.py:312
msgid "undefined-filename" msgid "undefined-filename"
msgstr "undefinierter-dateiname" msgstr "undefinierter-dateiname"
@ -2216,32 +2243,5 @@ msgstr "undefinierter-dateiname"
msgid "Enter valid JSON" msgid "Enter valid JSON"
msgstr "Gebe valides JSON ein" msgstr "Gebe valides JSON ein"
#~ msgid "Applications" #~ msgid "Users"
#~ msgstr "Anträge" #~ msgstr "Benutzer"
#~ msgid "Application"
#~ msgstr "Antrag"
#~ msgid "Application No. %s"
#~ msgstr "Antrag Nr. %s"
#~ msgid "Application No."
#~ msgstr "Antrag Nr."
#~ msgid "Show Application"
#~ msgstr "Antrag projizieren"
#~ msgid "Application settings"
#~ msgstr "Antrags-Einstellungen"
#~ msgid "Category"
#~ msgstr "Kategorie"
#~ msgid "Do you really want to delete multiple motions?"
#~ msgstr "Wollen Sie wirklich mehrere Anträge löschen?"
#~ msgid "Do you really want to delete <b>%s</b>?"
#~ msgstr "Soll <b>%s</b> wirklich gelöscht werden?"
#~ msgid "You!"
#~ msgstr "Sie!"

View File

@ -223,7 +223,7 @@ def create_or_reset_admin_user():
except User.DoesNotExist: except User.DoesNotExist:
admin = User() admin = User()
admin.username = 'admin' admin.username = 'admin'
admin.last_name = 'Admin User' admin.last_name = 'Administrator'
print("Created default admin user") print("Created default admin user")
admin.is_superuser = True admin.is_superuser = True

View File

@ -615,16 +615,13 @@ def motion_import(request):
user.last_name = last_name user.last_name = last_name
user.first_name = first_name user.first_name = first_name
user.username = gen_username(first_name, last_name) user.username = gen_username(first_name, last_name)
user.detail = ''
user.committee = ''
user.gender = ''
user.type = ''
user.default_password = gen_password()
user.save() user.save()
profile = Profile() user.reset_password()
profile.user = user
profile.group = ''
profile.committee = ''
profile.gender = 'none'
profile.type = 'guest'
profile.firstpassword = gen_password()
profile.user.set_password(profile.firstpassword)
profile.save()
users_generated += 1 users_generated += 1
# create / modify the motion # create / modify the motion
motion = None motion = None

View File

@ -71,7 +71,7 @@ def import_users(csv_file):
dialect=dialect)): dialect=dialect)):
if line_no: if line_no:
try: try:
(first_name, last_name, gender, category, type, committee, comment) = line[:7] (first_name, last_name, gender, detail, type, committee, comment) = line[:7]
except ValueError: except ValueError:
error_messages.append(_('Ignoring malformed line %d in import file.') % line_no + 1) error_messages.append(_('Ignoring malformed line %d in import file.') % line_no + 1)
continue continue
@ -80,11 +80,11 @@ def import_users(csv_file):
user.first_name = first_name user.first_name = first_name
user.username = gen_username(first_name, last_name) user.username = gen_username(first_name, last_name)
user.gender = gender user.gender = gender
user.category = category user.detail = detail
user.type = type user.type = type
user.committee = committee user.committee = committee
user.comment = comment user.comment = comment
user.firstpassword = gen_password() user.default_password = gen_password()
user.save() user.save()
user.reset_password() user.reset_password()
count_success += 1 count_success += 1

View File

@ -41,10 +41,10 @@ class UserUpdateForm(UserCreateForm):
class GroupForm(forms.ModelForm, CssClassMixin): class GroupForm(forms.ModelForm, CssClassMixin):
permissions = LocalizedModelMultipleChoiceField( permissions = LocalizedModelMultipleChoiceField(
queryset=Permission.objects.all(), label=_("Persmissions"), queryset=Permission.objects.all(), label=_("Permissions"),
required=False) required=False)
users = forms.ModelMultipleChoiceField( users = forms.ModelMultipleChoiceField(
queryset=User.objects.all(), label=_("Users"), required=False) queryset=User.objects.all(), label=_("Participants"), required=False)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
# Initial users # Initial users
@ -115,4 +115,5 @@ class ConfigForm(forms.Form, CssClassMixin):
help_text=_("Printed in PDF of first time passwords only.")) help_text=_("Printed in PDF of first time passwords only."))
participant_sort_users_by_first_name = forms.BooleanField( participant_sort_users_by_first_name = forms.BooleanField(
required=False, required=False,
label=_("Sort users by first name")) label=_("Sort participants by first name"),
help_text=_("Disable for sorting by last name"))

View File

@ -39,16 +39,16 @@ class User(DjangoUser, PersonMixin, Person):
django_user = models.OneToOneField(DjangoUser, editable=False, parent_link=True) django_user = models.OneToOneField(DjangoUser, editable=False, parent_link=True)
detail = models.CharField( detail = models.CharField(
max_length=100, blank=True, default='', verbose_name=_("Detail"), max_length=100, blank=True, default='', verbose_name=_("Detail"),
help_text=_('Will be shown behind the name.')) help_text=_('Will be shown after the name.'))
gender = models.CharField( gender = models.CharField(
max_length=50, choices=GENDER_CHOICES, blank=True, max_length=50, choices=GENDER_CHOICES, blank=True,
verbose_name=_("Gender"), help_text=_('Only for filter the userlist.')) verbose_name=_("Gender"), help_text=_('Only for filtering the participant list.'))
type = models.CharField( type = models.CharField(
max_length=100, choices=TYPE_CHOICES, blank=True, max_length=100, choices=TYPE_CHOICES, blank=True,
verbose_name=_("Typ"), help_text=_('Only for filter the userlist.')) verbose_name=_("Typ"), help_text=_('Only for filtering the participant list.'))
committee = models.CharField( committee = models.CharField(
max_length=100, blank=True, default='', verbose_name=_("Committee"), max_length=100, blank=True, default='', verbose_name=_("Committee"),
help_text=_('Only for filter the userlist.')) help_text=_('Only for filtering the participant list.'))
comment = models.TextField( comment = models.TextField(
blank=True, default='', verbose_name=_('Comment'), blank=True, default='', verbose_name=_('Comment'),
help_text=_('Only for notes.')) help_text=_('Only for notes.'))
@ -110,8 +110,8 @@ class Group(DjangoGroup, PersonMixin, Person):
person_prefix = 'group' person_prefix = 'group'
django_group = models.OneToOneField(DjangoGroup, editable=False, parent_link=True) django_group = models.OneToOneField(DjangoGroup, editable=False, parent_link=True)
group_as_person = models.BooleanField(default=False) group_as_person = models.BooleanField(default=False, verbose_name=_("Use this user group as participant"), help_text=_('For example as submitter of a motion.'))
description = models.TextField(blank=True) description = models.TextField(blank=True, verbose_name=_("Description"))
@models.permalink @models.permalink
def get_absolute_url(self, link='edit'): def get_absolute_url(self, link='edit'):
@ -145,7 +145,7 @@ class UsersAndGroupsToPersons(object):
if config['participant_sort_users_by_first_name']: if config['participant_sort_users_by_first_name']:
self.users = User.objects.all().order_by('first_name') self.users = User.objects.all().order_by('first_name')
else: else:
self.users = User.objects.all() self.users = User.objects.all().order_by('last_name')
self.groups = Group.objects.filter(group_as_person=True) self.groups = Group.objects.filter(group_as_person=True)
def __iter__(self): def __iter__(self):

View File

@ -98,6 +98,8 @@ class Overview(ListView):
else: else:
if config['participant_sort_users_by_first_name']: if config['participant_sort_users_by_first_name']:
query = query.order_by('first_name') query = query.order_by('first_name')
else:
query = query.order_by('last_name')
if 'reverse' in sortfilter: if 'reverse' in sortfilter:
query = query.reverse() query = query.reverse()
@ -215,7 +217,10 @@ class ParticipantsListPDF(PDFView):
def append_to_pdf(self, story): def append_to_pdf(self, story):
data = [['#', _('Last Name'), _('First Name'), _('Group'), _('Type'), data = [['#', _('Last Name'), _('First Name'), _('Group'), _('Type'),
_('Committee')]] _('Committee')]]
sort = 'last_name' if config['participant_sort_users_by_first_name']:
sort = 'first_name'
else:
sort = 'last_name'
counter = 0 counter = 0
for user in User.objects.all().order_by(sort): for user in User.objects.all().order_by(sort):
counter += 1 counter += 1
@ -257,7 +262,11 @@ class ParticipantsPasswordsPDF(PDFView):
data = [] data = []
participant_pdf_system_url = config["participant_pdf_system_url"] participant_pdf_system_url = config["participant_pdf_system_url"]
participant_pdf_welcometext = config["participant_pdf_welcometext"] participant_pdf_welcometext = config["participant_pdf_welcometext"]
for user in User.objects.all().order_by('last_name'): if config['participant_sort_users_by_first_name']:
sort = 'first_name'
else:
sort = 'last_name'
for user in User.objects.all().order_by(sort):
cell = [] cell = []
cell.append(Spacer(0, 0.8 * cm)) cell.append(Spacer(0, 0.8 * cm))
cell.append(Paragraph(_("Account for OpenSlides"), cell.append(Paragraph(_("Account for OpenSlides"),

View File

@ -0,0 +1,6 @@
{% load i18n %}
{% load tags %}
{% if welcometext %}
<p>{{ welcometext|safe|linebreaks }}</p>
{% endif %}

View File

@ -34,7 +34,7 @@ from openslides.config.models import config
from openslides.projector.api import (get_active_slide, set_active_slide, from openslides.projector.api import (get_active_slide, set_active_slide,
projector_message_set, projector_message_delete, get_slide_from_sid, projector_message_set, projector_message_delete, get_slide_from_sid,
get_all_widgets) get_all_widgets, clear_projector_cache)
from openslides.projector.forms import SelectWidgetsForm from openslides.projector.forms import SelectWidgetsForm
from openslides.projector.models import ProjectorOverlay, ProjectorSlide from openslides.projector.models import ProjectorOverlay, ProjectorSlide
from openslides.projector.projector import SLIDE, Widget from openslides.projector.projector import SLIDE, Widget
@ -128,7 +128,9 @@ class Projector(TemplateView, AjaxMixin):
if not data: if not data:
data = self.data data = self.data
cache.set('projector_data', data) cache.set('projector_data', data)
# clear cache if countdown is enabled
if config['countdown_state'] == 'active':
clear_projector_cache()
context = super(Projector, self).get_ajax_context(**kwargs) context = super(Projector, self).get_ajax_context(**kwargs)
content_hash = hash(content) content_hash = hash(content)
context.update({ context.update({
@ -277,6 +279,7 @@ class CountdownEdit(RedirectView):
pass pass
def get_ajax_context(self, **kwargs): def get_ajax_context(self, **kwargs):
clear_projector_cache()
return { return {
'state': config['countdown_state'], 'state': config['countdown_state'],
'countdown_time': config['countdown_time'], 'countdown_time': config['countdown_time'],
@ -299,6 +302,7 @@ class OverlayMessageView(RedirectView):
def get_ajax_context(self, **kwargs): def get_ajax_context(self, **kwargs):
clear_projector_cache()
return { return {
'overlay_message': config['projector_message'], 'overlay_message': config['projector_message'],
} }
@ -330,6 +334,7 @@ class ActivateOverlay(RedirectView):
self.overlay.save() self.overlay.save()
def get_ajax_context(self, **kwargs): def get_ajax_context(self, **kwargs):
clear_projector_cache()
return { return {
'active': self.overlay.active, 'active': self.overlay.active,
'def_name': self.overlay.def_name, 'def_name': self.overlay.def_name,
@ -389,6 +394,17 @@ def get_widgets(request):
""" """
widgets = [] widgets = []
# welcome widget
context = {
'welcometext': config['frontpage_welcometext']}
widgets.append(Widget(
name='welcome',
display_name=config['frontpage_title'],
template='projector/welcome_widget.html',
context=context,
permission_required='projector.can_see_dashboard',
default_column=1))
# Projector live view widget # Projector live view widget
widgets.append(Widget( widgets.append(Widget(
name='live_view', name='live_view',