rename openslidesuser to user and openslidesgroup to group

This commit is contained in:
Oskar Hahn 2012-08-12 12:52:38 +02:00
parent 0a8ee9cbad
commit df40de67b0
15 changed files with 144 additions and 166 deletions

View File

@ -1,6 +1,6 @@
[ [
{ {
"pk": 2, "pk": 1,
"model": "auth.group", "model": "auth.group",
"fields": { "fields": {
"name": "Beobachter", "name": "Beobachter",
@ -38,7 +38,7 @@
[ [
"can_see_participant", "can_see_participant",
"participant", "participant",
"openslidesuser" "user"
], ],
[ [
"can_see_projector", "can_see_projector",
@ -49,7 +49,7 @@
} }
}, },
{ {
"pk": 3, "pk": 2,
"model": "auth.group", "model": "auth.group",
"fields": { "fields": {
"name": "Delegierter", "name": "Delegierter",
@ -92,7 +92,7 @@
[ [
"can_see_participant", "can_see_participant",
"participant", "participant",
"openslidesuser" "user"
], ],
[ [
"can_see_projector", "can_see_projector",
@ -103,7 +103,7 @@
} }
}, },
{ {
"pk": 4, "pk": 3,
"model": "auth.group", "model": "auth.group",
"fields": { "fields": {
"name": "Versammlungsleitung", "name": "Versammlungsleitung",
@ -161,12 +161,12 @@
[ [
"can_manage_participant", "can_manage_participant",
"participant", "participant",
"openslidesuser" "user"
], ],
[ [
"can_see_participant", "can_see_participant",
"participant", "participant",
"openslidesuser" "user"
], ],
[ [
"can_manage_projector", "can_manage_projector",
@ -182,7 +182,7 @@
} }
}, },
{ {
"pk": 5, "pk": 4,
"model": "auth.group", "model": "auth.group",
"fields": { "fields": {
"name": "Teilnehmerverwaltung", "name": "Teilnehmerverwaltung",
@ -195,12 +195,12 @@
[ [
"can_manage_participant", "can_manage_participant",
"participant", "participant",
"openslidesuser" "user"
], ],
[ [
"can_see_participant", "can_see_participant",
"participant", "participant",
"openslidesuser" "user"
], ],
[ [
"can_see_projector", "can_see_projector",

View File

@ -12,7 +12,6 @@
from datetime import datetime from datetime import datetime
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models from django.db import models
from django.db.models import Max from django.db.models import Max
@ -26,8 +25,6 @@ from openslides.utils.person import PersonField
from openslides.config.models import config from openslides.config.models import config
from openslides.config.signals import default_config_value from openslides.config.signals import default_config_value
from openslides.participant.models import OpenSlidesUser
from openslides.poll.models import (BaseOption, BasePoll, CountVotesCast, from openslides.poll.models import (BaseOption, BasePoll, CountVotesCast,
CountInvalid, BaseVote) CountInvalid, BaseVote)
@ -360,15 +357,6 @@ class Application(models.Model, SlideMixin):
Return a list of all the allowed status. Return a list of all the allowed status.
""" """
actions = [] actions = []
is_admin = False
if user:
try:
user = user.openslidesuser
except OpenSlidesUser.DoesNotExist:
is_admin = True
except AttributeError:
# For the anonymous-user
pass
# check if user allowed to withdraw an application # check if user allowed to withdraw an application
if ((self.status == "pub" if ((self.status == "pub"
@ -405,11 +393,10 @@ class Application(models.Model, SlideMixin):
# Check if the user can delete the application (admin, manager, owner) # Check if the user can delete the application (admin, manager, owner)
# reworked as requiered in #100 # reworked as requiered in #100
if is_admin \ if (user.has_perm("applicatoin.can_delete_all_applications") or
or (user.has_perm("application.can_manage_application") \ (user.has_perm("application.can_manage_application") and
and (self.status == "pub" or self.number is None)) \ self.number is None) or
or (self.submitter == user \ (self.submitter == user and self.number is None)):
and (self.status == "pub" or self.number is None)):
actions.append("delete") actions.append("delete")
#For the rest, all actions need the manage permission #For the rest, all actions need the manage permission
@ -543,6 +530,7 @@ class Application(models.Model, SlideMixin):
('can_create_application', ugettext_noop("Can create application")), ('can_create_application', ugettext_noop("Can create application")),
('can_support_application', ugettext_noop("Can support application")), ('can_support_application', ugettext_noop("Can support application")),
('can_manage_application', ugettext_noop("Can manage application")), ('can_manage_application', ugettext_noop("Can manage application")),
('can_delete_all_applications', ugettext_noop("Can delete all applications")),
) )

View File

@ -12,15 +12,17 @@
from django.test import TestCase from django.test import TestCase
from django.test.client import Client from django.test.client import Client
from django.contrib.auth.models import User
from openslides.participant.models import User
from openslides.application.models import Application, AVersion from openslides.application.models import Application, AVersion
class ApplicationTest(TestCase): class ApplicationTest(TestCase):
def setUp(self): def setUp(self):
self.admin = User.objects.create_user('testadmin', '', 'default') self.admin = User(username='testadmin')
self.anonym = User.objects.create_user('testanoym', '', 'default') self.admin.save()
self.app1 = Application(submitter=self.admin.openslidesuser) self.anonym = User(username='testanoym')
self.anonym.save()
self.app1 = Application(submitter=self.admin)
self.app1.save() self.app1.save()
def refresh(self): def refresh(self):

View File

@ -51,7 +51,7 @@ from openslides.projector.projector import Widget
from openslides.poll.views import PollFormView from openslides.poll.views import PollFormView
from openslides.participant.api import gen_username, gen_password from openslides.participant.api import gen_username, gen_password
from openslides.participant.models import OpenSlidesUser from openslides.participant.models import User
from openslides.agenda.models import Item from openslides.agenda.models import Item
@ -124,7 +124,7 @@ def overview(request):
for (i, application) in enumerate(applications): for (i, application) in enumerate(applications):
try: try:
applications[i] = { applications[i] = {
'actions' : application.get_allowed_actions(request.user.openslidesuser), 'actions' : application.get_allowed_actions(request.user),
'application' : application 'application' : application
} }
except: except:
@ -152,8 +152,7 @@ def view(request, application_id, newest=False):
else: else:
version = application.public_version version = application.public_version
revisions = application.versions revisions = application.versions
user = request.user.openslidesuser actions = application.get_allowed_actions(user=request.user)
actions = application.get_allowed_actions(user=user)
return { return {
'application': application, 'application': application,
@ -183,11 +182,11 @@ def edit(request, application_id=None):
if application_id is not None: if application_id is not None:
application = Application.objects.get(id=application_id) application = Application.objects.get(id=application_id)
if (not hasattr(application.submitter, 'user') or if (not hasattr(application.submitter, 'user') or
not request.user.openslidesuser == application.submitter.user) \ not request.user == application.submitter.user) \
and not is_manager: and not is_manager:
messages.error(request, _("You can not edit this application. You are not the submitter.")) messages.error(request, _("You can not edit this application. You are not the submitter."))
return redirect(reverse('application_view', args=[application.id])) return redirect(reverse('application_view', args=[application.id]))
actions = application.get_allowed_actions(user=request.user.openslidesuser) actions = application.get_allowed_actions(user=request.user)
else: else:
application = None application = None
actions = None actions = None
@ -221,7 +220,7 @@ def edit(request, application_id=None):
original_supporters = [] original_supporters = []
application = managerform.save(commit=False) application = managerform.save(commit=False)
elif application_id is None: elif application_id is None:
application = Application(submitter=request.user.openslidesuser) application = Application(submitter=request.user)
application.title = dataform.cleaned_data['title'] application.title = dataform.cleaned_data['title']
application.text = dataform.cleaned_data['text'] application.text = dataform.cleaned_data['text']
application.reason = dataform.cleaned_data['reason'] application.reason = dataform.cleaned_data['reason']
@ -231,7 +230,7 @@ def edit(request, application_id=None):
and dataform.cleaned_data['trivial_change'] and dataform.cleaned_data['trivial_change']
except KeyError: except KeyError:
trivial_change = False trivial_change = False
application.save(request.user.openslidesuser, trivial_change=trivial_change) application.save(request.user, trivial_change=trivial_change)
if is_manager: if is_manager:
try: try:
new_supporters = set(managerform.cleaned_data['supporter']) new_supporters = set(managerform.cleaned_data['supporter'])
@ -273,7 +272,7 @@ def edit(request, application_id=None):
dataform = formclass(initial=initial, prefix="data") dataform = formclass(initial=initial, prefix="data")
if is_manager: if is_manager:
if application_id is None: if application_id is None:
initial = {'submitter': request.user.openslidesuser.person_id} initial = {'submitter': request.user.person_id}
else: else:
initial = {'submitter': application.submitter.person_id, initial = {'submitter': application.submitter.person_id,
'supporter': [supporter.person_id for supporter in application.supporters]} 'supporter': [supporter.person_id for supporter in application.supporters]}
@ -296,7 +295,7 @@ def set_number(request, application_id):
set a number for an application. set a number for an application.
""" """
try: try:
Application.objects.get(pk=application_id).set_number(user=request.user.openslidesuser) Application.objects.get(pk=application_id).set_number(user=request.user)
messages.success(request, _("Application number was successfully set.")) messages.success(request, _("Application number was successfully set."))
except Application.DoesNotExist: except Application.DoesNotExist:
pass pass
@ -312,7 +311,7 @@ def permit(request, application_id):
permit an application. permit an application.
""" """
try: try:
Application.objects.get(pk=application_id).permit(user=request.user.openslidesuser) Application.objects.get(pk=application_id).permit(user=request.user)
messages.success(request, _("Application was successfully permitted.")) messages.success(request, _("Application was successfully permitted."))
except Application.DoesNotExist: except Application.DoesNotExist:
pass pass
@ -327,7 +326,7 @@ def notpermit(request, application_id):
reject (not permit) an application. reject (not permit) an application.
""" """
try: try:
Application.objects.get(pk=application_id).notpermit(user=request.user.openslidesuser) Application.objects.get(pk=application_id).notpermit(user=request.user)
messages.success(request, _("Application was successfully rejected.")) messages.success(request, _("Application was successfully rejected."))
except Application.DoesNotExist: except Application.DoesNotExist:
pass pass
@ -343,7 +342,7 @@ def set_status(request, application_id=None, status=None):
try: try:
if status is not None: if status is not None:
application = Application.objects.get(pk=application_id) application = Application.objects.get(pk=application_id)
application.set_status(user=request.user.openslidesuser, status=status) application.set_status(user=request.user, status=status)
messages.success(request, _("Application status was set to: <b>%s</b>.") % application.get_status_display()) messages.success(request, _("Application status was set to: <b>%s</b>.") % application.get_status_display())
except Application.DoesNotExist: except Application.DoesNotExist:
pass pass
@ -387,7 +386,7 @@ def unsupport(request, application_id):
unsupport an application. unsupport an application.
""" """
try: try:
Application.objects.get(pk=application_id).unsupport(user=request.user.openslidesuser) Application.objects.get(pk=application_id).unsupport(user=request.user)
messages.success(request, _("You have unsupport the application successfully.") ) messages.success(request, _("You have unsupport the application successfully.") )
except Application.DoesNotExist: except Application.DoesNotExist:
pass pass
@ -401,7 +400,7 @@ def gen_poll(request, application_id):
gen a poll for this application. gen a poll for this application.
""" """
try: try:
poll = Application.objects.get(pk=application_id).gen_poll(user=request.user.openslidesuser) poll = Application.objects.get(pk=application_id).gen_poll(user=request.user)
messages.success(request, _("New vote was successfully created.") ) messages.success(request, _("New vote was successfully created.") )
except Application.DoesNotExist: except Application.DoesNotExist:
pass # TODO: do not call poll after this excaption pass # TODO: do not call poll after this excaption
@ -418,7 +417,7 @@ def delete_poll(request, poll_id):
count = application.polls.filter(id__lte=poll_id).count() count = application.polls.filter(id__lte=poll_id).count()
if request.method == 'POST': if request.method == 'POST':
poll.delete() poll.delete()
application.writelog(_("Poll deleted"), request.user.openslidesuser) application.writelog(_("Poll deleted"), request.user)
messages.success(request, _('Poll was successfully deleted.')) messages.success(request, _('Poll was successfully deleted.'))
else: else:
del_confirm_form(request, poll, name=_("the %s. poll") % count, delete_link=reverse('application_poll_delete', args=[poll_id])) del_confirm_form(request, poll, name=_("the %s. poll") % count, delete_link=reverse('application_poll_delete', args=[poll_id]))
@ -458,7 +457,7 @@ class ApplicationDelete(DeleteView):
if len(self.applications): if len(self.applications):
for application in self.applications: for application in self.applications:
if not 'delete' in application.get_allowed_actions(user=request.user.openslidesuser): if not 'delete' in application.get_allowed_actions(user=request.user):
messages.error(request, _("You can not delete application <b>%s</b>.") % application) messages.error(request, _("You can not delete application <b>%s</b>.") % application)
continue continue
@ -467,7 +466,7 @@ class ApplicationDelete(DeleteView):
messages.success(request, _("Application <b>%s</b> was successfully deleted.") % title) messages.success(request, _("Application <b>%s</b> was successfully deleted.") % title)
elif self.object: elif self.object:
if not 'delete' in self.object.get_allowed_actions(user=request.user.openslidesuser): if not 'delete' in self.object.get_allowed_actions(user=request.user):
messages.error(request, _("You can not delete application <b>%s</b>.") % self.object) messages.error(request, _("You can not delete application <b>%s</b>.") % self.object)
else: else:
title = self.object.title title = self.object.title
@ -508,12 +507,12 @@ class ViewPoll(PollFormView):
self.application = self.poll.get_application() self.application = self.poll.get_application()
context['application'] = self.application context['application'] = self.application
context['ballot'] = self.poll.get_ballot() context['ballot'] = self.poll.get_ballot()
context['actions'] = self.application.get_allowed_actions(user=self.request.user.openslidesuser) context['actions'] = self.application.get_allowed_actions(user=self.request.user)
return context return context
def get_modelform_class(self): def get_modelform_class(self):
cls = super(ViewPoll, self).get_modelform_class() cls = super(ViewPoll, self).get_modelform_class()
user = self.request.user.openslidesuser user = self.request.user
class ViewPollFormClass(cls): class ViewPollFormClass(cls):
def save(self, commit = True): def save(self, commit = True):
@ -535,7 +534,7 @@ def permit_version(request, aversion_id):
aversion = AVersion.objects.get(pk=aversion_id) aversion = AVersion.objects.get(pk=aversion_id)
application = aversion.application application = aversion.application
if request.method == 'POST': if request.method == 'POST':
application.accept_version(aversion, user=request.user.openslidesuser) application.accept_version(aversion, user=request.user)
messages.success(request, _("Version <b>%s</b> accepted.") % (aversion.aid)) messages.success(request, _("Version <b>%s</b> accepted.") % (aversion.aid))
else: else:
gen_confirm_form(request, _('Do you really want to permit version <b>%s</b>?') % aversion.aid, reverse('application_version_permit', args=[aversion.id])) gen_confirm_form(request, _('Do you really want to permit version <b>%s</b>?') % aversion.aid, reverse('application_version_permit', args=[aversion.id]))
@ -547,7 +546,7 @@ def reject_version(request, aversion_id):
aversion = AVersion.objects.get(pk=aversion_id) aversion = AVersion.objects.get(pk=aversion_id)
application = aversion.application application = aversion.application
if request.method == 'POST': if request.method == 'POST':
if application.reject_version(aversion, user=request.user.openslidesuser): if application.reject_version(aversion, user=request.user):
messages.success(request, _("Version <b>%s</b> rejected.") % (aversion.aid)) messages.success(request, _("Version <b>%s</b> rejected.") % (aversion.aid))
else: else:
messages.error(request, _("ERROR by rejecting the version.") ) messages.error(request, _("ERROR by rejecting the version.") )
@ -559,17 +558,6 @@ def reject_version(request, aversion_id):
@permission_required('application.can_manage_application') @permission_required('application.can_manage_application')
@template('application/import.html') @template('application/import.html')
def application_import(request): def application_import(request):
try:
request.user.openslidesuser
except OpenSlidesUser.DoesNotExist:
pass
except AttributeError:
# AnonymousUser
pass
else:
messages.error(request, _('The import function is available for the admin (without user profile) only.'))
return redirect(reverse('application_overview'))
if request.method == 'POST': if request.method == 'POST':
form = ApplicationImportForm(request.POST, request.FILES) form = ApplicationImportForm(request.POST, request.FILES)
if form.is_valid(): if form.is_valid():

View File

@ -34,7 +34,7 @@ from openslides.utils.person import get_person
from openslides.config.models import config from openslides.config.models import config
from openslides.participant.models import OpenSlidesUser from openslides.participant.models import User
from openslides.projector.projector import Widget from openslides.projector.projector import Widget
@ -97,13 +97,12 @@ def view(request, assignment_id=None):
polls = assignment.poll_set.all() polls = assignment.poll_set.all()
vote_results = assignment.vote_results(only_published=False) vote_results = assignment.vote_results(only_published=False)
user = request.user.openslidesuser
return { return {
'assignment': assignment, 'assignment': assignment,
'form': form, 'form': form,
'vote_results': vote_results, 'vote_results': vote_results,
'polls': polls, 'polls': polls,
'user_is_candidate': assignment.is_candidate(user) 'user_is_candidate': assignment.is_candidate(request.user)
} }
@ -173,7 +172,7 @@ def set_status(request, assignment_id=None, status=None):
def run(request, assignment_id): def run(request, assignment_id):
assignment = Assignment.objects.get(pk=assignment_id) assignment = Assignment.objects.get(pk=assignment_id)
try: try:
assignment.run(request.user.openslidesuser, request.user) assignment.run(request.user, request.user)
messages.success(request, _('You have set your candidature successfully.') ) messages.success(request, _('You have set your candidature successfully.') )
except NameError, e: except NameError, e:
messages.error(request, e) messages.error(request, e)
@ -185,7 +184,7 @@ def delrun(request, assignment_id):
assignment = Assignment.objects.get(pk=assignment_id) assignment = Assignment.objects.get(pk=assignment_id)
try: try:
if assignment.status == 'sea' or user.has_perm("assignment.can_manage_assignment"): if assignment.status == 'sea' or user.has_perm("assignment.can_manage_assignment"):
assignment.delrun(request.user.openslidesuser) assignment.delrun(request.user)
else: else:
messages.error(request, _('The candidate list is already closed.')) messages.error(request, _('The candidate list is already closed.'))
except Exception, e: except Exception, e:

View File

@ -22,7 +22,7 @@ from django.db import transaction
from openslides.utils import csv_ext from openslides.utils import csv_ext
from openslides.participant.models import OpenSlidesUser from openslides.participant.models import User
def gen_password(): def gen_password():
@ -76,7 +76,7 @@ def import_users(csv_file):
except ValueError: except ValueError:
error_messages.append(_('Ignoring malformed line %d in import file.') % line_no + 1) error_messages.append(_('Ignoring malformed line %d in import file.') % line_no + 1)
continue continue
user = OpenSlidesUser() user = User()
user.last_name = last_name user.last_name = last_name
user.first_name = first_name user.first_name = first_name
user.username = gen_username(first_name, last_name) user.username = gen_username(first_name, last_name)

View File

@ -17,27 +17,27 @@ from django.utils.translation import ugettext_lazy as _
from openslides.utils.forms import ( from openslides.utils.forms import (
CssClassMixin, LocalizedModelMultipleChoiceField) CssClassMixin, LocalizedModelMultipleChoiceField)
from openslides.participant.models import OpenSlidesUser, OpenSlidesGroup from openslides.participant.models import User, Group
class UserCreateForm(forms.ModelForm, CssClassMixin): class UserCreateForm(forms.ModelForm, CssClassMixin):
first_name = forms.CharField(label=_("First name")) first_name = forms.CharField(label=_("First name"))
last_name = forms.CharField(label=_("Last name")) last_name = forms.CharField(label=_("Last name"))
groups = forms.ModelMultipleChoiceField( groups = forms.ModelMultipleChoiceField(
queryset=OpenSlidesGroup.objects.exclude(name__iexact='anonymous'), queryset=Group.objects.exclude(name__iexact='anonymous'),
label=_("User groups"), required=False) label=_("User groups"), required=False)
is_active = forms.BooleanField( is_active = forms.BooleanField(
label=_("Active"), required=False, initial=True) label=_("Active"), required=False, initial=True)
class Meta: class Meta:
model = OpenSlidesUser model = User
fields = ('first_name', 'last_name', 'is_active', 'groups', 'category', fields = ('first_name', 'last_name', 'is_active', 'groups', 'category',
'gender', 'type', 'committee', 'comment', 'firstpassword') 'gender', 'type', 'committee', 'comment', 'firstpassword')
class UserUpdateForm(UserCreateForm): class UserUpdateForm(UserCreateForm):
class Meta: class Meta:
model = OpenSlidesUser model = User
fields = ('username', 'first_name', 'last_name', 'is_active', 'groups', fields = ('username', 'first_name', 'last_name', 'is_active', 'groups',
'category', 'gender', 'type', 'committee', 'comment', 'category', 'gender', 'type', 'committee', 'comment',
'firstpassword') 'firstpassword')
@ -48,14 +48,13 @@ class GroupForm(forms.ModelForm, CssClassMixin):
queryset=Permission.objects.all(), label=_("Persmissions"), queryset=Permission.objects.all(), label=_("Persmissions"),
required=False) required=False)
users = forms.ModelMultipleChoiceField( users = forms.ModelMultipleChoiceField(
queryset=OpenSlidesUser.objects.all(), queryset=User.objects.all(), label=_("Users"), required=False)
label=_("Users"), required=False)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
# Initial users # Initial users
if kwargs.get('instance', None) is not None: if kwargs.get('instance', None) is not None:
initial = kwargs.setdefault('initial', {}) initial = kwargs.setdefault('initial', {})
initial['users'] = [user.pk for user in kwargs['instance'].user_set.all()] initial['users'] = [django_user.user.pk for django_user in kwargs['instance'].user_set.all()]
super(GroupForm, self).__init__(*args, **kwargs) super(GroupForm, self).__init__(*args, **kwargs)
@ -93,12 +92,12 @@ class GroupForm(forms.ModelForm, CssClassMixin):
return data return data
class Meta: class Meta:
model = OpenSlidesGroup model = Group
class UsersettingsForm(forms.ModelForm, CssClassMixin): class UsersettingsForm(forms.ModelForm, CssClassMixin):
class Meta: class Meta:
model = OpenSlidesUser model = User
fields = ('username', 'first_name', 'last_name', 'email') fields = ('username', 'first_name', 'last_name', 'email')

View File

@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
openslides.utils.middleware openslides.utils.middleware
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
Additional definitions for OpenSlides forms. Additional definitions for OpenSlides forms.
@ -19,4 +19,4 @@ class AuthenticationMiddleware(_AuthenticationMiddleware):
super(AuthenticationMiddleware, self).process_request(request) super(AuthenticationMiddleware, self).process_request(request)
if not isinstance(request.user, AnonymousUser): if not isinstance(request.user, AnonymousUser):
request.user = request.user.openslidesuser request.user = request.user.user

View File

@ -10,7 +10,7 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from django.contrib.auth.models import User, Group from django.contrib.auth.models import User as DjangoUser, Group as DjangoGroup
from django.db import models from django.db import models
from django.db.models import signals from django.db.models import signals
from django.dispatch import receiver from django.dispatch import receiver
@ -22,8 +22,8 @@ from openslides.utils.person.signals import receiv_persons
from openslides.config.signals import default_config_value from openslides.config.signals import default_config_value
class OpenSlidesUser(User, PersonMixin): class User(DjangoUser, PersonMixin):
person_prefix = 'openslides_user' person_prefix = 'user'
GENDER_CHOICES = ( GENDER_CHOICES = (
('male', _('Male')), ('male', _('Male')),
('female', _('Female')), ('female', _('Female')),
@ -35,7 +35,7 @@ class OpenSlidesUser(User, PersonMixin):
('guest', _('Guest')), ('guest', _('Guest')),
) )
user = models.OneToOneField(User, editable=False, parent_link=True) django_user = models.OneToOneField(DjangoUser, editable=False, parent_link=True)
category = models.CharField( category = models.CharField(
max_length=100, null=True, blank=True, verbose_name=_("Category"), max_length=100, null=True, blank=True, verbose_name=_("Category"),
help_text=_('Will be shown behind the name.')) help_text=_('Will be shown behind the name.'))
@ -72,8 +72,8 @@ class OpenSlidesUser(User, PersonMixin):
""" """
if password is None: if password is None:
password = self.firstpassword password = self.firstpassword
self.user.set_password(password) self.set_password(password)
self.user.save() self.save()
@models.permalink @models.permalink
def get_absolute_url(self, link='edit'): def get_absolute_url(self, link='edit'):
@ -104,10 +104,10 @@ class OpenSlidesUser(User, PersonMixin):
) )
class OpenSlidesGroup(Group, PersonMixin): class Group(DjangoGroup, PersonMixin):
person_prefix = 'openslides_group' person_prefix = 'group'
group = models.OneToOneField(Group, editable=False, parent_link=True) django_group = models.OneToOneField(DjangoGroup, editable=False, parent_link=True)
group_as_person = models.BooleanField(default=False) group_as_person = models.BooleanField(default=False)
description = models.TextField(blank=True) description = models.TextField(blank=True)
@ -126,38 +126,38 @@ class OpenSlidesGroup(Group, PersonMixin):
return ('user_group_delete', [str(self.id)]) return ('user_group_delete', [str(self.id)])
def __unicode__(self): def __unicode__(self):
return unicode(self.group) return unicode(self.name)
class OpenSlidesUsersConnecter(object): class UsersConnecter(object):
def __init__(self, person_prefix=None, id=None): def __init__(self, person_prefix=None, id=None):
self.person_prefix = person_prefix self.person_prefix = person_prefix
self.id = id self.id = id
def __iter__(self): def __iter__(self):
if (not self.person_prefix or if (not self.person_prefix or
self.person_prefix == OpenSlidesUser.person_prefix): self.person_prefix == User.person_prefix):
if self.id: if self.id:
yield OpenSlidesUser.objects.get(pk=self.id) yield User.objects.get(pk=self.id)
else: else:
for user in OpenSlidesUser.objects.all(): for user in User.objects.all():
yield user yield user
if (not self.person_prefix or if (not self.person_prefix or
self.person_prefix == OpenSlidesGroup.person_prefix): self.person_prefix == Group.person_prefix):
if self.id: if self.id:
yield OpenSlidesGroup.objects.get(pk=self.id) yield Group.objects.filter(group_as_person=True).get(pk=self.id)
else: else:
for group in OpenSlidesGroup.objects.all(): for group in Group.objects.filter(group_as_person=True):
yield group yield group
def __getitem__(self, key): def __getitem__(self, key):
return OpenSlidesUser.objects.get(pk=key) return User.objects.get(pk=key)
@receiver(receiv_persons, dispatch_uid="participant") @receiver(receiv_persons, dispatch_uid="participant")
def receiv_persons(sender, **kwargs): def receiv_persons(sender, **kwargs):
return OpenSlidesUsersConnecter(person_prefix=kwargs['person_prefix'], return UsersConnecter(person_prefix=kwargs['person_prefix'],
id=kwargs['id']) id=kwargs['id'])
@ -174,17 +174,17 @@ def default_config(sender, key, **kwargs):
}.get(key) }.get(key)
@receiver(signals.post_save, sender=User) @receiver(signals.post_save, sender=DjangoUser)
def user_post_save(sender, instance, signal, *args, **kwargs): def user_post_save(sender, instance, signal, *args, **kwargs):
try: try:
instance.openslidesuser instance.user
except OpenSlidesUser.DoesNotExist: except User.DoesNotExist:
OpenSlidesUser(user=instance).save_base(raw=True) User(django_user=instance).save_base(raw=True)
@receiver(signals.post_save, sender=Group) @receiver(signals.post_save, sender=DjangoGroup)
def group_post_save(sender, instance, signal, *args, **kwargs): def group_post_save(sender, instance, signal, *args, **kwargs):
try: try:
instance.openslidesgroup instance.group
except OpenSlidesGroup.DoesNotExist: except Group.DoesNotExist:
OpenSlidesGroup(group=instance).save_base(raw=True) Group(django_group=instance).save_base(raw=True)

View File

@ -78,11 +78,11 @@
<tr class="{% cycle '' 'odd' %}"> <tr class="{% cycle '' 'odd' %}">
<td>{{ user.first_name }}</td> <td>{{ user.first_name }}</td>
<td>{{ user.last_name }}</td> <td>{{ user.last_name }}</td>
<td>{{ user.openslidesuser.category }}</td> <td>{{ user.category }}</td>
<td>{{ user.openslidesuser.get_type_display }}</td> <td>{{ user.get_type_display }}</td>
<td>{{ user.openslidesuser.committee }}</td> <td>{{ user.committee }}</td>
{% if perms.participant.can_manage_participant %} {% if perms.participant.can_manage_participant %}
<td>{{ user.openslidesuser.comment|first_line }}</td> <td>{{ user.comment|first_line }}</td>
<td> <td>
{% if user.last_login > user.date_joined %} {% if user.last_login > user.date_joined %}
{{ user.last_login }} {{ user.last_login }}

View File

@ -16,57 +16,58 @@ from django.contrib.auth.hashers import check_password
from openslides.utils.person import get_person, Persons from openslides.utils.person import get_person, Persons
from openslides.participant.api import gen_username, gen_password from openslides.participant.api import gen_username, gen_password
from openslides.participant.models import OpenSlidesUser, OpenSlidesGroup from openslides.participant.models import User, Group
class OpenSlidesUserTest(TestCase): class UserTest(TestCase):
def setUp(self): def setUp(self):
self.openslidesuser1 = OpenSlidesUser() self.user1 = User()
self.openslidesuser1.first_name = u'Max' self.user1.first_name = u'Max'
self.openslidesuser1.last_name = u'Mustermann' self.user1.last_name = u'Mustermann'
self.openslidesuser1.username = gen_username( self.user1.username = gen_username(
self.openslidesuser1.first_name, self.openslidesuser1.last_name) self.user1.first_name, self.user1.last_name)
self.openslidesuser1.firstpassword = gen_password() self.user1.firstpassword = gen_password()
self.openslidesuser1.save() self.user1.save()
self.user1 = self.openslidesuser1.user self.django_user1 = self.user1.django_user
def test_participant_user(self): def test_participant_user(self):
self.assertEqual(self.user1.openslidesuser, self.openslidesuser1) self.assertEqual(self.django_user1.user, self.user1)
self.assertEqual(self.user1, self.openslidesuser1.user) self.assertEqual(self.django_user1, self.user1.django_user)
def test_repr(self): def test_repr(self):
self.assertEqual(unicode(self.openslidesuser1), u'Max Mustermann') self.assertEqual(unicode(self.user1), u'Max Mustermann')
def test_name_surfix(self): def test_name_surfix(self):
self.openslidesuser1.category = u'München' self.user1.category = u'München'
self.openslidesuser1.save() self.user1.save()
self.assertEqual(unicode(self.openslidesuser1), u'Max Mustermann (München)') self.assertEqual(unicode(self.user1), u'Max Mustermann (München)')
def test_reset_password(self): def test_reset_password(self):
self.assertIsInstance(self.openslidesuser1.firstpassword, basestring) self.assertIsInstance(self.user1.firstpassword, basestring)
self.assertEqual(len(self.openslidesuser1.firstpassword), 8) self.assertEqual(len(self.user1.firstpassword), 8)
self.user1.set_unusable_password() self.user1.set_unusable_password()
self.assertFalse(self.user1.check_password(self.openslidesuser1.firstpassword)) self.assertFalse(self.user1.check_password(self.user1.firstpassword))
self.openslidesuser1.reset_password() self.user1.reset_password()
self.assertTrue(self.user1.check_password(self.openslidesuser1.firstpassword)) self.assertTrue(self.user1.check_password(self.user1.firstpassword))
def test_person_api(self): def test_person_api(self):
self.assertTrue(hasattr(self.openslidesuser1, 'person_id')) self.assertTrue(hasattr(self.user1, 'person_id'))
self.assertEqual(self.openslidesuser1.person_id, 'openslides_user:1') self.assertEqual(self.user1.person_id, 'user:1')
self.assertEqual(get_person('openslides_user:1'), self.openslidesuser1) self.assertEqual(get_person('user:1'), self.user1)
self.assertEqual(len(Persons(person_prefix='openslides_user')), 1) self.assertEqual(len(Persons(person_prefix='user')), 1)
class OpenSlidesGroupTest(TestCase): class GroupTest(TestCase):
def setUp(self): def setUp(self):
self.openslidesgroup1 = OpenSlidesGroup.objects.create(name='Test Group') self.group1 = Group.objects.create(name='Test Group')
self.group1 = self.openslidesgroup1.group self.django_group1 = self.group1.django_group
def test_group_openslidesgroup(self): def test_group_group(self):
self.assertEqual(self.openslidesgroup1.group, self.group1) self.assertEqual(self.group1.django_group, self.django_group1)
self.assertEqual(self.group1, self.django_group1.group)
def test_person_api(self): def test_person_api(self):
self.assertTrue(hasattr(self.openslidesgroup1, 'person_id')) self.assertTrue(hasattr(self.group1, 'person_id'))
person_id = "openslides_group:%d" % self.openslidesgroup1.id person_id = "group:%d" % self.group1.id
self.assertEqual(self.openslidesgroup1.person_id, person_id) self.assertEqual(self.group1.person_id, person_id)
self.assertEqual(get_person(person_id), self.openslidesgroup1) self.assertEqual(get_person(person_id), self.group1)

View File

@ -48,7 +48,7 @@ from openslides.participant.api import gen_username, gen_password, import_users
from openslides.participant.forms import ( from openslides.participant.forms import (
UserCreateForm, UserUpdateForm, UsersettingsForm, UserCreateForm, UserUpdateForm, UsersettingsForm,
UserImportForm, GroupForm, ConfigForm) UserImportForm, GroupForm, ConfigForm)
from openslides.participant.models import OpenSlidesUser, OpenSlidesGroup from openslides.participant.models import User, Group
class Overview(ListView): class Overview(ListView):
@ -77,7 +77,7 @@ class Overview(ListView):
else: else:
sortfilter[value] = [self.request.REQUEST[value]] sortfilter[value] = [self.request.REQUEST[value]]
query = OpenSlidesUser.objects query = User.objects
if 'gender' in sortfilter: if 'gender' in sortfilter:
query = query.filter(gender__iexact=sortfilter['gender'][0]) query = query.filter(gender__iexact=sortfilter['gender'][0])
if 'category' in sortfilter: if 'category' in sortfilter:
@ -94,7 +94,7 @@ class Overview(ListView):
elif (sortfilter['sort'][0] in elif (sortfilter['sort'][0] in
['category', 'type', 'committee', 'comment']): ['category', 'type', 'committee', 'comment']):
query = query.order_by( query = query.order_by(
'openslidesuser__%s' % sortfilter['sort'][0]) '%s' % sortfilter['sort'][0])
else: else:
query = query.order_by('last_name') query = query.order_by('last_name')
@ -108,7 +108,7 @@ class Overview(ListView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(Overview, self).get_context_data(**kwargs) context = super(Overview, self).get_context_data(**kwargs)
all_users = OpenSlidesUser.objects.count() all_users = User.objects.count()
# quotient of selected users and all users # quotient of selected users and all users
if all_users > 0: if all_users > 0:
@ -117,11 +117,11 @@ class Overview(ListView):
percent = 0 percent = 0
# list of all existing categories # list of all existing categories
categories = [p['category'] for p in OpenSlidesUser.objects.values('category') categories = [p['category'] for p in User.objects.values('category')
.exclude(category='').distinct()] .exclude(category='').distinct()]
# list of all existing committees # list of all existing committees
committees = [p['committee'] for p in OpenSlidesUser.objects.values('committee') committees = [p['committee'] for p in User.objects.values('committee')
.exclude(committee='').distinct()] .exclude(committee='').distinct()]
context.update({ context.update({
'allusers': all_users, 'allusers': all_users,
@ -140,7 +140,7 @@ class UserCreateView(CreateView):
""" """
permission_required = 'participant.can_manage_participant' permission_required = 'participant.can_manage_participant'
template_name = 'participant/edit.html' template_name = 'participant/edit.html'
model = OpenSlidesUser model = User
context_object_name = 'edit_user' context_object_name = 'edit_user'
form_class = UserCreateForm form_class = UserCreateForm
success_url = 'user_overview' success_url = 'user_overview'
@ -159,7 +159,7 @@ class UserUpdateView(UpdateView):
""" """
permission_required = 'participant.can_manage_participant' permission_required = 'participant.can_manage_participant'
template_name = 'participant/edit.html' template_name = 'participant/edit.html'
model = OpenSlidesUser model = User
context_object_name = 'edit_user' context_object_name = 'edit_user'
form_class = UserUpdateForm form_class = UserUpdateForm
success_url = 'user_overview' success_url = 'user_overview'
@ -171,7 +171,7 @@ class UserDeleteView(DeleteView):
Delete an participant. Delete an participant.
""" """
permission_required = 'participant.can_manage_participant' permission_required = 'participant.can_manage_participant'
model = OpenSlidesUser model = User
url = 'user_overview' url = 'user_overview'
@ -182,7 +182,7 @@ class SetUserStatusView(RedirectView, SingleObjectMixin):
permission_required = 'participant.can_manage_participant' permission_required = 'participant.can_manage_participant'
allow_ajax = True allow_ajax = True
url = 'user_overview' url = 'user_overview'
model = OpenSlidesUser model = User
def pre_redirect(self, request, *args, **kwargs): def pre_redirect(self, request, *args, **kwargs):
self.object = self.get_object() self.object = self.get_object()
@ -215,7 +215,7 @@ class ParticipantsListPDF(PDFView):
_('Committee')]] _('Committee')]]
sort = 'last_name' sort = 'last_name'
counter = 0 counter = 0
for user in OpenSlidesUser.objects.all().order_by(sort): for user in User.objects.all().order_by(sort):
counter += 1 counter += 1
data.append([ data.append([
counter, counter,
@ -255,7 +255,7 @@ class ParticipantsPasswordsPDF(PDFView):
data = [] data = []
participant_pdf_system_url = config["participant_pdf_system_url"] participant_pdf_system_url = config["participant_pdf_system_url"]
participant_pdf_welcometext = config["participant_pdf_welcometext"] participant_pdf_welcometext = config["participant_pdf_welcometext"]
for user in OpenSlidesUser.objects.all().order_by('last_name'): for user in User.objects.all().order_by('last_name'):
cell = [] cell = []
cell.append(Spacer(0, 0.8 * cm)) cell.append(Spacer(0, 0.8 * cm))
cell.append(Paragraph(_("Account for OpenSlides"), cell.append(Paragraph(_("Account for OpenSlides"),
@ -323,7 +323,7 @@ class ResetPasswordView(RedirectView, SingleObjectMixin, QuestionMixin):
Set the Passwort for a user to his firstpassword. Set the Passwort for a user to his firstpassword.
""" """
permission_required = 'participant.can_manage_participant' permission_required = 'participant.can_manage_participant'
model = OpenSlidesUser model = User
allow_ajax = True allow_ajax = True
question = ugettext_lazy('Do you really want to reset the password?') question = ugettext_lazy('Do you really want to reset the password?')
@ -354,7 +354,7 @@ class GroupOverviewView(ListView):
permission_required = 'participant.can_manage_participant' permission_required = 'participant.can_manage_participant'
template_name = 'participant/group_overview.html' template_name = 'participant/group_overview.html'
context_object_name = 'groups' context_object_name = 'groups'
model = OpenSlidesGroup model = Group
class GroupCreateView(CreateView): class GroupCreateView(CreateView):
@ -364,7 +364,7 @@ class GroupCreateView(CreateView):
permission_required = 'participant.can_manage_participant' permission_required = 'participant.can_manage_participant'
template_name = 'participant/group_edit.html' template_name = 'participant/group_edit.html'
context_object_name = 'group' context_object_name = 'group'
model = OpenSlidesGroup model = Group
form_class = GroupForm form_class = GroupForm
success_url = 'user_group_overview' success_url = 'user_group_overview'
apply_url = 'user_group_edit' apply_url = 'user_group_edit'
@ -380,7 +380,7 @@ class GroupUpdateView(UpdateView):
""" """
permission_required = 'participant.can_manage_participant' permission_required = 'participant.can_manage_participant'
template_name = 'participant/group_edit.html' template_name = 'participant/group_edit.html'
model = OpenSlidesGroup model = Group
context_object_name = 'group' context_object_name = 'group'
form_class = GroupForm form_class = GroupForm
success_url = 'user_group_overview' success_url = 'user_group_overview'
@ -396,7 +396,7 @@ class GroupDeleteView(DeleteView):
Delete a Group. Delete a Group.
""" """
permission_required = 'participant.can_manage_participant' permission_required = 'participant.can_manage_participant'
model = OpenSlidesGroup model = Group
url = 'user_group_overview' url = 'user_group_overview'

View File

@ -55,7 +55,6 @@ for plugin in settings.INSTALLED_PLUGINS:
urlpatterns += patterns('', urlpatterns += patterns('',
(r'^500/$', 'openslides.utils.views.server_error'),
(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict), (r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
url(r'^login/$', url(r'^login/$',

View File

@ -43,6 +43,8 @@ class Persons(object):
def generate_person_id(prefix, id): def generate_person_id(prefix, id):
assert prefix is not None
assert id is not None
if ':' in prefix: if ':' in prefix:
raise ValueError("':' is not allowed in a the 'person_prefix'") raise ValueError("':' is not allowed in a the 'person_prefix'")
return "%s:%d" % (prefix, id) return "%s:%d" % (prefix, id)

View File

@ -57,7 +57,7 @@ class PersonMixin(object):
try: try:
return generate_person_id(self.person_prefix, self.pk) return generate_person_id(self.person_prefix, self.pk)
except AttributeError: except AttributeError:
raise AttributeError("%s has to have a attribute 'user_prefix'" raise AttributeError("%s has to have a attribute 'person_prefix'"
% self) % self)
def __repr__(self): def __repr__(self):