Merge pull request #663 from emanuelschuetze/template-improvement3
More template improvements and translation updates.
This commit is contained in:
commit
60bce17728
@ -2,6 +2,7 @@
|
||||
|
||||
{% load i18n %}
|
||||
{% load staticfiles %}
|
||||
{% load tags %}
|
||||
|
||||
{% block title %}{{ block.super }} – {% trans "Election" %} "{{ assignment }}"{% endblock %}
|
||||
|
||||
@ -18,36 +19,32 @@
|
||||
{{ assignment }}
|
||||
<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 '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 -->
|
||||
{% 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' %}">
|
||||
<i class="icon-facetime-video {% if assignment.active %}icon-white{% endif %}"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if perms.assignment.can_manage_assignment or perms.agenda.can_manage_agenda %}
|
||||
<div class="btn-group">
|
||||
<a data-toggle="dropdown" href="#" class="btn btn-mini dropdown-toggle">
|
||||
{% trans 'More actions' %}
|
||||
<span class="caret"></span>
|
||||
<a data-toggle="dropdown" class="btn btn-mini dropdown-toggle">
|
||||
{% trans 'More actions' %} <span class="caret"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu pull-right">
|
||||
{% if perms.assignment.can_manage_assignment %}
|
||||
<!-- edit -->
|
||||
<li><a href="{% url 'assignment_edit' assignment.id %}"><i class="icon-pencil"></i> {% trans 'Edit election' %}</a></li>
|
||||
<!-- delete -->
|
||||
<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 %}
|
||||
<!-- create agenda item -->
|
||||
{% if perms.agenda.can_manage_agenda %}
|
||||
<li>
|
||||
<a href="{% url 'assignment_create_agenda' assignment.id %}"><i class="icon-plus"></i> {% trans 'New agenda item' %}</a>
|
||||
</li>
|
||||
<li><a href="{% url 'assignment_create_agenda' assignment.id %}"><i class="icon-plus"></i> {% trans 'New agenda item' %}</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
</small>
|
||||
</h1>
|
||||
|
||||
@ -67,7 +64,7 @@
|
||||
<ol>
|
||||
{% for person in assignment.get_participants %}
|
||||
<li>
|
||||
{{ person }}
|
||||
<a href="{% model_url person 'view' %}">{{ person }}</a>
|
||||
{% if perms.assignment.can_manage_assignment %}
|
||||
{% 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>
|
||||
@ -126,7 +123,7 @@
|
||||
<ul>
|
||||
{% for person in blocked_candidates %}
|
||||
<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' %}">
|
||||
<i class="icon-ban-circle"></i>
|
||||
</a>
|
||||
@ -196,7 +193,7 @@
|
||||
<a class="election_link" href="{% url 'assignment_user_elected' assignment.id candidate.person_id %}"></a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{{ candidate }}
|
||||
<a href="{% model_url candidate 'view' %}">{{ candidate }}</a>
|
||||
</td>
|
||||
{% for vote in poll_list %}
|
||||
<td style="white-space:nowrap;">
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OpenSlides 1.3\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"
|
||||
"Last-Translator: Emanuel Schütze <emanuel@intevation.de>\n"
|
||||
"Language: de\n"
|
||||
@ -205,26 +205,26 @@ msgstr "Aktuelle Zeit"
|
||||
msgid "Close"
|
||||
msgstr "Schließen"
|
||||
|
||||
#: agenda/static/javascript/agenda.js:27
|
||||
#: agenda/static/javascript/agenda.js:17
|
||||
#, c-format
|
||||
msgid ", of which %s are hidden."
|
||||
msgstr ", davon %s verborgen."
|
||||
|
||||
#: static/javascript/dataTables.bootstrap.js:19
|
||||
msgid "_MENU_ participants per page"
|
||||
msgstr "_MENU_ Teilnehmer/innen pro Seite"
|
||||
msgid "_MENU_ entries per page"
|
||||
msgstr "_MENU_ Einträge pro Seite"
|
||||
|
||||
#: static/javascript/dataTables.bootstrap.js:20
|
||||
msgid "Search:"
|
||||
msgstr "Suche:"
|
||||
|
||||
#: static/javascript/dataTables.bootstrap.js:21
|
||||
msgid "Showing _START_ to _END_ of _TOTAL_ participants"
|
||||
msgstr "_START_ bis _END_ von _TOTAL_ Teilnehmer/innen"
|
||||
msgid "Showing _START_ to _END_ of _TOTAL_ entries"
|
||||
msgstr "_START_ bis _END_ von _TOTAL_ Einträgen"
|
||||
|
||||
#: static/javascript/dataTables.bootstrap.js:22
|
||||
msgid "Showing 0 participants"
|
||||
msgstr "0 Teilnehmer/innen"
|
||||
msgid "Showing 0 entries"
|
||||
msgstr "0 Einträge"
|
||||
|
||||
#: static/javascript/dataTables.bootstrap.js:23
|
||||
msgid "(filtered from _MAX_ total entries)"
|
||||
@ -234,18 +234,18 @@ msgstr "(gefiltert von _MAX_ Einträgen)"
|
||||
msgid "No matching records found"
|
||||
msgstr "Keine passenden Einträge gefunden"
|
||||
|
||||
#: static/javascript/dataTables.bootstrap.js:25
|
||||
#: static/javascript/dataTables.bootstrap.js:26
|
||||
msgid "First"
|
||||
msgstr "Erster"
|
||||
|
||||
#: static/javascript/dataTables.bootstrap.js:26
|
||||
#: static/javascript/dataTables.bootstrap.js:27
|
||||
msgid "Last"
|
||||
msgstr "Letzter"
|
||||
|
||||
#: static/javascript/dataTables.bootstrap.js:27
|
||||
#: static/javascript/dataTables.bootstrap.js:28
|
||||
msgid "Next"
|
||||
msgstr "Weiter"
|
||||
|
||||
#: static/javascript/dataTables.bootstrap.js:28
|
||||
#: static/javascript/dataTables.bootstrap.js:29
|
||||
msgid "Previous"
|
||||
msgstr "Zurück"
|
||||
|
@ -30,7 +30,7 @@
|
||||
<td>{{ mediafile.filetype }}</td>
|
||||
<td>{{ mediafile.get_filesize }}</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 %}
|
||||
<td>
|
||||
<span style="width: 1px; white-space: nowrap;">
|
||||
|
@ -20,21 +20,21 @@
|
||||
{% trans "Version" %} {{ motion.version.version_number }}
|
||||
</small>
|
||||
<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_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 -->
|
||||
{% 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' %}">
|
||||
<i class="icon-facetime-video {% if motion.active %}icon-white{% endif %}"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if perms.motion.can_manage_motion or perms.agenda.can_manage_agenda %}
|
||||
<div class="btn-group">
|
||||
<a data-toggle="dropdown" href="#" class="btn btn-mini dropdown-toggle">
|
||||
{% trans 'More actions' %}
|
||||
<span class="caret"></span>
|
||||
<a data-toggle="dropdown" class="btn btn-mini dropdown-toggle">
|
||||
{% trans 'More actions' %} <span class="caret"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu pull-right">
|
||||
{% if perms.motion.can_manage_motion %}
|
||||
<!-- edit -->
|
||||
{% if allowed_actions.edit %}
|
||||
<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 %}
|
||||
<li><a href="{% model_url motion 'delete' %}"><i class="icon-remove"></i> {% trans 'Delete motion' %}</a></li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<!-- create agenda item -->
|
||||
{% if perms.agenda.can_manage_agenda %}
|
||||
<li>
|
||||
<a href="{% url 'motion_create_agenda' motion.id %}"><i class="icon-plus"></i> {% trans 'New agenda item' %}</a>
|
||||
</li>
|
||||
<li><a href="{% url 'motion_create_agenda' motion.id %}"><i class="icon-plus"></i> {% trans 'New agenda item' %}</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</small>
|
||||
</h1>
|
||||
|
||||
@ -166,7 +165,7 @@
|
||||
<!-- Submitter -->
|
||||
<h5>{% trans "Submitter" %}:</h5>
|
||||
{% 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 %}
|
||||
|
||||
<!-- Supporters -->
|
||||
@ -177,7 +176,7 @@
|
||||
{% else %}
|
||||
<ol>
|
||||
{% for supporter in motion.supporter.all %}
|
||||
<li>{{ supporter }}</li>
|
||||
<li><a href="{% model_url supporter.person 'view' %}">{{ supporter }}</a></li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
{% endif %}
|
||||
|
@ -35,7 +35,7 @@ def gen_username(first_name, last_name):
|
||||
"""
|
||||
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:
|
||||
User.objects.get(username=testname)
|
||||
except User.DoesNotExist:
|
||||
@ -43,7 +43,7 @@ def gen_username(first_name, last_name):
|
||||
i = 0
|
||||
while True:
|
||||
i += 1
|
||||
testname = "%s_%s_%s" % (first_name, last_name, i)
|
||||
testname = "%s%s%s" % (first_name, last_name, i)
|
||||
try:
|
||||
User.objects.get(username=testname)
|
||||
except User.DoesNotExist:
|
||||
@ -110,6 +110,6 @@ def import_users(csv_file):
|
||||
|
||||
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)
|
||||
|
@ -22,17 +22,12 @@ from openslides.participant.models import User, Group
|
||||
from openslides.participant.api import get_registered_group
|
||||
|
||||
|
||||
class UserCreateForm(forms.ModelForm, CssClassMixin):
|
||||
groups = forms.ModelMultipleChoiceField(
|
||||
queryset=Group.objects.exclude(name__iexact='anonymous'),
|
||||
label=ugettext_lazy('Groups'), required=False)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
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 UserCreateForm(CssClassMixin, forms.ModelForm):
|
||||
groups = LocalizedModelMultipleChoiceField(
|
||||
# Hide the built-in groups 'Anonymous' (pk=1) and 'Registered' (pk=2)
|
||||
queryset=Group.objects.exclude(pk=1).exclude(pk=2),
|
||||
label=ugettext_lazy('Groups'), required=False,
|
||||
help_text=ugettext_lazy('Hold down "Control", or "Command" on a Mac, to select more than one.'))
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
@ -109,21 +104,6 @@ class GroupForm(forms.ModelForm, CssClassMixin):
|
||||
|
||||
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:
|
||||
model = Group
|
||||
|
||||
|
@ -10,6 +10,25 @@
|
||||
<h1>{% trans group.name %}
|
||||
<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>
|
||||
<!-- 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>
|
||||
</h1>
|
||||
|
||||
@ -19,7 +38,7 @@
|
||||
|
||||
<ol>
|
||||
{% for member in group_members %}
|
||||
<li>{{ member }}</li>
|
||||
<li><a href="{% model_url member 'view' %}">{{ member }}</a></li>
|
||||
{% empty %}
|
||||
<p>{% trans "No members available." %}</p>
|
||||
{% endfor %}
|
||||
|
@ -1,25 +1,44 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% load i18n %}
|
||||
{% load staticfiles %}
|
||||
{% load tags %}
|
||||
|
||||
{% 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 %}
|
||||
<h1>{% trans "Groups" %}
|
||||
<h1>
|
||||
{% trans "Groups" %}
|
||||
<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_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to participants overview" %}</a>
|
||||
</small>
|
||||
</h1>
|
||||
|
||||
<table class="table table-striped table-bordered">
|
||||
<table id="dataTable" class="table table-striped table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="mini_width">{% trans "ID" %}</th>
|
||||
<th>{% trans "Group" %}</th>
|
||||
<th style="width: 1px;">{% trans "Actions" %}</th>
|
||||
<th class="mini_width">{% trans "Actions" %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
{% for group in groups %}
|
||||
<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>
|
||||
<a href="{% model_url group 'view' %}">{% trans group.name %}</a>
|
||||
</td>
|
||||
@ -33,7 +52,7 @@
|
||||
<a href="{% url 'user_group_edit' group.id %}" title="{% trans 'Edit' %}" class="btn btn-mini">
|
||||
<i class="icon-pencil"></i>
|
||||
</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">
|
||||
<i class="icon-remove"></i>
|
||||
</a>
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
<ul style="line-height: 180%">
|
||||
{% 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 %}">
|
||||
<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>
|
||||
|
@ -22,7 +22,6 @@
|
||||
</li>
|
||||
<li>
|
||||
{% trans 'Default groups' %}:
|
||||
{% trans 'Anonymous' %} (<code>1</code>), {% trans 'Registered' %} (<code>2</code>),
|
||||
{% trans 'Delegate' %} (<code>3</code>), {% trans 'Staff' %} (<code>4</code>)
|
||||
</li>
|
||||
<li>{% trans 'Required CSV file encoding: UTF-8 (Unicode).' %}</li>
|
||||
|
@ -16,39 +16,28 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>{% trans "Participants" %}
|
||||
<h1>
|
||||
{% trans "Participants" %}
|
||||
<small class="pull-right">
|
||||
<div class="btn-toolbar">
|
||||
{% 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_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>
|
||||
{% endif %}
|
||||
{% if perms.participant.can_see_participant and perms.participant.can_manage_participant %}
|
||||
<div class="btn-group pull-right">
|
||||
{% if user.is_authenticated %}
|
||||
<a href="#" data-toggle="dropdown" class="btn btn-mini dropdown-toggle">
|
||||
<i class="icon-print"></i> PDF
|
||||
<span class="caret"></span>
|
||||
<div class="btn-group">
|
||||
<a data-toggle="dropdown" class="btn btn-mini dropdown-toggle">
|
||||
<i class="icon-print"></i> PDF <span class="caret"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
<ul class="dropdown-menu pull-right">
|
||||
{% 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 'print_passwords' %}"><i class="icon-th-large"></i> {% trans 'First time passwords' %}</a></li>
|
||||
</ul>
|
||||
{% else %}
|
||||
<a href="{% url 'user_login' %}" class="btn">{% trans "Login" %}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% 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>
|
||||
{% 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>
|
||||
</h1>
|
||||
|
||||
@ -92,7 +81,7 @@
|
||||
<td class="optional">{{ user.structure_level }}</td>
|
||||
<td class="optional">
|
||||
{% for group in user.groups.all %}
|
||||
{% if group.name != 'Registered' %}
|
||||
{% if group.pk != 2 %}
|
||||
{% trans group.name %}
|
||||
{% if not forloop.last %}<br>{% endif %}
|
||||
{% endif %}
|
||||
|
@ -7,9 +7,29 @@
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>{{ shown_user.clean_name }}
|
||||
<h1>
|
||||
{{ shown_user.clean_name }}
|
||||
<small class="pull-right">
|
||||
<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>
|
||||
</h1>
|
||||
|
||||
|
@ -104,6 +104,17 @@ class UserCreateView(CreateView):
|
||||
self.object.default_password = gen_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):
|
||||
"""
|
||||
@ -190,7 +201,7 @@ class ParticipantsListPDF(PDFView):
|
||||
counter += 1
|
||||
groups = ''
|
||||
for group in user.groups.all():
|
||||
if unicode(group) != "Registered":
|
||||
if group.pk != 2:
|
||||
groups += "%s<br/>" % unicode(group)
|
||||
data.append([
|
||||
counter,
|
||||
@ -400,7 +411,7 @@ class GroupDeleteView(DeleteView):
|
||||
success_url_name = 'user_group_overview'
|
||||
|
||||
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."))
|
||||
else:
|
||||
super(GroupDeleteView, self).pre_redirect(request, *args, **kwargs)
|
||||
|
@ -19,7 +19,7 @@ $(document).ready(function() {
|
||||
"sLengthMenu": gettext("_MENU_ entries per page"),
|
||||
"sSearch": gettext("Search:"),
|
||||
"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)"),
|
||||
"sZeroRecords": gettext("No matching records found"),
|
||||
"oPaginate": {
|
||||
|
@ -27,7 +27,7 @@ class AnonymousAuth(object):
|
||||
"""
|
||||
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
|
||||
|
||||
@ -35,13 +35,13 @@ class AnonymousAuth(object):
|
||||
"""
|
||||
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
|
||||
not config['system_enable_anonymous']):
|
||||
return set()
|
||||
|
||||
perms = Permission.objects.filter(group__name='Anonymous')
|
||||
perms = Permission.objects.filter(group__pk=1)
|
||||
if perms is None:
|
||||
return set()
|
||||
perms = perms.values_list('content_type__app_label', 'codename') \
|
||||
|
@ -76,7 +76,7 @@ class TestMotionCreateView(MotionViewTestCase):
|
||||
response = self.admin_client.post(self.url, {'title': 'new motion',
|
||||
'text': 'motion text',
|
||||
'reason': 'motion reason',
|
||||
'submitter': self.admin})
|
||||
'submitter': self.admin.person_id})
|
||||
self.assertEqual(response.status_code, 302)
|
||||
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',
|
||||
'text': 'motion text',
|
||||
'reason': 'motion reason',
|
||||
'submitter': self.admin})
|
||||
'submitter': self.admin.person_id})
|
||||
self.assertEqual(response.status_code, 302)
|
||||
motion = Motion.objects.get(versions__title='delegate motion')
|
||||
self.assertTrue(motion.is_submitter(self.delegate))
|
||||
@ -95,7 +95,7 @@ class TestMotionCreateView(MotionViewTestCase):
|
||||
response = self.registered_client.post(self.url, {'title': 'registered motion',
|
||||
'text': 'motion text',
|
||||
'reason': 'motion reason',
|
||||
'submitter': self.admin})
|
||||
'submitter': self.admin.person_id})
|
||||
self.assertEqual(response.status_code, 403)
|
||||
self.assertFalse(Motion.objects.filter(versions__title='registered motion').exists())
|
||||
|
||||
@ -124,13 +124,13 @@ class TestMotionCreateView(MotionViewTestCase):
|
||||
config['motion_identifier'] = 'manually'
|
||||
response = self.admin_client.post(self.url, {'title': 'something',
|
||||
'text': 'bar',
|
||||
'submitter': self.admin,
|
||||
'submitter': self.admin.person_id,
|
||||
'identifier': 'uufag5faoX0thahBi8Fo'})
|
||||
self.assertFormError(response, 'form', 'identifier', 'Motion with this Identifier already exists.')
|
||||
|
||||
def test_empty_text_field(self):
|
||||
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.')
|
||||
|
||||
|
||||
@ -144,7 +144,7 @@ class TestMotionUpdateView(MotionViewTestCase):
|
||||
response = self.admin_client.post(self.url, {'title': 'new motion_title',
|
||||
'text': 'motion text',
|
||||
'reason': 'motion reason',
|
||||
'submitter': self.admin})
|
||||
'submitter': self.admin.person_id})
|
||||
self.assertRedirects(response, '/motion/1/')
|
||||
motion = Motion.objects.get(pk=1)
|
||||
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',
|
||||
'text': 'another motion text',
|
||||
'reason': 'another motion reason',
|
||||
'submitter': self.admin})
|
||||
'submitter': self.admin.person_id})
|
||||
self.assertRedirects(response, '/motion/1/')
|
||||
motion = Motion.objects.get(pk=self.motion1.pk)
|
||||
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',
|
||||
'text': 'another motion text',
|
||||
'reason': 'another motion reason',
|
||||
'submitter': self.admin,
|
||||
'submitter': self.admin.person_id,
|
||||
'disable_versioning': 'true'})
|
||||
self.assertRedirects(response, '/motion/1/')
|
||||
motion = Motion.objects.get(pk=self.motion1.pk)
|
||||
@ -214,7 +214,7 @@ class TestMotionUpdateView(MotionViewTestCase):
|
||||
response = self.admin_client.post(self.url, {'title': 'Chah4kaaKasiVuishi5x',
|
||||
'text': 'eedieFoothae2iethuo3',
|
||||
'reason': 'ier2laiy1veeGoo0mau2',
|
||||
'submitter': self.admin})
|
||||
'submitter': self.admin.person_id})
|
||||
self.assertRedirects(response, '/motion/1/')
|
||||
motion = Motion.objects.get(pk=self.motion1.pk)
|
||||
self.assertEqual(motion.versions.count(), 1)
|
||||
@ -223,11 +223,11 @@ class TestMotionUpdateView(MotionViewTestCase):
|
||||
self.assertEqual(self.motion1.state.workflow.pk, 1)
|
||||
response = self.admin_client.post(self.url, {'title': 'oori4KiaghaeSeuzaim2',
|
||||
'text': 'eequei1Tee1aegeNgee0',
|
||||
'submitter': self.admin})
|
||||
'submitter': self.admin.person_id})
|
||||
self.assertEqual(Motion.objects.get(pk=self.motion1.pk).state.workflow.pk, 1)
|
||||
response = self.admin_client.post(self.url, {'title': 'oori4KiaghaeSeuzaim2',
|
||||
'text': 'eequei1Tee1aegeNgee0',
|
||||
'submitter': self.admin,
|
||||
'submitter': self.admin.person_id,
|
||||
'set_workflow': 2})
|
||||
self.assertRedirects(response, '/motion/1/')
|
||||
self.assertEqual(Motion.objects.get(pk=self.motion1.pk).state.workflow.pk, 2)
|
||||
|
Loading…
Reference in New Issue
Block a user