#84: Participants CSV import deletes applications

This commit is contained in:
René Köcher 2012-04-12 19:11:07 +02:00
parent 497a8cdb70
commit 733d78373e
7 changed files with 302 additions and 133 deletions

View File

@ -38,6 +38,7 @@ class Application(models.Model, SlideMixin):
('noc', _('Not Concerned')),
('com', _('Commited a bill')),
('nop', _('Rejected (not permitted)')),
('rev', _('Needs Review')),
#additional actions:
# edit
# delete
@ -324,6 +325,11 @@ class Application(models.Model, SlideMixin):
or (self.status == "per" \
and user.has_perm("application.can_manage_application")):
actions.append("wit")
#Check if the user can review the application
if self.status == "rev" \
and (self.submitter == user \
or user.has_perm("application.can_manage_application")):
actions.append("pub")
try:
# Check if the user can support and unspoort the application
if self.status == "pub" \

View File

@ -23,6 +23,7 @@
<option value="acc" {% if 'on' in request.GET.status and 'acc' in request.GET.statusvalue %}selected{% endif %}>{%trans "Accepted" %}</option>
<option value="rej" {% if 'on' in request.GET.status and 'rej' in request.GET.statusvalue %}selected{% endif %}>{%trans "Rejected" %}</option>
<option value="wit" {% if 'on' in request.GET.status and 'wit' in request.GET.statusvalue %}selected{% endif %}>{%trans "Withdrawed (by submitter)" %}</option>
<option value="rev" {% if 'rev' in request.GET.statusvalue %}selected{% endif %}>{%trans "Needs Review" %}</option>
</select>
</form>
</p>

View File

@ -145,8 +145,11 @@
<div class="box">
<h4><b>{% trans "Manage application" %}</b></h4>
{% if "per" in actions or "nop" in actions or "setnumber" in actions %}
{% if "pub" in actions or "per" in actions or "nop" in actions or "setnumber" in actions %}
<h4>{% trans "Formal validation" %}:</h4>
{% if "pub" in actions %}
<a href='{% url application_set_status application.id 'pub' %}'><span class="button"><span class="icon ok-blue">{% trans 'Publish' %}</span></span></a>
{% endif %}
{% if "per" in actions %}
<a href='{% url application_permit application.id %}'><span class="button"><span class="icon ok-blue">{% trans 'Permit' %}</span></span></a>
{% endif %}

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-04-02 08:40+0200\n"
"POT-Creation-Date: 2012-04-12 16:50+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,11 +17,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: openslides_settings.py:42
#: openslides_settings.py:42 settings.py:60
msgid "German"
msgstr "Deutsch"
#: openslides_settings.py:43
#: openslides_settings.py:43 settings.py:61
msgid "English"
msgstr "Englisch"
@ -34,12 +34,12 @@ msgid "Countdown (in seconds)"
msgstr "Countdown (in Sekunden)"
#: agenda/models.py:39 application/forms.py:41
#: application/templates/application/view.html:246 projector/models.py:13
#: application/templates/application/view.html:249 projector/models.py:13
msgid "Title"
msgstr "Titel"
#: agenda/models.py:40 application/forms.py:42
#: application/templates/application/view.html:247 projector/models.py:14
#: application/templates/application/view.html:250 projector/models.py:14
msgid "Text"
msgstr "Text"
@ -51,7 +51,7 @@ msgstr ""
msgid "Closed"
msgstr "Abgeschlossen"
#: agenda/models.py:43 agenda/templates/agenda/overview.html:63
#: agenda/models.py:43 agenda/templates/agenda/overview.html:59
#: projector/models.py:15
msgid "Weight"
msgstr "Gewichtung"
@ -61,7 +61,7 @@ msgstr "Gewichtung"
#: agenda/templates/agenda/base_agenda.html:9
#: agenda/templates/agenda/overview.html:7
#: agenda/templates/agenda/overview.html:41
#: agenda/templates/agenda/overview.html:77
#: agenda/templates/agenda/overview.html:65
#: agenda/templates/projector/AgendaSummary.html:6
#: agenda/templates/projector/AgendaSummary.html:13
msgid "Agenda"
@ -107,8 +107,8 @@ msgstr "Nein"
msgid "Yes, with all child items."
msgstr "Ja, mit allen Kindelementen."
#: agenda/views.py:183 agenda/views.py:185 participant/views.py:193
#: participant/views.py:306 utils/utils.py:46
#: agenda/views.py:183 agenda/views.py:185 participant/views.py:194
#: participant/views.py:307 utils/utils.py:46
#, python-format
msgid "Do you really want to delete <b>%s</b>?"
msgstr "Soll <b>%s</b> wirklich gelöscht werden?"
@ -127,7 +127,7 @@ msgstr "Neuer Eintrag"
#: agenda/templates/agenda/config.html:5
#: application/templates/application/config.html:5
#: assignment/templates/assignment/config.html:5 system/views.py:95
#: assignment/templates/assignment/config.html:5 system/views.py:94
#: system/templates/system/base_system.html:7
#: system/templates/system/general.html:5
#: system/templates/system/system.html:5
@ -141,7 +141,7 @@ msgstr "Tagesordnungs-Einstellungen"
#: agenda/templates/agenda/config.html:13 agenda/templates/agenda/edit.html:12
#: application/templates/application/config.html:13
#: application/templates/application/edit.html:21
#: application/templates/application/poll_view.html:47
#: application/templates/application/poll_view.html:48
#: assignment/templates/assignment/config.html:13
#: assignment/templates/assignment/edit.html:17
#: assignment/templates/assignment/poll_view.html:53
@ -158,7 +158,7 @@ msgstr "Speichern"
#: application/templates/application/config.html:17
#: application/templates/application/edit.html:28
#: application/templates/application/import.html:19
#: application/templates/application/poll_view.html:54
#: application/templates/application/poll_view.html:55
#: assignment/templates/assignment/config.html:17
#: assignment/templates/assignment/edit.html:24
#: assignment/templates/assignment/poll_view.html:60
@ -173,18 +173,18 @@ msgid "Cancel"
msgstr "Abbrechen"
#: agenda/templates/agenda/edit.html:5
#: agenda/templates/agenda/overview.html:60
#: agenda/templates/agenda/overview.html:56
msgid "Item"
msgstr "Eintrag"
#: agenda/templates/agenda/edit.html:8
#: agenda/templates/agenda/item_row.html:37
#: agenda/templates/agenda/item_row.html:23
msgid "Edit item"
msgstr "Eintrag bearbeiten"
#: agenda/templates/agenda/edit.html:15
#: application/templates/application/edit.html:24
#: application/templates/application/poll_view.html:50
#: application/templates/application/poll_view.html:51
#: assignment/templates/assignment/edit.html:20
#: assignment/templates/assignment/poll_view.html:56
#: assignment/templates/assignment/view.html:110
@ -194,57 +194,46 @@ msgstr "Eintrag bearbeiten"
msgid "Apply"
msgstr "Übernehmen"
#: agenda/templates/agenda/item_row.html:16
#: agenda/templates/agenda/item_row.html:7
msgid "Item closed"
msgstr "Eintrag erledigt"
#: agenda/templates/agenda/item_row.html:34
#: agenda/templates/agenda/item_row.html:21
msgid "Show projector preview"
msgstr "Beamer-Vorschau anzeigen"
#: agenda/templates/agenda/item_row.html:38
#: agenda/templates/agenda/item_row.html:24
msgid "Delete item"
msgstr "Eintrag löschen"
#: agenda/templates/agenda/item_row.html:44
msgid "Select item overview"
msgstr "Wähle Eintragsübersicht"
#: agenda/templates/agenda/overview.html:46
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:56 projector/models.py:26
#: projector/views.py:155 projector/templates/projector/base_projector.html:6
#: projector/templates/projector/base_projector.html:11
#: projector/templates/projector/control.html:52
msgid "Projector"
msgstr "Beamer"
#: agenda/templates/agenda/overview.html:58
#: agenda/templates/agenda/overview.html:55
msgid "Done"
msgstr "Erledigt"
#: agenda/templates/agenda/overview.html:61
#: agenda/templates/agenda/overview.html:57
#: assignment/templates/assignment/overview.html:29
#: participant/templates/participant/overview.html:70
msgid "Actions"
msgstr "Aktionen"
#: agenda/templates/agenda/overview.html:77
#: agenda/templates/agenda/overview.html:65
msgid "items"
msgstr "Einträge"
#: agenda/templates/agenda/overview.html:83
#: agenda/templates/agenda/overview.html:71
msgid "Print agenda"
msgstr "Tagesordnung drucken"
#: agenda/templates/agenda/overview.html:95
#: agenda/templates/agenda/overview.html:83
msgid "No items available."
msgstr "Keine Einträge vorhanden."
#: application/forms.py:43 application/templates/application/view.html:229
#: application/templates/application/view.html:249
#: application/forms.py:43 application/templates/application/view.html:232
#: application/templates/application/view.html:252
#: application/templates/projector/Application.html:59 utils/pdf.py:382
msgid "Reason"
msgstr "Begründung"
@ -257,19 +246,19 @@ msgstr "Triviale Änderung"
msgid "Trivial changes don't create a new version."
msgstr "Triviale Änderungen erzeugen keine neue Version."
#: application/forms.py:49 application/models.py:52
#: application/templates/application/overview.html:38
#: application/forms.py:49 application/models.py:53
#: application/templates/application/overview.html:39
#: application/templates/application/view.html:13
#: application/templates/projector/Application.html:22 utils/pdf.py:311
msgid "Submitter"
msgstr "Antragsteller/in"
#: application/forms.py:50 application/models.py:54
#: application/forms.py:50 application/models.py:55
#: application/templates/application/view.html:27 utils/pdf.py:324
msgid "Supporters"
msgstr "Unterstützer/innen"
#: application/forms.py:58 participant/forms.py:81
#: application/forms.py:58 participant/forms.py:87
msgid "CSV File"
msgstr "CSV-Datei"
@ -318,12 +307,12 @@ msgid "Permitted"
msgstr "Zugelassen"
#: application/models.py:34 application/templates/application/overview.html:23
#: application/templates/application/view.html:171
#: application/templates/application/view.html:174
msgid "Accepted"
msgstr "Angenommen"
#: application/models.py:35 application/templates/application/overview.html:24
#: application/templates/application/view.html:176
#: application/templates/application/view.html:179
msgid "Rejected"
msgstr "Abgelehnt"
@ -331,17 +320,17 @@ msgstr "Abgelehnt"
msgid "Withdrawed"
msgstr "Zurückgezogen"
#: application/models.py:37 application/templates/application/view.html:184
#: application/models.py:37 application/templates/application/view.html:187
msgid "Adjourned"
msgstr "Vertagt"
# please check!
#: application/models.py:38 application/templates/application/view.html:187
#: application/models.py:38 application/templates/application/view.html:190
msgid "Not Concerned"
msgstr "Nicht befasst"
# please check!
#: application/models.py:39 application/templates/application/view.html:190
#: application/models.py:39 application/templates/application/view.html:193
msgid "Commited a bill"
msgstr "Verwiesen (in Ausschuss)"
@ -349,75 +338,79 @@ msgstr "Verwiesen (in Ausschuss)"
msgid "Rejected (not permitted)"
msgstr "Verworfen (nicht zulässig)"
#: application/models.py:123
#: application/models.py:41 application/templates/application/overview.html:26
msgid "Needs Review"
msgstr "Benötigt Review"
#: application/models.py:124
msgid "Searching for supporters."
msgstr "Auf Unterstützersuche."
#: application/models.py:125
#: application/models.py:126
msgid "Not yet permitted."
msgstr "Noch nicht zugelassen."
#: application/models.py:127
#: application/models.py:128
msgid "Not yet permitted changes."
msgstr "Noch nicht zugelassene Änderungen."
#: application/models.py:187
#: application/models.py:188
#, python-format
msgid "Version %s modified"
msgstr "Version %s bearbeitet"
#: application/models.py:196
#: application/models.py:197
#, python-format
msgid "Version %s created"
msgstr "Version %s erstellt"
#: application/models.py:205
#: application/models.py:206
msgid "Supporters removed"
msgstr "Unterstützer/innen gelöscht"
#: application/models.py:214
#: application/models.py:215
#, python-format
msgid "Status reseted to: %s"
msgstr "Status zurückgesetzt auf: %s"
#: application/models.py:227 application/views.py:170
#: application/models.py:228 application/views.py:170
#, python-format
msgid "Supporter: +%s"
msgstr "Unterstützer/in: +%s"
#: application/models.py:237 application/views.py:181
#: application/models.py:238 application/views.py:181
#, python-format
msgid "Supporter: -%s"
msgstr "Unterstützer/in: -%s"
#: application/models.py:253
#: application/models.py:254
#, python-format
msgid "Number set: %s"
msgstr "Nummer gesetzt: %s"
#: application/models.py:266
#: application/models.py:267
#, python-format
msgid "Version %s permitted"
msgstr "Version %s zugelassen"
#: application/models.py:280
#: application/models.py:281
#, python-format
msgid "Version %s not permitted"
msgstr "Version %s nicht zugelassen"
#: application/models.py:306
#: application/models.py:307
msgid "Status modified"
msgstr "Status geändert"
#: application/models.py:417
#: application/models.py:423
msgid "Poll created"
msgstr "Abstimmung erstellt"
#: application/models.py:490 application/views.py:620
#: application/models.py:496 application/views.py:620
#: application/templates/application/base_application.html:8
#: application/templates/application/overview.html:6
#: application/templates/application/overview.html:9
#: application/templates/application/overview.html:29 system/models.py:25
#: application/templates/application/overview.html:30 system/models.py:25
#: utils/pdf.py:390
msgid "Applications"
msgstr "Anträge"
@ -441,8 +434,8 @@ msgid "Application was successfully modified."
msgstr "Antrag wurde erfolgreich geändert."
#: application/views.py:192 application/views.py:581 assignment/views.py:123
#: participant/views.py:170 participant/views.py:291 participant/views.py:320
#: participant/views.py:390 system/views.py:54 utils/views.py:115
#: participant/views.py:171 participant/views.py:292 participant/views.py:321
#: participant/views.py:466 system/views.py:53 utils/views.py:132
msgid "Please check the form for errors."
msgstr "Bitte kontrollieren Sie das Formular nach Fehlern."
@ -545,7 +538,7 @@ msgstr "FEHLER beim Zurückweisen der Version."
msgid "Do you really want to reject version <b>%s</b>?"
msgstr "Soll Version <b>%s</b> wirklich zurückgewiesen werden?"
#: application/views.py:487 participant/views.py:336
#: application/views.py:487 participant/views.py:337
msgid ""
"The import function is available for the superuser (without user profile) "
"only."
@ -579,7 +572,7 @@ msgid_plural "%d new users were added."
msgstr[0] "%d neuer Nutzer wurde erstellt."
msgstr[1] "%d neue Nutzer wurden erstellt."
#: application/views.py:579 participant/views.py:388
#: application/views.py:579 participant/views.py:464
msgid "Import aborted because of severe errors in the input file."
msgstr "Import auf Grund von schweren Fehlern in der Quelldatei abgebrochen."
@ -628,7 +621,7 @@ msgstr "Antrags-Einstellungen"
#: application/templates/application/edit.html:6
#: application/templates/application/view.html:6
#: application/templates/application/view.html:213 utils/pdf.py:419
#: application/templates/application/view.html:216 utils/pdf.py:419
#: utils/pdf.py:431
msgid "Application"
msgstr "Antrag"
@ -675,7 +668,7 @@ msgid "Without number"
msgstr "Ohne Nummer"
#: application/templates/application/overview.html:19
#: application/templates/application/overview.html:37
#: application/templates/application/overview.html:38
#: application/templates/application/view.html:39
#: application/templates/projector/Application.html:11
#: assignment/templates/assignment/overview.html:14
@ -694,30 +687,30 @@ msgstr "Noch nicht zugelassen"
msgid "Withdrawed (by submitter)"
msgstr "Zurückgezogen (durch Antragsteller/in)"
#: application/templates/application/overview.html:32
#: application/templates/application/overview.html:33
msgid "Number"
msgstr "Nummer"
#: application/templates/application/overview.html:33
#: application/templates/application/overview.html:34
msgid "Application title"
msgstr "Antragstitel"
#: application/templates/application/overview.html:35
#: application/templates/application/overview.html:36
msgid "Number of supporters"
msgstr "Anzahl der Unterstützer/innen"
#: application/templates/application/overview.html:39
#: application/templates/application/overview.html:40
#: application/templates/application/view.html:107
msgid "Creation Time"
msgstr "Erstellungszeit"
#: application/templates/application/overview.html:61
#: application/templates/application/overview.html:62
msgid "No applications available."
msgstr "Keine Anträge vorhanden."
#: application/templates/application/poll_view.html:11
#: application/templates/application/poll_view.html:19
#: application/templates/application/view.html:211
#: application/templates/application/view.html:214
#: application/templates/projector/Application.html:53 utils/pdf.py:303
#: utils/pdf.py:305 utils/pdf.py:406 utils/pdf.py:408 utils/pdf.py:440
msgid "Application No."
@ -749,22 +742,22 @@ msgstr "Mehrheit"
msgid "undocumented"
msgstr "nicht erfasst"
#: application/templates/application/poll_view.html:27
#: application/templates/application/poll_view.html:28
msgid "Option"
msgstr "Wahlmöglichkeit"
#: application/templates/application/poll_view.html:28
#: application/templates/application/poll_view.html:29
msgid "Votes"
msgstr "Stimmen"
#: application/templates/application/poll_view.html:37
#: application/templates/application/poll_view.html:38
#: assignment/templates/assignment/poll_view.html:34
#: assignment/templates/assignment/view.html:204
#: assignment/templates/projector/Assignment.html:89 utils/pdf.py:555
msgid "Invalid votes"
msgstr "Ungültige Stimmen"
#: application/templates/application/poll_view.html:41
#: application/templates/application/poll_view.html:42
#: application/templates/application/view.html:84
#: application/templates/projector/Application.html:38
#: assignment/templates/assignment/poll_view.html:38
@ -855,85 +848,89 @@ msgid "Formal validation"
msgstr "Formale Gültigkeitsprüfung"
#: application/templates/application/view.html:151
msgid "Publish"
msgstr "Veröffentlen"
#: application/templates/application/view.html:154
msgid "Permit"
msgstr "Zulassen"
#: application/templates/application/view.html:154
#: application/templates/application/view.html:157
msgid "Not permit (reject)"
msgstr "Nicht zulassen (verwerfen)"
#: application/templates/application/view.html:157
#: application/templates/application/view.html:160
msgid "Set Number"
msgstr "Setze Nummer"
#: application/templates/application/view.html:164
#: application/templates/application/view.html:167
msgid "Beam Application"
msgstr "Antrag projizieren"
#: application/templates/application/view.html:168
#: application/templates/application/view.html:171
msgid "Result after vote"
msgstr "Ergebnis nach der Abstimmung"
#: application/templates/application/view.html:182
#: application/templates/application/view.html:185
msgid "Result after debate"
msgstr "Ergebnis nach der Debatte"
#: application/templates/application/view.html:193
#: application/templates/application/view.html:196
msgid "Withdrawed by Submitter"
msgstr "Zurückgezogen durch Antragsteller/in"
#: application/templates/application/view.html:199
#: application/templates/application/view.html:202
msgid "For Administration only:"
msgstr "Nur zur Administration:"
#: application/templates/application/view.html:201
#: application/templates/application/view.html:204
msgid "Reset"
msgstr "Zurücksetzen"
#: application/templates/application/view.html:216
#: application/templates/application/view.html:244
#: application/templates/application/view.html:219
#: application/templates/application/view.html:247
msgid "Version"
msgstr "Version"
#: application/templates/application/view.html:219
#: application/templates/application/view.html:222
msgid "Show newest Version"
msgstr "Neuste Version anzeigen"
#: application/templates/application/view.html:221
#: application/templates/application/view.html:224
msgid "Show permitted Version"
msgstr "Zugelassene Version anzeigen"
#: application/templates/application/view.html:239
#: application/templates/application/view.html:242
msgid "Version History"
msgstr "Versionshistorie"
#: application/templates/application/view.html:245
#: application/templates/application/view.html:248
msgid "Time"
msgstr "Zeit"
#: application/templates/application/view.html:256
#: application/templates/application/view.html:259
msgid "Version accepted"
msgstr "Version akzeptiert"
#: application/templates/application/view.html:259
#: application/templates/application/view.html:262
msgid "Accept Version"
msgstr "Zugelassene Version"
#: application/templates/application/view.html:262
#: application/templates/application/view.html:265
msgid "Reject Version"
msgstr "Verion zurückweisen"
#: application/templates/application/view.html:266
#: application/templates/application/view.html:269
msgid "Version rejected"
msgstr "Version zurückgewiesen"
#: application/templates/application/view.html:276
#: application/templates/application/view.html:283
#: application/templates/application/view.html:290
#: application/templates/application/view.html:279
#: application/templates/application/view.html:286
#: application/templates/application/view.html:293
msgid "unchanged"
msgstr "unverändert"
#: application/templates/application/view.html:299
#: application/templates/application/view.html:302
msgid "Log"
msgstr "Log"
@ -1262,14 +1259,30 @@ msgstr "Kandidat/in ist gewählt"
msgid "No ballots available."
msgstr "Keine Wahlgänge vorhanden."
#: participant/forms.py:37 participant/forms.py:46
#: participant/forms.py:37
msgid "Keep applications, try to reassign submitter"
msgstr "Anträge beibehalten, versuchen Antragssteller erneut zuzuweisen"
#: participant/forms.py:38
msgid "Keep applications, set status to \"needs review\""
msgstr "Anträge beibehalten, Stauts auf \"Benötigt Review\" setzen"
#: participant/forms.py:39
msgid "Discard applications"
msgstr "Alle Anträge löschen"
#: participant/forms.py:43 participant/forms.py:52
msgid "First name"
msgstr "Vorname"
#: participant/forms.py:38 participant/forms.py:47
#: participant/forms.py:44 participant/forms.py:53
msgid "Last name"
msgstr "Nachname"
#: participant/forms.py:88
msgid "For existing applications"
msgstr "Bei existierenden Anträgen"
#: participant/models.py:22 participant/templates/participant/overview.html:22
msgid "Male"
msgstr "Männlich"
@ -1320,51 +1333,88 @@ msgstr "Kommentar"
msgid "First Password"
msgstr "Erst-Passwort"
#: participant/views.py:162
#: participant/views.py:163
msgid "New participant was successfully created."
msgstr "Neue/r Teilnehmer/in wurde erfolgreich angelegt."
#: participant/views.py:164
#: participant/views.py:165
msgid "Participant was successfully modified."
msgstr "Teilnehmer/in wurde erfolgreich geändert."
#: participant/views.py:191
#: participant/views.py:192
#, python-format
msgid "Participant <b>%s</b> was successfully deleted."
msgstr "Teilnehmer/in <b>%s</b> wurde erfolgreich gelöscht."
#: participant/views.py:204 participant/views.py:223
#: participant/views.py:205 participant/views.py:224
#, python-format
msgid "Participant %d does not exist."
msgstr "Teilnehmer/in %d existiert nicht."
#: participant/views.py:269
#: participant/views.py:270
#, python-format
msgid "Group name \"%s\" is reserved for internal use."
msgstr "Der Gruppenname \"%s\" ist für interne Verwendung reserviert."
#: participant/views.py:283
#: participant/views.py:284
msgid "New group was successfully created."
msgstr "Neue Gruppe wurde erfolgreich angelegt."
#: participant/views.py:285
#: participant/views.py:286
msgid "Group was successfully modified."
msgstr "Gruppe wurde erfolgreich geändert."
#: participant/views.py:304
#: participant/views.py:305
#, python-format
msgid "Group <b>%s</b> was successfully deleted."
msgstr "Gruppe <b>%s</b> wurde erfolgreich gelöscht."
#: participant/views.py:318
#: participant/views.py:319
msgid "User settings successfully saved."
msgstr "Nutzereinstellungen wurden erfolgreich gespeichert."
#: participant/views.py:385
msgid "Supporters removed after user import."
msgstr "Unterstützer/innen nach Benutzerimport zurückgesetzt."
#: participant/views.py:432
#, python-format
msgid "Reassigned to \"%s\" after (re)importing users."
msgstr "Nach Benutzerimport erneut \"%s\" zugeordnet."
#: participant/views.py:435 participant/views.py:449
#, python-format
msgid "Could not reassing application %d - object not found!"
msgstr "Antrag Id#%d konnte nicht neu zugewiesen werden - "
"Das Objekt wurde nicht gefunden!"
#: participant/views.py:452
#, python-format
msgid "%d application could not be reassigned and needs a review!"
msgid_plural "%d applications could not be reassigned and need a review!"
msgstr[0] "%d Antrag konnte nicht neu zugewiesen werden and benötigt ein Review!"
msgstr[1] "%d Anträge konnten nicht neu zugewiesen werden und benötigen ein Review!"
#: participant/views.py:455
#, python-format
msgid "%d application was successfully reassigned."
msgid_plural "%d applications were successfully reassigned."
msgstr[0] "%d Antrag wurde erfolgreich neu zugewiesen."
msgstr[1] "%d Anträge wurden erfolgreich neu zugewiesen."
#: participant/views.py:458
#, python-format
msgid "%d application was discarded."
msgid_plural "%d applications were discarded."
msgstr[0] "%d Antrag wurde gelöscht."
msgstr[1] "%d Anträge wurden gelöscht."
#: participant/views.py:461
#, python-format
msgid "%d new participants were successfully imported."
msgstr "%d neue Teilnehmer/innen wurden erfolgreich importiert."
#: participant/views.py:392
#: participant/views.py:468
msgid ""
"Attention: All existing participants will be removed if you import new "
"participants."
@ -1372,17 +1422,29 @@ msgstr ""
"Achtung: Alle existierenden Teilnehmer/innen werden gelöscht, wenn Sie neue "
"Teilnehmer/innen importieren."
#: participant/views.py:404
#: participant/views.py:470
msgid "Attention: Supporters from all existing applications will be removed."
msgstr ""
"Achtung: Alle Unterstützer/innen werden von existiernden Anträgen gelöscht."
#: participant/views.py:471
msgid ""
"Attention: Applications which can't be mapped to new users will be set to "
"'Needs Review'."
msgstr "Achtung: Anträge welche keinem Nutzer zugeordnet werden können"
" bekommen automatisch den Status \"Benötigt Review\"."
#: participant/views.py:483
#, python-format
msgid "The Password for <b>%s</b> was successfully reset."
msgstr "Das Passwort für <b>%s</b> wurde erfolgreich zurückgesetzt."
#: participant/views.py:406
#: participant/views.py:485
#, python-format
msgid "Do you really want to reset the password for <b>%s</b>?"
msgstr "Soll das Passwort für <b>%s</b> wirklich zurückgesetzt werden?"
#: participant/views.py:414
#: participant/views.py:493
#: participant/templates/participant/base_participant.html:11
#: participant/templates/participant/overview.html:5
#: participant/templates/participant/overview.html:15
@ -1564,6 +1626,13 @@ msgstr "Ungültige Stimmen"
msgid "votes"
msgstr "Stimmen"
#: projector/models.py:26 projector/views.py:155
#: projector/templates/projector/base_projector.html:6
#: projector/templates/projector/base_projector.html:11
#: projector/templates/projector/control.html:35
msgid "Projector"
msgstr "Beamer"
#: projector/models.py:26
msgid "Projector Slide"
msgstr "Beamer-Folie"
@ -1582,55 +1651,59 @@ msgstr "Neue Folie"
msgid "Projector view"
msgstr "Beamer-Ansicht"
#: projector/templates/projector/control.html:56
#: projector/templates/projector/control.html:39
msgid "Countdown"
msgstr "Countdown"
#: projector/templates/projector/control.html:56
#: projector/templates/projector/control.html:39
msgid "sec"
msgstr "s"
#: projector/templates/projector/control.html:58
#: projector/templates/projector/control.html:41
msgid "Reset countdown"
msgstr "Countdown zurücksetzen"
#: projector/templates/projector/control.html:61
#: projector/templates/projector/control.html:44
msgid "Start countdown"
msgstr "Countdown starten"
#: projector/templates/projector/control.html:64
#: projector/templates/projector/control.html:47
msgid "Stop countdown"
msgstr "Countdown stoppen"
#: projector/templates/projector/control.html:70
#: projector/templates/projector/control.html:53
msgid "Adjust projector view"
msgstr "Beamer-Ansicht anpassen"
#: projector/templates/projector/control.html:71
#: projector/templates/projector/control.html:54
msgid "Zoom in"
msgstr "Vergrößern"
#: projector/templates/projector/control.html:74
#: projector/templates/projector/control.html:57
msgid "Zoom out"
msgstr "Verkleinern"
#: projector/templates/projector/control.html:77
#: projector/templates/projector/control.html:60
msgid "Scroll text up"
msgstr "Text nach oben scrollen"
#: projector/templates/projector/control.html:80
#: projector/templates/projector/control.html:63
msgid "Scroll text down"
msgstr "Text nach unten scrollen"
#: projector/templates/projector/control.html:83
#: projector/templates/projector/control.html:66
msgid "Reset projector view"
msgstr "Beamer-Ansicht zurücksetzen"
#: projector/templates/projector/control.html:121
#: projector/templates/projector/control.html:87
msgid "Select item overview"
msgstr "Wähle Eintragsübersicht"
#: projector/templates/projector/control.html:109
msgid "Projector Live View"
msgstr "Beamer-Live-Ansicht"
#: projector/templates/projector/control.html:130
#: projector/templates/projector/control.html:118
msgid "Hidden information"
msgstr "Versteckte Informationen"
@ -1670,15 +1743,15 @@ msgstr "Veranstaltungsort"
msgid "Event organizer"
msgstr "Veranstalter"
#: system/models.py:91
#: system/models.py:93
msgid "General"
msgstr "Allgemein"
#: system/views.py:50
#: system/views.py:49
msgid "General settings successfully saved."
msgstr "Allgemeine Einstellungen erfolgreich gespeichert."
#: system/views.py:85
#: system/views.py:84
msgid ""
"Anonymous access enabled. Please modify the \"Anonymous\" group to fit your "
"required permissions."
@ -1686,7 +1759,7 @@ msgstr ""
"Anonymer Zugriff aktiviert. Bitte setzen Sie die Rechte der Gruppe "
"\"Anonymous\" passend zum gewünschten Zugriffslevel."
#: system/views.py:88
#: system/views.py:87
msgid "System settings successfully saved."
msgstr "Systemeinstellungen erfolgreich gespeichert."

View File

@ -10,7 +10,7 @@
:license: GNU GPL, see LICENSE for more details.
"""
from django.forms import Form, ModelForm, CharField, EmailField, FileField, FileInput, MultipleChoiceField, ModelMultipleChoiceField
from django.forms import Form, ModelForm, CharField, EmailField, FileField, FileInput, MultipleChoiceField, ModelMultipleChoiceField, ChoiceField, BooleanField
from django.contrib.auth.models import User, Group, Permission
from django.contrib.auth.forms import AdminPasswordChangeForm
from django.utils.translation import ugettext as _
@ -33,6 +33,12 @@ USER_VISIBLE_PERMISSIONS = reduce(list.__add__, [
])
USER_APPLICATION_IMPORT_OPTIONS = [
('REASSIGN', _('Keep applications, try to reassign submitter')),
('INREVIEW', _('Keep applications, set status to "needs review"')),
('DISCARD' , _('Discard applications'))
]
class UserNewForm(ModelForm, CssClassMixin):
first_name = CharField(label=_("First name"))
last_name = CharField(label=_("Last name"))
@ -79,3 +85,4 @@ class UsersettingsForm(UserEditForm, CssClassMixin):
class UserImportForm(Form, CssClassMixin):
csvfile = FileField(widget=FileInput(attrs={'size':'50'}), label=_("CSV File"))
application_handling = ChoiceField(required=True, choices=USER_APPLICATION_IMPORT_OPTIONS, label=_("For existing applications"))

View File

@ -34,6 +34,7 @@ from django.db import transaction
from participant.models import Profile
from participant.api import gen_username, gen_password
from participant.forms import UserNewForm, UserEditForm, ProfileForm, UsersettingsForm, UserImportForm, GroupForm, AdminPasswordChangeForm
from application.models import Application
from utils.utils import template, permission_required, gen_confirm_form, ajax_request
from utils.pdf import print_userlist, print_passwords
from utils.template import Tab
@ -346,6 +347,43 @@ def user_import(request):
if form.is_valid():
try:
with transaction.commit_on_success():
old_users = {}
applications_mapped = 0
applications_review = 0
applications_removed = 0
try:
janitor = User.objects.get(username='__system__.janitor')
except User.DoesNotExist:
janitor = User()
janitor.first_name = ''
janitor.last_name = ''
janitor.username = '__system__.janitor'
janitor.save()
applications = Application.objects.all()
for application in applications:
if form.cleaned_data['application_handling'] == 'DISCARD':
# need to do this explicit since some applications may belong
# to __system__.janitor which is a permanent user
application.delete(force=True)
applications_removed += 1
else:
# collect all applications and map them to their submitters
submitter = application.submitter
skey = '%s_%s' % (submitter.first_name, submitter.last_name)
if not skey in old_users:
old_users[skey] = []
old_users[skey].append(application.id)
application.submitter = janitor
application.save()
if application.supporter.all():
application.writelog(_('Supporters removed after user import.'), user=request.user)
profiles = Profile.objects.all()
for profile in profiles:
profile.user.delete()
@ -382,6 +420,44 @@ def user_import(request):
observer = Group.objects.get(name='Beobachter')
user.groups.add(observer)
if form.cleaned_data['application_handling'] == 'REASSIGN':
# live remap
skey = '%s_%s' % (user.first_name, user.last_name)
if skey in old_users:
for appid in old_users[skey]:
try:
application = Application.objects.get(id=appid)
application.submitter = user
application.save()
application.writelog(_('Reassigned to "%s" after (re)importing users.') % ("%s %s" % (user.first_name, user.last_name)), user=request.user)
applications_mapped += 1
except Application.DoesNotExist:
messages.error(request, _('Could not reassing application %d - object not found!') % appid)
del old_users[skey]
if old_users:
# mark all applications without a valid user as 'needs review'
# this will account for *all* applications if application_mode == 'INREVIEW'
for skey in old_users:
for appid in old_users[skey]:
try:
application = Application.objects.get(id=appid)
if application.status != 'rev':
application.set_status(user=request.user, status='rev', force=True)
applications_review += 1
except Application.DoesNotExist:
messages.error(request, _('Could not reassing application %d - object not found!') % appid)
if applications_review:
messages.warning(request, ungettext('%d application could not be reassigned and needs a review!',
'%d applications could not be reassigned and need a review!', applications_review) % applications_review)
if applications_mapped:
messages.success(request, ungettext('%d application was successfully reassigned.',
'%d applications were successfully reassigned.', applications_mapped) % applications_mapped)
if applications_removed:
messages.warning(request, ungettext('%d application was discarded.',
'%d applications were discarded.', applications_removed) % applications_removed)
messages.success(request, _('%d new participants were successfully imported.') % i)
return redirect(reverse('user_overview'))
except csv.Error:
@ -390,6 +466,9 @@ def user_import(request):
messages.error(request, _('Please check the form for errors.'))
else:
messages.warning(request, _("Attention: All existing participants will be removed if you import new participants."))
if Application.objects.all():
messages.warning(request, _("Attention: Supporters from all existing applications will be removed."))
messages.warning(request, _("Attention: Applications which can't be mapped to new users will be set to 'Needs Review'."))
form = UserImportForm()
return {
'form': form,