Merge pull request #50 from Shirk/master

Fix #419
This commit is contained in:
Oskar Hahn 2012-11-22 04:19:29 -08:00
commit 48b0966a8f
5 changed files with 188 additions and 104 deletions

View File

@ -7,7 +7,7 @@ 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-11-21 21:43+0100\n" "POT-Creation-Date: 2012-11-22 10:22+0100\n"
"PO-Revision-Date: 2012-07-28 11:07+0200\n" "PO-Revision-Date: 2012-07-28 11:07+0200\n"
"Last-Translator: Emanuel Schuetze <emanuel@intevation.de>\n" "Last-Translator: Emanuel Schuetze <emanuel@intevation.de>\n"
"Language-Team: support@openslides.de\n" "Language-Team: support@openslides.de\n"
@ -34,12 +34,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:540 motion/templates/motion/view.html:246 #: motion/models.py:545 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:541 #: agenda/models.py:43 motion/forms.py:23 motion/models.py:546
#: 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"
@ -230,8 +230,8 @@ msgstr "Möchten Sie die geänderte Reihenfolge der Einträge speichern?"
#: assignment/views.py:579 assignment/templates/assignment/view.html:168 #: assignment/views.py:579 assignment/templates/assignment/view.html:168
#: assignment/templates/assignment/view.html:172 #: assignment/templates/assignment/view.html:172
#: assignment/templates/projector/Assignment.html:78 #: assignment/templates/projector/Assignment.html:78
#: assignment/templates/projector/Assignment.html:82 motion/models.py:574 #: assignment/templates/projector/Assignment.html:82 motion/models.py:579
#: motion/views.py:804 motion/views.py:855 #: motion/views.py:842 motion/views.py:893
#: 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
@ -240,8 +240,8 @@ msgstr "Ja"
#: agenda/templates/agenda/overview.html:47 assignment/models.py:301 #: agenda/templates/agenda/overview.html:47 assignment/models.py:301
#: assignment/views.py:580 assignment/templates/assignment/view.html:169 #: assignment/views.py:580 assignment/templates/assignment/view.html:169
#: assignment/templates/projector/Assignment.html:79 motion/models.py:574 #: assignment/templates/projector/Assignment.html:79 motion/models.py:579
#: motion/views.py:804 motion/views.py:856 #: motion/views.py:842 motion/views.py:894
#: 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
@ -404,7 +404,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:335 #: assignment/models.py:69 motion/models.py:337
#, 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."
@ -449,7 +449,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:302 motion/models.py:575 #: assignment/models.py:302 motion/models.py:580
msgid "Abstain" msgid "Abstain"
msgstr "Enthaltung" msgstr "Enthaltung"
@ -483,7 +483,7 @@ 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:257 motion/views.py:663 #: assignment/views.py:138 motion/views.py:257 motion/views.py:701
#: participant/views.py:506 participant/views.py:529 utils/views.py:225 #: participant/views.py:506 participant/views.py:529 utils/views.py:225
#: utils/views.py:243 utils/views.py:267 #: utils/views.py:243 utils/views.py:267
msgid "Please check the form for errors." msgid "Please check the form for errors."
@ -585,7 +585,7 @@ msgstr "Wahlen: %s"
msgid "Candidates" msgid "Candidates"
msgstr "Kandidaten/innen" msgstr "Kandidaten/innen"
#: assignment/views.py:412 motion/views.py:797 #: assignment/views.py:412 motion/views.py:835
#: motion/templates/motion/view.html:44 #: motion/templates/motion/view.html:44
msgid "Vote results" msgid "Vote results"
msgstr "Abstimmungsergebnis" msgstr "Abstimmungsergebnis"
@ -625,7 +625,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:109 #: assignment/templates/projector/Assignment.html:109
#: assignment/templates/projector/Assignment.html:115 motion/views.py:804 #: assignment/templates/projector/Assignment.html:115 motion/views.py:842
#: 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
@ -660,8 +660,8 @@ msgstr[0] "%d verfügbare Posten"
msgstr[1] "%d verfügbare Posten" msgstr[1] "%d verfügbare Posten"
#: assignment/views.py:580 assignment/templates/assignment/view.html:170 #: assignment/views.py:580 assignment/templates/assignment/view.html:170
#: assignment/templates/projector/Assignment.html:80 motion/views.py:804 #: assignment/templates/projector/Assignment.html:80 motion/views.py:842
#: motion/views.py:857 motion/templates/motion/view.html:81 #: motion/views.py:895 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"
@ -722,7 +722,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:775 #: assignment/templates/projector/Assignment.html:18 motion/views.py:813
#: 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
@ -844,7 +844,7 @@ msgid "was not a <br> candidate"
msgstr "war kein Kandidat" msgstr "war kein Kandidat"
#: assignment/templates/assignment/view.html:191 #: assignment/templates/assignment/view.html:191
#: assignment/templates/projector/Assignment.html:100 motion/views.py:804 #: assignment/templates/projector/Assignment.html:100 motion/views.py:842
#: 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"
@ -904,7 +904,7 @@ msgstr "Allgemein"
#: config/models.py:127 config/templates/config/version.html:5 #: config/models.py:127 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:789 #: config/templates/config/version.html:11 motion/views.py:827
#: 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"
@ -942,7 +942,7 @@ msgstr "Willkommens-Widget"
msgid "System" msgid "System"
msgstr "System" msgstr "System"
#: motion/forms.py:25 motion/models.py:542 motion/views.py:823 #: motion/forms.py:25 motion/models.py:547 motion/views.py:861
#: 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"
@ -956,14 +956,14 @@ 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:35 motion/models.py:66 motion/views.py:742 #: motion/forms.py:35 motion/models.py:68 motion/views.py:780
#: 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
msgid "Submitter" msgid "Submitter"
msgstr "Antragsteller/in" msgstr "Antragsteller/in"
#: motion/forms.py:44 motion/views.py:762 motion/templates/motion/view.html:22 #: motion/forms.py:44 motion/views.py:800 motion/templates/motion/view.html:22
msgid "Supporters" msgid "Supporters"
msgstr "Unterstützer/innen" msgstr "Unterstützer/innen"
@ -1008,74 +1008,74 @@ msgid "Warning: Trivial changes undermine the motions autorisation system."
msgstr "" msgstr ""
"Warnung: Triviale Änderungen unterlaufen das Zulassungssystem von Anträgen." "Warnung: Triviale Änderungen unterlaufen das Zulassungssystem von Anträgen."
#: motion/models.py:45 #: motion/models.py:47
msgid "Published" msgid "Published"
msgstr "Veröffentlicht" msgstr "Veröffentlicht"
#: motion/models.py:46 #: motion/models.py:48
msgid "Permitted" msgid "Permitted"
msgstr "Zugelassen" msgstr "Zugelassen"
#: motion/models.py:47 motion/templates/motion/overview.html:24 #: motion/models.py:49 motion/templates/motion/overview.html:24
#: motion/templates/motion/view.html:167 #: motion/templates/motion/view.html:167
msgid "Accepted" msgid "Accepted"
msgstr "Angenommen" msgstr "Angenommen"
#: motion/models.py:48 motion/templates/motion/overview.html:25 #: motion/models.py:50 motion/templates/motion/overview.html:25
#: motion/templates/motion/view.html:172 #: motion/templates/motion/view.html:172
msgid "Rejected" msgid "Rejected"
msgstr "Abgelehnt" msgstr "Abgelehnt"
#: motion/models.py:49 #: motion/models.py:51
msgid "Withdrawed" msgid "Withdrawed"
msgstr "Zurückgezogen" msgstr "Zurückgezogen"
#: motion/models.py:50 motion/templates/motion/view.html:180 #: motion/models.py:52 motion/templates/motion/view.html:180
msgid "Adjourned" msgid "Adjourned"
msgstr "Vertagt" msgstr "Vertagt"
# please check! # please check!
#: motion/models.py:51 motion/templates/motion/view.html:183 #: motion/models.py:53 motion/templates/motion/view.html:183
msgid "Not Concerned" msgid "Not Concerned"
msgstr "Nicht befasst" msgstr "Nicht befasst"
# please check! # please check!
#: motion/models.py:52 motion/templates/motion/view.html:186 #: motion/models.py:54 motion/templates/motion/view.html:186
msgid "Commited a bill" msgid "Commited a bill"
msgstr "Verwiesen (in Ausschuss)" msgstr "Verwiesen (in Ausschuss)"
#: motion/models.py:53 #: motion/models.py:55
msgid "Rejected (not authorized)" msgid "Rejected (not authorized)"
msgstr "Verworfen (nicht zulässig)" msgstr "Verworfen (nicht zulässig)"
#: motion/models.py:54 motion/templates/motion/overview.html:27 #: motion/models.py:56 motion/templates/motion/overview.html:27
msgid "Needs Review" msgid "Needs Review"
msgstr "Benötigt Review" msgstr "Benötigt Review"
#: motion/models.py:103 #: motion/models.py:105
#, python-format #, python-format
msgid "Version %d authorized" msgid "Version %d authorized"
msgstr "Version %d zugelassen" msgstr "Version %d zugelassen"
#: motion/models.py:110 #: motion/models.py:112
#, python-format #, python-format
msgctxt "Rejected means not authorized" msgctxt "Rejected means not authorized"
msgid "Version %d rejected" msgid "Version %d rejected"
msgstr "Version verworfen" msgstr "Version %d verworfen"
#: motion/models.py:139 #: motion/models.py:141
msgid "Searching for supporters." msgid "Searching for supporters."
msgstr "Auf Unterstützersuche." msgstr "Auf Unterstützersuche."
#: motion/models.py:141 #: motion/models.py:143
msgid "Not yet authorized." msgid "Not yet authorized."
msgstr "Noch nicht zugelassen." msgstr "Noch nicht zugelassen."
#: motion/models.py:143 #: motion/models.py:145
msgid "Not yet authorized changes." msgid "Not yet authorized changes."
msgstr "Noch nicht zugelassene Änderungen." msgstr "Noch nicht zugelassene Änderungen."
#: motion/models.py:223 #: motion/models.py:225
#, python-format #, python-format
msgid "" msgid ""
"Trivial changes to version %(version)d; changed fields: %(changed_fields)s" "Trivial changes to version %(version)d; changed fields: %(changed_fields)s"
@ -1083,51 +1083,51 @@ msgstr ""
"Triviale Änderung an Version %(version)d; Geänderte Felder: " "Triviale Änderung an Version %(version)d; Geänderte Felder: "
"%(changed_fields)s" "%(changed_fields)s"
#: motion/models.py:234 #: motion/models.py:236
#, python-format #, python-format
msgid "Version %s created" msgid "Version %s created"
msgstr "Version %s erstellt" msgstr "Version %s erstellt"
#: motion/models.py:244 #: motion/models.py:246
msgid "Supporters removed" msgid "Supporters removed"
msgstr "Unterstützer/innen gelöscht" msgstr "Unterstützer/innen gelöscht"
#: motion/models.py:253 #: motion/models.py:255
#, python-format #, python-format
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:265 #: motion/models.py:267
#, python-format #, python-format
msgid "Supporter: +%s" msgid "Supporter: +%s"
msgstr "Unterstützer/in: +%s" msgstr "Unterstützer/in: +%s"
#: motion/models.py:278 #: motion/models.py:280
#, python-format #, python-format
msgid "Supporter: -%s" msgid "Supporter: -%s"
msgstr "Unterstützer/in: -%s" msgstr "Unterstützer/in: -%s"
#: motion/models.py:295 #: motion/models.py:297
#, python-format #, python-format
msgid "Number set: %s" msgid "Number set: %s"
msgstr "Nummer gesetzt: %s" msgstr "Nummer gesetzt: %s"
#: motion/models.py:308 #: motion/models.py:310
#, python-format #, python-format
msgid "Version %s authorized" msgid "Version %s authorized"
msgstr "Version %s zugelassen" msgstr "Version %s zugelassen"
#: motion/models.py:322 #: motion/models.py:324
#, 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:338 #: motion/models.py:340
#, 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:346 #: motion/models.py:348
#, 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 "
@ -1136,15 +1136,15 @@ 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:354 #: motion/models.py:356
msgid "Status modified" msgid "Status modified"
msgstr "Status geändert" msgstr "Status geändert"
#: motion/models.py:446 #: motion/models.py:449 motion/models.py:451
msgid "by" msgid "by"
msgstr "von" msgstr "von"
#: motion/models.py:454 motion/templates/motion/view.html:210 #: motion/models.py:459 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
#: participant/templates/participant/personal_info_widget.html:13 #: participant/templates/participant/personal_info_widget.html:13
@ -1152,38 +1152,38 @@ msgstr "von"
msgid "no number" msgid "no number"
msgstr "ohne Nummer" msgstr "ohne Nummer"
#: motion/models.py:455 motion/templates/motion/widget.html:23 #: motion/models.py:460 motion/templates/motion/widget.html:23
#: participant/templates/participant/personal_info_widget.html:9 #: participant/templates/participant/personal_info_widget.html:9
#: participant/templates/participant/personal_info_widget.html:28 #: participant/templates/participant/personal_info_widget.html:28
msgid "motion" msgid "motion"
msgstr "Antrag" msgstr "Antrag"
#: motion/models.py:480 #: motion/models.py:485
msgid "Poll created" msgid "Poll created"
msgstr "Abstimmung erstellt" msgstr "Abstimmung erstellt"
#: motion/models.py:531 #: motion/models.py:536
msgid "Can see motions" msgid "Can see motions"
msgstr "Darf Anträge sehen" msgstr "Darf Anträge sehen"
#: motion/models.py:532 #: motion/models.py:537
msgid "Can create motions" msgid "Can create motions"
msgstr "Darf Anträge erstellen" msgstr "Darf Anträge erstellen"
#: motion/models.py:533 #: motion/models.py:538
msgid "Can support motions" msgid "Can support motions"
msgstr "Darf Anträge unterstützen" msgstr "Darf Anträge unterstützen"
#: motion/models.py:534 #: motion/models.py:539
msgid "Can manage motions" msgid "Can manage motions"
msgstr "Darf Anträge verwalten" msgstr "Darf Anträge verwalten"
#: motion/models.py:601 #: motion/models.py:606
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:604 motion/views.py:692 motion/views.py:917 #: motion/models.py:609 motion/views.py:730 motion/views.py:955
#: motion/views.py:928 motion/templates/motion/base_motion.html:9 #: motion/views.py:966 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"
@ -1330,44 +1330,77 @@ msgstr "FEHLER beim Zurückweisen der Version."
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:593 motion/views.py:597 motion/views.py:603 #: motion/views.py:599 motion/views.py:603 motion/views.py:609
#: motion/views.py:606 participant/api.py:76 #: motion/views.py:612 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:649 #: motion/views.py:620
#, python-format
msgid "Ignoring line %d because the assigned group may not act as a person."
msgstr ""
"Fehlerhafte Zeile %d der Quelldatei wurde ignoriert da die verwendete Gruppe "
"nicht als Person auftreten darf."
#: motion/views.py:629
msgid "Created by motion import."
msgstr "Erstellt durch Antragsimport."
#: motion/views.py:643
#, python-format
msgid ""
"Ignoring line %d because it contains an incomplete first / last name pair."
msgstr ""
"Fehlerhafte Zeile %d der Quelldatei wurde ignoriert, da Vor- bzw. Nachname "
"Leerstrings enthalten."
#: motion/views.py:681
#, 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:652 #: motion/views.py:684
#, 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:655 #: motion/views.py:687
#, 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:659 participant/api.py:92 #: motion/views.py:690
#, python-format
msgid "%d new group was added."
msgid_plural "%d new groups were added."
msgstr[0] "%d neue Gruppe wurde erstellt."
msgstr[1] "%d neue Gruppen wurden erstellt."
#: motion/views.py:693
#, python-format
msgid "%d group assigned to motions."
msgid_plural "%d groups assigned to motions."
msgstr[0] "%d Gruppe wurde zugewiesen."
msgstr[1] "%d Gruppen wurden zugewiesen."
#: motion/views.py:697 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:661 participant/api.py:94 #: motion/views.py:699 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:665 #: motion/views.py:703
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."
@ -1375,7 +1408,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:666 #: motion/views.py:704
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."
@ -1383,7 +1416,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:699 motion/views.py:837 #: motion/views.py:737 motion/views.py:875
#: 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
@ -1393,21 +1426,21 @@ msgstr ""
msgid "Motion" msgid "Motion"
msgstr "Antrag" msgstr "Antrag"
#: motion/views.py:713 motion/templates/motion/overview.html:84 #: motion/views.py:751 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:718 motion/views.py:720 motion/views.py:735 #: motion/views.py:756 motion/views.py:758 motion/views.py:773
#: motion/views.py:737 motion/templates/motion/base_motion.html:24 #: motion/views.py:775 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:752 #: motion/views.py:790
msgid "Signature" msgid "Signature"
msgstr "Unterschrift" msgstr "Unterschrift"
#: motion/views.py:803 motion/templates/motion/base_motion.html:55 #: motion/views.py:841 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
@ -1415,21 +1448,21 @@ msgstr "Unterschrift"
msgid "Vote" msgid "Vote"
msgstr "Abstimmung" msgstr "Abstimmung"
#: motion/views.py:837 #: motion/views.py:875
msgid "Poll" msgid "Poll"
msgstr "Abstimmung" msgstr "Abstimmung"
#: motion/views.py:851 #: motion/views.py:889
#, python-format #, python-format
msgid "Motion No. %s" msgid "Motion No. %s"
msgstr "Antrag Nr. %s" msgstr "Antrag Nr. %s"
#: motion/views.py:853 #: motion/views.py:891
#, python-format #, python-format
msgid "%d. Vote" msgid "%d. Vote"
msgstr "%d. Abstimmung" msgstr "%d. Abstimmung"
#: motion/views.py:910 #: motion/views.py:948
msgid "Motion settings successfully saved." msgid "Motion settings successfully saved."
msgstr "Antrags-Einstellungen wurden erfolgreich gespeichert." msgstr "Antrags-Einstellungen wurden erfolgreich gespeichert."
@ -1486,12 +1519,13 @@ msgstr "Wählen Sie eine CSV-Datei zum Importieren von Anträgen aus!"
#: motion/templates/motion/import.html:11 #: motion/templates/motion/import.html:11
msgid "" msgid ""
"Required comma separated values: <code>{number, title, text, reason, " "Required comma separated values: <code>{number, title, text, reason, "
"first_name, last_name}</code> (<code>number</code> and <code>reason</code> " "first_name, last_name, is_group}</code> (<code>number</code>, <code>reason</"
"are optional and may be empty)" "code> and <code>is_group</code> are optional and may be empty)"
msgstr "" msgstr ""
"Erforderliche kommaseparierte Werte: <code>{Nummer, Titel, Text, Begründung, " "Erforderliche kommaseparierte Werte: <code>{Nummer, Titel, Text, Begründung, "
"Vorname, Nachname}</code> (<code>Nummer</code> und <code>Begründung</code> " "Vorname, Nachname, Gruppenantrag}</code> (<code>Nummer</code>, "
"sind optional und können auch leer sein)" "<code>Begründung</code> und <code>Gruppenantrag</code> sind optional und "
"können auch leer sein)"
#: motion/templates/motion/import.html:13 #: motion/templates/motion/import.html:13
#: participant/templates/participant/import.html:13 #: participant/templates/participant/import.html:13
@ -2021,10 +2055,12 @@ msgid "Reset to First Password"
msgstr "Auf Erst-Passwort zurücksetzen" msgstr "Auf Erst-Passwort zurücksetzen"
#: participant/templates/participant/group_detail.html:14 #: participant/templates/participant/group_detail.html:14
#: participant/templates/projector/GroupSlide.html:13
msgid "Members" msgid "Members"
msgstr "Mitglieder" msgstr "Mitglieder"
#: participant/templates/participant/group_detail.html:19 #: participant/templates/participant/group_detail.html:19
#: participant/templates/projector/GroupSlide.html:22
msgid "No members available." msgid "No members available."
msgstr "Keine Mitglieder vorhanden." msgstr "Keine Mitglieder vorhanden."
@ -2354,6 +2390,11 @@ msgstr "undefinierter-dateiname"
msgid "Enter valid JSON" msgid "Enter valid JSON"
msgstr "Gebe valides JSON ein" msgstr "Gebe valides JSON ein"
#~ msgid "Ignoring line %d because the assigned group does not exist."
#~ msgstr ""
#~ "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert da die verwendete "
#~ "Gruppe nicht existiert."
#~ msgid "posts" #~ msgid "posts"
#~ msgstr "Posten" #~ msgstr "Posten"

View File

@ -28,6 +28,8 @@ from openslides.config.signals import default_config_value
from openslides.poll.models import (BaseOption, BasePoll, CountVotesCast, from openslides.poll.models import (BaseOption, BasePoll, CountVotesCast,
CountInvalid, BaseVote) CountInvalid, BaseVote)
from openslides.participant.models import User, Group
from openslides.projector.api import register_slidemodel from openslides.projector.api import register_slidemodel
from openslides.projector.models import SlideMixin from openslides.projector.models import SlideMixin
@ -443,7 +445,10 @@ class Motion(models.Model, SlideMixin):
self.log = "" self.log = ""
self.log += u"%s | %s" % (datetime.now().strftime("%d.%m.%Y %H:%M:%S"), _propper_unicode(text)) self.log += u"%s | %s" % (datetime.now().strftime("%d.%m.%Y %H:%M:%S"), _propper_unicode(text))
if user is not None: if user is not None:
self.log += u" (%s %s)" % (_("by"), _propper_unicode(user.username)) if isinstance(user, User):
self.log += u" (%s %s)" % (_("by"), _propper_unicode(user.username))
else:
self.log += u" (%s %s)" % (_("by"), _propper_unicode(str(user)))
self.log += "\n" self.log += "\n"
self.save() self.save()

View File

@ -8,7 +8,7 @@
<h1>{% trans "Import motions" %}</h1> <h1>{% trans "Import motions" %}</h1>
<p>{% trans 'Select a CSV file to import motions!' %}</p> <p>{% trans 'Select a CSV file to import motions!' %}</p>
<p>{% trans 'Required comma separated values: <code>{number, title, text, reason, first_name, last_name}</code> (<code>number</code> and <code>reason</code> are optional and may be empty)' %} <p>{% trans 'Required comma separated values: <code>{number, title, text, reason, first_name, last_name, is_group}</code> (<code>number</code>, <code>reason</code> and <code>is_group</code> are optional and may be empty)' %}
<br> <br>
{% trans 'Required CSV file encoding: UTF-8 (Unicode).' %} {% trans 'Required CSV file encoding: UTF-8 (Unicode).' %}
</p> </p>

View File

@ -52,7 +52,7 @@ from openslides.projector.projector import Widget
from openslides.poll.views import PollFormView from openslides.poll.views import PollFormView
from openslides.participant.api import gen_username, gen_password from openslides.participant.api import gen_username, gen_password
from openslides.participant.models import User from openslides.participant.models import User, Group
from openslides.agenda.models import Item from openslides.agenda.models import Item
@ -579,6 +579,8 @@ def motion_import(request):
users_generated = 0 users_generated = 0
motions_generated = 0 motions_generated = 0
motions_modified = 0 motions_modified = 0
groups_assigned = 0
groups_generated = 0
with transaction.commit_on_success(): with transaction.commit_on_success():
dialect = csv.Sniffer().sniff(request.FILES['csvfile'].readline()) dialect = csv.Sniffer().sniff(request.FILES['csvfile'].readline())
dialect = csv_ext.patchup(dialect) dialect = csv_ext.patchup(dialect)
@ -588,7 +590,11 @@ def motion_import(request):
if lno < 1: if lno < 1:
continue continue
try: try:
(number, title, text, reason, first_name, last_name) = line[:6] (number, title, text, reason, first_name, last_name, is_group) = line[:7]
if is_group.strip().lower() in ['y', 'j', 't', 'yes', 'ja', 'true', '1', 1]:
is_group = True
else:
is_group = False
except ValueError: except ValueError:
messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1))
continue continue
@ -605,24 +611,50 @@ def motion_import(request):
except ValueError: except ValueError:
messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1))
continue continue
# fetch existing users or create new users as needed
try: if is_group:
user = User.objects.get(first_name=first_name, last_name=last_name) # fetch existing groups or issue an error message
except User.DoesNotExist: try:
user = None user = Group.objects.get(name=last_name)
if user is None: if user.group_as_person == False:
user = User() messages.error(request, _('Ignoring line %d because the assigned group may not act as a person.') % (lno + 1))
user.last_name = last_name continue
user.first_name = first_name else:
user.username = gen_username(first_name, last_name) user = get_person(user.person_id)
user.structure_level = ''
user.committee = '' groups_assigned += 1
user.gender = '' except Group.DoesNotExist:
user.type = '' group = Group()
user.default_password = gen_password() group.group_as_person = True
user.save() group.description = _('Created by motion import.')
user.reset_password() group.name = last_name
users_generated += 1 group.save()
groups_generated += 1
user = get_person(group.person_id)
else:
# fetch existing users or create new users as needed
try:
user = User.objects.get(first_name=first_name, last_name=last_name)
except User.DoesNotExist:
user = None
if user is None:
if not first_name or not last_name:
messages.error(request, _('Ignoring line %d because it contains an incomplete first / last name pair.') % (lno + 1))
continue
user = User()
user.last_name = last_name
user.first_name = first_name
user.username = gen_username(first_name, last_name)
user.structure_level = ''
user.committee = ''
user.gender = ''
user.type = ''
user.default_password = gen_password()
user.save()
user.reset_password()
users_generated += 1
# create / modify the motion # create / modify the motion
motion = None motion = None
if number: if number:
@ -653,6 +685,12 @@ def motion_import(request):
'%d motions were successfully modified.', motions_modified) % motions_modified) '%d motions were successfully modified.', motions_modified) % motions_modified)
if users_generated: if users_generated:
messages.success(request, ungettext('%d new user was added.', '%d new users were added.', users_generated) % users_generated) messages.success(request, ungettext('%d new user was added.', '%d new users were added.', users_generated) % users_generated)
if groups_generated:
messages.success(request, ungettext('%d new group was added.', '%d new groups were added.', groups_generated) % groups_generated)
if groups_assigned:
messages.success(request, ungettext('%d group assigned to motions.', '%d groups assigned to motions.', groups_assigned) % groups_assigned)
return redirect(reverse('motion_overview')) return redirect(reverse('motion_overview'))
except csv.Error: except csv.Error: