switch space method signature change and test

This commit is contained in:
vabene1111 2022-06-09 18:18:57 +02:00
parent 2ab1560aed
commit 30e4ee855c
4 changed files with 63 additions and 16 deletions

View File

@ -2,7 +2,7 @@ from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import user_passes_test from django.contrib.auth.decorators import user_passes_test
from django.core.cache import caches from django.core.cache import caches
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError, ObjectDoesNotExist
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.urls import reverse, reverse_lazy from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
@ -326,13 +326,21 @@ def above_space_user_limit(space):
return False, '' return False, ''
def switch_user_active_space(user, user_space): def switch_user_active_space(user, space):
""" """
Switch the currently active space of a user by setting all spaces to inactive and activating the one passed Switch the currently active space of a user by setting all spaces to inactive and activating the one passed
:param user: user to change active space for :param user: user to change active space for
:param user_space: user space object to activate :param space: space to activate user for
:return user space object or none if not found/no permission
""" """
if not user_space.active: try:
UserSpace.objects.filter(user=user).update(active=False) # make sure to deactivate all spaces for a user us = UserSpace.objects.get(space=space, user=user)
user_space.active = True if not us.active:
user_space.save() UserSpace.objects.filter(user=user).update(active=False)
us.active = True
us.save()
return us
else:
return us
except ObjectDoesNotExist:
return None

View File

@ -6,8 +6,8 @@ from django_scopes import scopes_disabled
from cookbook.forms import ImportExportBase from cookbook.forms import ImportExportBase
from cookbook.helper.ingredient_parser import IngredientParser from cookbook.helper.ingredient_parser import IngredientParser
from cookbook.helper.permission_helper import has_group_permission from cookbook.helper.permission_helper import has_group_permission, is_space_owner, switch_user_active_space
from cookbook.models import ExportLog, UserSpace from cookbook.models import ExportLog, UserSpace, Food
def test_has_group_permission(u1_s1, a_u, space_2): def test_has_group_permission(u1_s1, a_u, space_2):
@ -36,3 +36,39 @@ def test_has_group_permission(u1_s1, a_u, space_2):
assert not has_group_permission(auth.get_user(a_u), ('guest',)) assert not has_group_permission(auth.get_user(a_u), ('guest',))
assert not has_group_permission(auth.get_user(a_u), ('user',)) assert not has_group_permission(auth.get_user(a_u), ('user',))
assert not has_group_permission(auth.get_user(a_u), ('admin',)) assert not has_group_permission(auth.get_user(a_u), ('admin',))
def test_is_space_owner(u1_s1, u2_s1, space_1, space_2):
with scopes_disabled():
f = Food.objects.create(name='Test', space=space_1)
space_1.created_by = auth.get_user(u1_s1)
space_1.save()
assert is_space_owner(auth.get_user(u1_s1), f)
assert is_space_owner(space_1.created_by, f)
assert not is_space_owner(auth.get_user(u2_s1), f)
f.space = space_2
f.save()
assert not is_space_owner(auth.get_user(u1_s1), f)
assert not is_space_owner(space_1.created_by, f)
assert not is_space_owner(auth.get_user(u2_s1), f)
def test_switch_user_active_space(u1_s1, u1_s2, space_1, space_2):
with scopes_disabled():
# can switch to already active space
assert switch_user_active_space(auth.get_user(u1_s1), space_1) == auth.get_user(u1_s1).userspace_set.filter(active=True).get()
# cannot switch to a space the user does not belong to
assert switch_user_active_space(auth.get_user(u1_s1), space_2) is None
# can join another space and be member of two spaces
us = UserSpace.objects.create(user=auth.get_user(u1_s1), space=space_2, active=False)
assert len(auth.get_user(u1_s1).userspace_set.all()) == 2
# can switch into newly created space
assert switch_user_active_space(auth.get_user(u1_s1), space_2) == us

View File

@ -1189,9 +1189,12 @@ def switch_active_space(request, space_id):
api endpoint to switch space function api endpoint to switch space function
""" """
try: try:
user_space = get_object_or_404(UserSpace, space=space_id, user=request.user) space = get_object_or_404(Space, id=space_id)
switch_user_active_space(request.user, user_space) user_space = switch_user_active_space(request.user, space)
return Response(UserSpaceSerializer().to_representation(instance=user_space), status=status.HTTP_200_OK) if user_space:
return Response(UserSpaceSerializer().to_representation(instance=user_space), status=status.HTTP_200_OK)
else:
return Response("not found", status=status.HTTP_404_NOT_FOUND)
except Exception as e: except Exception as e:
traceback.print_exc() traceback.print_exc()
return Response(str(e), status=status.HTTP_400_BAD_REQUEST) return Response(str(e), status=status.HTTP_400_BAD_REQUEST)

View File

@ -142,8 +142,8 @@ def space_overview(request):
@login_required @login_required
def switch_space(request, space_id): def switch_space(request, space_id):
user_space = get_object_or_404(UserSpace, space=space_id, user=request.user) space = get_object_or_404(Space, id=space_id)
switch_user_active_space(request.user, user_space) switch_user_active_space(request.user, space)
return HttpResponseRedirect(reverse('index')) return HttpResponseRedirect(reverse('index'))
@ -519,8 +519,8 @@ def invite_link(request, token):
@group_required('admin') @group_required('admin')
def space_manage(request, space_id): def space_manage(request, space_id):
user_space = get_object_or_404(UserSpace, space=space_id, user=request.user) space = get_object_or_404(Space, id=space_id)
switch_user_active_space(request.user, user_space) switch_user_active_space(request.user, space)
return render(request, 'space_manage.html', {}) return render(request, 'space_manage.html', {})