diff --git a/.gitignore b/.gitignore index c17fd65ee..6fa3cff77 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ docs/_build/* *.egg-info build/* dist/* +.DS_Store diff --git a/INSTALL.txt b/INSTALL.txt index d27c338ed..b1a15f014 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -1,4 +1,4 @@ -Installation Instructions for OpenSlides 1.2 +Installation Instructions for OpenSlides 1.3 ============================================ Content @@ -48,7 +48,7 @@ I. Installation on Windows (32/64bit) easy_install django django-mptt reportlab pil 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: @@ -56,13 +56,12 @@ I. Installation on Windows (32/64bit) OR - b) Clone development version from mercurial repository - http://hg.openslides.org. This requires Mercurial source control - management (hg), see http://mercurial.selenic.com. - + b) Clone development version from OpenSlides' github repository + https://github.com/OpenSlides/OpenSlides. + This requires Git, see http://git-scm.com/. 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: diff --git a/README.txt b/README.txt index 3d7096b1d..2f82dd045 100644 --- a/README.txt +++ b/README.txt @@ -2,7 +2,7 @@ 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? @@ -47,17 +47,27 @@ Command line options -------------------- The following command line options are available: +-h, --help + Shows all options + -a, --address=ADDRESS 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 --syncdb - Create/ update the database + Creates/updates database before starting the server --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: openslides.exe -a 127.0.0.1 @@ -82,4 +92,3 @@ Browsers: IE 7+ Chrome Safari - diff --git a/openslides/__init__.py b/openslides/__init__.py index 17d119cf0..fe637ceab 100644 --- a/openslides/__init__.py +++ b/openslides/__init__.py @@ -5,7 +5,7 @@ :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): @@ -16,7 +16,7 @@ def get_version(version=None): if version is None: version = VERSION 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: # main = X.Y[.Z] @@ -27,16 +27,17 @@ def get_version(version=None): main = '.'.join(str(x) for x in version[:main_parts]) if version[3] != 'final': - mapping = {'alpha': 'a', 'beta': 'b', 'rc': 'c'} - sub = mapping[version[3]] + str(version[4]) - try: - git_head_path = '.git/' + open('.git/HEAD', 'r').read()[5:].rstrip() - except IOError: - git_commit_id = 'unknown' + if version[3] == 'dev': + try: + git_head_path = '.git/' + open('.git/HEAD', 'r').read()[5:].rstrip() + except IOError: + 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: - import os - git_commit_id = open(os.path.abspath(git_head_path), 'r').read().rstrip() - sub = '%s commit %s' % (sub, git_commit_id) + sub = '-' + version[3] + str(version[4]) else: sub = '' diff --git a/openslides/config/models.py b/openslides/config/models.py index b4cc915c0..51a3958ae 100644 --- a/openslides/config/models.py +++ b/openslides/config/models.py @@ -81,13 +81,13 @@ def default_config(sender, key, **kwargs): return { 'event_name': 'OpenSlides', 'event_description': - _('Presentation system for agenda, motions and elections'), + _('Presentation and assembly system'), 'event_date': '', 'event_location': '', 'event_organizer': '', 'presentation': '', - 'frontpage_title': _('Welcome'), - 'frontpage_welcometext': _('Welcome to OpenSlides!'), + 'frontpage_title': _('Welcome to OpenSlides'), + 'frontpage_welcometext': _('[Place for your welcome text.]'), 'show_help_text': True, 'help_text': _("Get professional support for OpenSlides on %s.") % " \ diff --git a/openslides/locale/de/LC_MESSAGES/django.mo b/openslides/locale/de/LC_MESSAGES/django.mo index e19b0ca62..bbb46fe8a 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/locale/de/LC_MESSAGES/django.po b/openslides/locale/de/LC_MESSAGES/django.po index 10d30e59c..040a189d8 100644 --- a/openslides/locale/de/LC_MESSAGES/django.po +++ b/openslides/locale/de/LC_MESSAGES/django.po @@ -7,10 +7,10 @@ msgid "" msgstr "" "Project-Id-Version: OpenSlides 1.x\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" -"Last-Translator: Oskar Hahn \n" -"Language-Team: Deutsch \n" +"Last-Translator: Emanuel Schuetze \n" +"Language-Team: support@openslides.de\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -30,12 +30,12 @@ msgid "Parent item" msgstr "Elternelement" #: 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 msgid "Title" 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 msgid "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/templates/assignment/view.html:170 #: assignment/templates/projector/Assignment.html:78 -#: assignment/templates/projector/Assignment.html:82 motion/models.py:578 -#: motion/views.py:778 motion/views.py:829 +#: assignment/templates/projector/Assignment.html:82 motion/models.py:574 +#: motion/views.py:804 motion/views.py:855 #: motion/templates/motion/view.html:79 #: motion/templates/projector/Motion.html:37 utils/utils.py:53 #: utils/views.py:111 @@ -235,8 +235,8 @@ msgstr "Ja" #: agenda/templates/agenda/overview.html:47 assignment/models.py:300 #: assignment/views.py:577 assignment/templates/assignment/view.html:167 -#: assignment/templates/projector/Assignment.html:79 motion/models.py:578 -#: motion/views.py:778 motion/views.py:830 +#: assignment/templates/projector/Assignment.html:79 motion/models.py:574 +#: motion/views.py:804 motion/views.py:856 #: motion/templates/motion/view.html:80 #: motion/templates/projector/Motion.html:38 utils/utils.py:53 #: utils/views.py:111 @@ -385,7 +385,7 @@ msgstr "Abgeschlossen" msgid "Name" msgstr "Name" -#: assignment/models.py:55 +#: assignment/models.py:55 participant/models.py:114 msgid "Description" msgstr "Beschreibung" @@ -393,7 +393,7 @@ msgstr "Beschreibung" msgid "Comment on the ballot paper" msgstr "Kommentar für den Stimmzettel" -#: assignment/models.py:69 motion/models.py:339 +#: assignment/models.py:69 motion/models.py:335 #, python-format msgid "%s is not a valid status." msgstr "%s ist kein gültiger Status." @@ -438,7 +438,7 @@ msgstr "Darf selbst für Wahlen kandidieren" msgid "Can manage assignment" msgstr "Darf Wahlen verwalten" -#: assignment/models.py:301 motion/models.py:579 +#: assignment/models.py:301 motion/models.py:575 msgid "Abstain" msgstr "Enthaltung" @@ -471,9 +471,9 @@ msgstr "Neue Wahl wurde erfolgreich angelegt." msgid "Election was successfully modified." msgstr "Wahl wurde erfolgreich geändert." -#: assignment/views.py:138 motion/views.py:256 motion/views.py:637 -#: participant/views.py:463 participant/views.py:486 utils/views.py:210 -#: utils/views.py:228 utils/views.py:252 +#: assignment/views.py:138 motion/views.py:257 motion/views.py:663 +#: participant/views.py:457 participant/views.py:480 utils/views.py:225 +#: utils/views.py:243 utils/views.py:267 msgid "Please check the form for errors." msgstr "Bitte kontrollieren Sie das Formular nach Fehlern." @@ -572,7 +572,7 @@ msgstr "Wahlen: %s" msgid "Candidates" 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 msgid "Vote results" msgstr "Abstimmungsergebnis" @@ -613,7 +613,7 @@ msgstr "Ungültige Stimmen" #: assignment/templates/assignment/view.html:202 #: assignment/templates/assignment/view.html:207 #: 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/view.html:84 #: motion/templates/projector/Motion.html:42 poll/models.py:76 @@ -646,8 +646,8 @@ msgid "%d available posts" msgstr "%d verfügbare Posten" #: assignment/views.py:577 assignment/templates/assignment/view.html:168 -#: assignment/templates/projector/Assignment.html:80 motion/views.py:778 -#: motion/views.py:831 motion/templates/motion/view.html:81 +#: assignment/templates/projector/Assignment.html:80 motion/views.py:804 +#: motion/views.py:857 motion/templates/motion/view.html:81 #: motion/templates/projector/Motion.html:39 msgid "Abstention" msgstr "Enthaltung" @@ -712,7 +712,7 @@ msgstr "Wahl-Einstellungen" #: assignment/templates/assignment/overview.html:14 #: assignment/templates/assignment/overview.html:27 #: 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:40 #: motion/templates/motion/view.html:34 @@ -815,7 +815,7 @@ msgid "was not a
candidate" msgstr "war kein Kandidat" #: 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/projector/Motion.html:40 msgid "Invalid" @@ -859,16 +859,16 @@ msgid "Can manage configuration" msgstr "Darf die Konfiguration verwalten" #: config/models.py:84 -msgid "Presentation system for agenda, motions and elections" -msgstr "Präsentationssystem für Tagesordnung, Anträge und Wahlen" +msgid "Presentation and assembly system" +msgstr "Präsentations- und Versammlungssystem" -#: config/models.py:89 templates/base.html:30 -msgid "Welcome" -msgstr "Willkommen" +#: config/models.py:89 +msgid "Welcome to OpenSlides" +msgstr "Willkommen bei OpenSlides" -#: config/models.py:90 participant/models.py:192 -msgid "Welcome to OpenSlides!" -msgstr "Willkommen bei OpenSlides!" +#: config/models.py:90 +msgid "[Place for your welcome text.]" +msgstr "[Platz für Ihren Begrüßungstext.]" #: config/models.py:92 #, python-format @@ -881,7 +881,7 @@ msgstr "Allgemein" #: config/models.py:131 config/templates/config/version.html:5 #: 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 msgid "Version" msgstr "Version" @@ -919,7 +919,7 @@ msgstr "Startseite" msgid "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/projector/Motion.html:77 msgid "Reason" @@ -933,7 +933,7 @@ msgstr "Triviale Änderung" msgid "Trivial changes don't create a new 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" msgstr "Unterstützer/innen" @@ -1022,7 +1022,7 @@ msgstr "Verworfen (nicht zulässig)" msgid "Needs 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/view.html:18 #: motion/templates/projector/Motion.html:55 @@ -1034,11 +1034,6 @@ msgstr "Antragsteller/in" msgid "Version %d authorized" 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 msgid "Searching for supporters." msgstr "Auf Unterstützersuche." @@ -1073,37 +1068,37 @@ msgstr "Unterstützer/innen gelöscht" msgid "Status reseted to: %s" msgstr "Status zurückgesetzt auf: %s" -#: motion/models.py:268 +#: motion/models.py:265 #, python-format msgid "Supporter: +%s" msgstr "Unterstützer/in: +%s" -#: motion/models.py:282 +#: motion/models.py:278 #, python-format msgid "Supporter: -%s" msgstr "Unterstützer/in: -%s" -#: motion/models.py:299 +#: motion/models.py:295 #, python-format msgid "Number set: %s" msgstr "Nummer gesetzt: %s" -#: motion/models.py:312 +#: motion/models.py:308 #, python-format msgid "Version %s authorized" msgstr "Version %s zugelassen" -#: motion/models.py:326 +#: motion/models.py:322 #, python-format msgid "Version %s not authorized" msgstr "Version %s nicht zugelassen" -#: motion/models.py:342 +#: motion/models.py:338 #, python-format msgid "The motion status is already '%s.'" msgstr "Der Antragsstatus ist bereits '%s'." -#: motion/models.py:350 +#: motion/models.py:346 #, python-format msgid "" "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 " "'%(newstatus)s' setzen." -#: motion/models.py:358 +#: motion/models.py:354 msgid "Status modified" msgstr "Status geändert" -#: motion/models.py:450 +#: motion/models.py:446 msgid "by" 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/projector/Motion.html:65 msgid "no number" 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 msgid "motion" msgstr "Antrag" -#: motion/models.py:484 +#: motion/models.py:480 msgid "Poll created" msgstr "Abstimmung erstellt" -#: motion/models.py:535 +#: motion/models.py:531 msgid "Can see motions" msgstr "Darf Anträge sehen" -#: motion/models.py:536 +#: motion/models.py:532 msgid "Can create motions" msgstr "Darf Anträge erstellen" -#: motion/models.py:537 +#: motion/models.py:533 msgid "Can support motions" msgstr "Darf Anträge unterstützen" -#: motion/models.py:538 +#: motion/models.py:534 msgid "Can manage motions" msgstr "Darf Anträge verwalten" -#: motion/models.py:605 +#: motion/models.py:601 msgid "The assembly may decide," 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/overview.html:7 #: motion/templates/motion/overview.html:10 msgid "Motions" msgstr "Anträge" -#: motion/views.py:179 +#: motion/views.py:180 msgid "You have not the necessary rights to create or edit motions." msgstr "" "Sie haben nicht die nötigen Rechte, um Anträge zu erstellen oder zu " "bearbeiten." -#: motion/views.py:184 +#: motion/views.py:185 msgid "You can not edit this motion." msgstr "Sie dürfen diesen Antrag nicht bearbeiten." -#: motion/views.py:247 +#: motion/views.py:248 msgid "New motion was successfully created." msgstr "Neuer Antrag wurde erfolgreich angelegt." -#: motion/views.py:249 +#: motion/views.py:250 msgid "Motion was successfully modified." msgstr "Antrag wurde erfolgreich geändert." -#: motion/views.py:263 +#: motion/views.py:264 msgid "" "Attention: Do you really want to edit this motion? The supporters will " "not be removed automatically because you can manage motions. Please " @@ -1190,7 +1185,7 @@ msgstr "" "werden nicht automatisch entfernt, da Sie Anträge verwalten dürfen. " "Prüfen Sie, ob die Unterstützungen noch gültig sind." -#: motion/views.py:265 +#: motion/views.py:266 #, python-format msgid "" "Attention: Do you really want to edit this motion? All %s supporters " @@ -1199,132 +1194,148 @@ msgstr "" "Wollen Sie den Antrag wirklich ändern? Alle %s Unterstützer/innen " "werden dann automatisch entfernt. Versuchen Sie diese erneut zu gewinnen." -#: motion/views.py:297 +#: motion/views.py:298 msgid "Motion number was successfully set." msgstr "Antragsnummer wurde erfolgreich gesetzt." -#: motion/views.py:313 +#: motion/views.py:314 msgid "Motion was successfully authorized." msgstr "Antrag wurde erfolgreich zugelassen." -#: motion/views.py:328 +#: motion/views.py:329 msgid "Motion was successfully rejected." msgstr "Antrag wurde erfolgreich verworfen." -#: motion/views.py:344 +#: motion/views.py:345 #, python-format msgid "Motion status was set to: %s." msgstr "Antragsstatus wurde gesetzt auf: %s." -#: motion/views.py:360 +#: motion/views.py:361 msgid "Motion status was reset." 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 -msgid "You have unsupport the motion successfully." -msgstr "Sie haben dem Antrag erfolgreich Ihre Unterstützung entzogen." +msgid "You can not support this motion." +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 +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." msgstr "Neue Abstimmung erfolgreich angelegt." -#: motion/views.py:418 +#: motion/views.py:447 msgid "Poll deleted" msgstr "Abstimmung gelöscht" -#: motion/views.py:419 +#: motion/views.py:448 msgid "Poll was successfully deleted." msgstr "Abstimmung wurde erfolgreich gelöscht." -#: motion/views.py:421 +#: motion/views.py:450 #, python-format msgid "the %s. poll" msgstr "die %s. Abstimmung" -#: motion/views.py:462 motion/views.py:471 +#: motion/views.py:491 motion/views.py:500 #, python-format msgid "You can not delete motion %s." msgstr "Sie können Antrag %s nicht löschen." -#: motion/views.py:467 motion/views.py:475 +#: motion/views.py:496 motion/views.py:504 #, python-format msgid "Motion %s was successfully deleted." msgstr "Antrag %s wurde erfolgreich gelöscht." -#: motion/views.py:477 +#: motion/views.py:506 msgid "Invalid request" msgstr "Ungültige Anfrage" -#: motion/views.py:501 +#: motion/views.py:530 msgid "Poll was updated" msgstr "Abstimmung wurde aktualisiert" -#: motion/views.py:518 +#: motion/views.py:547 #, python-format msgid "Version %s accepted." msgstr "Version %s akzeptiert." -#: motion/views.py:520 +#: motion/views.py:549 #, python-format msgid "Do you really want to authorize version %s?" msgstr "Soll Version %s wirklich zugelassen werden?" -#: motion/views.py:530 +#: motion/views.py:559 #, python-format msgid "Version %s rejected." msgstr "Version %s zurückgewiesen." -#: motion/views.py:532 +#: motion/views.py:561 msgid "ERROR by rejecting the version." msgstr "FEHLER beim Zurückweisen der Version." -#: motion/views.py:534 +#: motion/views.py:563 #, python-format msgid "Do you really want to reject version %s?" msgstr "Soll Version %s wirklich zurückgewiesen werden?" -#: motion/views.py:564 motion/views.py:568 motion/views.py:574 -#: motion/views.py:577 participant/api.py:76 +#: motion/views.py:593 motion/views.py:597 motion/views.py:603 +#: motion/views.py:606 participant/api.py:76 #, python-format msgid "Ignoring malformed line %d in import file." msgstr "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert." -#: motion/views.py:623 +#: motion/views.py:649 #, python-format msgid "%d motion was successfully imported." msgid_plural "%d motions were successfully imported." msgstr[0] "%d Antrag wurde erfolgreich importiert." msgstr[1] "%d Anträge wurden erfolgreich importiert." -#: motion/views.py:626 +#: motion/views.py:652 #, python-format msgid "%d motion was successfully modified." msgid_plural "%d motions were successfully modified." msgstr[0] "%d Antrag wurde erfolgreich geändert." msgstr[1] "%d Anträge wurden erfolgreich geändert." -#: motion/views.py:629 +#: motion/views.py:655 #, python-format msgid "%d new user was added." msgid_plural "%d new users were added." msgstr[0] "%d neuer Nutzer wurde 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." 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!" msgstr "" "Die Quelldatei benutzt eine ungültige Zeichenkodierung, es wird nur UTF-8 " "wird unterstützt!" -#: motion/views.py:639 +#: motion/views.py:665 msgid "" "Attention: Existing motions will be modified if you import new motions with " "the same number." @@ -1332,7 +1343,7 @@ msgstr "" "Achtung: Existierende Anträge werden geändert wenn Sie neue Anträge mit " "identischer Nummer importieren." -#: motion/views.py:640 +#: motion/views.py:666 msgid "" "Attention: Importing an motions without a number multiple times will create " "duplicates." @@ -1340,7 +1351,7 @@ msgstr "" "Achtung: Bei mehrfachem Import eines Antrags ohne Nummer können Duplikate " "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:12 #: motion/templates/motion/view.html:7 motion/templates/motion/view.html:206 @@ -1350,21 +1361,21 @@ msgstr "" msgid "Motion" 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." msgstr "Keine Anträge vorhanden." -#: motion/views.py:692 motion/views.py:694 motion/views.py:709 -#: motion/views.py:711 motion/templates/motion/base_motion.html:24 +#: motion/views.py:718 motion/views.py:720 motion/views.py:735 +#: motion/views.py:737 motion/templates/motion/base_motion.html:24 #: motion/templates/projector/Motion.html:63 msgid "Motion No." msgstr "Antrag Nr." -#: motion/views.py:726 +#: motion/views.py:752 msgid "Signature" 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:13 #: motion/templates/motion/view.html:66 motion/templates/motion/view.html:74 @@ -1372,20 +1383,21 @@ msgstr "Unterschrift" msgid "Vote" msgstr "Abstimmung" -#: motion/views.py:811 +#: motion/views.py:837 msgid "Poll" msgstr "Abstimmung" -#: motion/views.py:825 +#: motion/views.py:851 +#, python-format msgid "Motion No. %s" msgstr "Antrag Nr. %s" -#: motion/views.py:827 +#: motion/views.py:853 #, python-format msgid "%d. Vote" msgstr "%d. Abstimmung" -#: motion/views.py:884 +#: motion/views.py:910 msgid "Motion settings successfully saved." msgstr "Antrags-Einstellungen wurden erfolgreich gespeichert." @@ -1429,7 +1441,7 @@ msgstr "Antrag als PDF" #: motion/templates/motion/base_motion.html:49 msgid "Show Motion" -msgstr "Zeige Antrag" +msgstr "Antrag projizieren" #: motion/templates/motion/config.html:5 motion/templates/motion/config.html:8 msgid "Motion settings" @@ -1653,12 +1665,16 @@ msgid "User groups" msgstr "Benutzerrollen" #: participant/forms.py:44 -msgid "Persmissions" +msgid "Permissions" msgstr "Rechte" -#: participant/forms.py:47 -msgid "Users" -msgstr "Benutzer" +#: participant/forms.py:47 participant/views.py:495 +#: 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/forms.py:83 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" #: participant/forms.py:118 -msgid "Sort users by first name" -msgstr "Sortiere Teilnehmer beim Vornamen" +msgid "Sort participants by first name" +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 msgid "Male" @@ -1711,7 +1731,7 @@ msgid "Detail" msgstr "Detail" #: participant/models.py:42 -msgid "Will be shown behind the name." +msgid "Will be shown after the name." msgstr "Wird nach dem Namen angezeigt." #: participant/models.py:45 participant/templates/participant/overview.html:24 @@ -1719,8 +1739,8 @@ msgid "Gender" msgstr "Geschlecht" #: participant/models.py:45 participant/models.py:48 participant/models.py:51 -msgid "Only for filter the userlist." -msgstr "Nur zum Filtern der Benutzerliste." +msgid "Only for filtering the participant list." +msgstr "Nur zum Filtern der Teilnehmerliste." #: participant/models.py:48 msgid "Typ" @@ -1748,6 +1768,18 @@ msgstr "Darf die Teilnehmer/inen sehen" msgid "Can manage participant" 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 msgid "Participant-list" msgstr "Teilnehmerliste" @@ -1810,16 +1842,16 @@ msgstr "%d neue Teilnehmer/innen wurden erfolgreich importiert." msgid "Do you really want to reset the password?" msgstr "Soll das Passwort wirklich zurückgesetzt werden?" -#: participant/views.py:346 +#: participant/views.py:343 #, python-format msgid "The Password for %s was successfully reset." msgstr "Das Passwort für %s wurde erfolgreich zurückgesetzt." -#: participant/views.py:428 +#: participant/views.py:422 msgid "Participants settings successfully saved." msgstr "Teilnehmer/innen-Einstellungen wurden erfolgreich gespeichert." -#: participant/views.py:438 +#: participant/views.py:432 #, python-format msgid "" "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 " "Meldung weiterhin für alle und ist ein Sicherheitsrisiko." -#: participant/views.py:461 +#: participant/views.py:455 msgid "User settings successfully saved." msgstr "Nutzereinstellungen wurden erfolgreich gespeichert." -#: participant/views.py:483 +#: participant/views.py:477 msgid "Password successfully changed." -msgstr "Password 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" +msgstr "Passwort wurde erfolgreich geändert." #: participant/templates/participant/base_participant.html:15 msgid "All participants" @@ -2034,23 +2058,23 @@ msgstr "Darf den Projektor sehen" msgid "Can see the dashboard" msgstr "Darf das Dashboard sehen" -#: projector/views.py:185 +#: projector/views.py:202 msgid "Errors in the form" 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" msgstr "Dashboard" -#: projector/views.py:378 +#: projector/views.py:406 msgid "Projector live view" msgstr "Projektor-Live-Ansicht" -#: projector/views.py:404 +#: projector/views.py:432 msgid "Overlays" msgstr "Einblendungen" -#: projector/views.py:417 +#: projector/views.py:445 msgid "Custom Slides" msgstr "Benutzerdefinierte Folien" @@ -2075,7 +2099,6 @@ msgid "Projector view" msgstr "Projektor-Ansicht" #: projector/templates/projector/control_countdown.html:6 -msgctxt "seconds" msgid "s" msgstr "s" @@ -2158,6 +2181,10 @@ msgstr "Startseite" msgid "Logout" msgstr "Abmelden" +#: templates/base.html:30 +msgid "Welcome" +msgstr "Willkommen" + #: templates/front_page.html:12 msgid "You have access to the following pages:" msgstr "Sie haben Zugriff auf folgende Seiten:" @@ -2176,7 +2203,7 @@ msgstr "Gedruckt am: %s" msgid "Page %s" msgstr "Seite %s" -#: utils/utils.py:66 utils/views.py:271 +#: utils/utils.py:66 utils/views.py:290 #, python-format msgid "Do you really want to delete %s?" msgstr "Soll %s wirklich gelöscht werden?" @@ -2193,22 +2220,22 @@ msgstr "Sind Sie sicher?" msgid "Thank you for your answer" msgstr "Danke für Ihre Antwort" -#: utils/views.py:232 +#: utils/views.py:247 #, python-format msgid "%s was successfully modified." msgstr "%s wurde erfolgreich bearbeitet." -#: utils/views.py:263 +#: utils/views.py:278 #, python-format msgid "%s was successfully created." msgstr "%s wurde erfolgreich angelegt." -#: utils/views.py:274 +#: utils/views.py:296 #, python-format msgid "%s was successfully deleted." msgstr "%s wurde erfolgreich gelöscht." -#: utils/views.py:305 +#: utils/views.py:312 msgid "undefined-filename" msgstr "undefinierter-dateiname" @@ -2216,32 +2243,5 @@ msgstr "undefinierter-dateiname" msgid "Enter valid JSON" msgstr "Gebe valides JSON ein" -#~ msgid "Applications" -#~ msgstr "Anträge" - -#~ 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 %s?" -#~ msgstr "Soll %s wirklich gelöscht werden?" - -#~ msgid "You!" -#~ msgstr "Sie!" +#~ msgid "Users" +#~ msgstr "Benutzer" diff --git a/openslides/main.py b/openslides/main.py index 17d682eb8..4844b752a 100644 --- a/openslides/main.py +++ b/openslides/main.py @@ -223,7 +223,7 @@ def create_or_reset_admin_user(): except User.DoesNotExist: admin = User() admin.username = 'admin' - admin.last_name = 'Admin User' + admin.last_name = 'Administrator' print("Created default admin user") admin.is_superuser = True diff --git a/openslides/motion/views.py b/openslides/motion/views.py index 78873ba92..4512f05a1 100644 --- a/openslides/motion/views.py +++ b/openslides/motion/views.py @@ -615,16 +615,13 @@ def motion_import(request): user.last_name = last_name user.first_name = first_name user.username = gen_username(first_name, last_name) + user.detail = '' + user.committee = '' + user.gender = '' + user.type = '' + user.default_password = gen_password() user.save() - profile = Profile() - 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() + user.reset_password() users_generated += 1 # create / modify the motion motion = None diff --git a/openslides/participant/api.py b/openslides/participant/api.py index 3e5856391..5f5bf2b0b 100644 --- a/openslides/participant/api.py +++ b/openslides/participant/api.py @@ -71,7 +71,7 @@ def import_users(csv_file): dialect=dialect)): if line_no: 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: error_messages.append(_('Ignoring malformed line %d in import file.') % line_no + 1) continue @@ -80,11 +80,11 @@ def import_users(csv_file): user.first_name = first_name user.username = gen_username(first_name, last_name) user.gender = gender - user.category = category + user.detail = detail user.type = type user.committee = committee user.comment = comment - user.firstpassword = gen_password() + user.default_password = gen_password() user.save() user.reset_password() count_success += 1 diff --git a/openslides/participant/forms.py b/openslides/participant/forms.py index 153285d8f..672b3ae4e 100644 --- a/openslides/participant/forms.py +++ b/openslides/participant/forms.py @@ -41,10 +41,10 @@ class UserUpdateForm(UserCreateForm): class GroupForm(forms.ModelForm, CssClassMixin): permissions = LocalizedModelMultipleChoiceField( - queryset=Permission.objects.all(), label=_("Persmissions"), + queryset=Permission.objects.all(), label=_("Permissions"), required=False) users = forms.ModelMultipleChoiceField( - queryset=User.objects.all(), label=_("Users"), required=False) + queryset=User.objects.all(), label=_("Participants"), required=False) def __init__(self, *args, **kwargs): # Initial users @@ -115,4 +115,5 @@ class ConfigForm(forms.Form, CssClassMixin): help_text=_("Printed in PDF of first time passwords only.")) participant_sort_users_by_first_name = forms.BooleanField( required=False, - label=_("Sort users by first name")) + label=_("Sort participants by first name"), + help_text=_("Disable for sorting by last name")) diff --git a/openslides/participant/models.py b/openslides/participant/models.py index cabb54b7a..851be38d0 100644 --- a/openslides/participant/models.py +++ b/openslides/participant/models.py @@ -39,16 +39,16 @@ class User(DjangoUser, PersonMixin, Person): django_user = models.OneToOneField(DjangoUser, editable=False, parent_link=True) detail = models.CharField( 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( 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( 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( 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( blank=True, default='', verbose_name=_('Comment'), help_text=_('Only for notes.')) @@ -110,8 +110,8 @@ class Group(DjangoGroup, PersonMixin, Person): person_prefix = 'group' django_group = models.OneToOneField(DjangoGroup, editable=False, parent_link=True) - group_as_person = models.BooleanField(default=False) - description = models.TextField(blank=True) + 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, verbose_name=_("Description")) @models.permalink def get_absolute_url(self, link='edit'): @@ -145,7 +145,7 @@ class UsersAndGroupsToPersons(object): if config['participant_sort_users_by_first_name']: self.users = User.objects.all().order_by('first_name') else: - self.users = User.objects.all() + self.users = User.objects.all().order_by('last_name') self.groups = Group.objects.filter(group_as_person=True) def __iter__(self): diff --git a/openslides/participant/views.py b/openslides/participant/views.py index 00599c327..99665a469 100644 --- a/openslides/participant/views.py +++ b/openslides/participant/views.py @@ -98,6 +98,8 @@ class Overview(ListView): else: if config['participant_sort_users_by_first_name']: query = query.order_by('first_name') + else: + query = query.order_by('last_name') if 'reverse' in sortfilter: query = query.reverse() @@ -215,7 +217,10 @@ class ParticipantsListPDF(PDFView): def append_to_pdf(self, story): data = [['#', _('Last Name'), _('First Name'), _('Group'), _('Type'), _('Committee')]] - sort = 'last_name' + if config['participant_sort_users_by_first_name']: + sort = 'first_name' + else: + sort = 'last_name' counter = 0 for user in User.objects.all().order_by(sort): counter += 1 @@ -257,7 +262,11 @@ class ParticipantsPasswordsPDF(PDFView): data = [] participant_pdf_system_url = config["participant_pdf_system_url"] 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.append(Spacer(0, 0.8 * cm)) cell.append(Paragraph(_("Account for OpenSlides"), diff --git a/openslides/projector/templates/projector/welcome_widget.html b/openslides/projector/templates/projector/welcome_widget.html new file mode 100644 index 000000000..68461cacb --- /dev/null +++ b/openslides/projector/templates/projector/welcome_widget.html @@ -0,0 +1,6 @@ +{% load i18n %} +{% load tags %} + +{% if welcometext %} +

{{ welcometext|safe|linebreaks }}

+{% endif %} diff --git a/openslides/projector/views.py b/openslides/projector/views.py index 10c22f1ea..8536d6bf8 100644 --- a/openslides/projector/views.py +++ b/openslides/projector/views.py @@ -34,7 +34,7 @@ from openslides.config.models import config from openslides.projector.api import (get_active_slide, set_active_slide, 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.models import ProjectorOverlay, ProjectorSlide from openslides.projector.projector import SLIDE, Widget @@ -128,7 +128,9 @@ class Projector(TemplateView, AjaxMixin): if not data: data = self.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) content_hash = hash(content) context.update({ @@ -277,6 +279,7 @@ class CountdownEdit(RedirectView): pass def get_ajax_context(self, **kwargs): + clear_projector_cache() return { 'state': config['countdown_state'], 'countdown_time': config['countdown_time'], @@ -299,6 +302,7 @@ class OverlayMessageView(RedirectView): def get_ajax_context(self, **kwargs): + clear_projector_cache() return { 'overlay_message': config['projector_message'], } @@ -330,6 +334,7 @@ class ActivateOverlay(RedirectView): self.overlay.save() def get_ajax_context(self, **kwargs): + clear_projector_cache() return { 'active': self.overlay.active, 'def_name': self.overlay.def_name, @@ -389,6 +394,17 @@ def get_widgets(request): """ 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 widgets.append(Widget( name='live_view',