diff --git a/openslides/locale/de/LC_MESSAGES/django.mo b/openslides/locale/de/LC_MESSAGES/django.mo index 0bb777f72..e3d56e464 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 6129f1525..cebb45241 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-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" "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" @@ -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/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:842 motion/views.py:893 #: motion/templates/motion/view.html:79 #: motion/templates/projector/Motion.html:37 utils/utils.py:53 #: utils/views.py:111 @@ -240,8 +240,8 @@ msgstr "Ja" #: 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:574 -#: motion/views.py:804 motion/views.py:856 +#: assignment/templates/projector/Assignment.html:79 motion/models.py:579 +#: motion/views.py:842 motion/views.py:894 #: motion/templates/motion/view.html:80 #: motion/templates/projector/Motion.html:38 utils/utils.py:53 #: utils/views.py:111 @@ -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." @@ -449,7 +449,7 @@ msgstr "Darf selbst für Wahlen kandidieren" msgid "Can manage assignment" msgstr "Darf Wahlen verwalten" -#: assignment/models.py:302 motion/models.py:575 +#: assignment/models.py:302 motion/models.py:580 msgid "Abstain" msgstr "Enthaltung" @@ -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:701 #: 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." @@ -585,7 +585,7 @@ msgstr "Wahlen: %s" msgid "Candidates" 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 msgid "Vote results" msgstr "Abstimmungsergebnis" @@ -625,7 +625,7 @@ msgstr "Ungültige Stimmen" #: 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:842 #: motion/templates/motion/poll_view.html:35 #: motion/templates/motion/view.html:84 #: 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" #: assignment/views.py:580 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/templates/projector/Assignment.html:80 motion/views.py:842 +#: motion/views.py:895 motion/templates/motion/view.html:81 #: motion/templates/projector/Motion.html:39 msgid "Abstention" msgstr "Enthaltung" @@ -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:813 #: 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:842 #: 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:827 #: 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:861 #: 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:780 #: 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:800 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:730 motion/views.py:955 +#: motion/views.py:966 motion/templates/motion/base_motion.html:9 #: motion/templates/motion/overview.html:7 #: motion/templates/motion/overview.html:10 msgid "Motions" @@ -1330,44 +1330,77 @@ 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:599 motion/views.py:603 motion/views.py:609 +#: motion/views.py:612 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: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 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:684 #, 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:687 #, 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: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." 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!" msgstr "" "Die Quelldatei benutzt eine ungültige Zeichenkodierung, es wird nur UTF-8 " "wird unterstützt!" -#: motion/views.py:665 +#: motion/views.py:703 msgid "" "Attention: Existing motions will be modified if you import new motions with " "the same number." @@ -1375,7 +1408,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:704 msgid "" "Attention: Importing an motions without a number multiple times will create " "duplicates." @@ -1383,7 +1416,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:737 motion/views.py:875 #: 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 +1426,21 @@ msgstr "" msgid "Motion" 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." 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:756 motion/views.py:758 motion/views.py:773 +#: motion/views.py:775 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:790 msgid "Signature" 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:13 #: motion/templates/motion/view.html:66 motion/templates/motion/view.html:74 @@ -1415,21 +1448,21 @@ msgstr "Unterschrift" msgid "Vote" msgstr "Abstimmung" -#: motion/views.py:837 +#: motion/views.py:875 msgid "Poll" msgstr "Abstimmung" -#: motion/views.py:851 +#: motion/views.py:889 #, python-format msgid "Motion No. %s" msgstr "Antrag Nr. %s" -#: motion/views.py:853 +#: motion/views.py:891 #, python-format msgid "%d. Vote" msgstr "%d. Abstimmung" -#: motion/views.py:910 +#: motion/views.py:948 msgid "Motion settings successfully saved." 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 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 @@ -2021,10 +2055,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." @@ -2354,6 +2390,11 @@ msgstr "undefinierter-dateiname" msgid "Enter valid JSON" 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" #~ msgstr "Posten" 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..15dbf4913 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,8 @@ def motion_import(request): users_generated = 0 motions_generated = 0 motions_modified = 0 + groups_assigned = 0 + groups_generated = 0 with transaction.commit_on_success(): dialect = csv.Sniffer().sniff(request.FILES['csvfile'].readline()) dialect = csv_ext.patchup(dialect) @@ -588,7 +590,11 @@ 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 except ValueError: messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) continue @@ -605,24 +611,50 @@ 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: + group = Group() + group.group_as_person = True + group.description = _('Created by motion import.') + group.name = last_name + 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 motion = None if number: @@ -653,6 +685,12 @@ 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_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')) except csv.Error: