Merge pull request #775 from ostcar/issue-765b
Fixes #765. Avoids the django AbstracUser username validator
This commit is contained in:
commit
c15c5047e6
@ -1,25 +1,49 @@
|
||||
An- und Abmelden – Benutzername und Passwort ändern
|
||||
An- und Abmelden – Benutzername und Passwort ändern
|
||||
+++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
An- und Abmelden
|
||||
----------------
|
||||
|
||||
Beim ersten Aufruf von OpenSlides erscheint die Login-Seite. Der erste Benutzername des Administrators ist ``admin``. Er hat das erste Passwort ``admin``. Über die Teilnehmerverwaltung neu angelegte Teilnehmer haben einen aus dem Vor- und Nachnamen zusammengesetzten Benutzernamen, wobei Groß- und Kleinschreibung zu beachten ist. Beispiel: Ein mit dem Vornamen ``Max`` und dem Nachnamen ``Mustermann`` angelegter Teilnehmer hat den Benutzernamen ``MaxMustermann``. Das Erstpasswort kann über die Teilnehmerverwaltung eingesehen werden. Zum Einloggen geben Sie einfach Ihren Benutzernamen und Ihr Passwort ein und klicken Sie auf ``Anmelden``.
|
||||
Beim ersten Aufruf von OpenSlides erscheint die Login-Seite. Der erste
|
||||
Benutzername des Administrators ist ``admin``. Er hat das erste Passwort
|
||||
``admin``. Über die Teilnehmerverwaltung neu angelegte Teilnehmer haben
|
||||
einen aus dem Vor- und Nachnamen zusammengesetzten Benutzernamen, wobei
|
||||
Groß- und Kleinschreibung zu beachten ist und zwischen den Namen ein
|
||||
Leerzeichen liegt. Beispiel: Ein mit dem Vornamen ``Max`` und dem Nachnamen
|
||||
``Mustermann`` angelegter Teilnehmer hat den Benutzernamen ``Max
|
||||
Mustermann``. Das Erstpasswort kann über die Teilnehmerverwaltung
|
||||
eingesehen werden. Zum Einloggen geben Sie einfach Ihren Benutzernamen und
|
||||
Ihr Passwort ein und klicken Sie auf ``Anmelden``.
|
||||
|
||||
|
||||
Eigene Benutzereinstellungen (insbesondere Benutzername oder Passwort) ändern
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
Die eigenen Benutzereinstellungen wie Benutzername und Passwort können über den Link ``Benutzereinstellungen`` oben rechts geändert werden. Klicken Sie auf den Link, wählen Sie im oberen rechten Menü aus, ob Sie Ihre persönlichen Einstellungen oder Ihr Passwort ändern möchten, und ändern Sie die jeweiligen Einstellungen. Klicken Sie abschließend auf ``Speichern``.
|
||||
Die eigenen Benutzereinstellungen wie Benutzername und Passwort können über
|
||||
den Link ``Benutzereinstellungen`` oben rechts geändert werden. Klicken Sie
|
||||
auf den Link, wählen Sie im oberen rechten Menü aus, ob Sie Ihre
|
||||
persönlichen Einstellungen oder Ihr Passwort ändern möchten, und ändern Sie
|
||||
die jeweiligen Einstellungen. Klicken Sie abschließend auf ``Speichern``.
|
||||
|
||||
|
||||
Fremde Benutzereinstellungen (insbesondere Benutzername oder Passwort) ändern
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
Beim Anlegen eines Teilnehmers wird automatisch ein zufälliges Erst-Passwort gesetzt. Sie können das Erst-Passwort aus einer PDF-Datei ablesen, die Sie durch Klick auf den Link „Erst-Passwörter als PDF“ im rechten oberen Menü erreichen.
|
||||
Beim Anlegen eines Teilnehmers wird automatisch ein zufälliges
|
||||
Erst-Passwort gesetzt. Sie können das Erst-Passwort aus einer PDF-Datei
|
||||
ablesen, die Sie durch Klick auf den Link „Erst-Passwörter als PDF“ im
|
||||
rechten oberen Menü erreichen.
|
||||
|
||||
Benutzer mit den entsprechenden Rechten wie Mitarbeiter können alle Benutzer über den Menüpunkt „Teilnehmer/innen“ verwalten und dort auch den Benutzernamen ändern und das Passwort auf ein bestimmtes Erst-Passwort zurücksetzen.
|
||||
Benutzer mit den entsprechenden Rechten wie Mitarbeiter können alle Benutzer
|
||||
über den Menüpunkt „Teilnehmer/innen“ verwalten und dort auch den
|
||||
Benutzernamen ändern und das Passwort auf ein bestimmtes Erst-Passwort
|
||||
zurücksetzen.
|
||||
|
||||
Klicken Sie beim jeweiligen Teilnehmer auf das Bearbeiten-Symbol |edit| und tragen Sie unter „Erst-Passwort“ ein neues, selbstgewähltes Passwort ein. Anschließend klicken Sie auf ``Übernehmen``. In einem zweiten Schritt müssen Sie auf den Link „Auf Erst-Passwort zurücksetzen“ klicken, um das im System gespeicherte Passwort mit Ihrem neu eingegebenen zu ersetzen. Bestätigen Sie den oben auf der Seite erscheinenden Dialog mit ``Ja``.
|
||||
Klicken Sie beim jeweiligen Teilnehmer auf das Bearbeiten-Symbol |edit| und
|
||||
tragen Sie unter „Erst-Passwort“ ein neues, selbstgewähltes Passwort ein.
|
||||
Anschließend klicken Sie auf ``Übernehmen``. In einem zweiten Schritt
|
||||
müssen Sie auf den Link „Auf Erst-Passwort zurücksetzen“ klicken, um das im
|
||||
System gespeicherte Passwort mit Ihrem neu eingegebenen zu ersetzen.
|
||||
Bestätigen Sie den oben auf der Seite erscheinenden Dialog mit ``Ja``.
|
||||
|
||||
.. |edit| image:: ../_images/pencil.png
|
||||
|
@ -23,7 +23,7 @@ from openslides.participant.models import User, Group
|
||||
|
||||
def gen_password():
|
||||
"""
|
||||
generates a random passwort.
|
||||
Generates a random passwort.
|
||||
"""
|
||||
chars = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789"
|
||||
size = 8
|
||||
@ -33,21 +33,28 @@ def gen_password():
|
||||
|
||||
def gen_username(first_name, last_name):
|
||||
"""
|
||||
generates the username for new users.
|
||||
Generates a username from a first- and lastname.
|
||||
"""
|
||||
testname = "%s%s" % (first_name.strip(), last_name.strip())
|
||||
try:
|
||||
User.objects.get(username=testname)
|
||||
except User.DoesNotExist:
|
||||
return testname
|
||||
i = 0
|
||||
first_name = first_name.strip()
|
||||
last_name = last_name.strip()
|
||||
|
||||
if first_name and last_name:
|
||||
base_name = " ".join((first_name, last_name))
|
||||
else:
|
||||
base_name = first_name or last_name
|
||||
if not base_name:
|
||||
raise ValueError('Either \'first_name\' or \'last_name\' can not be '
|
||||
'empty')
|
||||
|
||||
if not User.objects.filter(username=base_name).exists():
|
||||
return base_name
|
||||
|
||||
counter = 0
|
||||
while True:
|
||||
i += 1
|
||||
testname = "%s%s%s" % (first_name, last_name, i)
|
||||
try:
|
||||
User.objects.get(username=testname)
|
||||
except User.DoesNotExist:
|
||||
return testname
|
||||
counter += 1
|
||||
test_name = "%s %d" % (base_name, counter)
|
||||
if not User.objects.filter(username=test_name).exists():
|
||||
return test_name
|
||||
|
||||
|
||||
def import_users(csv_file):
|
||||
|
@ -52,14 +52,23 @@ class UserUpdateForm(UserCreateForm):
|
||||
user edits himself and removes the last group containing the permission
|
||||
to manage participants.
|
||||
"""
|
||||
user_name = forms.CharField()
|
||||
"""
|
||||
Field to save the username.
|
||||
|
||||
The field username (without the underscore) from the UserModel does not
|
||||
allow whitespaces and umlauts.
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
fields = ('username', 'title', 'first_name', 'last_name', 'gender', 'email',
|
||||
fields = ('user_name', 'title', 'first_name', 'last_name', 'gender', 'email',
|
||||
'groups', 'structure_level', 'committee', 'about_me', 'comment',
|
||||
'is_active', 'default_password')
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.request = kwargs.pop('request')
|
||||
kwargs['initial']['user_name'] = kwargs['instance'].username
|
||||
return super(UserUpdateForm, self).__init__(*args, **kwargs)
|
||||
|
||||
def clean(self, *args, **kwargs):
|
||||
@ -145,15 +154,27 @@ class GroupForm(forms.ModelForm, CssClassMixin):
|
||||
return super(GroupForm, self).clean(*args, **kwargs)
|
||||
|
||||
|
||||
class UsersettingsForm(forms.ModelForm, CssClassMixin):
|
||||
class UsersettingsForm(CssClassMixin, forms.ModelForm):
|
||||
user_name = forms.CharField()
|
||||
"""
|
||||
Field to save the username.
|
||||
|
||||
The field username (without the underscore) from the UserModel does not
|
||||
allow whitespaces and umlauts.
|
||||
"""
|
||||
|
||||
language = forms.ChoiceField(choices=settings.LANGUAGES)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['initial']['user_name'] = kwargs['instance'].username
|
||||
return super(UsersettingsForm, self).__init__(*args, **kwargs)
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
fields = ('username', 'title', 'first_name', 'last_name', 'gender', 'email',
|
||||
fields = ('user_name', 'title', 'first_name', 'last_name', 'gender', 'email',
|
||||
'committee', 'about_me')
|
||||
|
||||
|
||||
class UserImportForm(forms.Form, CssClassMixin):
|
||||
class UserImportForm(CssClassMixin, forms.Form):
|
||||
csvfile = forms.FileField(widget=forms.FileInput(attrs={'size': '50'}),
|
||||
label=ugettext_lazy('CSV File'))
|
||||
|
@ -132,6 +132,9 @@ class UserUpdateView(UpdateView):
|
||||
form_kwargs.update({'request': self.request})
|
||||
return form_kwargs
|
||||
|
||||
def manipulate_object(self, form):
|
||||
self.object.username = form.cleaned_data['user_name']
|
||||
|
||||
def post_save(self, form):
|
||||
super(UserUpdateView, self).post_save(form)
|
||||
# TODO: find a better solution that makes the following lines obsolete
|
||||
@ -485,7 +488,9 @@ def user_settings(request):
|
||||
if request.method == 'POST':
|
||||
form_user = UsersettingsForm(request.POST, instance=request.user)
|
||||
if form_user.is_valid():
|
||||
form_user.save()
|
||||
user = form_user.save(commit=False)
|
||||
user.username = form_user.cleaned_data['user_name']
|
||||
user.save()
|
||||
language = request.LANGUAGE_CODE = \
|
||||
request.session['django_language'] = form_user.cleaned_data['language']
|
||||
activate(language)
|
||||
|
50
tests/participant/test_umlaut_user.py
Normal file
50
tests/participant/test_umlaut_user.py
Normal file
@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Test Umlaut User
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
:copyright: 2011–2013 by OpenSlides team, see AUTHORS.
|
||||
:license: GNU GPL, see LICENSE for more details.
|
||||
"""
|
||||
|
||||
from django.test.client import Client
|
||||
|
||||
from openslides.utils.test import TestCase
|
||||
from openslides.config.api import config
|
||||
from openslides.participant.models import User, Group
|
||||
|
||||
|
||||
class TestUmlautUser(TestCase):
|
||||
"""
|
||||
Tests persons with umlauts in there name.
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
self.user = User.objects.create(username='äöü')
|
||||
self.user.reset_password('äöü')
|
||||
self.client = Client()
|
||||
self.client.login(username='äöü', password='äöü')
|
||||
|
||||
def test_login(self):
|
||||
client = Client()
|
||||
response = client.post('/login/', {'username': 'äöü',
|
||||
'password': 'äöüß'})
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
response = client.post('/login/', {'username': 'äöü',
|
||||
'password': 'äöü'})
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
def test_logout(self):
|
||||
response = self.client.get('/logout/')
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
def test_permission(self):
|
||||
response = self.client.get('/participant/1/edit/')
|
||||
self.assertEqual(response.status_code, 403)
|
||||
|
||||
self.user.groups.add(Group.objects.get(pk=4))
|
||||
|
||||
response = self.client.get('/participant/1/edit/')
|
||||
self.assertEqual(response.status_code, 200)
|
37
tests/participant/test_utils.py
Normal file
37
tests/participant/test_utils.py
Normal file
@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Tests for models of openslides.participant
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
:copyright: 2011–2013 by OpenSlides team, see AUTHORS.
|
||||
:license: GNU GPL, see LICENSE for more details.
|
||||
"""
|
||||
|
||||
from openslides.utils.test import TestCase
|
||||
|
||||
from openslides.participant.models import User
|
||||
from openslides.participant.api import gen_username
|
||||
|
||||
|
||||
class UserGenUsername(TestCase):
|
||||
"""
|
||||
Tests for the function gen_username.
|
||||
"""
|
||||
|
||||
def test_base(self):
|
||||
self.assertEqual(gen_username('foo', 'bar'), 'foo bar')
|
||||
self.assertEqual(gen_username('foo ', ' bar\n'), 'foo bar')
|
||||
self.assertEqual(gen_username('foobar', ''), 'foobar')
|
||||
self.assertEqual(gen_username('', 'foobar'), 'foobar')
|
||||
self.assertRaises(ValueError, gen_username, '', '')
|
||||
|
||||
def test_used_username(self):
|
||||
User.objects.create(username='user name')
|
||||
self.assertEqual(gen_username('user', 'name'), 'user name 1')
|
||||
|
||||
User.objects.create(username='user name 1')
|
||||
self.assertEqual(gen_username('user', 'name'), 'user name 2')
|
||||
|
||||
def test_umlauts(self):
|
||||
self.assertEqual(gen_username('äöü', 'ßüäö'), 'äöü ßüäö')
|
Loading…
Reference in New Issue
Block a user