auto space creation and redirect to welcome page

This commit is contained in:
vabene1111
2025-09-10 22:18:09 +02:00
parent c2533d9ea2
commit f2191f79dd
43 changed files with 184 additions and 9 deletions

View File

@@ -1,8 +1,14 @@
from django.contrib.auth.models import Group
from django.http import HttpResponseRedirect
from django.urls import reverse from django.urls import reverse
from django_scopes import scope, scopes_disabled from django_scopes import scope, scopes_disabled
from oauth2_provider.contrib.rest_framework import OAuth2Authentication from oauth2_provider.contrib.rest_framework import OAuth2Authentication
from psycopg2.errors import UniqueViolation
from rest_framework.exceptions import AuthenticationFailed from rest_framework.exceptions import AuthenticationFailed
import random
from cookbook.models import Space, UserSpace
from cookbook.views import views from cookbook.views import views
from recipes import settings from recipes import settings
@@ -34,16 +40,20 @@ class ScopeMiddleware:
if request.path.startswith(prefix + '/switch-space/'): if request.path.startswith(prefix + '/switch-space/'):
return self.get_response(request) return self.get_response(request)
with scopes_disabled():
if request.user.userspace_set.count() == 0 and not reverse('account_logout') in request.path:
return views.space_overview(request)
# get active user space, if for some reason more than one space is active select first (group permission checks will fail, this is not intended at this point) # get active user space, if for some reason more than one space is active select first (group permission checks will fail, this is not intended at this point)
user_space = request.user.userspace_set.filter(active=True).first() user_space = request.user.userspace_set.filter(active=True).first()
if not user_space: if not user_space:
return views.space_overview(request) if request.user.userspace_set.count() > 0:
# if the users has a userspace but nothing is active, activate the first one
user_space = request.user.userspace_set.filter(active=True).first()
user_space.active = True
user_space.save()
else:
# if user does not yet have a space create one for him
user_space = create_space_for_user(request.user)
# TODO remove the need for this view
if user_space.groups.count() == 0 and not reverse('account_logout') in request.path: if user_space.groups.count() == 0 and not reverse('account_logout') in request.path:
return views.no_groups(request) return views.no_groups(request)
@@ -65,3 +75,28 @@ class ScopeMiddleware:
with scopes_disabled(): with scopes_disabled():
request.space = None request.space = None
return self.get_response(request) 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"
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, )
try:
created_space.save()
except UniqueViolation:
created_space.name = f'{name} #{random.randrange(1, 10 ** 5)}'
created_space.save()
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

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.6 on 2025-09-10 20:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0001_squashed_0227_space_ai_default_provider_and_more'),
]
operations = [
migrations.AddField(
model_name='space',
name='space_setup_completed',
field=models.BooleanField(default=True),
),
]

View File

@@ -329,6 +329,8 @@ class Space(ExportModelOperationsMixin('space'), models.Model):
demo = models.BooleanField(default=False) demo = models.BooleanField(default=False)
food_inherit = models.ManyToManyField(FoodInheritField, blank=True) food_inherit = models.ManyToManyField(FoodInheritField, blank=True)
space_setup_completed = models.BooleanField(default=True)
ai_enabled = models.BooleanField(default=True) ai_enabled = models.BooleanField(default=True)
ai_credits_monthly = models.IntegerField(default=100) ai_credits_monthly = models.IntegerField(default=100)
ai_credits_balance = models.DecimalField(default=0, max_digits=16, decimal_places=4) ai_credits_balance = models.DecimalField(default=0, max_digits=16, decimal_places=4)

View File

@@ -425,7 +425,7 @@ class SpaceSerializer(WritableNestedModelSerializer):
'allow_sharing', 'demo', 'food_inherit', 'user_count', 'recipe_count', 'file_size_mb', 'allow_sharing', 'demo', 'food_inherit', 'user_count', 'recipe_count', 'file_size_mb',
'image', 'nav_logo', 'space_theme', 'custom_space_theme', 'nav_bg_color', 'nav_text_color', 'image', 'nav_logo', 'space_theme', 'custom_space_theme', 'nav_bg_color', 'nav_text_color',
'logo_color_32', 'logo_color_128', 'logo_color_144', 'logo_color_180', 'logo_color_192', 'logo_color_512', 'logo_color_svg', 'ai_credits_monthly', 'logo_color_32', 'logo_color_128', 'logo_color_144', 'logo_color_180', 'logo_color_192', 'logo_color_512', 'logo_color_svg', 'ai_credits_monthly',
'ai_credits_balance', 'ai_monthly_credits_used', 'ai_enabled', 'ai_default_provider') 'ai_credits_balance', 'ai_monthly_credits_used', 'ai_enabled', 'ai_default_provider', 'space_setup_completed')
read_only_fields = ( read_only_fields = (
'id', 'created_by', 'created_at', 'max_recipes', 'max_file_storage_mb', 'max_users', 'allow_sharing', 'id', 'created_by', 'created_at', 'max_recipes', 'max_file_storage_mb', 'max_users', 'allow_sharing',
'demo', 'ai_monthly_credits_used') 'demo', 'ai_monthly_credits_used')

View File

@@ -18,6 +18,7 @@ let routes = [
{path: '/', component: () => import("@/pages/StartPage.vue"), name: 'StartPage' }, {path: '/', component: () => import("@/pages/StartPage.vue"), name: 'StartPage' },
{path: '/search', redirect: {name: 'StartPage'}}, {path: '/search', redirect: {name: 'StartPage'}},
{path: '/test', component: () => import("@/pages/TestPage.vue"), name: 'view_test'}, {path: '/test', component: () => import("@/pages/TestPage.vue"), name: 'view_test'},
{path: '/welcome', component: () => import("@/pages/WelcomePage.vue"), name: 'WelcomePage', meta: {title: 'Welcome'}},
{path: '/help', component: () => import("@/pages/HelpPage.vue"), name: 'HelpPage', meta: {title: 'Help'}}, {path: '/help', component: () => import("@/pages/HelpPage.vue"), name: 'HelpPage', meta: {title: 'Help'}},
{ {
path: '/settings', component: () => import("@/pages/SettingsPage.vue"), name: 'SettingsPage', redirect: '/settings/account', path: '/settings', component: () => import("@/pages/SettingsPage.vue"), name: 'SettingsPage', redirect: '/settings/account',

View File

@@ -74,6 +74,8 @@
<p class="text-h6 mt-2">{{ $t('Settings') }}</p> <p class="text-h6 mt-2">{{ $t('Settings') }}</p>
<v-divider class="mb-2"></v-divider> <v-divider class="mb-2"></v-divider>
<v-text-field v-model="space.name" :label="$t('Name')"></v-text-field>
<user-file-field v-model="space.image" :label="$t('Image')" :hint="$t('CustomImageHelp')" persistent-hint></user-file-field> <user-file-field v-model="space.image" :label="$t('Image')" :hint="$t('CustomImageHelp')" persistent-hint></user-file-field>
@@ -96,8 +98,10 @@
<template v-if="space.aiEnabled"> <template v-if="space.aiEnabled">
<model-select model="AiProvider" :label="$t('Default')" v-model="space.aiDefaultProvider"></model-select> <model-select model="AiProvider" :label="$t('Default')" v-model="space.aiDefaultProvider"></model-select>
<v-number-input v-model="space.aiCreditsMonthly" :precision="2" :label="$t('MonthlyCredits')" :disabled="!useUserPreferenceStore().userSettings.user.isSuperuser"></v-number-input> <v-number-input v-model="space.aiCreditsMonthly" :precision="2" :label="$t('MonthlyCredits')"
<v-number-input v-model="space.aiCreditsBalance" :precision="4" :label="$t('AiCreditsBalance')" :disabled="!useUserPreferenceStore().userSettings.user.isSuperuser"></v-number-input> :disabled="!useUserPreferenceStore().userSettings.user.isSuperuser"></v-number-input>
<v-number-input v-model="space.aiCreditsBalance" :precision="4" :label="$t('AiCreditsBalance')"
:disabled="!useUserPreferenceStore().userSettings.user.isSuperuser"></v-number-input>
</template> </template>
<v-btn color="success" @click="updateSpace()" prepend-icon="$save">{{ $t('Save') }}</v-btn> <v-btn color="success" @click="updateSpace()" prepend-icon="$save">{{ $t('Save') }}</v-btn>
@@ -141,13 +145,18 @@ import {isSpaceAboveRecipeLimit, isSpaceAboveStorageLimit, isSpaceAboveUserLimit
const space = ref({} as Space) const space = ref({} as Space)
onMounted(() => { onMounted(() => {
loadSpace()
})
function loadSpace() {
let api = new ApiApi() let api = new ApiApi()
api.apiSpaceCurrentRetrieve().then(r => { api.apiSpaceCurrentRetrieve().then(r => {
space.value = r space.value = r
}).catch(err => { }).catch(err => {
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err) useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
}) })
}) }
function updateSpace() { function updateSpace() {
let api = new ApiApi() let api = new ApiApi()

View File

@@ -286,6 +286,7 @@
"Size": "", "Size": "",
"Sort_by_new": "", "Sort_by_new": "",
"Space": "", "Space": "",
"SpaceName": "",
"Starting_Day": "", "Starting_Day": "",
"StartsWith": "", "StartsWith": "",
"StartsWithHelp": "", "StartsWithHelp": "",

View File

@@ -279,6 +279,7 @@
"Size": "Размер", "Size": "Размер",
"Sort_by_new": "Сортиране по ново", "Sort_by_new": "Сортиране по ново",
"Space": "", "Space": "",
"SpaceName": "",
"Starting_Day": "Начален ден от седмицата", "Starting_Day": "Начален ден от седмицата",
"StartsWith": "", "StartsWith": "",
"StartsWithHelp": "", "StartsWithHelp": "",

View File

@@ -364,6 +364,7 @@
"Social_Authentication": "Identificació amb Xarxes Socials", "Social_Authentication": "Identificació amb Xarxes Socials",
"Sort_by_new": "Ordenar a partir del més nou", "Sort_by_new": "Ordenar a partir del més nou",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "Un administrador de l'espai podria canviar algunes configuracions estètiques i tindrien prioritat sobre la configuració dels usuaris per a aquest espai.", "Space_Cosmetic_Settings": "Un administrador de l'espai podria canviar algunes configuracions estètiques i tindrien prioritat sobre la configuració dels usuaris per a aquest espai.",
"Split_All_Steps": "Dividir totes les files en passos separats.", "Split_All_Steps": "Dividir totes les files en passos separats.",
"StartDate": "Data d'inici", "StartDate": "Data d'inici",

View File

@@ -359,6 +359,7 @@
"Social_Authentication": "Přihlašování pomocí účtů sociálních sítí", "Social_Authentication": "Přihlašování pomocí účtů sociálních sítí",
"Sort_by_new": "Seřadit od nejnovějšího", "Sort_by_new": "Seřadit od nejnovějšího",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "Některá kosmetická nastavení mohou měnit správci prostoru a budou mít přednost před nastavením klienta pro daný prostor.", "Space_Cosmetic_Settings": "Některá kosmetická nastavení mohou měnit správci prostoru a budou mít přednost před nastavením klienta pro daný prostor.",
"Split_All_Steps": "Rozdělit každý řádek do samostatného kroku.", "Split_All_Steps": "Rozdělit každý řádek do samostatného kroku.",
"StartDate": "Počáteční datum", "StartDate": "Počáteční datum",

View File

@@ -364,6 +364,7 @@
"Social_Authentication": "Social authenticering", "Social_Authentication": "Social authenticering",
"Sort_by_new": "Sorter efter nylige", "Sort_by_new": "Sorter efter nylige",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "Visse kosmetiske indstillinger kan ændres af område-administratorer og vil overskrive klient-indstillinger for pågældende område.", "Space_Cosmetic_Settings": "Visse kosmetiske indstillinger kan ændres af område-administratorer og vil overskrive klient-indstillinger for pågældende område.",
"Split_All_Steps": "Opdel rækker i separate trin.", "Split_All_Steps": "Opdel rækker i separate trin.",
"StartDate": "Startdato", "StartDate": "Startdato",

View File

@@ -510,6 +510,7 @@
"SpaceMemberHelp": "Füge Benutzer hinzu indem du Einladungen erstellst und Sie an die gewünschte Person sendest.", "SpaceMemberHelp": "Füge Benutzer hinzu indem du Einladungen erstellst und Sie an die gewünschte Person sendest.",
"SpaceMembers": "Space Mitglieder", "SpaceMembers": "Space Mitglieder",
"SpaceMembersHelp": "Benutzer und Ihre Rechte in einem Space. ", "SpaceMembersHelp": "Benutzer und Ihre Rechte in einem Space. ",
"SpaceName": "Space Name",
"SpaceSettings": "Space Einstellungen", "SpaceSettings": "Space Einstellungen",
"Space_Cosmetic_Settings": "Kosmetische Einstellungen auf Space Ebene überschreiben die Einstellungen der einzelnen Nutzer.", "Space_Cosmetic_Settings": "Kosmetische Einstellungen auf Space Ebene überschreiben die Einstellungen der einzelnen Nutzer.",
"Split": "Aufteilen", "Split": "Aufteilen",

View File

@@ -364,6 +364,7 @@
"Social_Authentication": "Ταυτοποίηση μέσω κοινωνικών δικτύων", "Social_Authentication": "Ταυτοποίηση μέσω κοινωνικών δικτύων",
"Sort_by_new": "Ταξινόμηση κατά νέο", "Sort_by_new": "Ταξινόμηση κατά νέο",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "Ορισμένες ρυθμίσεις εμφάνισης μπορούν να αλλάξουν από τους διαχειριστές του χώρου και θα παρακάμψουν τις ρυθμίσεις πελάτη για αυτόν τον χώρο.", "Space_Cosmetic_Settings": "Ορισμένες ρυθμίσεις εμφάνισης μπορούν να αλλάξουν από τους διαχειριστές του χώρου και θα παρακάμψουν τις ρυθμίσεις πελάτη για αυτόν τον χώρο.",
"Split_All_Steps": "Διαχωρισμός όλων των γραμμών σε χωριστά βήματα.", "Split_All_Steps": "Διαχωρισμός όλων των γραμμών σε χωριστά βήματα.",
"StartDate": "Ημερομηνία Έναρξης", "StartDate": "Ημερομηνία Έναρξης",

View File

@@ -508,6 +508,7 @@
"SpaceMemberHelp": "Add users to your space by creating an Invite Link and sending it to the person you want to add.", "SpaceMemberHelp": "Add users to your space by creating an Invite Link and sending it to the person you want to add.",
"SpaceMembers": "Space Members", "SpaceMembers": "Space Members",
"SpaceMembersHelp": "Users and their permissions in a space. ", "SpaceMembersHelp": "Users and their permissions in a space. ",
"SpaceName": "Space Name",
"SpaceSettings": "Space Settings", "SpaceSettings": "Space Settings",
"Space_Cosmetic_Settings": "Some cosmetic settings can be changed by space administrators and will override client settings for that space.", "Space_Cosmetic_Settings": "Some cosmetic settings can be changed by space administrators and will override client settings for that space.",
"Split": "Split", "Split": "Split",

View File

@@ -490,6 +490,7 @@
"SpaceMemberHelp": "Agrega usuarios a tu espacio creando un enlace de invitación y enviándolo a la persona que quieras agregar.", "SpaceMemberHelp": "Agrega usuarios a tu espacio creando un enlace de invitación y enviándolo a la persona que quieras agregar.",
"SpaceMembers": "Miembros del espacio", "SpaceMembers": "Miembros del espacio",
"SpaceMembersHelp": "Usuarios y sus permisos en un espacio. ", "SpaceMembersHelp": "Usuarios y sus permisos en un espacio. ",
"SpaceName": "",
"SpaceSettings": "Ajustes del espacio", "SpaceSettings": "Ajustes del espacio",
"Space_Cosmetic_Settings": "Algunos ajustes de apariencia pueden ser cambiados por los administradores del espacio y anularán los ajustes del cliente para ese espacio.", "Space_Cosmetic_Settings": "Algunos ajustes de apariencia pueden ser cambiados por los administradores del espacio y anularán los ajustes del cliente para ese espacio.",
"Split": "Dividir", "Split": "Dividir",

View File

@@ -352,6 +352,7 @@
"Social_Authentication": "Sosiaalinen Todennus", "Social_Authentication": "Sosiaalinen Todennus",
"Sort_by_new": "Lajittele uusien mukaan", "Sort_by_new": "Lajittele uusien mukaan",
"Space": "", "Space": "",
"SpaceName": "",
"Split_All_Steps": "Jaa kaikki rivit erillisiin vaiheisiin.", "Split_All_Steps": "Jaa kaikki rivit erillisiin vaiheisiin.",
"StartDate": "Aloituspäivä", "StartDate": "Aloituspäivä",
"Starting_Day": "Viikon aloituspäivä", "Starting_Day": "Viikon aloituspäivä",

View File

@@ -505,6 +505,7 @@
"SpaceMemberHelp": "Ajoutez des utilisateurs à votre espace en créant un lien d'invitation et en l'envoyant à la personne que vous souhaitez ajouter.", "SpaceMemberHelp": "Ajoutez des utilisateurs à votre espace en créant un lien d'invitation et en l'envoyant à la personne que vous souhaitez ajouter.",
"SpaceMembers": "Membres du groupe", "SpaceMembers": "Membres du groupe",
"SpaceMembersHelp": "Utilisateurs et permissions dans un groupe. ", "SpaceMembersHelp": "Utilisateurs et permissions dans un groupe. ",
"SpaceName": "",
"SpaceSettings": "Paramètres du groupe", "SpaceSettings": "Paramètres du groupe",
"Space_Cosmetic_Settings": "Certains paramètres cosmétiques peuvent être modifiés par un administrateur de l'espace et seront prioritaires sur les paramètres des utilisateurs pour cet espace.", "Space_Cosmetic_Settings": "Certains paramètres cosmétiques peuvent être modifiés par un administrateur de l'espace et seront prioritaires sur les paramètres des utilisateurs pour cet espace.",
"Split": "Diviser", "Split": "Diviser",

View File

@@ -364,6 +364,7 @@
"Social_Authentication": "אימות חברתי", "Social_Authentication": "אימות חברתי",
"Sort_by_new": "סדר ע\"י חדש", "Sort_by_new": "סדר ע\"י חדש",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "חלק מהגדרות הקוסמטיות יכולות להיות מעודכנות על ידי מנהל המרחב וידרסו את הגדרות הקליינט עבור מרחב זה.", "Space_Cosmetic_Settings": "חלק מהגדרות הקוסמטיות יכולות להיות מעודכנות על ידי מנהל המרחב וידרסו את הגדרות הקליינט עבור מרחב זה.",
"Split_All_Steps": "פצל את כל השורות לצעדים נפרדים.", "Split_All_Steps": "פצל את כל השורות לצעדים נפרדים.",
"StartDate": "תאריך התחלה", "StartDate": "תאריך התחלה",

View File

@@ -364,6 +364,7 @@
"Social_Authentication": "Autentifikacija putem društvenih mreža", "Social_Authentication": "Autentifikacija putem društvenih mreža",
"Sort_by_new": "Poredaj po novom", "Sort_by_new": "Poredaj po novom",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "Neke kozmetičke postavke mogu promijeniti administratori prostora i one će poništiti postavke klijenta za taj prostor.", "Space_Cosmetic_Settings": "Neke kozmetičke postavke mogu promijeniti administratori prostora i one će poništiti postavke klijenta za taj prostor.",
"Split_All_Steps": "Podijeli sve retke u zasebne korake.", "Split_All_Steps": "Podijeli sve retke u zasebne korake.",
"StartDate": "Početni datum", "StartDate": "Početni datum",

View File

@@ -331,6 +331,7 @@
"Size": "Méret", "Size": "Méret",
"Sort_by_new": "Rendezés legújabbak szerint", "Sort_by_new": "Rendezés legújabbak szerint",
"Space": "", "Space": "",
"SpaceName": "",
"Split_All_Steps": "Ossza fel az összes sort különálló lépésekbe.", "Split_All_Steps": "Ossza fel az összes sort különálló lépésekbe.",
"StartDate": "Kezdés dátuma", "StartDate": "Kezdés dátuma",
"Starting_Day": "A hét kezdőnapja", "Starting_Day": "A hét kezdőnapja",

View File

@@ -148,6 +148,7 @@
"Size": "", "Size": "",
"Sort_by_new": "Տեսակավորել ըստ նորերի", "Sort_by_new": "Տեսակավորել ըստ նորերի",
"Space": "", "Space": "",
"SpaceName": "",
"StartsWith": "", "StartsWith": "",
"StartsWithHelp": "", "StartsWithHelp": "",
"Step": "", "Step": "",

View File

@@ -308,6 +308,7 @@
"Social_Authentication": "", "Social_Authentication": "",
"Sort_by_new": "Urutkan berdasarkan baru", "Sort_by_new": "Urutkan berdasarkan baru",
"Space": "", "Space": "",
"SpaceName": "",
"Starting_Day": "", "Starting_Day": "",
"StartsWith": "", "StartsWith": "",
"StartsWithHelp": "", "StartsWithHelp": "",

View File

@@ -362,6 +362,7 @@
"Social_Authentication": "", "Social_Authentication": "",
"Sort_by_new": "", "Sort_by_new": "",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "", "Space_Cosmetic_Settings": "",
"Split_All_Steps": "", "Split_All_Steps": "",
"StartDate": "", "StartDate": "",

View File

@@ -507,6 +507,7 @@
"SpaceMemberHelp": "Aggiungi utenti al tuo spazio creando un collegamento di invito e inviandolo alla persona che desideri aggiungere.", "SpaceMemberHelp": "Aggiungi utenti al tuo spazio creando un collegamento di invito e inviandolo alla persona che desideri aggiungere.",
"SpaceMembers": "Membri dello spazio", "SpaceMembers": "Membri dello spazio",
"SpaceMembersHelp": "Utenti e relativi permessi in uno spazio. ", "SpaceMembersHelp": "Utenti e relativi permessi in uno spazio. ",
"SpaceName": "",
"SpaceSettings": "Impostazioni spazio", "SpaceSettings": "Impostazioni spazio",
"Space_Cosmetic_Settings": "Alcune impostazioni cosmetiche possono essere modificate dagli amministratori dell'istanza e sovrascriveranno le impostazioni client per quell'istanza.", "Space_Cosmetic_Settings": "Alcune impostazioni cosmetiche possono essere modificate dagli amministratori dell'istanza e sovrascriveranno le impostazioni client per quell'istanza.",
"Split": "Dividi", "Split": "Dividi",

View File

@@ -336,6 +336,7 @@
"Social_Authentication": "", "Social_Authentication": "",
"Sort_by_new": "Rūšiuoti pagal naujumą", "Sort_by_new": "Rūšiuoti pagal naujumą",
"Space": "", "Space": "",
"SpaceName": "",
"Split_All_Steps": "", "Split_All_Steps": "",
"StartDate": "", "StartDate": "",
"Starting_Day": "", "Starting_Day": "",

View File

@@ -364,6 +364,7 @@
"Social_Authentication": "", "Social_Authentication": "",
"Sort_by_new": "", "Sort_by_new": "",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "", "Space_Cosmetic_Settings": "",
"Split_All_Steps": "", "Split_All_Steps": "",
"StartDate": "", "StartDate": "",

View File

@@ -346,6 +346,7 @@
"Social_Authentication": "", "Social_Authentication": "",
"Sort_by_new": "Sorter etter nyest", "Sort_by_new": "Sorter etter nyest",
"Space": "", "Space": "",
"SpaceName": "",
"Split_All_Steps": "", "Split_All_Steps": "",
"StartDate": "Startdato", "StartDate": "Startdato",
"Starting_Day": "Dag uken skal state på", "Starting_Day": "Dag uken skal state på",

View File

@@ -508,6 +508,7 @@
"SpaceMemberHelp": "Voeg gebruikers toe aan je ruimte door een uitnodigingslink aan te maken en naar de persoon te sturen die je wilt toevoegen.", "SpaceMemberHelp": "Voeg gebruikers toe aan je ruimte door een uitnodigingslink aan te maken en naar de persoon te sturen die je wilt toevoegen.",
"SpaceMembers": "Gebruikers van de ruimte", "SpaceMembers": "Gebruikers van de ruimte",
"SpaceMembersHelp": "Gebruikers en hun rechten in een ruimte. ", "SpaceMembersHelp": "Gebruikers en hun rechten in een ruimte. ",
"SpaceName": "",
"SpaceSettings": "Ruimte-instellingen", "SpaceSettings": "Ruimte-instellingen",
"Space_Cosmetic_Settings": "Sommige weergave instellingen kunnen worden geforceerd door de administrator van de 'Ruimte' en zullen de persoonlijke instellingen voor die 'Ruimte' overschrijven.", "Space_Cosmetic_Settings": "Sommige weergave instellingen kunnen worden geforceerd door de administrator van de 'Ruimte' en zullen de persoonlijke instellingen voor die 'Ruimte' overschrijven.",
"Split": "Splitsen", "Split": "Splitsen",

View File

@@ -390,6 +390,7 @@
"Social_Authentication": "Uwierzytelnianie społecznościowe", "Social_Authentication": "Uwierzytelnianie społecznościowe",
"Sort_by_new": "Sortuj według nowych", "Sort_by_new": "Sortuj według nowych",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "Administratorzy przestrzeni mogą zmienić niektóre ustawienia kosmetyczne, które zastąpią ustawienia klienta dla tej przestrzeni.", "Space_Cosmetic_Settings": "Administratorzy przestrzeni mogą zmienić niektóre ustawienia kosmetyczne, które zastąpią ustawienia klienta dla tej przestrzeni.",
"Split_All_Steps": "Traktuj każdy wiersz jako osobne kroki.", "Split_All_Steps": "Traktuj każdy wiersz jako osobne kroki.",
"StartDate": "Data początkowa", "StartDate": "Data początkowa",

View File

@@ -297,6 +297,7 @@
"Size": "Tamanho", "Size": "Tamanho",
"Sort_by_new": "Ordenar por mais recente", "Sort_by_new": "Ordenar por mais recente",
"Space": "", "Space": "",
"SpaceName": "",
"StartDate": "Data de início", "StartDate": "Data de início",
"Starting_Day": "Dia de início da semana", "Starting_Day": "Dia de início da semana",
"StartsWith": "", "StartsWith": "",

View File

@@ -438,6 +438,7 @@
"Social_Authentication": "Autenticação social", "Social_Authentication": "Autenticação social",
"Sort_by_new": "Ordenar por novos", "Sort_by_new": "Ordenar por novos",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "Algumas configurações cosméticas podem ser alteradas pelos administradores do espaço e substituirão as configurações do cliente para esse espaço.", "Space_Cosmetic_Settings": "Algumas configurações cosméticas podem ser alteradas pelos administradores do espaço e substituirão as configurações do cliente para esse espaço.",
"Split_All_Steps": "Divida todas as linhas em etapas separadas.", "Split_All_Steps": "Divida todas as linhas em etapas separadas.",
"StartDate": "Data Início", "StartDate": "Data Início",

View File

@@ -320,6 +320,7 @@
"Social_Authentication": "Autentificare socială", "Social_Authentication": "Autentificare socială",
"Sort_by_new": "Sortare după nou", "Sort_by_new": "Sortare după nou",
"Space": "", "Space": "",
"SpaceName": "",
"Split_All_Steps": "Împărțiți toate rândurile în pași separați.", "Split_All_Steps": "Împărțiți toate rândurile în pași separați.",
"Starting_Day": "Ziua de început a săptămânii", "Starting_Day": "Ziua de început a săptămânii",
"StartsWith": "", "StartsWith": "",

View File

@@ -505,6 +505,7 @@
"SpaceMemberHelp": "Для добавления пользователей создайте пригласительную ссылку и передайте её человеку, которого хотите пригласить.", "SpaceMemberHelp": "Для добавления пользователей создайте пригласительную ссылку и передайте её человеку, которого хотите пригласить.",
"SpaceMembers": "Участники пространства", "SpaceMembers": "Участники пространства",
"SpaceMembersHelp": "Пользователи и их права доступа в пространстве. ", "SpaceMembersHelp": "Пользователи и их права доступа в пространстве. ",
"SpaceName": "",
"SpaceSettings": "Настройки пространства", "SpaceSettings": "Настройки пространства",
"Space_Cosmetic_Settings": "Администраторы пространства могут менять некоторые визуальные настройки, которые будут переопределять настройки клиента для данного пространства.", "Space_Cosmetic_Settings": "Администраторы пространства могут менять некоторые визуальные настройки, которые будут переопределять настройки клиента для данного пространства.",
"Split": "Разделить", "Split": "Разделить",

View File

@@ -507,6 +507,7 @@
"SpaceMemberHelp": "Dodajte uporabnike v svoj prostor tako, da ustvarite povezavo za povabilo in jo pošljete osebi, ki jo želite dodati.", "SpaceMemberHelp": "Dodajte uporabnike v svoj prostor tako, da ustvarite povezavo za povabilo in jo pošljete osebi, ki jo želite dodati.",
"SpaceMembers": "Člani prostora", "SpaceMembers": "Člani prostora",
"SpaceMembersHelp": "Uporabniki in njihova dovoljenja v prostoru. ", "SpaceMembersHelp": "Uporabniki in njihova dovoljenja v prostoru. ",
"SpaceName": "",
"SpaceSettings": "Nastavitve prostora", "SpaceSettings": "Nastavitve prostora",
"Space_Cosmetic_Settings": "Nekatere kozmetične nastavitve lahko spremenijo skrbniki prostora in bodo preglasile nastavitve odjemalca za ta prostor.", "Space_Cosmetic_Settings": "Nekatere kozmetične nastavitve lahko spremenijo skrbniki prostora in bodo preglasile nastavitve odjemalca za ta prostor.",
"Split": "Razdelitev", "Split": "Razdelitev",

View File

@@ -401,6 +401,7 @@
"Social_Authentication": "Social autentisering", "Social_Authentication": "Social autentisering",
"Sort_by_new": "Sortera efter ny", "Sort_by_new": "Sortera efter ny",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "Vissa kosmetiska inställningar kan ändras av hushålls-administratörer och skriver över klientinställningar för det hushållet.", "Space_Cosmetic_Settings": "Vissa kosmetiska inställningar kan ändras av hushålls-administratörer och skriver över klientinställningar för det hushållet.",
"Split_All_Steps": "Dela upp alla rader i separata steg.", "Split_All_Steps": "Dela upp alla rader i separata steg.",
"StartDate": "Startdatum", "StartDate": "Startdatum",

View File

@@ -364,6 +364,7 @@
"Social_Authentication": "Sosyal Kimlik Doğrulama", "Social_Authentication": "Sosyal Kimlik Doğrulama",
"Sort_by_new": "Yeniye göre sırala", "Sort_by_new": "Yeniye göre sırala",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "Bazı kozmetik ayarlar alan yöneticileri tarafından değiştirilebilir ve o alanın istemci ayarlarını geçersiz kılar.", "Space_Cosmetic_Settings": "Bazı kozmetik ayarlar alan yöneticileri tarafından değiştirilebilir ve o alanın istemci ayarlarını geçersiz kılar.",
"Split_All_Steps": "Tüm satırları ayrı adımlara bölün.", "Split_All_Steps": "Tüm satırları ayrı adımlara bölün.",
"StartDate": "Başlangıç Tarihi", "StartDate": "Başlangıç Tarihi",

View File

@@ -321,6 +321,7 @@
"Size": "Розмір", "Size": "Розмір",
"Sort_by_new": "Сортувати за новими", "Sort_by_new": "Сортувати за новими",
"Space": "", "Space": "",
"SpaceName": "",
"StartDate": "Початкова дата", "StartDate": "Початкова дата",
"Starting_Day": "Початковий день тижня", "Starting_Day": "Початковий день тижня",
"StartsWith": "", "StartsWith": "",

View File

@@ -364,6 +364,7 @@
"Social_Authentication": "社交认证", "Social_Authentication": "社交认证",
"Sort_by_new": "按新旧排序", "Sort_by_new": "按新旧排序",
"Space": "", "Space": "",
"SpaceName": "",
"Space_Cosmetic_Settings": "空间管理员可以更改某些装饰设置,并将覆盖该空间的客户端设置。", "Space_Cosmetic_Settings": "空间管理员可以更改某些装饰设置,并将覆盖该空间的客户端设置。",
"Split_All_Steps": "将所有行拆分为单独的步骤。", "Split_All_Steps": "将所有行拆分为单独的步骤。",
"StartDate": "开始日期", "StartDate": "开始日期",

View File

@@ -506,6 +506,7 @@
"SpaceMemberHelp": "透過建立邀請連結並發送給您要新增的人來將使用者新增到您的空間。", "SpaceMemberHelp": "透過建立邀請連結並發送給您要新增的人來將使用者新增到您的空間。",
"SpaceMembers": "空間成員", "SpaceMembers": "空間成員",
"SpaceMembersHelp": "空間中的使用者及其權限。 ", "SpaceMembersHelp": "空間中的使用者及其權限。 ",
"SpaceName": "",
"SpaceSettings": "空間設定", "SpaceSettings": "空間設定",
"Space_Cosmetic_Settings": "空間管理員可以更改某些裝飾設置,並將覆蓋該空間的客戶端設置。", "Space_Cosmetic_Settings": "空間管理員可以更改某些裝飾設置,並將覆蓋該空間的客戶端設置。",
"Split": "分割", "Split": "分割",

View File

@@ -248,6 +248,12 @@ export interface PatchedSpace {
* @memberof PatchedSpace * @memberof PatchedSpace
*/ */
aiDefaultProvider?: AiProvider; aiDefaultProvider?: AiProvider;
/**
*
* @type {boolean}
* @memberof PatchedSpace
*/
spaceSetupCompleted?: boolean;
} }
/** /**
@@ -299,6 +305,7 @@ export function PatchedSpaceFromJSONTyped(json: any, ignoreDiscriminator: boolea
'aiMonthlyCreditsUsed': json['ai_monthly_credits_used'] == null ? undefined : json['ai_monthly_credits_used'], 'aiMonthlyCreditsUsed': json['ai_monthly_credits_used'] == null ? undefined : json['ai_monthly_credits_used'],
'aiEnabled': json['ai_enabled'] == null ? undefined : json['ai_enabled'], 'aiEnabled': json['ai_enabled'] == null ? undefined : json['ai_enabled'],
'aiDefaultProvider': json['ai_default_provider'] == null ? undefined : AiProviderFromJSON(json['ai_default_provider']), 'aiDefaultProvider': json['ai_default_provider'] == null ? undefined : AiProviderFromJSON(json['ai_default_provider']),
'spaceSetupCompleted': json['space_setup_completed'] == null ? undefined : json['space_setup_completed'],
}; };
} }
@@ -329,6 +336,7 @@ export function PatchedSpaceToJSON(value?: Omit<PatchedSpace, 'createdBy'|'creat
'ai_credits_balance': value['aiCreditsBalance'], 'ai_credits_balance': value['aiCreditsBalance'],
'ai_enabled': value['aiEnabled'], 'ai_enabled': value['aiEnabled'],
'ai_default_provider': AiProviderToJSON(value['aiDefaultProvider']), 'ai_default_provider': AiProviderToJSON(value['aiDefaultProvider']),
'space_setup_completed': value['spaceSetupCompleted'],
}; };
} }

View File

@@ -248,6 +248,12 @@ export interface Space {
* @memberof Space * @memberof Space
*/ */
aiDefaultProvider?: AiProvider; aiDefaultProvider?: AiProvider;
/**
*
* @type {boolean}
* @memberof Space
*/
spaceSetupCompleted?: boolean;
} }
/** /**
@@ -311,6 +317,7 @@ export function SpaceFromJSONTyped(json: any, ignoreDiscriminator: boolean): Spa
'aiMonthlyCreditsUsed': json['ai_monthly_credits_used'], 'aiMonthlyCreditsUsed': json['ai_monthly_credits_used'],
'aiEnabled': json['ai_enabled'] == null ? undefined : json['ai_enabled'], 'aiEnabled': json['ai_enabled'] == null ? undefined : json['ai_enabled'],
'aiDefaultProvider': json['ai_default_provider'] == null ? undefined : AiProviderFromJSON(json['ai_default_provider']), 'aiDefaultProvider': json['ai_default_provider'] == null ? undefined : AiProviderFromJSON(json['ai_default_provider']),
'spaceSetupCompleted': json['space_setup_completed'] == null ? undefined : json['space_setup_completed'],
}; };
} }
@@ -341,6 +348,7 @@ export function SpaceToJSON(value?: Omit<Space, 'createdBy'|'createdAt'|'maxReci
'ai_credits_balance': value['aiCreditsBalance'], 'ai_credits_balance': value['aiCreditsBalance'],
'ai_enabled': value['aiEnabled'], 'ai_enabled': value['aiEnabled'],
'ai_default_provider': AiProviderToJSON(value['aiDefaultProvider']), 'ai_default_provider': AiProviderToJSON(value['aiDefaultProvider']),
'space_setup_completed': value['spaceSetupCompleted'],
}; };
} }

View File

@@ -38,6 +38,9 @@ import HorizontalRecipeScroller from "@/components/display/HorizontalRecipeWindo
import HorizontalMealPlanWindow from "@/components/display/HorizontalMealPlanWindow.vue" import HorizontalMealPlanWindow from "@/components/display/HorizontalMealPlanWindow.vue"
import SearchPage from "@/pages/SearchPage.vue"; import SearchPage from "@/pages/SearchPage.vue";
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore"; import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
import {useRouter} from "vue-router";
const router = useRouter()
const totalRecipes = ref(-1) const totalRecipes = ref(-1)
@@ -47,6 +50,10 @@ onMounted(() => {
api.apiRecipeList({pageSize: 1}).then((r) => { api.apiRecipeList({pageSize: 1}).then((r) => {
totalRecipes.value = r.count totalRecipes.value = r.count
}) })
if (!useUserPreferenceStore().activeSpace.spaceSetupCompleted) {
router.push({name: 'WelcomePage'})
}
}) })
</script> </script>

View File

@@ -0,0 +1,54 @@
<template>
<v-container>
<v-card>
<v-card-title>Welcome</v-card-title>
<v-card-text v-if="space">
Welcome to Tandoor
<v-text-field v-model="space.name" :label="$t('Name')"></v-text-field>
</v-card-text>
</v-card>
</v-container>
</template>
<script setup lang="ts">
import {ApiApi, Space} from "@/openapi";
import {onMounted, ref} from "vue";
import {ErrorMessageType, PreparedMessage, useMessageStore} from "@/stores/MessageStore.ts";
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore.ts";
const space = ref<undefined | Space>(undefined)
onMounted(() => {
loadSpace()
})
function loadSpace() {
let api = new ApiApi()
api.apiSpaceCurrentRetrieve().then(r => {
space.value = r
}).catch(err => {
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
})
}
function updateSpace() {
let api = new ApiApi()
api.apiSpacePartialUpdate({id: space.value.id, patchedSpace: space.value}).then(r => {
space.value = r
useUserPreferenceStore().activeSpace = Object.assign({}, space.value)
useMessageStore().addPreparedMessage(PreparedMessage.UPDATE_SUCCESS, space.value)
}).catch(err => {
useMessageStore().addError(ErrorMessageType.UPDATE_ERROR, err)
})
}
</script>
<style scoped>
</style>