Merge pull request #44 from emanuelschuetze/master

Some fixes for 1.3
This commit is contained in:
Oskar Hahn 2012-11-20 08:38:19 -08:00
commit 9122052ba6
25 changed files with 244 additions and 317 deletions

View File

@ -32,10 +32,11 @@
{% if assignment.active %}activeline{% endif %}">
<td><a href="{% url assignment_view assignment.id %}">{{ assignment }}</a></td>
<td>
{{ assignment.posts }} {% trans "posts" %} / {{ assignment.elected|length }} {% trans "elected" %}
{% blocktrans with posts=assignment.posts %}posts: {{ posts }}{% endblocktrans %}
{% if assignment.status != 'fin' %}
/ {{ assignment.candidates|length }} {% trans "candidates" %}
| {% blocktrans with candidates=assignment.get_participants|length %}candidates: {{ candidates }}{% endblocktrans %}
{% endif %}
| {% blocktrans with elected=assignment.elected|length %}elected: {{ elected }}{% endblocktrans %}
</td>
<td>{{ assignment.get_status_display }}</td>
<td>

View File

@ -33,9 +33,10 @@
<h1>{{ assignment }}</h1>
<p>{{ assignment.description|linebreaks }}</p>
{% if assignment.status != "fin" %}
<h3>{% trans "Candidates" %}</h3>
<ol>
{% for person in assignment.candidates %}
{% for person in assignment.get_participants %}
<li>
{{ person }}
{% if perms.assignment.can_manage_assignment %}
@ -43,6 +44,14 @@
<a href="{% url assignment_delother assignment.id person.person_id %}"><img src="{% static 'images/icons/delete.png' %}" title="{% trans 'Remove candidate' %}"></a>
{% endif %}
{% endif %}
{% if person in assignment.elected %}
| <b>{% trans "elected" %}</b>
{% if perms.assignment.can_manage_assignment %}
{% if assignment.status == "sea" or assignment.status == "vot" %}
<a href="{% url assignment_user_not_elected assignment.id person.person_id %}"><img src="{% static 'images/icons/dialog-cancel.png' %}" title="{% trans 'Mark candidate as not elected' %}"></a>
{% endif %}
{% endif %}
{% endif %}
</li>
{% empty %}
<li style="list-style: none outside none;"><i>{% trans "No candidates available." %}</i></li>
@ -85,27 +94,11 @@
</p>
{% endif %}
</form>
{% endif %}
{% endif %}
{% endif %}
<h3>{% trans "Elected Candidates" %}</h3>
<ul>
{% for person in assignment.elected %}
<li>
{{ person }}
{% if perms.assignment.can_manage_assignment %}
{% if assignment.status == "sea" or assignment.status == "vot" %}
<a href="{% url assignment_user_not_elected assignment.id person.person_id %}"><img src="{% static 'images/icons/delete.png' %}" title="{% trans 'Remove candidate' %}"></a>
{% endif %}
{% endif %}
</li>
{% empty %}
<li>{% trans "No elected candidates available." %}</li>
{% endfor %}
</ul>
{% if perms.assignment.can_manage_assignments %}
{% if perms.assignment.can_manage_assignments and blocked_candidates and assignment.status != "fin" %}
<h3>{% trans "Blocked Candidates" %}</h3>
<ul>
{% for person in blocked_candidates %}
@ -118,20 +111,11 @@
</ul>
{% endif %}
{% if assignment.status != "sea" %}
<h3>{% trans "Election results" %}</h3>
{% if polls.exists %}
<table id="election_table" style="width: auto;">
<tr>
<th></th>
{% with ballotnumber=polls.count %}
<th colspan="{{ ballotnumber|add:'1' }}" style="text-align: center;">
{% trans "ballot" %}
</th>
{% endwith %}
</tr>
<tr>
<th>{% trans "Candidates" %}</th>
{% for poll in polls %}
@ -161,7 +145,7 @@
</tr>
{% for candidate, poll_list in vote_results.items %}
<tr class="{% cycle 'odd' '' %}">
<tr class="{% cycle 'odd' '' as rowcolors %}">
<td class="candidate">
{% if candidate in assignment.elected %}
{% if perms.assignment.can_manage_assignment %}
@ -198,8 +182,7 @@
{% endif %}
</tr>
{% endfor %}
<tr>
<tr class="{% cycle rowcolors %}">
<td>{% trans 'Invalid votes' %}</td>
{% for poll in polls %}
{% if poll.published or perms.assignment.can_manage_assignment %}
@ -215,7 +198,6 @@
<td></td>
{% endif %}
</tr>
<tr class="total">
<td><strong>{% trans 'Votes cast' %}</strong></td>
{% for poll in polls %}
@ -233,11 +215,8 @@
{% endif %}
</tr>
</table>
{% else %}
<i>{% trans "No ballots available." %}</i>
<i>{% trans "No results available." %}</i>
{% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %}
<p><a href='{% url assignment_gen_poll assignment.id %}'>
<span class="button">
@ -245,9 +224,7 @@
</span>
</a></p>
{% endif %}
{% endif %}
{% endif %}
</div>
{% endblock %}

View File

@ -62,7 +62,7 @@
</tr>
{% for candidate, poll_list in vote_results.items %}
<tr class="{% cycle 'odd' '' %}">
<tr class="{% cycle 'odd' '' as rowcolors %}">
<td class="candidate{% if candidate in assignment.elected %} elected{% endif %}">
{% if candidate in assignment.elected %}
<a class="elected">
@ -92,8 +92,7 @@
{% endfor %}
</tr>
{% endfor %}
<tr>
<tr class="{% cycle rowcolors %}">
<td>{% trans 'Invalid votes' %}</td>
{% for poll in polls %}
<td style="white-space:nowrap;">
@ -105,7 +104,6 @@
{% endfor %}
</tr>
<tr class="total">
<td>
<strong>{% trans 'Votes cast' %}</strong>
@ -120,12 +118,6 @@
</td>
{% endfor %}
</tr>
</table>
{% elif some_polls_available %}
<i>{% trans "Vote results are not published yet." %}</i>
{% elif assignment.candidates %}
<i>{% trans "No ballots available." %}</i>
{% endif %}
<br>
{% endblock %}

View File

@ -56,13 +56,13 @@ class GeneralConfigForm(forms.Form, CssClassMixin):
required=False,
)
frontpage_title = forms.CharField(
welcome_title = forms.CharField(
widget=forms.TextInput(),
label=_("Title"),
required=False,
)
frontpage_welcometext = forms.CharField(
welcome_text = forms.CharField(
widget=forms.Textarea(),
label=_("Welcome text"),
required=False,

View File

@ -86,8 +86,8 @@ def default_config(sender, key, **kwargs):
'event_location': '',
'event_organizer': '',
'presentation': '',
'frontpage_title': _('Welcome to OpenSlides'),
'frontpage_welcometext': _('[Place for your welcome text.]'),
'welcome_title': _('Welcome to OpenSlides'),
'welcome_text': _('[Place for your welcome text.]'),
'system_enable_anonymous': False,
}.get(key)

View File

@ -23,9 +23,9 @@
</fieldset>
<p></p>
<fieldset>
<legend>{% trans "Frontpage" %}</legend>
<legend>{% trans "Welcome Widget" %}</legend>
{% for field in form %}
{% if "id_frontpage" in field.label_tag %}
{% if "id_welcome" in field.label_tag %}
<p>
{{ field.errors }}
{{ field.required }}

View File

@ -41,8 +41,8 @@ class GeneralConfig(FormView):
'event_date': config['event_date'],
'event_location': config['event_location'],
'event_organizer': config['event_organizer'],
'frontpage_title': config['frontpage_title'],
'frontpage_welcometext': config['frontpage_welcometext'],
'welcome_title': config['welcome_title'],
'welcome_text': config['welcome_text'],
'system_enable_anonymous': config['system_enable_anonymous'],
}
@ -54,10 +54,9 @@ class GeneralConfig(FormView):
config['event_location'] = form.cleaned_data['event_location']
config['event_organizer'] = form.cleaned_data['event_organizer']
# frontpage
config['frontpage_title'] = form.cleaned_data['frontpage_title']
config['frontpage_welcometext'] = \
form.cleaned_data['frontpage_welcometext']
# welcome widget
config['welcome_title'] = form.cleaned_data['welcome_title']
config['welcome_text'] = form.cleaned_data['welcome_text']
# system
if form.cleaned_data['system_enable_anonymous']:

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: OpenSlides 1.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-11-08 09:41+0100\n"
"POT-Creation-Date: 2012-11-20 12:34+0100\n"
"PO-Revision-Date: 2012-07-28 11:07+0200\n"
"Last-Translator: Emanuel Schuetze <emanuel@intevation.de>\n"
"Language-Team: support@openslides.de\n"
@ -27,7 +27,7 @@ msgstr "Englisch"
#: global_settings.py:38
msgid "French"
msgstr ""
msgstr "Französisch"
#: agenda/forms.py:28
msgid "Parent item"
@ -185,7 +185,7 @@ msgstr "Abbrechen"
#: agenda/templates/agenda/edit.html:27
#: assignment/templates/assignment/edit.html:29
#: assignment/templates/assignment/poll_view.html:69
#: assignment/templates/assignment/view.html:83
#: assignment/templates/assignment/view.html:92
#: motion/templates/motion/edit.html:29
#: motion/templates/motion/poll_view.html:55
#: participant/templates/participant/edit.html:34
@ -227,8 +227,8 @@ 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:184
#: assignment/templates/assignment/view.html:188
#: assignment/views.py:577 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
@ -239,7 +239,7 @@ msgid "Yes"
msgstr "Ja"
#: agenda/templates/agenda/overview.html:47 assignment/models.py:302
#: assignment/views.py:578 assignment/templates/assignment/view.html:185
#: 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
#: motion/templates/motion/view.html:80
@ -299,7 +299,7 @@ msgid "Preview"
msgstr "Vorschau"
#: agenda/templates/agenda/widget.html:23
#: assignment/templates/assignment/view.html:148
#: assignment/templates/assignment/view.html:132
#: assignment/templates/assignment/widget.html:11
#: motion/templates/motion/widget.html:11
#: participant/templates/participant/group_widget.html:11
@ -309,7 +309,7 @@ msgid "Delete"
msgstr "Löschen"
#: agenda/templates/agenda/widget.html:26
#: assignment/templates/assignment/view.html:147
#: assignment/templates/assignment/view.html:131
#: assignment/templates/assignment/widget.html:14
#: motion/templates/motion/widget.html:14
#: participant/templates/participant/group_widget.html:14
@ -484,7 +484,7 @@ msgid "Election was successfully modified."
msgstr "Wahl wurde erfolgreich geändert."
#: assignment/views.py:138 motion/views.py:257 motion/views.py:663
#: participant/views.py:492 participant/views.py:515 utils/views.py:225
#: 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."
msgstr "Bitte kontrollieren Sie das Formular nach Fehlern."
@ -553,7 +553,7 @@ msgid "not elected"
msgstr "nicht gewählt"
#: assignment/views.py:298 assignment/views.py:481
#: assignment/templates/assignment/overview.html:35
#: assignment/templates/assignment/view.html:48
msgid "elected"
msgstr "gewählt"
@ -565,7 +565,7 @@ msgstr "Abstimmung wurde erfolgreich gelöscht."
msgid "Assignment"
msgstr "Wahl"
#: assignment/views.py:358 assignment/templates/assignment/overview.html:58
#: assignment/views.py:358 assignment/templates/assignment/overview.html:59
#: assignment/templates/assignment/widget.html:23
msgid "No assignments available."
msgstr "Keine Wahlen vorhanden."
@ -578,8 +578,8 @@ msgstr "Wahlen: %s"
#: assignment/views.py:389 assignment/views.py:422
#: assignment/templates/assignment/overview.html:26
#: assignment/templates/assignment/poll_view.html:18
#: assignment/templates/assignment/view.html:36
#: assignment/templates/assignment/view.html:136
#: assignment/templates/assignment/view.html:37
#: assignment/templates/assignment/view.html:120
#: assignment/templates/projector/Assignment.html:38
#: assignment/templates/projector/Assignment.html:56
msgid "Candidates"
@ -594,8 +594,7 @@ msgstr "Abstimmungsergebnis"
#: assignment/templates/assignment/base_assignment.html:71
#: assignment/templates/assignment/poll_view.html:5
#: assignment/templates/assignment/poll_view.html:8
#: assignment/templates/assignment/view.html:130
#: assignment/templates/assignment/view.html:139
#: assignment/templates/assignment/view.html:123
#: assignment/templates/projector/Assignment.html:59
msgid "ballot"
msgstr "Wahlgang"
@ -616,17 +615,17 @@ msgstr ""
"E: %(ABSTAIN)s"
#: assignment/views.py:454 assignment/templates/assignment/poll_view.html:35
#: assignment/templates/assignment/view.html:203
#: assignment/templates/projector/Assignment.html:97
#: 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/templates/assignment/view.html:220
#: assignment/templates/assignment/view.html:225
#: assignment/templates/projector/Assignment.html:111
#: assignment/templates/projector/Assignment.html:117 motion/views.py:804
#: 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
#: motion/templates/motion/poll_view.html:35
#: motion/templates/motion/view.html:84
#: motion/templates/projector/Motion.html:42 poll/models.py:76
@ -660,7 +659,7 @@ 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:186
#: 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
#: motion/templates/projector/Motion.html:39
@ -692,17 +691,17 @@ msgstr "Wahl anzeigen"
#: assignment/templates/assignment/base_assignment.html:39
#: assignment/templates/assignment/edit.html:8
#: assignment/templates/assignment/edit.html:17
#: assignment/templates/assignment/overview.html:49
#: assignment/templates/assignment/overview.html:50
msgid "Edit election"
msgstr "Wahl bearbeiten"
#: assignment/templates/assignment/base_assignment.html:44
#: assignment/templates/assignment/overview.html:50
#: assignment/templates/assignment/overview.html:51
msgid "Delete election"
msgstr "Wahl löschen"
#: assignment/templates/assignment/base_assignment.html:50
#: assignment/templates/assignment/overview.html:52
#: assignment/templates/assignment/overview.html:53
msgid "Election as PDF"
msgstr "Wahl als PDF"
@ -739,14 +738,21 @@ msgstr[0] "Wahl"
msgstr[1] "Wahlen"
#: assignment/templates/assignment/overview.html:35
msgid "posts"
msgstr "Posten"
#, python-format
msgid "posts: %(posts)s"
msgstr "Posten: %(posts)s"
#: assignment/templates/assignment/overview.html:37
msgid "candidates"
msgstr "Kandidaten/innen"
#, python-format
msgid "candidates: %(candidates)s"
msgstr "Kandidaten/innen: %(candidates)s"
#: assignment/templates/assignment/overview.html:44
#: assignment/templates/assignment/overview.html:39
#, python-format
msgid "elected: %(elected)s"
msgstr "Gewählt: %(elected)s"
#: assignment/templates/assignment/overview.html:45
msgid "Activate election"
msgstr "Wahl projizieren"
@ -779,84 +785,74 @@ msgstr "Stimmzettel als PDF"
msgid "Change status"
msgstr "Status ändern"
#: assignment/templates/assignment/view.html:43
#: assignment/templates/assignment/view.html:99
#: assignment/templates/assignment/view.html:113
#: assignment/templates/assignment/view.html:44
#: assignment/templates/assignment/view.html:106
msgid "Remove candidate"
msgstr "Kandidate/in entfernen"
#: assignment/templates/assignment/view.html:48
#: assignment/templates/assignment/view.html:51
msgid "Mark candidate as not elected"
msgstr "Kandidat/in als nicht gewählt markieren"
#: assignment/templates/assignment/view.html:57
#: assignment/templates/projector/Assignment.html:44
msgid "No candidates available."
msgstr "Keine Kandidaten/innen vorhanden."
#: assignment/templates/assignment/view.html:60
#: assignment/templates/assignment/view.html:69
msgid "Withdraw self candidature"
msgstr "Eigene Kandidatur zurückziehen"
#: assignment/templates/assignment/view.html:66
#: assignment/templates/assignment/view.html:75
msgid "Self candidature"
msgstr "Selbst kandidieren"
#: assignment/templates/assignment/view.html:77
#: assignment/templates/assignment/view.html:86
msgid "Add new participant"
msgstr "Neue/n Teilnehmer/in hinzufügen"
#: assignment/templates/assignment/view.html:92
msgid "Elected Candidates"
msgstr "Gewählte Kandidaten/innen"
#: assignment/templates/assignment/view.html:104
msgid "No elected candidates available."
msgstr "Keine gewählten Kandidaten/innen vorhanden."
#: assignment/templates/assignment/view.html:109
#: assignment/templates/assignment/view.html:102
msgid "Blocked Candidates"
msgstr "Blockierte Kandidaten/innen"
#: assignment/templates/assignment/view.html:116
#: assignment/templates/assignment/view.html:109
msgid "No blocked candidates available."
msgstr "Keine blockierten Kandidaten/innen vorhanden."
#: assignment/templates/assignment/view.html:121
#: assignment/templates/assignment/view.html:115
#: assignment/templates/projector/Assignment.html:52
msgid "Election results"
msgstr "Wahlergebnisse"
#: assignment/templates/assignment/view.html:144
#: assignment/templates/assignment/view.html:128
msgid "Publish/unpublish results"
msgstr "Ergebnisse veröffentlichen/unveröffentlichen"
#: assignment/templates/assignment/view.html:156
#: assignment/templates/assignment/view.html:244
#: assignment/templates/assignment/view.html:140
#: assignment/templates/assignment/view.html:223
msgid "New ballot"
msgstr "Neuer Wahlgang"
#: assignment/templates/assignment/view.html:171
#: assignment/templates/assignment/view.html:155
#: assignment/templates/projector/Assignment.html:69
msgid "Candidate is elected"
msgstr "Kandidat/in ist gewählt"
#: assignment/templates/assignment/view.html:190
#: assignment/templates/assignment/view.html:174
#: assignment/templates/projector/Assignment.html:84
msgid "was not a <br> candidate"
msgstr "war kein Kandidat"
#: assignment/templates/assignment/view.html:208
#: assignment/templates/projector/Assignment.html:101 motion/views.py:804
#: assignment/templates/assignment/view.html:191
#: assignment/templates/projector/Assignment.html:100 motion/views.py:804
#: motion/templates/motion/view.html:82
#: motion/templates/projector/Motion.html:40
msgid "Invalid"
msgstr "Ungültig"
#: assignment/templates/assignment/view.html:239
#: assignment/templates/projector/Assignment.html:128
msgid "No ballots available."
msgstr "Keine Wahlgänge vorhanden."
#: assignment/templates/projector/Assignment.html:126
msgid "Vote results are not published yet."
msgstr "Wahlergebnisse sind noch nicht veröffentlicht."
#: assignment/templates/assignment/view.html:219
msgid "No results available."
msgstr "Keine Ergebnisse vorhanden."
#: config/forms.py:24
msgid "Event name"
@ -902,23 +898,18 @@ msgstr "Willkommen bei OpenSlides"
msgid "[Place for your welcome text.]"
msgstr "[Platz für Ihren Begrüßungstext.]"
#: config/models.py:92
#, python-format
msgid "Get professional support for OpenSlides on %s."
msgstr "Professionelle Unterstützung für OpenSlides gibt es unter %s."
#: config/models.py:107
#: config/models.py:103
msgid "General"
msgstr "Allgemein"
#: config/models.py:131 config/templates/config/version.html:5
#: config/models.py:127 config/templates/config/version.html:5
#: config/templates/config/version.html:8
#: config/templates/config/version.html:11 motion/views.py:789
#: motion/templates/motion/view.html:214 motion/templates/motion/view.html:244
msgid "Version"
msgstr "Version"
#: config/views.py:79
#: config/views.py:78
msgid ""
"Anonymous access enabled. Please modify the \"Anonymous\" group to fit your "
"required permissions."
@ -926,11 +917,11 @@ msgstr ""
"Anonymer Zugriff aktiviert. Bitte setzen Sie die Rechte der Gruppe "
"\"Anonymous\" passend zum gewünschten Zugriffslevel."
#: config/views.py:85
#: config/views.py:84
msgid "General settings successfully saved."
msgstr "Allgemeine Einstellungen erfolgreich gespeichert."
#: config/views.py:120 config/templates/config/base_config.html:7
#: config/views.py:119 config/templates/config/base_config.html:7
msgid "Configuration"
msgstr "Konfiguration"
@ -944,8 +935,8 @@ msgid "Event"
msgstr "Veranstaltung"
#: config/templates/config/general.html:26
msgid "Frontpage"
msgstr "Startseite"
msgid "Welcome Widget"
msgstr "Willkommens-Widget"
#: config/templates/config/general.html:41
msgid "System"
@ -1706,7 +1697,7 @@ msgstr "Keine Abstimmungsergebnisse vorhanden."
msgid "Participant"
msgstr "Teilnehmer"
#: participant/forms.py:26 participant/views.py:590
#: participant/forms.py:26 participant/views.py:604
#: participant/templates/participant/group_overview.html:7
#: participant/templates/participant/group_overview.html:10
#: participant/templates/participant/user_detail.html:14
@ -1718,7 +1709,7 @@ msgstr "Gruppen"
msgid "Permissions"
msgstr "Rechte"
#: participant/forms.py:47 participant/views.py:530 participant/views.py:576
#: participant/forms.py:47 participant/views.py:544 participant/views.py:590
#: participant/templates/participant/base_participant.html:12
#: participant/templates/participant/overview.html:7
#: participant/templates/participant/overview.html:18
@ -1777,8 +1768,8 @@ msgstr "Gast"
#: participant/models.py:44 participant/templates/participant/overview.html:30
#: participant/templates/participant/overview.html:68
msgid "Detail"
msgstr "Detail"
msgid "Structure level"
msgstr "Gliederungsebene"
#: participant/models.py:45
msgid "Will be shown after the name."
@ -1798,7 +1789,7 @@ msgstr "Nur zum Filtern der Teilnehmerliste."
msgid "Typ"
msgstr "Typ"
#: participant/models.py:53 participant/views.py:245
#: participant/models.py:53 participant/views.py:259
#: participant/templates/participant/overview.html:45
#: participant/templates/participant/overview.html:70
#: participant/templates/participant/user_detail.html:34
@ -1843,81 +1834,97 @@ msgstr "Zum Beispiel als Antragsteller."
msgid "Welcome to OpenSlides!"
msgstr "Willkommen bei OpenSlides!"
#: participant/views.py:240
#: participant/views.py:210
msgid "You can not delete yourself."
msgstr "Sie dürfen sich nicht selbst löschen."
#: participant/views.py:212
msgid "You can not delete the administrator."
msgstr "Sie dürfen den Administrator nicht löschen."
#: participant/views.py:232
msgid "You can not deactivate yourself."
msgstr "Sie dürfen sich nicht selbst deaktivieren."
#: participant/views.py:235
msgid "You can not deactivate the administrator."
msgstr "Sie dürfen den Administrator nicht deaktivieren."
#: participant/views.py:254
msgid "Participant-list"
msgstr "Teilnehmerliste"
#: participant/views.py:241
#: participant/views.py:255
msgid "List of Participants"
msgstr "Teilnehmerliste"
#: participant/views.py:244 participant/templates/participant/overview.html:67
#: participant/views.py:258 participant/templates/participant/overview.html:67
msgid "Last Name"
msgstr "Nachname"
#: participant/views.py:244 participant/templates/participant/overview.html:66
#: participant/views.py:258 participant/templates/participant/overview.html:66
msgid "First Name"
msgstr "Vorname"
#: participant/views.py:244
#: participant/views.py:258
#: participant/templates/participant/group_overview.html:13
msgid "Group"
msgstr "Gruppe"
#: participant/views.py:244 participant/templates/participant/overview.html:37
#: 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"
#: participant/views.py:276
#: participant/views.py:290
msgid "Participant-passwords"
msgstr "Teilnehmer-Passwoerter"
#: participant/views.py:298
#: participant/views.py:312
msgid "Account for OpenSlides"
msgstr "Zugang für OpenSlides"
#: participant/views.py:300
#: participant/views.py:314
#, python-format
msgid "for %s"
msgstr "für %s"
#: participant/views.py:303
#: participant/views.py:317
#, python-format
msgid "User: %s"
msgstr "Nutzername: %s"
#: participant/views.py:307
#: participant/views.py:321
#, python-format
msgid "Password: %s"
msgstr "Passwort: %s"
#: participant/views.py:312
#: participant/views.py:326
#, python-format
msgid "URL: %s"
msgstr "URL: %s"
#: participant/views.py:354
#: participant/views.py:368
#, python-format
msgid "%d new participants were successfully imported."
msgstr "%d neue Teilnehmer/innen wurden erfolgreich importiert."
#: participant/views.py:365
#: participant/views.py:379
msgid "Do you really want to reset the password?"
msgstr "Soll das Passwort wirklich zurückgesetzt werden?"
#: participant/views.py:378
#: participant/views.py:392
#, python-format
msgid "The Password for %s was successfully reset."
msgstr "Das Passwort für %s wurde erfolgreich zurückgesetzt."
#: participant/views.py:457
#: participant/views.py:471
msgid "Participants settings successfully saved."
msgstr "Teilnehmer/innen-Einstellungen wurden erfolgreich gespeichert."
#: participant/views.py:467
#: participant/views.py:481
#, python-format
msgid ""
"Installation was successfully! Use %(user)s (password: %(password)s) for "
@ -1930,15 +1937,15 @@ msgstr ""
"Sie das Passwort nach der ersten Anmeldung! Anderenfalls erscheint diese "
"Meldung weiterhin für alle und ist ein Sicherheitsrisiko."
#: participant/views.py:490
#: participant/views.py:504
msgid "User settings successfully saved."
msgstr "Nutzereinstellungen wurden erfolgreich gespeichert."
#: participant/views.py:512
#: participant/views.py:526
msgid "Password successfully changed."
msgstr "Passwort wurde erfolgreich geändert."
#: participant/views.py:562
#: participant/views.py:576
msgid "My motions and elections"
msgstr "Meine Anträge und Wahlen"
@ -1988,7 +1995,7 @@ msgid "Edit participant"
msgstr "Teilnehmer/in bearbeiten"
#: participant/templates/participant/base_participant.html:50
#: participant/templates/participant/overview.html:97
#: participant/templates/participant/overview.html:98
msgid "Delete participant"
msgstr "Teilnehmer/in löschen"
@ -2092,15 +2099,15 @@ msgstr "von"
msgid "Last Login"
msgstr "Letzer Login"
#: participant/templates/participant/overview.html:99
#: participant/templates/participant/overview.html:100
msgid "Change status to inactive"
msgstr "Status ändern auf inaktiv"
#: participant/templates/participant/overview.html:102
#: participant/templates/participant/overview.html:103
msgid "Change status to active"
msgstr "Status ändern auf aktiv"
#: participant/templates/participant/overview.html:111
#: participant/templates/participant/overview.html:113
#: participant/templates/participant/user_widget.html:22
msgid "No participants available."
msgstr "Keine Teilnehmer/innen vorhanden."
@ -2171,31 +2178,28 @@ msgstr "Darf den Projektor sehen"
msgid "Can see the dashboard"
msgstr "Darf das Dashboard sehen"
#: projector/views.py:204
#: projector/views.py:206
msgid "Errors in the form"
msgstr "Fehler im Formular"
#: projector/views.py:383 projector/templates/projector/dashboard.html:17
#: projector/views.py:384 projector/templates/projector/base_projector.html:7
#: projector/templates/projector/base_projector.html:12
#: projector/templates/projector/dashboard.html:17
msgid "Dashboard"
msgstr "Dashboard"
#: projector/views.py:411
#: projector/views.py:412
msgid "Projector live view"
msgstr "Projektor-Live-Ansicht"
#: projector/views.py:437
#: projector/views.py:439
msgid "Overlays"
msgstr "Einblendungen"
#: projector/views.py:450
#: projector/views.py:452
msgid "Custom Slides"
msgstr "Benutzerdefinierte Folien"
#: projector/templates/projector/base_projector.html:7
#: projector/templates/projector/base_projector.html:12
msgid "Projector"
msgstr "Projektor"
#: projector/templates/projector/base_projector.html:15
msgid "Overview"
msgstr "Übersicht"
@ -2207,7 +2211,6 @@ msgid "Select widgets"
msgstr "Widgets auswählen"
#: projector/templates/projector/base_projector.html:22
#: templates/front_page.html:25
msgid "Projector view"
msgstr "Projektor-Ansicht"
@ -2245,27 +2248,23 @@ msgstr "Willkommensseite"
msgid "New slide"
msgstr "Neue Folie"
#: projector/templates/projector/dashboard.html:21
msgid "Adjust projector view"
msgstr "Projektor-Ansicht anpassen"
#: projector/templates/projector/dashboard.html:22
#: projector/templates/projector/live_view_widget.html:10
msgid "Zoom in"
msgstr "Vergrößern"
#: projector/templates/projector/dashboard.html:25
#: projector/templates/projector/live_view_widget.html:13
msgid "Zoom out"
msgstr "Verkleinern"
#: projector/templates/projector/dashboard.html:28
#: projector/templates/projector/live_view_widget.html:18
msgid "Scroll text up"
msgstr "Text nach oben scrollen"
#: projector/templates/projector/dashboard.html:31
#: projector/templates/projector/live_view_widget.html:21
msgid "Scroll text down"
msgstr "Text nach unten scrollen"
#: projector/templates/projector/dashboard.html:34
#: projector/templates/projector/live_view_widget.html:26
msgid "Reset projector view"
msgstr "Projektor-Ansicht zurücksetzen"
@ -2286,8 +2285,7 @@ msgstr "Seite nicht gefunden."
msgid "Server Error"
msgstr "Serverfehler"
#: templates/base.html:21 templates/front_page.html:6
#: templates/front_page.html.py:22
#: templates/base.html:21
msgid "Home"
msgstr "Startseite"
@ -2299,20 +2297,20 @@ msgstr "Abmelden"
msgid "Welcome"
msgstr "Willkommen"
#: templates/front_page.html:12
msgid "You have access to the following pages:"
msgstr "Sie haben Zugriff auf folgende Seiten:"
#: templates/base.html:79
msgid ""
"Get <a href='http://openslides.org/support' target='_blank'>professional "
"support</a> for OpenSlides."
msgstr ""
"Nutzen Sie unseren <a href='http://openslides.org/support' "
"target='_blank'>professionellen Support</a> für OpenSlides."
#: utils/pdf.py:225
msgid "%Y-%m-%d %H:%Mh"
msgstr "%d.%m.%Y %H:%Mh"
#: utils/pdf.py:226
#: utils/pdf.py:227
#, python-format
msgid "Printed: %s"
msgstr "Gedruckt am: %s"
msgid "As of: %s"
msgstr "Stand: %s"
#: utils/pdf.py:237 utils/pdf.py:246
#: utils/pdf.py:238 utils/pdf.py:247
#, python-format
msgid "Page %s"
msgstr "Seite %s"
@ -2356,3 +2354,9 @@ msgstr "undefinierter-dateiname"
#: utils/jsonfield/fields.py:21
msgid "Enter valid JSON"
msgstr "Gebe valides JSON ein"
#~ msgid "posts"
#~ msgstr "Posten"
#~ msgid "candidates"
#~ msgstr "Kandidaten/innen"

View File

@ -615,7 +615,7 @@ def motion_import(request):
user.last_name = last_name
user.first_name = first_name
user.username = gen_username(first_name, last_name)
user.detail = ''
user.structure_level = ''
user.committee = ''
user.gender = ''
user.type = ''

View File

@ -71,7 +71,7 @@ def import_users(csv_file):
dialect=dialect)):
if line_no:
try:
(first_name, last_name, gender, detail, type, committee, comment) = line[:7]
(first_name, last_name, gender, structure_level, type, committee, comment) = line[:7]
except ValueError:
error_messages.append(_('Ignoring malformed line %d in import file.') % line_no + 1)
continue
@ -80,7 +80,7 @@ def import_users(csv_file):
user.first_name = first_name
user.username = gen_username(first_name, last_name)
user.gender = gender
user.detail = detail
user.structure_level = structure_level
user.type = type
user.committee = committee
user.comment = comment

View File

@ -27,7 +27,7 @@ class UserCreateForm(forms.ModelForm, CssClassMixin):
class Meta:
model = User
fields = ('first_name', 'last_name', 'is_active', 'groups', 'detail',
fields = ('first_name', 'last_name', 'is_active', 'groups', 'structure_level',
'gender', 'type', 'committee', 'about_me', 'comment', 'default_password')
@ -35,7 +35,7 @@ class UserUpdateForm(UserCreateForm):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'is_active', 'groups',
'detail', 'gender', 'type', 'committee', 'about_me', 'comment',
'structure_level', 'gender', 'type', 'committee', 'about_me', 'comment',
'default_password')

View File

@ -40,8 +40,8 @@ class User(DjangoUser, PersonMixin, Person, SlideMixin):
)
django_user = models.OneToOneField(DjangoUser, editable=False, parent_link=True)
detail = models.CharField(
max_length=100, blank=True, default='', verbose_name=_("Detail"),
structure_level = models.CharField(
max_length=100, blank=True, default='', verbose_name=_("Structure level"),
help_text=_('Will be shown after the name.'))
gender = models.CharField(
max_length=50, choices=GENDER_CHOICES, blank=True,
@ -67,10 +67,10 @@ class User(DjangoUser, PersonMixin, Person, SlideMixin):
return self.get_full_name() or self.username
def get_name_suffix(self):
return self.detail
return self.structure_level
def set_name_suffix(self, value):
self.detail = value
self.structure_level = value
name_suffix = property(get_name_suffix, set_name_suffix)

View File

@ -26,11 +26,11 @@
<option value="female"{% if 'female' in sortfilter.gender %} selected{% endif %}>{% trans "Female" %}</option>
<option value=""{% if '' in sortfilter.gender %} selected{% endif %}>{% trans "Not specified" %}</option>
</select>
<select class="default-input" name="detail" onchange="document.forms['filter'].submit()">
<option value="---">-- {% trans "Detail" %} --</option>
{% for detail in details %}
<option value="{{ detail }}"{% if detail in sortfilter.detail %} selected{% endif %}>
{{ detail }}</option>
<select class="default-input" name="structure_level" onchange="document.forms['filter'].submit()">
<option value="---">-- {% trans "Structure level" %} --</option>
{% for level in structure_levels %}
<option value="{{ level }}"{% if level in sortfilter.structure_level %} selected{% endif %}>
{{ level }}</option>
{% endfor %}
</select>
<select class="default-input" name="type" onchange="document.forms['filter'].submit()">
@ -65,7 +65,7 @@
<tr>
<th><a href="?sort=first_name&reverse={% if 'first_name' in sortfilter.sort and 'reverse' not in sortfilter %}1{% else %}---{%endif%}">{% trans "First Name" %}</a></th>
<th><a href="?sort=last_name&reverse={% if 'last_name' in sortfilter.sort and 'reverse' not in sortfilter %}1{% else %}---{%endif%}">{% trans "Last Name" %}</a></th>
<th><a href="?sort=detail&reverse={% if 'detail' in sortfilter.sort and 'reverse' not in sortfilter %}1{% else %}---{%endif%}">{% trans "Detail" %}</a></th>
<th><a href="?sort=structure_level&reverse={% if 'structure_level' in sortfilter.sort and 'reverse' not in sortfilter %}1{% else %}---{%endif%}">{% trans "Structure level" %}</a></th>
<th><a href="?sort=type&reverse={% if 'type' in sortfilter.sort and 'reverse' not in sortfilter %}1{% else %}---{%endif%}">{% trans "Type" %}</a></th>
<th><a href="?sort=committee&reverse={% if 'committee' in sortfilter.sort and 'reverse' not in sortfilter %}1{% else %}---{%endif%}">{% trans "Committee" %}</a></th>
{% if perms.participant.can_manage_participant %}
@ -78,7 +78,7 @@
<tr class="{% cycle '' 'odd' %}">
<td><a href="{% model_url user 'view' %}">{{ user.first_name }}</a></td>
<td><a href="{% model_url user 'view' %}">{{ user.last_name }}</a></td>
<td>{{ user.detail }}</td>
<td>{{ user.structure_level }}</td>
<td>{{ user.get_type_display }}</td>
<td>{{ user.committee }}</td>
{% if perms.participant.can_manage_participant %}

View File

@ -38,7 +38,7 @@ class UserTest(TestCase):
self.assertEqual(unicode(self.user1), 'Max Mustermann')
def test_name_suffix(self):
self.user1.detail = 'München'
self.user1.structure_level = 'München'
self.user1.save()
self.assertEqual(unicode(self.user1), 'Max Mustermann (München)')

View File

@ -71,7 +71,7 @@ class UserOverview(ListView):
except KeyError:
sortfilter = {}
for value in ['gender', 'detail', 'type', 'committee', 'status',
for value in ['gender', 'structure_level', 'type', 'committee', 'status',
'sort', 'reverse']:
if value in self.request.REQUEST:
if self.request.REQUEST[value] == '---':
@ -85,8 +85,8 @@ class UserOverview(ListView):
query = User.objects
if 'gender' in sortfilter:
query = query.filter(gender__iexact=sortfilter['gender'][0])
if 'detail' in sortfilter:
query = query.filter(detail__iexact=sortfilter['detail'][0])
if 'structure_level' in sortfilter:
query = query.filter(structure_level__iexact=sortfilter['structure_level'][0])
if 'type' in sortfilter:
query = query.filter(type__iexact=sortfilter['type'][0])
if 'committee' in sortfilter:
@ -97,7 +97,7 @@ class UserOverview(ListView):
if sortfilter['sort'][0] in ['first_name', 'last_name', 'last_login']:
query = query.order_by(sortfilter['sort'][0])
elif (sortfilter['sort'][0] in
['detail', 'type', 'committee', 'comment']):
['structure_level', 'type', 'committee', 'comment']):
query = query.order_by(
'%s' % sortfilter['sort'][0])
else:
@ -125,8 +125,8 @@ class UserOverview(ListView):
percent = 0
# list of all existing categories
details = [p['detail'] for p in User.objects.values('detail')
.exclude(detail='').distinct()]
structure_levels = [p['structure_level'] for p in User.objects.values('structure_level')
.exclude(structure_level='').distinct()]
# list of all existing committees
committees = [p['committee'] for p in User.objects.values('committee')
.exclude(committee='').distinct()]
@ -135,7 +135,7 @@ class UserOverview(ListView):
'allusers': all_users,
'request_user': self.request.user,
'percent': round(percent, 1),
'details': details,
'structure_levels': structure_levels,
'committees': committees,
'cookie': ['participant_sortfilter', urlencode(decodedict(self.sortfilter),
doseq=True)],
@ -268,8 +268,8 @@ class ParticipantsListPDF(PDFView):
counter,
Paragraph(user.last_name, stylesheet['Tablecell']),
Paragraph(user.first_name, stylesheet['Tablecell']),
Paragraph(user.detail, stylesheet['Tablecell']),
Paragraph(user.type, stylesheet['Tablecell']),
Paragraph(user.structure_level, stylesheet['Tablecell']),
Paragraph(user.get_type_display(), stylesheet['Tablecell']),
Paragraph(user.committee, stylesheet['Tablecell'])])
t = LongTable(data, style=[
('VALIGN', (0, 0), (-1, -1), 'TOP'),

View File

@ -15,27 +15,6 @@
{% block content %}
<h1>{% trans 'Dashboard' %}</h1>
{% if perms.projector.can_manage_projector %}
<div style="text-align: right; padding: 0 10px 5px 0; margin-top:-20px;">
<!-- control projector view -->
{% trans "Adjust projector view" %}:
<a class="projector_edit" href="{% url projector_bigger %}" title="{% trans 'Zoom in' %}">
<img src="{% static 'images/icons/zoom-in.png' %}" />
</a>
<a class="projector_edit" href="{% url projector_smaller %}" title="{% trans 'Zoom out' %}">
<img src="{% static 'images/icons/zoom-out.png' %}" />
</a>
<a class="projector_edit" href="{% url projector_up %}" title="{% trans 'Scroll text up' %}">
<img src="{% static 'images/icons/go-up.png' %}" />
</a>
<a class="projector_edit" href="{% url projector_down %}" title="{% trans 'Scroll text down' %}">
<img src="{% static 'images/icons/go-down.png' %}" />
</a>
<a class="projector_edit" href="{% url projector_clean %}" title="{% trans 'Reset projector view' %}">
<img src="{% static 'images/icons/view-reset.png' %}" />
</a>
</div>
{% endif %}
<div class="column" id="col1">
{% for name, widget in widgets.items %}

View File

@ -4,6 +4,5 @@
{% load i18n %}
{% block content %}
<h1>{% get_config 'frontpage_title' %}</h1>
{% get_config 'frontpage_welcometext' %}
<div class="item_fullscreen">{% get_config 'welcome_title' %}</div>
{% endblock %}

View File

@ -1,7 +1,36 @@
{% load i18n %}
{% load tags %}
{% load staticfiles %}
<!-- projector control buttons -->
{% if perms.projector.can_manage_projector %}
<div style="float: right;">
<p>
<a class="projector_edit" href="{% url projector_bigger %}" title="{% trans 'Zoom in' %}">
<img src="{% static 'images/icons/zoom-in.png' %}" />
</a><br>
<a class="projector_edit" href="{% url projector_smaller %}" title="{% trans 'Zoom out' %}">
<img src="{% static 'images/icons/zoom-out.png' %}" />
</a>
</p>
<p>
<a class="projector_edit" href="{% url projector_up %}" title="{% trans 'Scroll text up' %}">
<img src="{% static 'images/icons/go-up.png' %}" />
</a><br>
<a class="projector_edit" href="{% url projector_down %}" title="{% trans 'Scroll text down' %}">
<img src="{% static 'images/icons/go-down.png' %}" />
</a>
</p>
<p>
<a class="projector_edit" href="{% url projector_clean %}" title="{% trans 'Reset projector view' %}">
<img src="{% static 'images/icons/view-reset.png' %}" />
</a>
</p>
</div>
{% endif %}
<!-- projector view -->
<a href="{% url projector_show %}" target="_blank">
<div id="iframewrapper">
<iframe id="iframe" src="{% url projector_show %}" frameborder="0"></iframe>

View File

@ -22,6 +22,7 @@ from django.db import transaction
from django.db.models import Q
from django.dispatch import receiver
from django.shortcuts import redirect
from django.template import RequestContext
from django.utils.datastructures import SortedDict
from django.utils.importlib import import_module
from django.utils.translation import ugettext_lazy as _
@ -396,10 +397,10 @@ def get_widgets(request):
# welcome widget
context = {
'welcometext': config['frontpage_welcometext']}
'welcometext': config['welcome_text']}
widgets.append(Widget(
name='welcome',
display_name=config['frontpage_title'],
display_name=config['welcome_title'],
template='projector/welcome_widget.html',
context=context,
permission_required='projector.can_see_dashboard',
@ -410,6 +411,7 @@ def get_widgets(request):
name='live_view',
display_name=_('Projector live view'),
template='projector/live_view_widget.html',
context = RequestContext(request, {}),
permission_required='projector.can_see_projector',
default_column=2))

View File

@ -76,7 +76,7 @@
{% endblock %}
<div id="footer">
<small>
&copy; Copyright 2011-2012 | Powered by <a href="http://openslides.org" target="_blank">OpenSlides</a> | Get <a href="http://openslides.org/support" target="_blank">professional support</a> for OpenSlides.
&copy; Copyright 2011-2012 | Powered by <a href="http://openslides.org" target="_blank">OpenSlides</a> | {% trans "Get <a href='http://openslides.org/support' target='_blank'>professional support</a> for OpenSlides." %}
</small>
</div>
</div>

View File

@ -1,29 +0,0 @@
{% extends "base.html" %}
{% load i18n %}
{% load staticfiles %}
{% block title %}{{ block.super }} {% trans "Home" %}{% endblock %}
{% block content %}
<h1>{{ title }}</h1>
<p>{{ welcometext|safe|linebreaks }}</p>
{% trans "You have access to the following pages:" %}
<ul>
{% for app in apps %}
<li><a href="{{ app.url }}">{{ app.title }}</a></li>
{% endfor %}
</ul>
{% endblock %}
{% block submenu %}
{% if perms.projector.can_see_projector %}
<h4 class="sectiontitle">{% trans "Home" %}</h4>
<ul>
<li>
<a href="{% url projector_show %}"><img src="{% static 'images/icons/projector.png' %}"> {% trans 'Projector view' %}</a>
</li>
</ul>
{% endif %}
{% endblock %}

View File

@ -13,17 +13,17 @@
from django.conf import settings
from django.conf.urls.defaults import patterns, url, include
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.core.urlresolvers import reverse_lazy
from django.shortcuts import redirect
from django.utils.importlib import import_module
from openslides.utils.views import FrontPage
from openslides.utils.views import RedirectView
handler500 = 'openslides.utils.views.server_error'
urlpatterns = patterns('',
# frontpage
(r'^$', FrontPage.as_view()),
# Redirect to dashboard URL
url(r'^$', RedirectView.as_view(url=reverse_lazy('dashboard')), name='home',),
(r'^agenda/', include('openslides.agenda.urls')),
(r'^motion/', include('openslides.motion.urls')),

View File

@ -20,6 +20,7 @@ from reportlab.pdfbase.ttfonts import TTFont
from reportlab.rl_config import defaultPageSize
from django.conf import settings
from django.utils import formats
# Import gettext for python 2.5 support
from django.utils.translation import ugettext as _, gettext
@ -222,8 +223,8 @@ def firstPage(canvas, doc):
# time
canvas.setFont('Ubuntu', 7)
time = datetime.now().strftime(gettext("%Y-%m-%d %H:%Mh"))
canvas.drawString(15 * cm, 28 * cm, _("Printed: %s") % time)
time = formats.date_format(datetime.now(), 'DATETIME_FORMAT')
canvas.drawString(15 * cm, 28 * cm, _("As of: %s") % time)
# title
if doc.title:

View File

@ -358,33 +358,6 @@ class PDFView(PermissionMixin, View):
return self.render_to_response(self.get_filename())
class FrontPage(TemplateView):
template_name = 'front_page.html'
def has_permission(self, request):
if request.user.is_authenticated() or config['system_enable_anonymous']:
return True
return False
def get_context_data(self, **kwargs):
context = super(FrontPage, self).get_context_data(**kwargs)
apps = []
for app in settings.INSTALLED_APPS:
try:
mod = import_module(app + '.views')
tab = mod.register_tab(self.request)
except (ImportError, AttributeError):
continue
if tab.permission:
apps.append(tab)
context.update({
'apps': apps,
'title': config['frontpage_title'],
'welcometext': config['frontpage_welcometext'],
})
return context
def server_error(request, template_name='500.html'):
"""
500 error handler.