From 36f83808fdb072a966f03fe40bdc2c24892419b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=CC=81=20Ko=CC=88cher?= Date: Wed, 21 Nov 2012 23:38:25 +0100 Subject: [PATCH] Implement #419: Add group column for motion csv import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The motion import now features an additional column to indicate that the import should be created by an existing group. If the column is missing it is considered as 'off' and first / last name are used as always. If the column exists and contains 'y','yes','j','ja','true', '1' or 1 first name will be ignored and last name will be interpreted as a group name. If the group exists and can act as a person the motion will be imported and assigned to this group. Signed-off-by: René Köcher --- openslides/locale/de/LC_MESSAGES/django.mo | Bin 35641 -> 36410 bytes openslides/locale/de/LC_MESSAGES/django.po | 294 ++++++++++-------- openslides/motion/models.py | 7 +- .../motion/templates/motion/import.html | 2 +- openslides/motion/views.py | 69 ++-- 5 files changed, 216 insertions(+), 156 deletions(-) diff --git a/openslides/locale/de/LC_MESSAGES/django.mo b/openslides/locale/de/LC_MESSAGES/django.mo index e7684f7a10f08fe2740c3700eb8c1d8527308b60..80230a43128f2b06af7f6844a41530dfd572e0e3 100644 GIT binary patch delta 11085 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 delta 10392 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 diff --git a/openslides/locale/de/LC_MESSAGES/django.po b/openslides/locale/de/LC_MESSAGES/django.po index 4dfa4ce39..e024ae92c 100644 --- a/openslides/locale/de/LC_MESSAGES/django.po +++ b/openslides/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: OpenSlides 1.x\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-11-20 12:34+0100\n" +"POT-Creation-Date: 2012-11-21 23:23+0100\n" "PO-Revision-Date: 2012-07-28 11:07+0200\n" "Last-Translator: Emanuel Schuetze \n" "Language-Team: support@openslides.de\n" @@ -34,12 +34,12 @@ msgid "Parent item" msgstr "Elternelement" #: 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 msgid "Title" 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 msgid "Text" msgstr "Text" @@ -226,22 +226,22 @@ msgstr "Zusammenfassung für diesen Eintrag projizieren" msgid "Do you want to save the changed order of agenda items?" msgstr "Möchten Sie die geänderte Reihenfolge der Einträge speichern?" -#: agenda/templates/agenda/overview.html:46 assignment/models.py:302 -#: assignment/views.py:577 assignment/templates/assignment/view.html:168 +#: agenda/templates/agenda/overview.html:46 assignment/models.py:301 +#: assignment/views.py:579 assignment/templates/assignment/view.html:168 #: assignment/templates/assignment/view.html:172 #: assignment/templates/projector/Assignment.html:78 -#: assignment/templates/projector/Assignment.html:82 motion/models.py:574 -#: motion/views.py:804 motion/views.py:855 +#: assignment/templates/projector/Assignment.html:82 motion/models.py:579 +#: motion/views.py:833 motion/views.py:884 #: motion/templates/motion/view.html:79 #: motion/templates/projector/Motion.html:37 utils/utils.py:53 #: utils/views.py:111 msgid "Yes" msgstr "Ja" -#: agenda/templates/agenda/overview.html:47 assignment/models.py:302 -#: assignment/views.py:578 assignment/templates/assignment/view.html:169 -#: assignment/templates/projector/Assignment.html:79 motion/models.py:574 -#: motion/views.py:804 motion/views.py:856 +#: agenda/templates/agenda/overview.html:47 assignment/models.py:301 +#: assignment/views.py:580 assignment/templates/assignment/view.html:169 +#: assignment/templates/projector/Assignment.html:79 motion/models.py:579 +#: motion/views.py:833 motion/views.py:885 #: motion/templates/motion/view.html:80 #: motion/templates/projector/Motion.html:38 utils/utils.py:53 #: utils/views.py:111 @@ -318,7 +318,7 @@ msgstr "Löschen" msgid "Edit" msgstr "Bearbeiten" -#: assignment/forms.py:24 assignment/models.py:57 assignment/views.py:383 +#: assignment/forms.py:24 assignment/models.py:57 assignment/views.py:385 #: assignment/templates/assignment/view.html:13 #: assignment/templates/projector/Assignment.html:21 msgid "Number of available posts" @@ -396,7 +396,7 @@ msgstr "Abgeschlossen" msgid "Name" msgstr "Name" -#: assignment/models.py:55 participant/models.py:133 +#: assignment/models.py:55 participant/models.py:134 msgid "Description" msgstr "Beschreibung" @@ -404,7 +404,7 @@ msgstr "Beschreibung" msgid "Comment on the ballot paper" msgstr "Kommentar für den Stimmzettel" -#: assignment/models.py:69 motion/models.py:335 +#: assignment/models.py:69 motion/models.py:337 #, python-format msgid "%s is not a valid status." msgstr "%s ist kein gültiger Status." @@ -419,7 +419,7 @@ msgstr "Der Wahlstatus ist bereits %s." msgid "%s is already a candidate." msgstr "%s ist bereits ein/e Kandidat/in." -#: assignment/models.py:87 assignment/views.py:200 +#: assignment/models.py:87 assignment/views.py:202 msgid "The candidate list is already closed." msgstr "Die Kandidatenliste ist bereits geschlossen." @@ -428,42 +428,42 @@ msgstr "Die Kandidatenliste ist bereits geschlossen." msgid "%s does not want to be a candidate." msgstr "%s möchte nicht kandidieren." -#: assignment/models.py:109 +#: assignment/models.py:108 #, python-format msgid "%s is no candidate" msgstr "%s ist kein/e Kandidat/in" -#: assignment/models.py:255 +#: assignment/models.py:254 msgid "Can see assignment" msgstr "Darf Wahlen sehen" -#: assignment/models.py:257 +#: assignment/models.py:256 msgid "Can nominate another person" msgstr "Darf andere Personen für Wahlen vorschlagen" -#: assignment/models.py:258 +#: assignment/models.py:257 msgid "Can nominate themselves" msgstr "Darf selbst für Wahlen kandidieren" -#: assignment/models.py:259 +#: assignment/models.py:258 msgid "Can manage assignment" msgstr "Darf Wahlen verwalten" -#: assignment/models.py:303 motion/models.py:575 +#: assignment/models.py:302 motion/models.py:580 msgid "Abstain" msgstr "Enthaltung" -#: assignment/models.py:305 motion/templates/motion/poll_view.html:22 +#: assignment/models.py:304 motion/templates/motion/poll_view.html:22 msgid "Votes" msgstr "Stimmen" -#: assignment/models.py:322 +#: assignment/models.py:321 #, python-format msgid "Ballot %d" msgstr "Wahlgang %d" -#: assignment/models.py:331 assignment/views.py:340 assignment/views.py:664 -#: assignment/views.py:678 +#: assignment/models.py:330 assignment/views.py:342 assignment/views.py:666 +#: assignment/views.py:680 #: assignment/templates/assignment/base_assignment.html:14 #: assignment/templates/assignment/overview.html:6 #: assignment/templates/assignment/overview.html:9 @@ -483,7 +483,7 @@ msgstr "Neue Wahl wurde erfolgreich angelegt." msgid "Election was successfully modified." 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:692 #: participant/views.py:506 participant/views.py:529 utils/views.py:225 #: utils/views.py:243 utils/views.py:267 msgid "Please check the form for errors." @@ -499,11 +499,11 @@ msgstr "Wahl %s wurde erfolgreich gelöscht." msgid "Election status was set to: %s." msgstr "Wahlstatus wurde gesetzt auf: %s." -#: assignment/views.py:181 +#: assignment/views.py:183 msgid "You have set your candidature successfully." msgstr "Sie haben Ihre Kandidatur erfolgreich gesetzt." -#: assignment/views.py:197 +#: assignment/views.py:199 msgid "" "You have withdrawn your candidature successfully. You can not be nominated " "by other participants anymore." @@ -511,71 +511,71 @@ msgstr "" "Sie haben Ihre Kandidatur erfolgreich zurückgezogen. Sie können nun von " "anderen Teilnehmer/innen nicht mehr vorgeschlagen werden." -#: assignment/views.py:218 +#: assignment/views.py:220 #, python-format msgid "Candidate %s was withdrawn successfully." msgstr "Die Kandidatur von %s wurde erfolgreich zurückgezogen." -#: assignment/views.py:220 +#: assignment/views.py:222 #, python-format msgid "%s was unblocked successfully." msgstr "%s wurde erfolgreich freigegeben." -#: assignment/views.py:224 +#: assignment/views.py:226 #, python-format msgid "Do you really want to withdraw %s from the election?" msgstr "Soll %s wirklich von der Wahl zurückgezogen werden?" -#: assignment/views.py:226 +#: assignment/views.py:228 #, python-format msgid "Do you really want to unblock %s for the election?" msgstr "Soll %s wirklich für die Wahl freigegeben werden?" -#: assignment/views.py:241 +#: assignment/views.py:243 msgid "New ballot was successfully created." msgstr "Neuer Wahlgang erfolgreich angelegt." -#: assignment/views.py:273 +#: assignment/views.py:275 #, python-format msgid "Ballot ID %d does not exist." msgstr "Wahlgang-ID %d existiert nicht." -#: assignment/views.py:280 +#: assignment/views.py:282 msgid "Ballot successfully published." msgstr "Wahlgang wurde erfolgreich veröffentlicht." -#: assignment/views.py:282 +#: assignment/views.py:284 msgid "Ballot successfully unpublished." msgstr "Wahlgang wurde erfolgreich unveröffentlicht." -#: assignment/views.py:295 +#: assignment/views.py:297 msgid "not elected" msgstr "nicht gewählt" -#: assignment/views.py:298 assignment/views.py:481 +#: assignment/views.py:300 assignment/views.py:483 #: assignment/templates/assignment/view.html:48 msgid "elected" msgstr "gewählt" -#: assignment/views.py:326 +#: assignment/views.py:328 msgid "Ballot was successfully deleted." msgstr "Abstimmung wurde erfolgreich gelöscht." -#: assignment/views.py:337 +#: assignment/views.py:339 msgid "Assignment" msgstr "Wahl" -#: assignment/views.py:358 assignment/templates/assignment/overview.html:59 +#: assignment/views.py:360 assignment/templates/assignment/overview.html:59 #: assignment/templates/assignment/widget.html:23 msgid "No assignments available." msgstr "Keine Wahlen vorhanden." -#: assignment/views.py:377 +#: assignment/views.py:379 #, python-format msgid "Election: %s" msgstr "Wahlen: %s" -#: assignment/views.py:389 assignment/views.py:422 +#: assignment/views.py:391 assignment/views.py:424 #: assignment/templates/assignment/overview.html:26 #: assignment/templates/assignment/poll_view.html:18 #: assignment/templates/assignment/view.html:37 @@ -585,12 +585,12 @@ msgstr "Wahlen: %s" msgid "Candidates" msgstr "Kandidaten/innen" -#: assignment/views.py:410 motion/views.py:797 +#: assignment/views.py:412 motion/views.py:826 #: motion/templates/motion/view.html:44 msgid "Vote results" msgstr "Abstimmungsergebnis" -#: assignment/views.py:414 +#: assignment/views.py:416 #: assignment/templates/assignment/base_assignment.html:71 #: assignment/templates/assignment/poll_view.html:5 #: assignment/templates/assignment/poll_view.html:8 @@ -599,11 +599,11 @@ msgstr "Abstimmungsergebnis" msgid "ballot" msgstr "Wahlgang" -#: assignment/views.py:417 +#: assignment/views.py:419 msgid "ballots" msgstr "Wahlgänge" -#: assignment/views.py:443 +#: assignment/views.py:445 #, python-format msgid "" "Y: %(YES)s\n" @@ -614,25 +614,25 @@ msgstr "" "N: %(NO)s\n" "E: %(ABSTAIN)s" -#: assignment/views.py:454 assignment/templates/assignment/poll_view.html:35 +#: assignment/views.py:456 assignment/templates/assignment/poll_view.html:35 #: assignment/templates/assignment/view.html:186 #: assignment/templates/projector/Assignment.html:96 #: motion/templates/motion/poll_view.html:31 msgid "Invalid votes" msgstr "Ungültige Stimmen" -#: assignment/views.py:461 assignment/templates/assignment/poll_view.html:45 +#: assignment/views.py:463 assignment/templates/assignment/poll_view.html:45 #: assignment/templates/assignment/view.html:202 #: assignment/templates/assignment/view.html:207 #: 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:833 #: motion/templates/motion/poll_view.html:35 #: motion/templates/motion/view.html:84 #: motion/templates/projector/Motion.html:42 poll/models.py:76 msgid "Votes cast" msgstr "Abgegebene Stimmen" -#: assignment/views.py:520 assignment/views.py:536 +#: assignment/views.py:522 assignment/views.py:538 #: assignment/templates/assignment/overview.html:25 #: assignment/templates/assignment/poll_view.html:5 #: assignment/templates/assignment/view.html:6 @@ -640,33 +640,33 @@ msgstr "Abgegebene Stimmen" msgid "Election" msgstr "Wahl" -#: assignment/views.py:542 +#: assignment/views.py:544 #, python-format msgid "%d. ballot" msgstr "%d. Wahlgang" -#: assignment/views.py:543 +#: assignment/views.py:545 #, python-format msgid "%d candidate" msgid_plural "%d candidates" msgstr[0] "%d Kandidat/in" msgstr[1] "%d Kandidaten/innen" -#: assignment/views.py:545 +#: assignment/views.py:547 #, python-format msgid "%d available post" msgid_plural "%d available posts" msgstr[0] "%d verfügbare Posten" msgstr[1] "%d verfügbare Posten" -#: assignment/views.py:578 assignment/templates/assignment/view.html:170 -#: assignment/templates/projector/Assignment.html:80 motion/views.py:804 -#: motion/views.py:857 motion/templates/motion/view.html:81 +#: assignment/views.py:580 assignment/templates/assignment/view.html:170 +#: assignment/templates/projector/Assignment.html:80 motion/views.py:833 +#: motion/views.py:886 motion/templates/motion/view.html:81 #: motion/templates/projector/Motion.html:39 msgid "Abstention" msgstr "Enthaltung" -#: assignment/views.py:657 +#: assignment/views.py:659 msgid "Election settings successfully saved." msgstr "Wahl-Einstellungen wurden erfolgreich gespeichert." @@ -722,7 +722,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:775 +#: assignment/templates/projector/Assignment.html:18 motion/views.py:804 #: motion/templates/motion/overview.html:20 #: motion/templates/motion/overview.html:40 #: motion/templates/motion/view.html:34 @@ -844,7 +844,7 @@ msgid "was not a
candidate" msgstr "war kein Kandidat" #: 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:833 #: motion/templates/motion/view.html:82 #: motion/templates/projector/Motion.html:40 msgid "Invalid" @@ -904,7 +904,7 @@ msgstr "Allgemein" #: config/models.py:127 config/templates/config/version.html:5 #: 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:818 #: motion/templates/motion/view.html:214 motion/templates/motion/view.html:244 msgid "Version" msgstr "Version" @@ -942,7 +942,7 @@ msgstr "Willkommens-Widget" msgid "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:852 #: motion/templates/motion/view.html:229 motion/templates/motion/view.html:249 #: motion/templates/projector/Motion.html:77 msgid "Reason" @@ -956,14 +956,14 @@ msgstr "Triviale Änderung" msgid "Trivial changes don't create a new 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:771 #: motion/templates/motion/overview.html:41 #: motion/templates/motion/view.html:18 #: motion/templates/projector/Motion.html:55 msgid "Submitter" msgstr "Antragsteller/in" -#: motion/forms.py:44 motion/views.py:762 motion/templates/motion/view.html:22 +#: motion/forms.py:44 motion/views.py:791 motion/templates/motion/view.html:22 msgid "Supporters" msgstr "Unterstützer/innen" @@ -1008,74 +1008,74 @@ msgid "Warning: Trivial changes undermine the motions autorisation system." msgstr "" "Warnung: Triviale Änderungen unterlaufen das Zulassungssystem von Anträgen." -#: motion/models.py:45 +#: motion/models.py:47 msgid "Published" msgstr "Veröffentlicht" -#: motion/models.py:46 +#: motion/models.py:48 msgid "Permitted" 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 msgid "Accepted" 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 msgid "Rejected" msgstr "Abgelehnt" -#: motion/models.py:49 +#: motion/models.py:51 msgid "Withdrawed" 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" msgstr "Vertagt" # 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" msgstr "Nicht befasst" # 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" msgstr "Verwiesen (in Ausschuss)" -#: motion/models.py:53 +#: motion/models.py:55 msgid "Rejected (not authorized)" 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" msgstr "Benötigt Review" -#: motion/models.py:103 +#: motion/models.py:105 #, python-format msgid "Version %d authorized" msgstr "Version %d zugelassen" -#: motion/models.py:110 +#: motion/models.py:112 #, python-format msgctxt "Rejected means not authorized" msgid "Version %d rejected" -msgstr "Version verworfen" +msgstr "Version %d verworfen" -#: motion/models.py:139 +#: motion/models.py:141 msgid "Searching for supporters." msgstr "Auf Unterstützersuche." -#: motion/models.py:141 +#: motion/models.py:143 msgid "Not yet authorized." msgstr "Noch nicht zugelassen." -#: motion/models.py:143 +#: motion/models.py:145 msgid "Not yet authorized changes." msgstr "Noch nicht zugelassene Änderungen." -#: motion/models.py:223 +#: motion/models.py:225 #, python-format msgid "" "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: " "%(changed_fields)s" -#: motion/models.py:234 +#: motion/models.py:236 #, python-format msgid "Version %s created" msgstr "Version %s erstellt" -#: motion/models.py:244 +#: motion/models.py:246 msgid "Supporters removed" msgstr "Unterstützer/innen gelöscht" -#: motion/models.py:253 +#: motion/models.py:255 #, python-format msgid "Status reseted to: %s" msgstr "Status zurückgesetzt auf: %s" -#: motion/models.py:265 +#: motion/models.py:267 #, python-format msgid "Supporter: +%s" msgstr "Unterstützer/in: +%s" -#: motion/models.py:278 +#: motion/models.py:280 #, python-format msgid "Supporter: -%s" msgstr "Unterstützer/in: -%s" -#: motion/models.py:295 +#: motion/models.py:297 #, python-format msgid "Number set: %s" msgstr "Nummer gesetzt: %s" -#: motion/models.py:308 +#: motion/models.py:310 #, python-format msgid "Version %s authorized" msgstr "Version %s zugelassen" -#: motion/models.py:322 +#: motion/models.py:324 #, python-format msgid "Version %s not authorized" msgstr "Version %s nicht zugelassen" -#: motion/models.py:338 +#: motion/models.py:340 #, python-format msgid "The motion status is already '%s.'" msgstr "Der Antragsstatus ist bereits '%s'." -#: motion/models.py:346 +#: motion/models.py:348 #, python-format msgid "" "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 " "'%(newstatus)s' setzen." -#: motion/models.py:354 +#: motion/models.py:356 msgid "Status modified" msgstr "Status geändert" -#: motion/models.py:446 +#: motion/models.py:449 motion/models.py:451 msgid "by" 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/projector/Motion.html:65 #: participant/templates/participant/personal_info_widget.html:13 @@ -1152,38 +1152,38 @@ msgstr "von" msgid "no number" 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:28 msgid "motion" msgstr "Antrag" -#: motion/models.py:480 +#: motion/models.py:485 msgid "Poll created" msgstr "Abstimmung erstellt" -#: motion/models.py:531 +#: motion/models.py:536 msgid "Can see motions" msgstr "Darf Anträge sehen" -#: motion/models.py:532 +#: motion/models.py:537 msgid "Can create motions" msgstr "Darf Anträge erstellen" -#: motion/models.py:533 +#: motion/models.py:538 msgid "Can support motions" msgstr "Darf Anträge unterstützen" -#: motion/models.py:534 +#: motion/models.py:539 msgid "Can manage motions" msgstr "Darf Anträge verwalten" -#: motion/models.py:601 +#: motion/models.py:606 msgid "The assembly may decide," msgstr "Die Versammlung möge beschließen," -#: motion/models.py:604 motion/views.py:692 motion/views.py:917 -#: motion/views.py:928 motion/templates/motion/base_motion.html:9 +#: motion/models.py:609 motion/views.py:721 motion/views.py:946 +#: motion/views.py:957 motion/templates/motion/base_motion.html:9 #: motion/templates/motion/overview.html:7 #: motion/templates/motion/overview.html:10 msgid "Motions" @@ -1330,44 +1330,73 @@ msgstr "FEHLER beim Zurückweisen der Version." msgid "Do you really want to reject version %s?" msgstr "Soll Version %s wirklich zurückgewiesen werden?" -#: motion/views.py:593 motion/views.py:597 motion/views.py:603 -#: motion/views.py:606 participant/api.py:76 +#: motion/views.py:600 motion/views.py:604 motion/views.py:610 +#: motion/views.py:613 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:649 +#: motion/views.py:621 +#, 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:628 +#, python-format +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." + +#: motion/views.py:638 +#, 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:676 #, 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:652 +#: motion/views.py:679 #, 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:655 +#: motion/views.py:682 #, 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:659 participant/api.py:92 +#: motion/views.py:684 +#, 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:688 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:661 participant/api.py:94 +#: motion/views.py:690 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:665 +#: motion/views.py:694 msgid "" "Attention: Existing motions will be modified if you import new motions with " "the same number." @@ -1375,7 +1404,7 @@ msgstr "" "Achtung: Existierende Anträge werden geändert wenn Sie neue Anträge mit " "identischer Nummer importieren." -#: motion/views.py:666 +#: motion/views.py:695 msgid "" "Attention: Importing an motions without a number multiple times will create " "duplicates." @@ -1383,7 +1412,7 @@ msgstr "" "Achtung: Bei mehrfachem Import eines Antrags ohne Nummer können Duplikate " "entstehen." -#: motion/views.py:699 motion/views.py:837 +#: motion/views.py:728 motion/views.py:866 #: 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 @@ -1393,21 +1422,21 @@ msgstr "" msgid "Motion" msgstr "Antrag" -#: motion/views.py:713 motion/templates/motion/overview.html:84 +#: motion/views.py:742 motion/templates/motion/overview.html:84 msgid "No motions available." msgstr "Keine Anträge vorhanden." -#: motion/views.py:718 motion/views.py:720 motion/views.py:735 -#: motion/views.py:737 motion/templates/motion/base_motion.html:24 +#: motion/views.py:747 motion/views.py:749 motion/views.py:764 +#: motion/views.py:766 motion/templates/motion/base_motion.html:24 #: motion/templates/projector/Motion.html:63 msgid "Motion No." msgstr "Antrag Nr." -#: motion/views.py:752 +#: motion/views.py:781 msgid "Signature" msgstr "Unterschrift" -#: motion/views.py:803 motion/templates/motion/base_motion.html:55 +#: motion/views.py:832 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 @@ -1415,21 +1444,21 @@ msgstr "Unterschrift" msgid "Vote" msgstr "Abstimmung" -#: motion/views.py:837 +#: motion/views.py:866 msgid "Poll" msgstr "Abstimmung" -#: motion/views.py:851 +#: motion/views.py:880 #, python-format msgid "Motion No. %s" msgstr "Antrag Nr. %s" -#: motion/views.py:853 +#: motion/views.py:882 #, python-format msgid "%d. Vote" msgstr "%d. Abstimmung" -#: motion/views.py:910 +#: motion/views.py:939 msgid "Motion settings successfully saved." msgstr "Antrags-Einstellungen wurden erfolgreich gespeichert." @@ -1486,12 +1515,12 @@ msgstr "Wählen Sie eine CSV-Datei zum Importieren von Anträgen aus!" #: motion/templates/motion/import.html:11 msgid "" "Required comma separated values: {number, title, text, reason, " -"first_name, last_name} (number and reason " -"are optional and may be empty)" +"first_name, last_name, is_group} (number, reason and is_group are optional and may be empty)" msgstr "" "Erforderliche kommaseparierte Werte: {Nummer, Titel, Text, Begründung, " -"Vorname, Nachname} (Nummer und Begründung " -"sind optional und können auch leer sein)" +"Vorname, Nachname, Gruppenantrag} (Nummer, Begründung " +" und Gruppenantrag sind optional und können auch leer sein)" #: motion/templates/motion/import.html:13 #: participant/templates/participant/import.html:13 @@ -1701,7 +1730,6 @@ msgstr "Teilnehmer" #: participant/templates/participant/group_overview.html:7 #: participant/templates/participant/group_overview.html:10 #: participant/templates/participant/user_detail.html:14 -#: participant/templates/projector/UserSlide.html:12 msgid "Groups" msgstr "Gruppen" @@ -1777,7 +1805,6 @@ msgstr "Wird nach dem Namen angezeigt." #: participant/models.py:48 participant/templates/participant/overview.html:24 #: participant/templates/participant/user_detail.html:24 -#: participant/templates/projector/UserSlide.html:20 msgid "Gender" msgstr "Geschlecht" @@ -1793,7 +1820,6 @@ msgstr "Typ" #: participant/templates/participant/overview.html:45 #: participant/templates/participant/overview.html:70 #: participant/templates/participant/user_detail.html:34 -#: participant/templates/projector/UserSlide.html:28 msgid "Committee" msgstr "Amt" @@ -1822,15 +1848,15 @@ msgstr "Darf die Teilnehmer/inen sehen" msgid "Can manage participant" msgstr "Darf die Teilnehmer/inen verwalten" -#: participant/models.py:132 +#: participant/models.py:133 msgid "Use this group as participant" msgstr "Verwende diese Gruppe als Teilnehmer/in" -#: participant/models.py:132 +#: participant/models.py:133 msgid "For example as submitter of a motion." msgstr "Zum Beispiel als Antragsteller." -#: participant/models.py:214 +#: participant/models.py:225 msgid "Welcome to OpenSlides!" msgstr "Willkommen bei OpenSlides!" @@ -1874,7 +1900,6 @@ msgstr "Gruppe" #: participant/views.py:258 participant/templates/participant/overview.html:37 #: participant/templates/participant/overview.html:69 #: participant/templates/participant/user_detail.html:29 -#: participant/templates/projector/UserSlide.html:24 msgid "Type" msgstr "Typ" @@ -2025,10 +2050,12 @@ msgid "Reset to First Password" msgstr "Auf Erst-Passwort zurücksetzen" #: participant/templates/participant/group_detail.html:14 +#: participant/templates/projector/GroupSlide.html:13 msgid "Members" msgstr "Mitglieder" #: participant/templates/participant/group_detail.html:19 +#: participant/templates/projector/GroupSlide.html:22 msgid "No members available." msgstr "Keine Mitglieder vorhanden." @@ -2150,7 +2177,6 @@ msgid "I am candidate for the following elections:" msgstr "Ich bin Kandidat/in bei folgenden Wahlen:" #: participant/templates/participant/user_detail.html:19 -#: participant/templates/projector/UserSlide.html:16 msgid "The participant is not member of any group." msgstr "Teilnehmer/in ist kein Mitglied einer Gruppe." diff --git a/openslides/motion/models.py b/openslides/motion/models.py index 71a6aa80f..c29133ebf 100644 --- a/openslides/motion/models.py +++ b/openslides/motion/models.py @@ -28,6 +28,8 @@ from openslides.config.signals import default_config_value from openslides.poll.models import (BaseOption, BasePoll, CountVotesCast, CountInvalid, BaseVote) +from openslides.participant.models import User, Group + from openslides.projector.api import register_slidemodel from openslides.projector.models import SlideMixin @@ -443,7 +445,10 @@ class Motion(models.Model, SlideMixin): self.log = "" self.log += u"%s | %s" % (datetime.now().strftime("%d.%m.%Y %H:%M:%S"), _propper_unicode(text)) 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.save() diff --git a/openslides/motion/templates/motion/import.html b/openslides/motion/templates/motion/import.html index 828f9a00e..aa36852a7 100644 --- a/openslides/motion/templates/motion/import.html +++ b/openslides/motion/templates/motion/import.html @@ -8,7 +8,7 @@

{% trans "Import motions" %}

{% trans 'Select a CSV file to import motions!' %}

-

{% trans 'Required comma separated values: {number, title, text, reason, first_name, last_name} (number and reason are optional and may be empty)' %} +

{% trans 'Required comma separated values: {number, title, text, reason, first_name, last_name, is_group} (number, reason and is_group are optional and may be empty)' %}
{% trans 'Required CSV file encoding: UTF-8 (Unicode).' %}

diff --git a/openslides/motion/views.py b/openslides/motion/views.py index c575b6ad2..2b0b92467 100644 --- a/openslides/motion/views.py +++ b/openslides/motion/views.py @@ -52,7 +52,7 @@ from openslides.projector.projector import Widget from openslides.poll.views import PollFormView 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 @@ -579,6 +579,7 @@ def motion_import(request): users_generated = 0 motions_generated = 0 motions_modified = 0 + groups_assigned = 0 with transaction.commit_on_success(): dialect = csv.Sniffer().sniff(request.FILES['csvfile'].readline()) dialect = csv_ext.patchup(dialect) @@ -588,8 +589,14 @@ def motion_import(request): if lno < 1: continue 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 + print 'works for %d' % (lno + 1) except ValueError: + print 'doesn\'t work for %d' % (lno + 1) messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) continue form = MotionForm({'title': title, 'text': text, 'reason': reason}) @@ -605,24 +612,44 @@ def motion_import(request): except ValueError: messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) continue - # 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: - 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 + + if is_group: + # fetch existing groups or issue an error message + try: + user = Group.objects.get(name=last_name) + if user.group_as_person == False: + messages.error(request, _('Ignoring line %d because the assigned group may not act as a person.') % (lno + 1)) + continue + else: + user = get_person(user.person_id) + + groups_assigned += 1 + except Group.DoesNotExist: + messages.error(request, _('Ignoring line %d because the assigned group does not exist.') % (lno + 1)) + continue + 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 motion = None if number: @@ -653,6 +680,8 @@ def motion_import(request): '%d motions were successfully modified.', motions_modified) % motions_modified) if users_generated: messages.success(request, ungettext('%d new user was added.', '%d new users were added.', users_generated) % users_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')) except csv.Error: