diff --git a/initial_data.json b/initial_data.json index ad17d7a56..5f7c8e30c 100644 --- a/initial_data.json +++ b/initial_data.json @@ -1,6 +1,6 @@ [ { - "pk": 2, + "pk": 1, "model": "auth.group", "fields": { "name": "Beobachter", @@ -38,7 +38,7 @@ [ "can_see_participant", "participant", - "openslidesuser" + "user" ], [ "can_see_projector", @@ -49,7 +49,7 @@ } }, { - "pk": 3, + "pk": 2, "model": "auth.group", "fields": { "name": "Delegierter", @@ -92,7 +92,7 @@ [ "can_see_participant", "participant", - "openslidesuser" + "user" ], [ "can_see_projector", @@ -103,7 +103,7 @@ } }, { - "pk": 4, + "pk": 3, "model": "auth.group", "fields": { "name": "Versammlungsleitung", @@ -161,12 +161,12 @@ [ "can_manage_participant", "participant", - "openslidesuser" + "user" ], [ "can_see_participant", "participant", - "openslidesuser" + "user" ], [ "can_manage_projector", @@ -182,7 +182,7 @@ } }, { - "pk": 5, + "pk": 4, "model": "auth.group", "fields": { "name": "Teilnehmerverwaltung", @@ -195,12 +195,12 @@ [ "can_manage_participant", "participant", - "openslidesuser" + "user" ], [ "can_see_participant", "participant", - "openslidesuser" + "user" ], [ "can_see_projector", diff --git a/openslides/application/models.py b/openslides/application/models.py index 78ebd55b6..82d1099c8 100644 --- a/openslides/application/models.py +++ b/openslides/application/models.py @@ -12,7 +12,6 @@ from datetime import datetime -from django.contrib.auth.models import User from django.core.urlresolvers import reverse from django.db import models 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.signals import default_config_value -from openslides.participant.models import OpenSlidesUser - from openslides.poll.models import (BaseOption, BasePoll, CountVotesCast, CountInvalid, BaseVote) @@ -360,15 +357,6 @@ class Application(models.Model, SlideMixin): Return a list of all the allowed status. """ 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 if ((self.status == "pub" @@ -405,11 +393,10 @@ class Application(models.Model, SlideMixin): # Check if the user can delete the application (admin, manager, owner) # reworked as requiered in #100 - if is_admin \ - or (user.has_perm("application.can_manage_application") \ - and (self.status == "pub" or self.number is None)) \ - or (self.submitter == user \ - and (self.status == "pub" or self.number is None)): + if (user.has_perm("applicatoin.can_delete_all_applications") or + (user.has_perm("application.can_manage_application") and + self.number is None) or + (self.submitter == user and self.number is None)): actions.append("delete") #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_support_application', ugettext_noop("Can support application")), ('can_manage_application', ugettext_noop("Can manage application")), + ('can_delete_all_applications', ugettext_noop("Can delete all applications")), ) diff --git a/openslides/application/tests.py b/openslides/application/tests.py index 2f5e65e09..bd3ecb73a 100644 --- a/openslides/application/tests.py +++ b/openslides/application/tests.py @@ -12,15 +12,17 @@ from django.test import TestCase 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 class ApplicationTest(TestCase): def setUp(self): - self.admin = User.objects.create_user('testadmin', '', 'default') - self.anonym = User.objects.create_user('testanoym', '', 'default') - self.app1 = Application(submitter=self.admin.openslidesuser) + self.admin = User(username='testadmin') + self.admin.save() + self.anonym = User(username='testanoym') + self.anonym.save() + self.app1 = Application(submitter=self.admin) self.app1.save() def refresh(self): diff --git a/openslides/application/views.py b/openslides/application/views.py index d531b0cab..1163d6ea2 100644 --- a/openslides/application/views.py +++ b/openslides/application/views.py @@ -51,7 +51,7 @@ from openslides.projector.projector import Widget from openslides.poll.views import PollFormView 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 @@ -124,7 +124,7 @@ def overview(request): for (i, application) in enumerate(applications): try: applications[i] = { - 'actions' : application.get_allowed_actions(request.user.openslidesuser), + 'actions' : application.get_allowed_actions(request.user), 'application' : application } except: @@ -152,8 +152,7 @@ def view(request, application_id, newest=False): else: version = application.public_version revisions = application.versions - user = request.user.openslidesuser - actions = application.get_allowed_actions(user=user) + actions = application.get_allowed_actions(user=request.user) return { 'application': application, @@ -183,11 +182,11 @@ def edit(request, application_id=None): if application_id is not None: application = Application.objects.get(id=application_id) if (not hasattr(application.submitter, 'user') or - not request.user.openslidesuser == application.submitter.user) \ + not request.user == application.submitter.user) \ and not is_manager: messages.error(request, _("You can not edit this application. You are not the submitter.")) 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: application = None actions = None @@ -221,7 +220,7 @@ def edit(request, application_id=None): original_supporters = [] application = managerform.save(commit=False) elif application_id is None: - application = Application(submitter=request.user.openslidesuser) + application = Application(submitter=request.user) application.title = dataform.cleaned_data['title'] application.text = dataform.cleaned_data['text'] application.reason = dataform.cleaned_data['reason'] @@ -231,7 +230,7 @@ def edit(request, application_id=None): and dataform.cleaned_data['trivial_change'] except KeyError: trivial_change = False - application.save(request.user.openslidesuser, trivial_change=trivial_change) + application.save(request.user, trivial_change=trivial_change) if is_manager: try: new_supporters = set(managerform.cleaned_data['supporter']) @@ -273,7 +272,7 @@ def edit(request, application_id=None): dataform = formclass(initial=initial, prefix="data") if is_manager: if application_id is None: - initial = {'submitter': request.user.openslidesuser.person_id} + initial = {'submitter': request.user.person_id} else: initial = {'submitter': application.submitter.person_id, '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. """ 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.")) except Application.DoesNotExist: pass @@ -312,7 +311,7 @@ def permit(request, application_id): permit an application. """ 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.")) except Application.DoesNotExist: pass @@ -327,7 +326,7 @@ def notpermit(request, application_id): reject (not permit) an application. """ 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.")) except Application.DoesNotExist: pass @@ -343,7 +342,7 @@ def set_status(request, application_id=None, status=None): try: if status is not None: 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: %s.") % application.get_status_display()) except Application.DoesNotExist: pass @@ -387,7 +386,7 @@ def unsupport(request, application_id): unsupport an application. """ 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.") ) except Application.DoesNotExist: pass @@ -401,7 +400,7 @@ def gen_poll(request, application_id): gen a poll for this application. """ 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.") ) except Application.DoesNotExist: 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() if request.method == 'POST': poll.delete() - application.writelog(_("Poll deleted"), request.user.openslidesuser) + application.writelog(_("Poll deleted"), request.user) messages.success(request, _('Poll was successfully deleted.')) else: 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): 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 %s.") % application) continue @@ -467,7 +466,7 @@ class ApplicationDelete(DeleteView): messages.success(request, _("Application %s was successfully deleted.") % title) 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 %s.") % self.object) else: title = self.object.title @@ -508,12 +507,12 @@ class ViewPoll(PollFormView): self.application = self.poll.get_application() context['application'] = self.application 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 def get_modelform_class(self): cls = super(ViewPoll, self).get_modelform_class() - user = self.request.user.openslidesuser + user = self.request.user class ViewPollFormClass(cls): def save(self, commit = True): @@ -535,7 +534,7 @@ def permit_version(request, aversion_id): aversion = AVersion.objects.get(pk=aversion_id) application = aversion.application if request.method == 'POST': - application.accept_version(aversion, user=request.user.openslidesuser) + application.accept_version(aversion, user=request.user) messages.success(request, _("Version %s accepted.") % (aversion.aid)) else: gen_confirm_form(request, _('Do you really want to permit version %s?') % 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) application = aversion.application 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 %s rejected.") % (aversion.aid)) else: messages.error(request, _("ERROR by rejecting the version.") ) @@ -559,17 +558,6 @@ def reject_version(request, aversion_id): @permission_required('application.can_manage_application') @template('application/import.html') 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': form = ApplicationImportForm(request.POST, request.FILES) if form.is_valid(): diff --git a/openslides/assignment/views.py b/openslides/assignment/views.py index 96a37bb14..56dc26448 100644 --- a/openslides/assignment/views.py +++ b/openslides/assignment/views.py @@ -34,7 +34,7 @@ from openslides.utils.person import get_person from openslides.config.models import config -from openslides.participant.models import OpenSlidesUser +from openslides.participant.models import User from openslides.projector.projector import Widget @@ -97,13 +97,12 @@ def view(request, assignment_id=None): polls = assignment.poll_set.all() vote_results = assignment.vote_results(only_published=False) - user = request.user.openslidesuser return { 'assignment': assignment, 'form': form, 'vote_results': vote_results, '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): assignment = Assignment.objects.get(pk=assignment_id) try: - assignment.run(request.user.openslidesuser, request.user) + assignment.run(request.user, request.user) messages.success(request, _('You have set your candidature successfully.') ) except NameError, e: messages.error(request, e) @@ -185,7 +184,7 @@ def delrun(request, assignment_id): assignment = Assignment.objects.get(pk=assignment_id) try: if assignment.status == 'sea' or user.has_perm("assignment.can_manage_assignment"): - assignment.delrun(request.user.openslidesuser) + assignment.delrun(request.user) else: messages.error(request, _('The candidate list is already closed.')) except Exception, e: diff --git a/openslides/participant/api.py b/openslides/participant/api.py index 9fdccc47b..6728016cd 100644 --- a/openslides/participant/api.py +++ b/openslides/participant/api.py @@ -22,7 +22,7 @@ from django.db import transaction from openslides.utils import csv_ext -from openslides.participant.models import OpenSlidesUser +from openslides.participant.models import User def gen_password(): @@ -76,7 +76,7 @@ def import_users(csv_file): except ValueError: error_messages.append(_('Ignoring malformed line %d in import file.') % line_no + 1) continue - user = OpenSlidesUser() + user = User() user.last_name = last_name user.first_name = first_name user.username = gen_username(first_name, last_name) diff --git a/openslides/participant/forms.py b/openslides/participant/forms.py index d420ba55f..93e6b22df 100644 --- a/openslides/participant/forms.py +++ b/openslides/participant/forms.py @@ -17,27 +17,27 @@ from django.utils.translation import ugettext_lazy as _ from openslides.utils.forms import ( CssClassMixin, LocalizedModelMultipleChoiceField) -from openslides.participant.models import OpenSlidesUser, OpenSlidesGroup +from openslides.participant.models import User, Group class UserCreateForm(forms.ModelForm, CssClassMixin): first_name = forms.CharField(label=_("First name")) last_name = forms.CharField(label=_("Last name")) groups = forms.ModelMultipleChoiceField( - queryset=OpenSlidesGroup.objects.exclude(name__iexact='anonymous'), + queryset=Group.objects.exclude(name__iexact='anonymous'), label=_("User groups"), required=False) is_active = forms.BooleanField( label=_("Active"), required=False, initial=True) class Meta: - model = OpenSlidesUser + model = User fields = ('first_name', 'last_name', 'is_active', 'groups', 'category', 'gender', 'type', 'committee', 'comment', 'firstpassword') class UserUpdateForm(UserCreateForm): class Meta: - model = OpenSlidesUser + model = User fields = ('username', 'first_name', 'last_name', 'is_active', 'groups', 'category', 'gender', 'type', 'committee', 'comment', 'firstpassword') @@ -48,14 +48,13 @@ class GroupForm(forms.ModelForm, CssClassMixin): queryset=Permission.objects.all(), label=_("Persmissions"), required=False) users = forms.ModelMultipleChoiceField( - queryset=OpenSlidesUser.objects.all(), - label=_("Users"), required=False) + queryset=User.objects.all(), label=_("Users"), required=False) def __init__(self, *args, **kwargs): # Initial users if kwargs.get('instance', None) is not None: 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) @@ -93,12 +92,12 @@ class GroupForm(forms.ModelForm, CssClassMixin): return data class Meta: - model = OpenSlidesGroup + model = Group class UsersettingsForm(forms.ModelForm, CssClassMixin): class Meta: - model = OpenSlidesUser + model = User fields = ('username', 'first_name', 'last_name', 'email') diff --git a/openslides/participant/middleware.py b/openslides/participant/middleware.py index 0e86e8ad2..b2341f00f 100644 --- a/openslides/participant/middleware.py +++ b/openslides/participant/middleware.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- """ openslides.utils.middleware - ~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Additional definitions for OpenSlides forms. @@ -19,4 +19,4 @@ class AuthenticationMiddleware(_AuthenticationMiddleware): super(AuthenticationMiddleware, self).process_request(request) if not isinstance(request.user, AnonymousUser): - request.user = request.user.openslidesuser + request.user = request.user.user diff --git a/openslides/participant/models.py b/openslides/participant/models.py index 8924d4d4b..83b484432 100644 --- a/openslides/participant/models.py +++ b/openslides/participant/models.py @@ -10,7 +10,7 @@ :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.models import signals 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 -class OpenSlidesUser(User, PersonMixin): - person_prefix = 'openslides_user' +class User(DjangoUser, PersonMixin): + person_prefix = 'user' GENDER_CHOICES = ( ('male', _('Male')), ('female', _('Female')), @@ -35,7 +35,7 @@ class OpenSlidesUser(User, PersonMixin): ('guest', _('Guest')), ) - user = models.OneToOneField(User, editable=False, parent_link=True) + django_user = models.OneToOneField(DjangoUser, editable=False, parent_link=True) category = models.CharField( max_length=100, null=True, blank=True, verbose_name=_("Category"), help_text=_('Will be shown behind the name.')) @@ -72,8 +72,8 @@ class OpenSlidesUser(User, PersonMixin): """ if password is None: password = self.firstpassword - self.user.set_password(password) - self.user.save() + self.set_password(password) + self.save() @models.permalink def get_absolute_url(self, link='edit'): @@ -104,10 +104,10 @@ class OpenSlidesUser(User, PersonMixin): ) -class OpenSlidesGroup(Group, PersonMixin): - person_prefix = 'openslides_group' +class Group(DjangoGroup, PersonMixin): + 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) description = models.TextField(blank=True) @@ -126,38 +126,38 @@ class OpenSlidesGroup(Group, PersonMixin): return ('user_group_delete', [str(self.id)]) 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): self.person_prefix = person_prefix self.id = id def __iter__(self): if (not self.person_prefix or - self.person_prefix == OpenSlidesUser.person_prefix): + self.person_prefix == User.person_prefix): if self.id: - yield OpenSlidesUser.objects.get(pk=self.id) + yield User.objects.get(pk=self.id) else: - for user in OpenSlidesUser.objects.all(): + for user in User.objects.all(): yield user if (not self.person_prefix or - self.person_prefix == OpenSlidesGroup.person_prefix): + self.person_prefix == Group.person_prefix): if self.id: - yield OpenSlidesGroup.objects.get(pk=self.id) + yield Group.objects.filter(group_as_person=True).get(pk=self.id) else: - for group in OpenSlidesGroup.objects.all(): + for group in Group.objects.filter(group_as_person=True): yield group def __getitem__(self, key): - return OpenSlidesUser.objects.get(pk=key) + return User.objects.get(pk=key) @receiver(receiv_persons, dispatch_uid="participant") def receiv_persons(sender, **kwargs): - return OpenSlidesUsersConnecter(person_prefix=kwargs['person_prefix'], + return UsersConnecter(person_prefix=kwargs['person_prefix'], id=kwargs['id']) @@ -174,17 +174,17 @@ def default_config(sender, key, **kwargs): }.get(key) -@receiver(signals.post_save, sender=User) +@receiver(signals.post_save, sender=DjangoUser) def user_post_save(sender, instance, signal, *args, **kwargs): try: - instance.openslidesuser - except OpenSlidesUser.DoesNotExist: - OpenSlidesUser(user=instance).save_base(raw=True) + instance.user + except User.DoesNotExist: + 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): try: - instance.openslidesgroup - except OpenSlidesGroup.DoesNotExist: - OpenSlidesGroup(group=instance).save_base(raw=True) + instance.group + except Group.DoesNotExist: + Group(django_group=instance).save_base(raw=True) diff --git a/openslides/participant/templates/participant/overview.html b/openslides/participant/templates/participant/overview.html index 4641d615a..3e2762a37 100644 --- a/openslides/participant/templates/participant/overview.html +++ b/openslides/participant/templates/participant/overview.html @@ -78,11 +78,11 @@