diff --git a/cookbook/helper/permission_helper.py b/cookbook/helper/permission_helper.py index e1df06ada..9641b8553 100644 --- a/cookbook/helper/permission_helper.py +++ b/cookbook/helper/permission_helper.py @@ -3,17 +3,19 @@ import inspect from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import user_passes_test +from django.contrib.auth.models import Group from django.core.cache import cache from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.http import HttpResponseRedirect from django.urls import reverse, reverse_lazy from django.utils.translation import gettext as _ +from django_scopes import scopes_disabled from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope, TokenHasScope from oauth2_provider.models import AccessToken from rest_framework import permissions from rest_framework.permissions import SAFE_METHODS - -from cookbook.models import Recipe, ShareLink, UserSpace +import random +from cookbook.models import Recipe, ShareLink, UserSpace, Space def get_allowed_groups(groups_required): @@ -330,6 +332,7 @@ class CustomRecipePermission(permissions.BasePermission): return ((has_group_permission(request.user, ['guest']) and request.method in SAFE_METHODS) or has_group_permission(request.user, ['user'])) and obj.space == request.space + class CustomAiProviderPermission(permissions.BasePermission): """ Custom permission class for the AiProvider api endpoint @@ -456,8 +459,35 @@ class IsReadOnlyDRF(permissions.BasePermission): def has_permission(self, request, view): return request.method in SAFE_METHODS + class IsCreateDRF(permissions.BasePermission): message = 'You cannot interact with this object, you can only create' def has_permission(self, request, view): - return request.method == 'POST' \ No newline at end of file + return request.method == 'POST' + + +def create_space_for_user(user, name=None): + with scopes_disabled(): + if not name: + name = f"{user.username}'s Space" + + if Space.objects.filter(name=name).exists(): + name = f'{name} #{random.randrange(1, 10 ** 5)}' + + created_space = Space(name=name, + created_by=user, + max_file_storage_mb=settings.SPACE_DEFAULT_MAX_FILES, + max_recipes=settings.SPACE_DEFAULT_MAX_RECIPES, + max_users=settings.SPACE_DEFAULT_MAX_USERS, + allow_sharing=settings.SPACE_DEFAULT_ALLOW_SHARING, + ai_enabled=settings.SPACE_AI_ENABLED, + ai_credits_monthly=settings.SPACE_AI_CREDITS_MONTHLY, + space_setup_completed=False, ) + created_space.save() + + UserSpace.objects.filter(user=user).update(active=False) + user_space = UserSpace.objects.create(space=created_space, user=user, active=True) + user_space.groups.add(Group.objects.filter(name='admin').get()) + + return user_space diff --git a/cookbook/helper/scope_middleware.py b/cookbook/helper/scope_middleware.py index 92b8baee8..84e054609 100644 --- a/cookbook/helper/scope_middleware.py +++ b/cookbook/helper/scope_middleware.py @@ -8,6 +8,7 @@ from rest_framework.exceptions import AuthenticationFailed import random +from cookbook.helper.permission_helper import create_space_for_user from cookbook.models import Space, UserSpace from cookbook.views import views from recipes import settings @@ -83,29 +84,3 @@ class ScopeMiddleware: with scopes_disabled(): request.space = None return self.get_response(request) - - -def create_space_for_user(user, name=None): - with scopes_disabled(): - if not name: - name = f"{user.username}'s Space" - - if Space.objects.filter(name=name).exists(): - name = f'{name} #{random.randrange(1, 10 ** 5)}' - - created_space = Space(name=name, - created_by=user, - max_file_storage_mb=settings.SPACE_DEFAULT_MAX_FILES, - max_recipes=settings.SPACE_DEFAULT_MAX_RECIPES, - max_users=settings.SPACE_DEFAULT_MAX_USERS, - allow_sharing=settings.SPACE_DEFAULT_ALLOW_SHARING, - ai_enabled=settings.SPACE_AI_ENABLED, - ai_credits_monthly=settings.SPACE_AI_CREDITS_MONTHLY, - space_setup_completed=False, ) - created_space.save() - - UserSpace.objects.filter(user=user).update(active=False) - user_space = UserSpace.objects.create(space=created_space, user=user, active=True) - user_space.groups.add(Group.objects.filter(name='admin').get()) - - return user_space diff --git a/cookbook/serializer.py b/cookbook/serializer.py index 500873597..9b153a0ca 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -26,9 +26,8 @@ from cookbook.helper.CustomStorageClass import CachedS3Boto3Storage from cookbook.helper.HelperFunctions import str2bool from cookbook.helper.ai_helper import get_monthly_token_usage from cookbook.helper.image_processing import is_file_type_allowed -from cookbook.helper.permission_helper import above_space_limit +from cookbook.helper.permission_helper import above_space_limit, create_space_for_user from cookbook.helper.property_helper import FoodPropertyHelper -from cookbook.helper.scope_middleware import create_space_for_user from cookbook.helper.shopping_helper import RecipeShoppingEditor from cookbook.helper.unit_conversion_helper import UnitConversionHelper from cookbook.models import (Automation, BookmarkletImport, Comment, CookLog, CustomFilter, diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 3d3421e27..7de37cd8e 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -18,8 +18,6 @@ import litellm import redis import requests from PIL import UnidentifiedImageError -from PIL.ImImagePlugin import number -from PIL.features import check from django.contrib import messages from django.contrib.auth.models import Group, User from django.contrib.postgres.search import TrigramSimilarity