Merge pull request #663 from emanuelschuetze/template-improvement3

More template improvements and translation updates.
This commit is contained in:
Emanuel Schütze 2013-05-16 13:28:25 -07:00
commit 60bce17728
19 changed files with 494 additions and 494 deletions

View File

@ -2,6 +2,7 @@
{% load i18n %} {% load i18n %}
{% load staticfiles %} {% load staticfiles %}
{% load tags %}
{% block title %}{{ block.super }} {% trans "Election" %} "{{ assignment }}"{% endblock %} {% block title %}{{ block.super }} {% trans "Election" %} "{{ assignment }}"{% endblock %}
@ -18,36 +19,32 @@
{{ assignment }} {{ assignment }}
<small class="pull-right"> <small class="pull-right">
<a href="{% url 'assignment_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a> <a href="{% url 'assignment_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a>
<a href="{% url 'print_assignment' assignment.id %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'Print election as PDF' %}"><i class="icon-print"></i> PDF</a>
<!-- activate projector --> <!-- activate projector -->
{% if perms.projector.can_manage_projector %} {% if perms.projector.can_manage_projector %}
<a href="{% url 'projector_activate_slide' assignment.sid %}" class="activate_link btn {% if assignment.active %}btn-primary{% endif %} btn-mini" rel="tooltip" data-original-title="{% trans 'Show election' %}"> <a href="{% url 'projector_activate_slide' assignment.sid %}" class="activate_link btn {% if assignment.active %}btn-primary{% endif %} btn-mini" rel="tooltip" data-original-title="{% trans 'Show election' %}">
<i class="icon-facetime-video {% if assignment.active %}icon-white{% endif %}"></i> <i class="icon-facetime-video {% if assignment.active %}icon-white{% endif %}"></i>
</a> </a>
{% endif %} {% endif %}
{% if perms.assignment.can_manage_assignment or perms.agenda.can_manage_agenda %}
<div class="btn-group"> <div class="btn-group">
<a data-toggle="dropdown" href="#" class="btn btn-mini dropdown-toggle"> <a data-toggle="dropdown" class="btn btn-mini dropdown-toggle">
{% trans 'More actions' %} {% trans 'More actions' %} <span class="caret"></span>
<span class="caret"></span>
</a> </a>
<ul class="dropdown-menu pull-right"> <ul class="dropdown-menu pull-right">
{% if perms.assignment.can_manage_assignment %}
<!-- edit --> <!-- edit -->
<li><a href="{% url 'assignment_edit' assignment.id %}"><i class="icon-pencil"></i> {% trans 'Edit election' %}</a></li> <li><a href="{% url 'assignment_edit' assignment.id %}"><i class="icon-pencil"></i> {% trans 'Edit election' %}</a></li>
<!-- delete --> <!-- delete -->
<li><a href="{% url 'assignment_delete' assignment.id %}"><i class="icon-remove"></i> {% trans 'Delete election' %}</a></li> <li><a href="{% url 'assignment_delete' assignment.id %}"><i class="icon-remove"></i> {% trans 'Delete election' %}</a></li>
<!-- edit poll -->
{% if perms.assignment.can_manage_assignment %}
{% for poll in motion.polls %}
<li><a href="{% url 'assignment_poll_view' poll.id %}"><i class="icon-edit"></i> {{ forloop.counter }}. {% trans "Ballot" %}</a></li>
{% endfor %}
{% endif %} {% endif %}
<!-- create agenda item --> <!-- create agenda item -->
{% if perms.agenda.can_manage_agenda %} {% if perms.agenda.can_manage_agenda %}
<li> <li><a href="{% url 'assignment_create_agenda' assignment.id %}"><i class="icon-plus"></i> {% trans 'New agenda item' %}</a></li>
<a href="{% url 'assignment_create_agenda' assignment.id %}"><i class="icon-plus"></i> {% trans 'New agenda item' %}</a>
</li>
{% endif %} {% endif %}
</ul> </ul>
</div> </div>
{% endif %}
</small> </small>
</h1> </h1>
@ -67,7 +64,7 @@
<ol> <ol>
{% for person in assignment.get_participants %} {% for person in assignment.get_participants %}
<li> <li>
{{ person }} <a href="{% model_url person 'view' %}">{{ person }}</a>
{% if perms.assignment.can_manage_assignment %} {% if perms.assignment.can_manage_assignment %}
{% if assignment.status == "sea" or assignment.status == "vot" %} {% if assignment.status == "sea" or assignment.status == "vot" %}
<a href="{% url 'assignment_delother' assignment.id person.person_id %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'Remove candidate' %}"><i class="icon-remove"></i></a> <a href="{% url 'assignment_delother' assignment.id person.person_id %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'Remove candidate' %}"><i class="icon-remove"></i></a>
@ -126,7 +123,7 @@
<ul> <ul>
{% for person in blocked_candidates %} {% for person in blocked_candidates %}
<li> <li>
{{ person }} <a href="{% model_url person 'view' %}">{{ person }}</a>
<a class="btn btn-mini" href="{% url 'assignment_delother' assignment.id person.person_id %}" title="{% trans 'Remove candidate' %}"> <a class="btn btn-mini" href="{% url 'assignment_delother' assignment.id person.person_id %}" title="{% trans 'Remove candidate' %}">
<i class="icon-ban-circle"></i> <i class="icon-ban-circle"></i>
</a> </a>
@ -196,7 +193,7 @@
<a class="election_link" href="{% url 'assignment_user_elected' assignment.id candidate.person_id %}"></a> <a class="election_link" href="{% url 'assignment_user_elected' assignment.id candidate.person_id %}"></a>
{% endif %} {% endif %}
{% endif %} {% endif %}
{{ candidate }} <a href="{% model_url candidate 'view' %}">{{ candidate }}</a>
</td> </td>
{% for vote in poll_list %} {% for vote in poll_list %}
<td style="white-space:nowrap;"> <td style="white-space:nowrap;">

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: OpenSlides 1.3\n" "Project-Id-Version: OpenSlides 1.3\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-04-23 16:17+0200\n" "POT-Creation-Date: 2013-05-16 00:15+0200\n"
"PO-Revision-Date: 2012-07-28 11:07+0200\n" "PO-Revision-Date: 2012-07-28 11:07+0200\n"
"Last-Translator: Emanuel Schütze <emanuel@intevation.de>\n" "Last-Translator: Emanuel Schütze <emanuel@intevation.de>\n"
"Language: de\n" "Language: de\n"
@ -205,26 +205,26 @@ msgstr "Aktuelle Zeit"
msgid "Close" msgid "Close"
msgstr "Schließen" msgstr "Schließen"
#: agenda/static/javascript/agenda.js:27 #: agenda/static/javascript/agenda.js:17
#, c-format #, c-format
msgid ", of which %s are hidden." msgid ", of which %s are hidden."
msgstr ", davon %s verborgen." msgstr ", davon %s verborgen."
#: static/javascript/dataTables.bootstrap.js:19 #: static/javascript/dataTables.bootstrap.js:19
msgid "_MENU_ participants per page" msgid "_MENU_ entries per page"
msgstr "_MENU_ Teilnehmer/innen pro Seite" msgstr "_MENU_ Einträge pro Seite"
#: static/javascript/dataTables.bootstrap.js:20 #: static/javascript/dataTables.bootstrap.js:20
msgid "Search:" msgid "Search:"
msgstr "Suche:" msgstr "Suche:"
#: static/javascript/dataTables.bootstrap.js:21 #: static/javascript/dataTables.bootstrap.js:21
msgid "Showing _START_ to _END_ of _TOTAL_ participants" msgid "Showing _START_ to _END_ of _TOTAL_ entries"
msgstr "_START_ bis _END_ von _TOTAL_ Teilnehmer/innen" msgstr "_START_ bis _END_ von _TOTAL_ Einträgen"
#: static/javascript/dataTables.bootstrap.js:22 #: static/javascript/dataTables.bootstrap.js:22
msgid "Showing 0 participants" msgid "Showing 0 entries"
msgstr "0 Teilnehmer/innen" msgstr "0 Einträge"
#: static/javascript/dataTables.bootstrap.js:23 #: static/javascript/dataTables.bootstrap.js:23
msgid "(filtered from _MAX_ total entries)" msgid "(filtered from _MAX_ total entries)"
@ -234,18 +234,18 @@ msgstr "(gefiltert von _MAX_ Einträgen)"
msgid "No matching records found" msgid "No matching records found"
msgstr "Keine passenden Einträge gefunden" msgstr "Keine passenden Einträge gefunden"
#: static/javascript/dataTables.bootstrap.js:25 #: static/javascript/dataTables.bootstrap.js:26
msgid "First" msgid "First"
msgstr "Erster" msgstr "Erster"
#: static/javascript/dataTables.bootstrap.js:26 #: static/javascript/dataTables.bootstrap.js:27
msgid "Last" msgid "Last"
msgstr "Letzter" msgstr "Letzter"
#: static/javascript/dataTables.bootstrap.js:27 #: static/javascript/dataTables.bootstrap.js:28
msgid "Next" msgid "Next"
msgstr "Weiter" msgstr "Weiter"
#: static/javascript/dataTables.bootstrap.js:28 #: static/javascript/dataTables.bootstrap.js:29
msgid "Previous" msgid "Previous"
msgstr "Zurück" msgstr "Zurück"

View File

@ -30,7 +30,7 @@
<td>{{ mediafile.filetype }}</td> <td>{{ mediafile.filetype }}</td>
<td>{{ mediafile.get_filesize }}</td> <td>{{ mediafile.get_filesize }}</td>
<td>{{ mediafile.timestamp }}</td> <td>{{ mediafile.timestamp }}</td>
<td>{{ mediafile.uploader }}</td> <td><a href="{% model_url mediafile.uploader 'view' %}">{{ mediafile.uploader }}</a></td>
{% if perms.mediafile.can_manage %} {% if perms.mediafile.can_manage %}
<td> <td>
<span style="width: 1px; white-space: nowrap;"> <span style="width: 1px; white-space: nowrap;">

View File

@ -20,21 +20,21 @@
{% trans "Version" %} {{ motion.version.version_number }} {% trans "Version" %} {{ motion.version.version_number }}
</small> </small>
<small class="pull-right"> <small class="pull-right">
<div class="btn-toolbar">
<a href="{% url 'motion_list' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a> <a href="{% url 'motion_list' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a>
<a href="{% url 'motion_detail_pdf' motion.id %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'Print this motion as PDF' %}"><i class="icon-print"></i> PDF</a> <a href="{% url 'motion_detail_pdf' motion.id %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'Print motion as PDF' %}"><i class="icon-print"></i> PDF</a>
<!-- activate projector --> <!-- activate projector -->
{% if perms.projector.can_manage_projector %} {% if perms.projector.can_manage_projector %}
<a href="{% url 'projector_activate_slide' motion.sid %}" class="activate_link btn {% if motion.active %}btn-primary{% endif %} btn-mini" rel="tooltip" data-original-title="{% trans 'Show motion' %}"> <a href="{% url 'projector_activate_slide' motion.sid %}" class="activate_link btn {% if motion.active %}btn-primary{% endif %} btn-mini" rel="tooltip" data-original-title="{% trans 'Show motion' %}">
<i class="icon-facetime-video {% if motion.active %}icon-white{% endif %}"></i> <i class="icon-facetime-video {% if motion.active %}icon-white{% endif %}"></i>
</a> </a>
{% endif %} {% endif %}
{% if perms.motion.can_manage_motion or perms.agenda.can_manage_agenda %}
<div class="btn-group"> <div class="btn-group">
<a data-toggle="dropdown" href="#" class="btn btn-mini dropdown-toggle"> <a data-toggle="dropdown" class="btn btn-mini dropdown-toggle">
{% trans 'More actions' %} {% trans 'More actions' %} <span class="caret"></span>
<span class="caret"></span>
</a> </a>
<ul class="dropdown-menu pull-right"> <ul class="dropdown-menu pull-right">
{% if perms.motion.can_manage_motion %}
<!-- edit --> <!-- edit -->
{% if allowed_actions.edit %} {% if allowed_actions.edit %}
<li><a href="{% model_url motion 'edit' %}"><i class="icon-pencil"></i> {% trans 'Edit motion' %}</a></li> <li><a href="{% model_url motion 'edit' %}"><i class="icon-pencil"></i> {% trans 'Edit motion' %}</a></li>
@ -43,15 +43,14 @@
{% if allowed_actions.delete %} {% if allowed_actions.delete %}
<li><a href="{% model_url motion 'delete' %}"><i class="icon-remove"></i> {% trans 'Delete motion' %}</a></li> <li><a href="{% model_url motion 'delete' %}"><i class="icon-remove"></i> {% trans 'Delete motion' %}</a></li>
{% endif %} {% endif %}
{% endif %}
<!-- create agenda item --> <!-- create agenda item -->
{% if perms.agenda.can_manage_agenda %} {% if perms.agenda.can_manage_agenda %}
<li> <li><a href="{% url 'motion_create_agenda' motion.id %}"><i class="icon-plus"></i> {% trans 'New agenda item' %}</a></li>
<a href="{% url 'motion_create_agenda' motion.id %}"><i class="icon-plus"></i> {% trans 'New agenda item' %}</a>
</li>
{% endif %} {% endif %}
</ul> </ul>
</div> </div>
</div> {% endif %}
</small> </small>
</h1> </h1>
@ -166,7 +165,7 @@
<!-- Submitter --> <!-- Submitter -->
<h5>{% trans "Submitter" %}:</h5> <h5>{% trans "Submitter" %}:</h5>
{% for submitter in motion.submitter.all %} {% for submitter in motion.submitter.all %}
{{ submitter.person }}{% if not forloop.last %}, {% endif %} <a href="{% model_url submitter.person 'view' %}">{{ submitter }}</a>{% if not forloop.last %}, {% endif %}
{% endfor %} {% endfor %}
<!-- Supporters --> <!-- Supporters -->
@ -177,7 +176,7 @@
{% else %} {% else %}
<ol> <ol>
{% for supporter in motion.supporter.all %} {% for supporter in motion.supporter.all %}
<li>{{ supporter }}</li> <li><a href="{% model_url supporter.person 'view' %}">{{ supporter }}</a></li>
{% endfor %} {% endfor %}
</ol> </ol>
{% endif %} {% endif %}

View File

@ -35,7 +35,7 @@ def gen_username(first_name, last_name):
""" """
generates the username for new users. generates the username for new users.
""" """
testname = "%s_%s" % (first_name.strip(), last_name.strip()) testname = "%s%s" % (first_name.strip(), last_name.strip())
try: try:
User.objects.get(username=testname) User.objects.get(username=testname)
except User.DoesNotExist: except User.DoesNotExist:
@ -43,7 +43,7 @@ def gen_username(first_name, last_name):
i = 0 i = 0
while True: while True:
i += 1 i += 1
testname = "%s_%s_%s" % (first_name, last_name, i) testname = "%s%s%s" % (first_name, last_name, i)
try: try:
User.objects.get(username=testname) User.objects.get(username=testname)
except User.DoesNotExist: except User.DoesNotExist:
@ -110,6 +110,6 @@ def import_users(csv_file):
def get_registered_group(): def get_registered_group():
""" """
Returns the Group 'Registered'. Upper and lower case is possible. Returns the group 'Registered' (pk=2).
""" """
return Group.objects.get(name__iexact='Registered') return Group.objects.get(pk=2)

View File

@ -22,17 +22,12 @@ from openslides.participant.models import User, Group
from openslides.participant.api import get_registered_group from openslides.participant.api import get_registered_group
class UserCreateForm(forms.ModelForm, CssClassMixin): class UserCreateForm(CssClassMixin, forms.ModelForm):
groups = forms.ModelMultipleChoiceField( groups = LocalizedModelMultipleChoiceField(
queryset=Group.objects.exclude(name__iexact='anonymous'), # Hide the built-in groups 'Anonymous' (pk=1) and 'Registered' (pk=2)
label=ugettext_lazy('Groups'), required=False) queryset=Group.objects.exclude(pk=1).exclude(pk=2),
label=ugettext_lazy('Groups'), required=False,
def __init__(self, *args, **kwargs): help_text=ugettext_lazy('Hold down "Control", or "Command" on a Mac, to select more than one.'))
if kwargs.get('instance', None) is None:
initial = kwargs.setdefault('initial', {})
registered = get_registered_group()
initial['groups'] = [registered.pk]
super(UserCreateForm, self).__init__(*args, **kwargs)
class Meta: class Meta:
model = User model = User
@ -109,21 +104,6 @@ class GroupForm(forms.ModelForm, CssClassMixin):
return instance return instance
def clean_name(self):
# Do not allow to change the name "anonymous" or give another group
# this name
data = self.cleaned_data['name']
if self.instance.name.lower() in ['anonymous', 'registered']:
# Editing the anonymous-user
if self.instance.name.lower() != data.lower():
raise forms.ValidationError(
_('You can not edit the name for this group.'))
else:
if data.lower() in ['anonymous', 'registered']:
raise forms.ValidationError(
_('Group name "%s" is reserved for internal use.') % data)
return data
class Meta: class Meta:
model = Group model = Group

View File

@ -10,6 +10,25 @@
<h1>{% trans group.name %} <h1>{% trans group.name %}
<small class="pull-right"> <small class="pull-right">
<a href="{% url 'user_group_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a> <a href="{% url 'user_group_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a>
<!-- activate projector -->
{% if perms.projector.can_manage_projector %}
<a href="{% url 'projector_activate_slide' group.sid %}" class="activate_link btn {% if group.active %}btn-primary{% endif %} btn-mini" rel="tooltip" data-original-title="{% trans 'Show group' %}">
<i class="icon-facetime-video {% if group.active %}icon-white{% endif %}"></i>
</a>
{% endif %}
{% if perms.participant.can_manage_participant and group.pk != 1 and group.pk != 2 %}
<div class="btn-group">
<a data-toggle="dropdown" class="btn btn-mini dropdown-toggle">
{% trans 'More actions' %} <span class="caret"></span>
</a>
<ul class="dropdown-menu pull-right">
<!-- edit -->
<li><a href="{% url 'user_group_edit' group.id %}"><i class="icon-pencil"></i> {% trans 'Edit group' %}</a></li>
<!-- delete -->
<li><a href="{% url 'user_group_delete' group.id %}"><i class="icon-remove"></i> {% trans 'Delete group' %}</a></li>
</ul>
</div>
{% endif %}
</small> </small>
</h1> </h1>
@ -19,7 +38,7 @@
<ol> <ol>
{% for member in group_members %} {% for member in group_members %}
<li>{{ member }}</li> <li><a href="{% model_url member 'view' %}">{{ member }}</a></li>
{% empty %} {% empty %}
<p>{% trans "No members available." %}</p> <p>{% trans "No members available." %}</p>
{% endfor %} {% endfor %}

View File

@ -1,25 +1,44 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load staticfiles %}
{% load tags %} {% load tags %}
{% block title %}{{ block.super }} {% trans "Groups" %}{% endblock %} {% block title %}{{ block.super }} {% trans "Groups" %}{% endblock %}
{% block header %}
<link href="{% static 'styles/dataTables/dataTables.bootstrap.css' %}" type="text/css" rel="stylesheet">
{% endblock %}
{% block javascript %}
<script src="{% static 'javascript/jquery.dataTables.min.js' %}" type="text/javascript"></script>
<script src="{% static 'javascript/dataTables.bootstrap.js' %}" type="text/javascript"></script>
{% endblock %}
{% block content %} {% block content %}
<h1>{% trans "Groups" %} <h1>
{% trans "Groups" %}
<small class="pull-right"> <small class="pull-right">
<a href="{% url 'user_group_new' %}" class="btn btn-mini btn-primary" rel="tooltip" data-original-title="{% trans 'New group' %}"><i class="icon-plus icon-white"></i> {% trans "New" %}</a> <a href="{% url 'user_group_new' %}" class="btn btn-mini btn-primary" rel="tooltip" data-original-title="{% trans 'New group' %}"><i class="icon-plus icon-white"></i> {% trans "New" %}</a>
<a href="{% url 'user_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to participants overview" %}</a> <a href="{% url 'user_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to participants overview" %}</a>
</small> </small>
</h1> </h1>
<table class="table table-striped table-bordered"> <table id="dataTable" class="table table-striped table-bordered">
<thead>
<tr> <tr>
<th class="mini_width">{% trans "ID" %}</th>
<th>{% trans "Group" %}</th> <th>{% trans "Group" %}</th>
<th style="width: 1px;">{% trans "Actions" %}</th> <th class="mini_width">{% trans "Actions" %}</th>
</tr> </tr>
</thead>
{% for group in groups %} {% for group in groups %}
<tr class="{% if group.active %}activeline{% endif %}"> <tr class="{% if group.active %}activeline{% endif %}">
<td class="nobr">{{ group.pk }}
{% if group.pk == 1 or group.pk == 2 %}
<a title="{% blocktrans %}The groups 1 ('Anonymous') and 2 ('Registered') are fixed default groups which can not be deleted. Each created or imported participant is a member of group 2. Use custom groups to set additional permissions for a subset of participants.{% endblocktrans %}"><i class="icon-info-sign"></i></a>
{% endif %}
</td>
<td> <td>
<a href="{% model_url group 'view' %}">{% trans group.name %}</a> <a href="{% model_url group 'view' %}">{% trans group.name %}</a>
</td> </td>
@ -33,7 +52,7 @@
<a href="{% url 'user_group_edit' group.id %}" title="{% trans 'Edit' %}" class="btn btn-mini"> <a href="{% url 'user_group_edit' group.id %}" title="{% trans 'Edit' %}" class="btn btn-mini">
<i class="icon-pencil"></i> <i class="icon-pencil"></i>
</a> </a>
{% if group.name|lower != 'anonymous' and group.name|lower != 'registered' %} {% if group.pk != 1 and group.pk != 2 %}
<a href="{% url 'user_group_delete' group.id %}" title="{% trans 'Delete' %}" class="btn btn-mini"> <a href="{% url 'user_group_delete' group.id %}" title="{% trans 'Delete' %}" class="btn btn-mini">
<i class="icon-remove"></i> <i class="icon-remove"></i>
</a> </a>

View File

@ -3,7 +3,7 @@
<ul style="line-height: 180%"> <ul style="line-height: 180%">
{% for group in groups %} {% for group in groups %}
{% if group.name != 'Anonymous' and group.name != 'Registered' %} {% if group.pk != 1 and group.pk != 2 %}
<li class="{% if group.active %}activeline{% endif %}"> <li class="{% if group.active %}activeline{% endif %}">
<a href="{% url 'projector_activate_slide' group.sid %}" class="activate_link btn {% if group.active %}btn-primary{% endif %} btn-mini" title="{% trans 'Show' %}"> <a href="{% url 'projector_activate_slide' group.sid %}" class="activate_link btn {% if group.active %}btn-primary{% endif %} btn-mini" title="{% trans 'Show' %}">
<i class="icon-facetime-video {% if group.active %}icon-white{% endif %}"></i> <i class="icon-facetime-video {% if group.active %}icon-white{% endif %}"></i>

View File

@ -22,7 +22,6 @@
</li> </li>
<li> <li>
{% trans 'Default groups' %}: {% trans 'Default groups' %}:
{% trans 'Anonymous' %} (<code>1</code>), {% trans 'Registered' %} (<code>2</code>),
{% trans 'Delegate' %} (<code>3</code>), {% trans 'Staff' %} (<code>4</code>) {% trans 'Delegate' %} (<code>3</code>), {% trans 'Staff' %} (<code>4</code>)
</li> </li>
<li>{% trans 'Required CSV file encoding: UTF-8 (Unicode).' %}</li> <li>{% trans 'Required CSV file encoding: UTF-8 (Unicode).' %}</li>

View File

@ -16,39 +16,28 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<h1>{% trans "Participants" %} <h1>
{% trans "Participants" %}
<small class="pull-right"> <small class="pull-right">
<div class="btn-toolbar">
{% if perms.participant.can_manage_participant %} {% if perms.participant.can_manage_participant %}
<a href="{% url 'user_new' %}" class="btn btn-mini btn-primary" rel="tooltip" data-original-title="{% trans 'New participant' %}"><i class="icon-plus icon-white"></i> {% trans "New" %}</a> <a href="{% url 'user_new' %}" class="btn btn-mini btn-primary" rel="tooltip" data-original-title="{% trans 'New participant' %}"><i class="icon-plus icon-white"></i> {% trans "New" %}</a>
<a href="{% url 'user_group_overview' %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'All groups' %}"><i class="icon-group"></i> {% trans "Groups" %}</a> <a href="{% url 'user_group_overview' %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'All groups' %}"><i class="icon-group"></i> {% trans "Groups" %}</a>
<a href="{% url 'user_import' %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'Import participants' %}"><i class="icon-import"></i> {% trans 'Import' %}</a> <a href="{% url 'user_import' %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'Import participants' %}"><i class="icon-import"></i> {% trans 'Import' %}</a>
{% endif %} {% endif %}
{% if perms.participant.can_see_participant and perms.participant.can_manage_participant %} {% if perms.participant.can_see_participant and perms.participant.can_manage_participant %}
<div class="btn-group pull-right"> <div class="btn-group">
{% if user.is_authenticated %} <a data-toggle="dropdown" class="btn btn-mini dropdown-toggle">
<a href="#" data-toggle="dropdown" class="btn btn-mini dropdown-toggle"> <i class="icon-print"></i> PDF <span class="caret"></span>
<i class="icon-print"></i> PDF
<span class="caret"></span>
</a> </a>
<ul class="dropdown-menu"> <ul class="dropdown-menu pull-right">
{% url 'user_settings' as url_usersettings %} {% url 'user_settings' as url_usersettings %}
<li><a href="{% url 'user_print' %}"><i class="icon-list"></i> {% trans 'List of participants' %}</a></li> <li><a href="{% url 'user_print' %}"><i class="icon-list"></i> {% trans 'List of participants' %}</a></li>
<li><a href="{% url 'print_passwords' %}"><i class="icon-th-large"></i> {% trans 'First time passwords' %}</a></li> <li><a href="{% url 'print_passwords' %}"><i class="icon-th-large"></i> {% trans 'First time passwords' %}</a></li>
</ul> </ul>
{% else %}
<a href="{% url 'user_login' %}" class="btn">{% trans "Login" %}</a>
{% endif %}
</div> </div>
{% else %} {% else %}
{% if perms.participant.can_see_participant %}
<a href="{% url 'user_print' %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'Print list of participants as PDF' %}"><i class="icon-print"></i> PDF</a> <a href="{% url 'user_print' %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'Print list of participants as PDF' %}"><i class="icon-print"></i> PDF</a>
{% endif %} {% endif %}
{% if perms.participant.can_manage_participant %}
<a href="{% url 'print_passwords' %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'Print first time passwords as PDF' %}"><i class="icon-print"></i> PDF</a>
{% endif %}
{% endif %}
</div>
</small> </small>
</h1> </h1>
@ -92,7 +81,7 @@
<td class="optional">{{ user.structure_level }}</td> <td class="optional">{{ user.structure_level }}</td>
<td class="optional"> <td class="optional">
{% for group in user.groups.all %} {% for group in user.groups.all %}
{% if group.name != 'Registered' %} {% if group.pk != 2 %}
{% trans group.name %} {% trans group.name %}
{% if not forloop.last %}<br>{% endif %} {% if not forloop.last %}<br>{% endif %}
{% endif %} {% endif %}

View File

@ -7,9 +7,29 @@
{% block content %} {% block content %}
<h1>{{ shown_user.clean_name }} <h1>
{{ shown_user.clean_name }}
<small class="pull-right"> <small class="pull-right">
<a href="{% url 'user_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a> <a href="{% url 'user_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a>
<!-- activate projector -->
{% if perms.projector.can_manage_projector %}
<a href="{% url 'projector_activate_slide' shown_user.sid %}" class="activate_link btn {% if shown_user.active %}btn-primary{% endif %} btn-mini" rel="tooltip" data-original-title="{% trans 'Show participant' %}">
<i class="icon-facetime-video {% if shown_user.active %}icon-white{% endif %}"></i>
</a>
{% endif %}
{% if perms.participant.can_manage_participant %}
<div class="btn-group">
<a data-toggle="dropdown" class="btn btn-mini dropdown-toggle">
{% trans 'More actions' %} <span class="caret"></span>
</a>
<ul class="dropdown-menu pull-right">
<!-- edit -->
<li><a href="{% url 'user_edit' shown_user.id %}"><i class="icon-pencil"></i> {% trans 'Edit participant' %}</a></li>
<!-- delete -->
<li><a href="{% url 'user_delete' shown_user.id %}"><i class="icon-remove"></i> {% trans 'Delete participant' %}</a></li>
</ul>
</div>
{% endif %}
</small> </small>
</h1> </h1>

View File

@ -104,6 +104,17 @@ class UserCreateView(CreateView):
self.object.default_password = gen_password() self.object.default_password = gen_password()
self.object.set_password(self.object.default_password) self.object.set_password(self.object.default_password)
def post_save(self, form):
super(UserCreateView, self).post_save(form)
# TODO: find a better solution that makes the following lines obsolete
# Background: motion.models.use_post_save adds already the registerd group
# to new user but super(..).post_save(form) removes it and sets only the
# groups selected in the form (without 'registered')
# workaround: add registered group again manually
from openslides.participant.api import get_registered_group # TODO: Test, if global import is possible
registered = get_registered_group()
self.object.groups.add(registered)
class UserUpdateView(UpdateView): class UserUpdateView(UpdateView):
""" """
@ -190,7 +201,7 @@ class ParticipantsListPDF(PDFView):
counter += 1 counter += 1
groups = '' groups = ''
for group in user.groups.all(): for group in user.groups.all():
if unicode(group) != "Registered": if group.pk != 2:
groups += "%s<br/>" % unicode(group) groups += "%s<br/>" % unicode(group)
data.append([ data.append([
counter, counter,
@ -400,7 +411,7 @@ class GroupDeleteView(DeleteView):
success_url_name = 'user_group_overview' success_url_name = 'user_group_overview'
def pre_redirect(self, request, *args, **kwargs): def pre_redirect(self, request, *args, **kwargs):
if self.get_object().name.lower() in ['anonymous', 'registered']: if self.get_object().pk in [1, 2]:
messages.error(request, _("You can not delete this Group.")) messages.error(request, _("You can not delete this Group."))
else: else:
super(GroupDeleteView, self).pre_redirect(request, *args, **kwargs) super(GroupDeleteView, self).pre_redirect(request, *args, **kwargs)

View File

@ -19,7 +19,7 @@ $(document).ready(function() {
"sLengthMenu": gettext("_MENU_ entries per page"), "sLengthMenu": gettext("_MENU_ entries per page"),
"sSearch": gettext("Search:"), "sSearch": gettext("Search:"),
"sInfo": gettext("Showing _START_ to _END_ of _TOTAL_ entries"), "sInfo": gettext("Showing _START_ to _END_ of _TOTAL_ entries"),
"sInfoEmpty": gettext("Showing 0 participants"), "sInfoEmpty": gettext("Showing 0 entries"),
"sInfoFiltered": gettext("(filtered from _MAX_ total entries)"), "sInfoFiltered": gettext("(filtered from _MAX_ total entries)"),
"sZeroRecords": gettext("No matching records found"), "sZeroRecords": gettext("No matching records found"),
"oPaginate": { "oPaginate": {

View File

@ -27,7 +27,7 @@ class AnonymousAuth(object):
""" """
Authenticate a user based in username / password. Authenticate a user based in username / password.
- always return None as anonymous can't login.. - always return None as anonymous can't login.
""" """
return None return None
@ -35,13 +35,13 @@ class AnonymousAuth(object):
""" """
Return the permissions a user is graneted by his group membership(s). Return the permissions a user is graneted by his group membership(s).
- try to return the permissions for the 'Anonymous' group - try to return the permissions for the 'Anonymous' group (pk=1).
""" """
if (not user_obj.is_anonymous() or obj is not None or if (not user_obj.is_anonymous() or obj is not None or
not config['system_enable_anonymous']): not config['system_enable_anonymous']):
return set() return set()
perms = Permission.objects.filter(group__name='Anonymous') perms = Permission.objects.filter(group__pk=1)
if perms is None: if perms is None:
return set() return set()
perms = perms.values_list('content_type__app_label', 'codename') \ perms = perms.values_list('content_type__app_label', 'codename') \

View File

@ -76,7 +76,7 @@ class TestMotionCreateView(MotionViewTestCase):
response = self.admin_client.post(self.url, {'title': 'new motion', response = self.admin_client.post(self.url, {'title': 'new motion',
'text': 'motion text', 'text': 'motion text',
'reason': 'motion reason', 'reason': 'motion reason',
'submitter': self.admin}) 'submitter': self.admin.person_id})
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.assertTrue(Motion.objects.filter(versions__title='new motion').exists()) self.assertTrue(Motion.objects.filter(versions__title='new motion').exists())
@ -85,7 +85,7 @@ class TestMotionCreateView(MotionViewTestCase):
response = self.delegate_client.post(self.url, {'title': 'delegate motion', response = self.delegate_client.post(self.url, {'title': 'delegate motion',
'text': 'motion text', 'text': 'motion text',
'reason': 'motion reason', 'reason': 'motion reason',
'submitter': self.admin}) 'submitter': self.admin.person_id})
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
motion = Motion.objects.get(versions__title='delegate motion') motion = Motion.objects.get(versions__title='delegate motion')
self.assertTrue(motion.is_submitter(self.delegate)) self.assertTrue(motion.is_submitter(self.delegate))
@ -95,7 +95,7 @@ class TestMotionCreateView(MotionViewTestCase):
response = self.registered_client.post(self.url, {'title': 'registered motion', response = self.registered_client.post(self.url, {'title': 'registered motion',
'text': 'motion text', 'text': 'motion text',
'reason': 'motion reason', 'reason': 'motion reason',
'submitter': self.admin}) 'submitter': self.admin.person_id})
self.assertEqual(response.status_code, 403) self.assertEqual(response.status_code, 403)
self.assertFalse(Motion.objects.filter(versions__title='registered motion').exists()) self.assertFalse(Motion.objects.filter(versions__title='registered motion').exists())
@ -124,13 +124,13 @@ class TestMotionCreateView(MotionViewTestCase):
config['motion_identifier'] = 'manually' config['motion_identifier'] = 'manually'
response = self.admin_client.post(self.url, {'title': 'something', response = self.admin_client.post(self.url, {'title': 'something',
'text': 'bar', 'text': 'bar',
'submitter': self.admin, 'submitter': self.admin.person_id,
'identifier': 'uufag5faoX0thahBi8Fo'}) 'identifier': 'uufag5faoX0thahBi8Fo'})
self.assertFormError(response, 'form', 'identifier', 'Motion with this Identifier already exists.') self.assertFormError(response, 'form', 'identifier', 'Motion with this Identifier already exists.')
def test_empty_text_field(self): def test_empty_text_field(self):
response = self.admin_client.post(self.url, {'title': 'foo', response = self.admin_client.post(self.url, {'title': 'foo',
'submitter': self.admin}) 'submitter': self.admin.person_id})
self.assertFormError(response, 'form', 'text', 'This field is required.') self.assertFormError(response, 'form', 'text', 'This field is required.')
@ -144,7 +144,7 @@ class TestMotionUpdateView(MotionViewTestCase):
response = self.admin_client.post(self.url, {'title': 'new motion_title', response = self.admin_client.post(self.url, {'title': 'new motion_title',
'text': 'motion text', 'text': 'motion text',
'reason': 'motion reason', 'reason': 'motion reason',
'submitter': self.admin}) 'submitter': self.admin.person_id})
self.assertRedirects(response, '/motion/1/') self.assertRedirects(response, '/motion/1/')
motion = Motion.objects.get(pk=1) motion = Motion.objects.get(pk=1)
self.assertEqual(motion.title, 'new motion_title') self.assertEqual(motion.title, 'new motion_title')
@ -175,7 +175,7 @@ class TestMotionUpdateView(MotionViewTestCase):
response = self.admin_client.post(self.url, {'title': 'another new motion_title', response = self.admin_client.post(self.url, {'title': 'another new motion_title',
'text': 'another motion text', 'text': 'another motion text',
'reason': 'another motion reason', 'reason': 'another motion reason',
'submitter': self.admin}) 'submitter': self.admin.person_id})
self.assertRedirects(response, '/motion/1/') self.assertRedirects(response, '/motion/1/')
motion = Motion.objects.get(pk=self.motion1.pk) motion = Motion.objects.get(pk=self.motion1.pk)
self.assertEqual(motion.versions.count(), 2) self.assertEqual(motion.versions.count(), 2)
@ -193,7 +193,7 @@ class TestMotionUpdateView(MotionViewTestCase):
response = self.admin_client.post(self.url, {'title': 'another new motion_title', response = self.admin_client.post(self.url, {'title': 'another new motion_title',
'text': 'another motion text', 'text': 'another motion text',
'reason': 'another motion reason', 'reason': 'another motion reason',
'submitter': self.admin, 'submitter': self.admin.person_id,
'disable_versioning': 'true'}) 'disable_versioning': 'true'})
self.assertRedirects(response, '/motion/1/') self.assertRedirects(response, '/motion/1/')
motion = Motion.objects.get(pk=self.motion1.pk) motion = Motion.objects.get(pk=self.motion1.pk)
@ -214,7 +214,7 @@ class TestMotionUpdateView(MotionViewTestCase):
response = self.admin_client.post(self.url, {'title': 'Chah4kaaKasiVuishi5x', response = self.admin_client.post(self.url, {'title': 'Chah4kaaKasiVuishi5x',
'text': 'eedieFoothae2iethuo3', 'text': 'eedieFoothae2iethuo3',
'reason': 'ier2laiy1veeGoo0mau2', 'reason': 'ier2laiy1veeGoo0mau2',
'submitter': self.admin}) 'submitter': self.admin.person_id})
self.assertRedirects(response, '/motion/1/') self.assertRedirects(response, '/motion/1/')
motion = Motion.objects.get(pk=self.motion1.pk) motion = Motion.objects.get(pk=self.motion1.pk)
self.assertEqual(motion.versions.count(), 1) self.assertEqual(motion.versions.count(), 1)
@ -223,11 +223,11 @@ class TestMotionUpdateView(MotionViewTestCase):
self.assertEqual(self.motion1.state.workflow.pk, 1) self.assertEqual(self.motion1.state.workflow.pk, 1)
response = self.admin_client.post(self.url, {'title': 'oori4KiaghaeSeuzaim2', response = self.admin_client.post(self.url, {'title': 'oori4KiaghaeSeuzaim2',
'text': 'eequei1Tee1aegeNgee0', 'text': 'eequei1Tee1aegeNgee0',
'submitter': self.admin}) 'submitter': self.admin.person_id})
self.assertEqual(Motion.objects.get(pk=self.motion1.pk).state.workflow.pk, 1) self.assertEqual(Motion.objects.get(pk=self.motion1.pk).state.workflow.pk, 1)
response = self.admin_client.post(self.url, {'title': 'oori4KiaghaeSeuzaim2', response = self.admin_client.post(self.url, {'title': 'oori4KiaghaeSeuzaim2',
'text': 'eequei1Tee1aegeNgee0', 'text': 'eequei1Tee1aegeNgee0',
'submitter': self.admin, 'submitter': self.admin.person_id,
'set_workflow': 2}) 'set_workflow': 2})
self.assertRedirects(response, '/motion/1/') self.assertRedirects(response, '/motion/1/')
self.assertEqual(Motion.objects.get(pk=self.motion1.pk).state.workflow.pk, 2) self.assertEqual(Motion.objects.get(pk=self.motion1.pk).state.workflow.pk, 2)