space and user space api updates

This commit is contained in:
vabene1111
2025-09-14 09:57:57 +02:00
parent 4f248afe76
commit 58c412ad95
42 changed files with 183 additions and 29 deletions

View File

@@ -455,3 +455,9 @@ 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'

View File

@@ -46,13 +46,15 @@ class ScopeMiddleware:
# 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()
if not user_space:
if request.user.userspace_set.count() > 0:
if not user_space and 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 = request.user.userspace_set.first()
if user_space:
user_space.active = True
user_space.save()
elif 'signup_token' in request.session:
if not user_space:
if 'signup_token' in request.session:
# if user is authenticated, has no space but a signup token (InviteLink) is present, redirect to invite link logic
return HttpResponseRedirect(reverse('view_invite', args=[request.session.pop('signup_token', '')]))
else:

View File

@@ -75,7 +75,7 @@ from cookbook.helper.permission_helper import (CustomIsAdmin, CustomIsOwner, Cus
CustomTokenHasScope, CustomUserPermission, IsReadOnlyDRF,
above_space_limit,
group_required, has_group_permission, is_space_owner,
switch_user_active_space, CustomAiProviderPermission
switch_user_active_space, CustomAiProviderPermission, IsCreateDRF
)
from cookbook.helper.recipe_search import RecipeSearch
from cookbook.helper.recipe_url_import import clean_dict, get_from_youtube_scraper, get_images_from_soup
@@ -546,7 +546,7 @@ class GroupViewSet(LoggingMixin, viewsets.ModelViewSet):
class SpaceViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = Space.objects
serializer_class = SpaceSerializer
permission_classes = [IsReadOnlyDRF & CustomIsGuest | CustomIsOwner & CustomIsAdmin & CustomTokenHasReadWriteScope]
permission_classes = [((IsReadOnlyDRF | IsCreateDRF) & CustomIsGuest) | CustomIsOwner & CustomIsAdmin & CustomTokenHasReadWriteScope]
pagination_class = DefaultPagination
http_method_names = ['get', 'post', 'put', 'patch']
@@ -567,7 +567,7 @@ class SpaceViewSet(LoggingMixin, viewsets.ModelViewSet):
class UserSpaceViewSet(LoggingMixin, viewsets.ModelViewSet):
queryset = UserSpace.objects
serializer_class = UserSpaceSerializer
permission_classes = [(CustomIsSpaceOwner | CustomIsOwnerReadOnly) & CustomTokenHasReadWriteScope]
permission_classes = [(CustomIsSpaceOwner | (IsReadOnlyDRF & CustomIsUser) | CustomIsOwnerReadOnly) & CustomTokenHasReadWriteScope]
http_method_names = ['get', 'put', 'patch', 'delete']
pagination_class = DefaultPagination
@@ -581,10 +581,23 @@ class UserSpaceViewSet(LoggingMixin, viewsets.ModelViewSet):
if internal_note is not None:
self.queryset = self.queryset.filter(internal_note=internal_note)
if is_space_owner(self.request.user, self.request.space):
# starting with users you can SEE all other users in a space, guests only see themselves
if has_group_permission(self.request.user, ['user']):
return self.queryset.filter(space=self.request.space)
else:
return self.queryset.filter(user=self.request.user, space=self.request.space)
return self.queryset.filter(space=self.request.space, user=self.request.user)
@extend_schema(responses=UserSpaceSerializer(many=True))
@decorators.action(detail=False, pagination_class=DefaultPagination, methods=['GET'], serializer_class=UserSpaceSerializer, )
def all_personal(self, request):
"""
return all userspaces for the user requesting the endpoint
:param request:
:return:
"""
with scopes_disabled():
self.queryset = self.queryset.filter(user=self.request.user)
return Response(self.serializer_class(self.queryset.all(), many=True, context={'request': self.request}).data)
class UserPreferenceViewSet(LoggingMixin, viewsets.ModelViewSet):

View File

@@ -163,7 +163,7 @@ onMounted(() => {
* global title update handler, might be overridden by page specific handlers
*/
router.afterEach((to, from) => {
if(to.name != 'WelcomePage' && !useUserPreferenceStore().activeSpace.spaceSetupCompleted && useUserPreferenceStore().activeSpace.createdBy.id! == useUserPreferenceStore().userSettings.user.id!){
if(to.name == 'StartPage' && !useUserPreferenceStore().activeSpace.spaceSetupCompleted && useUserPreferenceStore().activeSpace.createdBy.id! == useUserPreferenceStore().userSettings.user.id!){
router.push({name: 'WelcomePage'})
}
nextTick(() => {

View File

@@ -98,7 +98,7 @@
<script setup lang="ts">
import {ApiApi, UserFile, UserFileFromJSON} from "@/openapi";
import {onMounted, ref} from "vue";
import {onMounted, ref, watch} from "vue";
import {DateTime} from "luxon";
import {ErrorMessageType, PreparedMessage, useMessageStore} from "@/stores/MessageStore";
import {getCookie} from "@/utils/cookie";
@@ -131,8 +131,13 @@ const tableHeaders = ref([
])
onMounted(() => {
//TODO move to open function of file tab
})
watch(() => dialog.value, (value, oldValue) => {
if (value && !oldValue) {
loadFiles()
}
})
function loadFiles() {

View File

@@ -29,7 +29,7 @@
<v-textarea v-model="editingObj.message" :label="$t('Message')" clearable></v-textarea>
<space-limits-info :space="editingObj" :show-thank-you="false"></space-limits-info>
<space-limits-info :space="editingObj" :show-thank-you="false" v-if="isUpdate()"></space-limits-info>
</v-form>
</v-tabs-window-item>

View File

@@ -162,6 +162,7 @@
"Keyword": "",
"Keyword_Alias": "",
"Keywords": "",
"LeaveSpace": "",
"Link": "",
"Load_More": "",
"LogCredits": "",
@@ -292,6 +293,7 @@
"Sort_by_new": "",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Starting_Day": "",

View File

@@ -157,6 +157,7 @@
"Keyword": "Ключова дума",
"Keyword_Alias": "Псевдоним на ключова дума",
"Keywords": "Ключови думи",
"LeaveSpace": "",
"Link": "Връзка",
"Load_More": "Зареди още",
"LogCredits": "",
@@ -285,6 +286,7 @@
"Sort_by_new": "Сортиране по ново",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Starting_Day": "Начален ден от седмицата",

View File

@@ -211,6 +211,7 @@
"Language": "Llenguatge",
"Last_name": "Cognoms",
"Learn_More": "Saber-me més",
"LeaveSpace": "",
"Link": "Enllaç",
"Load_More": "Carregueu-ne més",
"LogCredits": "",
@@ -370,6 +371,7 @@
"Sort_by_new": "Ordenar a partir del més nou",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"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.",

View File

@@ -209,6 +209,7 @@
"Language": "Jazyk",
"Last_name": "Příjmení",
"Learn_More": "Zjistit víc",
"LeaveSpace": "",
"Link": "Odkaz",
"Load_More": "Načíst další",
"LogCredits": "",
@@ -365,6 +366,7 @@
"Sort_by_new": "Seřadit od nejnovějšího",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"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.",

View File

@@ -211,6 +211,7 @@
"Language": "Sprog",
"Last_name": "Efternavn",
"Learn_More": "Lær mere",
"LeaveSpace": "",
"Link": "Link",
"Load_More": "Indlæs mere",
"LogCredits": "",
@@ -370,6 +371,7 @@
"Sort_by_new": "Sorter efter nylige",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Space_Cosmetic_Settings": "Visse kosmetiske indstillinger kan ændres af område-administratorer og vil overskrive klient-indstillinger for pågældende område.",

View File

@@ -290,6 +290,7 @@
"Last": "Letztes",
"Last_name": "Nachname",
"Learn_More": "Mehr erfahren",
"LeaveSpace": "Space verlassen",
"Link": "Link",
"Load": "Laden",
"Load_More": "Weitere laden",
@@ -515,7 +516,7 @@
"SpaceLimitReached": "Dieser Space hat ein Limit erreicht. Es können keine neuen Objekte von diesem Typ angelegt werden.",
"SpaceMemberHelp": "Füge Benutzer hinzu indem du Einladungen erstellst und Sie an die gewünschte Person sendest.",
"SpaceMembers": "Space Mitglieder",
"SpaceMembersHelp": "Benutzer und Ihre Rechte in einem Space. ",
"SpaceMembersHelp": "Benutzer und Ihre Rechte in einem Space. Füge weitere Nutzer mit Einladungslinks hinzu.",
"SpaceName": "Space Name",
"SpacePrivateObjectsHelp": "Einige Objekte sind Standardmäßig privat, können aber mit Mitgliedern deines Spaces geteilt werden.",
"SpaceSettings": "Space Einstellungen",

View File

@@ -211,6 +211,7 @@
"Language": "Γλώσσα",
"Last_name": "Επίθετο",
"Learn_More": "Μάθετε περισσότερα",
"LeaveSpace": "",
"Link": "Σύνδεσμος",
"Load_More": "Φόρτωση περισσότερων",
"LogCredits": "",
@@ -370,6 +371,7 @@
"Sort_by_new": "Ταξινόμηση κατά νέο",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Space_Cosmetic_Settings": "Ορισμένες ρυθμίσεις εμφάνισης μπορούν να αλλάξουν από τους διαχειριστές του χώρου και θα παρακάμψουν τις ρυθμίσεις πελάτη για αυτόν τον χώρο.",

View File

@@ -288,6 +288,7 @@
"Last": "Last",
"Last_name": "Last Name",
"Learn_More": "Learn More",
"LeaveSpace": "Leave Space",
"Link": "Link",
"Load": "Load",
"Load_More": "Load More",
@@ -513,7 +514,7 @@
"SpaceLimitReached": "This Space has reached a limit. No more objects of this type can be created.",
"SpaceMemberHelp": "Add users to your space by creating an Invite Link and sending it to the person you want to add.",
"SpaceMembers": "Space Members",
"SpaceMembersHelp": "Users and their permissions in a space. ",
"SpaceMembersHelp": "Users and their permissions in a space. Add additional users using invite links.",
"SpaceName": "Space Name",
"SpacePrivateObjectsHelp": " Some things are private by default an can be shared with members of your space.",
"SpaceSettings": "Space Settings",

View File

@@ -279,6 +279,7 @@
"Last": "Último",
"Last_name": "Apellidos",
"Learn_More": "Saber Más",
"LeaveSpace": "",
"Link": "Enlace",
"Load": "Cargar",
"Load_More": "Cargar más",
@@ -495,7 +496,7 @@
"SpaceLimitReached": "Este espacio ha alcanzado un límite. No se pueden crear más objetos de este tipo.",
"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",
"SpaceMembersHelp": "Usuarios y sus permisos en un espacio. ",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"SpaceSettings": "Ajustes del espacio",

View File

@@ -205,6 +205,7 @@
"Language": "Kieli",
"Last_name": "Sukunimi",
"Learn_More": "Lisätietoja",
"LeaveSpace": "",
"Link": "Linkki",
"Load_More": "Lataa Lisää",
"LogCredits": "",
@@ -358,6 +359,7 @@
"Sort_by_new": "Lajittele uusien mukaan",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Split_All_Steps": "Jaa kaikki rivit erillisiin vaiheisiin.",

View File

@@ -288,6 +288,7 @@
"Last": "Dernier",
"Last_name": "Nom",
"Learn_More": "Apprenez-en plus",
"LeaveSpace": "",
"Link": "Lien",
"Load": "Chargement",
"Load_More": "Charger plus",
@@ -510,7 +511,7 @@
"SpaceLimitReached": "Ce groupe a atteint sa limite. Aucun nouvel objet de ce type ne peut être créé.",
"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",
"SpaceMembersHelp": "Utilisateurs et permissions dans un groupe. ",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"SpaceSettings": "Paramètres du groupe",

View File

@@ -211,6 +211,7 @@
"Language": "שפה",
"Last_name": "שם משפחה",
"Learn_More": "למד עוד",
"LeaveSpace": "",
"Link": "קישור",
"Load_More": "טען עוד",
"LogCredits": "",
@@ -370,6 +371,7 @@
"Sort_by_new": "סדר ע\"י חדש",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Space_Cosmetic_Settings": "חלק מהגדרות הקוסמטיות יכולות להיות מעודכנות על ידי מנהל המרחב וידרסו את הגדרות הקליינט עבור מרחב זה.",

View File

@@ -211,6 +211,7 @@
"Language": "Jezik",
"Last_name": "Prezime",
"Learn_More": "Saznajte više",
"LeaveSpace": "",
"Link": "Poveznica",
"Load_More": "Učitaj više",
"LogCredits": "",
@@ -370,6 +371,7 @@
"Sort_by_new": "Poredaj po novom",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Space_Cosmetic_Settings": "Neke kozmetičke postavke mogu promijeniti administratori prostora i one će poništiti postavke klijenta za taj prostor.",

View File

@@ -193,6 +193,7 @@
"Language": "Nyelv",
"Last_name": "Vezetéknév",
"Learn_More": "Tudjon meg többet",
"LeaveSpace": "",
"Link": "Link",
"Load_More": "Továbbiak betöltése",
"LogCredits": "",
@@ -337,6 +338,7 @@
"Sort_by_new": "Rendezés legújabbak szerint",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Split_All_Steps": "Ossza fel az összes sort különálló lépésekbe.",

View File

@@ -83,6 +83,7 @@
"Information": "Տեղեկություն",
"Ingredients": "",
"Keywords": "",
"LeaveSpace": "",
"Link": "",
"Load_More": "",
"LogCredits": "",
@@ -154,6 +155,7 @@
"Sort_by_new": "Տեսակավորել ըստ նորերի",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"StartsWith": "",

View File

@@ -178,6 +178,7 @@
"Keywords": "Kata Kunci",
"Language": "",
"Last_name": "",
"LeaveSpace": "",
"Link": "Link",
"Load_More": "Muat lebih banyak",
"LogCredits": "",
@@ -314,6 +315,7 @@
"Sort_by_new": "Urutkan berdasarkan baru",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Starting_Day": "",

View File

@@ -210,6 +210,7 @@
"Language": "",
"Last_name": "",
"Learn_More": "",
"LeaveSpace": "",
"Link": "",
"Load_More": "",
"LogCredits": "",
@@ -368,6 +369,7 @@
"Sort_by_new": "",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Space_Cosmetic_Settings": "",

View File

@@ -288,6 +288,7 @@
"Last": "Ultimo",
"Last_name": "Cognome",
"Learn_More": "Scopri altro",
"LeaveSpace": "",
"Link": "Collegamento",
"Load": "Carica",
"Load_More": "Carica altro",
@@ -512,7 +513,7 @@
"SpaceLimitReached": "Questo spazio ha raggiunto il limite. Non è possibile creare altri oggetti di questo tipo.",
"SpaceMemberHelp": "Aggiungi utenti al tuo spazio creando un collegamento di invito e inviandolo alla persona che desideri aggiungere.",
"SpaceMembers": "Membri dello spazio",
"SpaceMembersHelp": "Utenti e relativi permessi in uno spazio. ",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"SpaceSettings": "Impostazioni spazio",

View File

@@ -195,6 +195,7 @@
"Language": "",
"Last_name": "",
"Learn_More": "",
"LeaveSpace": "",
"Link": "",
"Load_More": "Įkelti daugiau",
"LogCredits": "",
@@ -342,6 +343,7 @@
"Sort_by_new": "Rūšiuoti pagal naujumą",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Split_All_Steps": "",

View File

@@ -211,6 +211,7 @@
"Language": "",
"Last_name": "",
"Learn_More": "",
"LeaveSpace": "",
"Link": "",
"Load_More": "",
"LogCredits": "",
@@ -370,6 +371,7 @@
"Sort_by_new": "",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Space_Cosmetic_Settings": "",

View File

@@ -202,6 +202,7 @@
"Language": "Språk",
"Last_name": "Etternavn",
"Learn_More": "Lær mer",
"LeaveSpace": "",
"Link": "Lenke",
"Load_More": "Last inn flere",
"LogCredits": "",
@@ -352,6 +353,7 @@
"Sort_by_new": "Sorter etter nyest",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Split_All_Steps": "",

View File

@@ -289,6 +289,7 @@
"Last": "Laatste",
"Last_name": "Achternaam",
"Learn_More": "Meer informatie",
"LeaveSpace": "",
"Link": "Link",
"Load": "Laden",
"Load_More": "Laad meer",
@@ -513,7 +514,7 @@
"SpaceLimitReached": "Deze ruimte heeft een limiet bereikt. Er kunnen geen objecten van dit type meer worden aangemaakt.",
"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",
"SpaceMembersHelp": "Gebruikers en hun rechten in een ruimte. ",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"SpaceSettings": "Ruimte-instellingen",

View File

@@ -237,6 +237,7 @@
"Language": "Język",
"Last_name": "Nazwisko",
"Learn_More": "Dowiedz się więcej",
"LeaveSpace": "",
"Link": "Link",
"Load_More": "Załaduj więcej",
"LogCredits": "",
@@ -396,6 +397,7 @@
"Sort_by_new": "Sortuj według nowych",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Space_Cosmetic_Settings": "Administratorzy przestrzeni mogą zmienić niektóre ustawienia kosmetyczne, które zastąpią ustawienia klienta dla tej przestrzeni.",

View File

@@ -169,6 +169,7 @@
"Keywords": "Palavras-chave",
"Language": "Linguagem",
"Learn_More": "Aprenda mais",
"LeaveSpace": "",
"Link": "Ligação",
"Load_More": "Carregar Mais",
"LogCredits": "",
@@ -303,6 +304,7 @@
"Sort_by_new": "Ordenar por mais recente",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"StartDate": "Data de início",

View File

@@ -287,6 +287,7 @@
"Last": "Último",
"Last_name": "Último Nome",
"Learn_More": "Aprender Mais",
"LeaveSpace": "",
"Link": "Link",
"Load": "Carregar",
"Load_More": "Carregar mais",
@@ -444,6 +445,7 @@
"Sort_by_new": "Ordenar por novos",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"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.",

View File

@@ -187,6 +187,7 @@
"Keywords": "Cuvinte cheie",
"Language": "Limba",
"Last_name": "Nume de familie",
"LeaveSpace": "",
"Link": "Link",
"Load_More": "Încărcați mai mult",
"LogCredits": "",
@@ -326,6 +327,7 @@
"Sort_by_new": "Sortare după nou",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Split_All_Steps": "Împărțiți toate rândurile în pași separați.",

View File

@@ -288,6 +288,7 @@
"Last": "Последний",
"Last_name": "Фамилия",
"Learn_More": "Узнать больше",
"LeaveSpace": "",
"Link": "Гиперссылка",
"Load": "Загрузить",
"Load_More": "Загрузить еще",
@@ -510,7 +511,7 @@
"SpaceLimitReached": "В этом пространстве достигнут лимит. Новые объекты данного типа создавать нельзя.",
"SpaceMemberHelp": "Для добавления пользователей создайте пригласительную ссылку и передайте её человеку, которого хотите пригласить.",
"SpaceMembers": "Участники пространства",
"SpaceMembersHelp": "Пользователи и их права доступа в пространстве. ",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"SpaceSettings": "Настройки пространства",

View File

@@ -288,6 +288,7 @@
"Last": "Zadnji",
"Last_name": "Priimek",
"Learn_More": "Preberite Več",
"LeaveSpace": "",
"Link": "Hiperpovezava",
"Load": "Naloži",
"Load_More": "Naloži več",
@@ -512,7 +513,7 @@
"SpaceLimitReached": "Ta prostor je dosegel omejitev. Te vrste predmetov ni mogoče ustvariti več.",
"SpaceMemberHelp": "Dodajte uporabnike v svoj prostor tako, da ustvarite povezavo za povabilo in jo pošljete osebi, ki jo želite dodati.",
"SpaceMembers": "Člani prostora",
"SpaceMembersHelp": "Uporabniki in njihova dovoljenja v prostoru. ",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"SpaceSettings": "Nastavitve prostora",

View File

@@ -248,6 +248,7 @@
"Language": "Språk",
"Last_name": "Efternamn",
"Learn_More": "Läs mer",
"LeaveSpace": "",
"Link": "Länk",
"Load_More": "Ladda mer",
"LogCredits": "",
@@ -407,6 +408,7 @@
"Sort_by_new": "Sortera efter ny",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Space_Cosmetic_Settings": "Vissa kosmetiska inställningar kan ändras av hushålls-administratörer och skriver över klientinställningar för det hushållet.",

View File

@@ -211,6 +211,7 @@
"Language": "Dil",
"Last_name": "Soyisim",
"Learn_More": "Daha Fazla",
"LeaveSpace": "",
"Link": "Bağlantı",
"Load_More": "Daha Fazla Yükle",
"LogCredits": "",
@@ -370,6 +371,7 @@
"Sort_by_new": "Yeniye göre sırala",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"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.",

View File

@@ -186,6 +186,7 @@
"Keywords": "Ключові слова",
"Language": "Мова",
"Learn_More": "Дізнатися Більше",
"LeaveSpace": "",
"Link": "Посилання",
"Load_More": "Завантажити більше",
"LogCredits": "",
@@ -327,6 +328,7 @@
"Sort_by_new": "Сортувати за новими",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"StartDate": "Початкова дата",

View File

@@ -211,6 +211,7 @@
"Language": "语言",
"Last_name": "姓",
"Learn_More": "了解更多",
"LeaveSpace": "",
"Link": "链接",
"Load_More": "加载更多",
"LogCredits": "",
@@ -370,6 +371,7 @@
"Sort_by_new": "按新旧排序",
"Space": "",
"SpaceHelp": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"Space_Cosmetic_Settings": "空间管理员可以更改某些装饰设置,并将覆盖该空间的客户端设置。",

View File

@@ -287,6 +287,7 @@
"Last": "最後",
"Last_name": "姓",
"Learn_More": "了解更多",
"LeaveSpace": "",
"Link": "連結",
"Load": "載入",
"Load_More": "載入更多",
@@ -511,7 +512,7 @@
"SpaceLimitReached": "此空間已達到限制。無法再建立此類型的物件。",
"SpaceMemberHelp": "透過建立邀請連結並發送給您要新增的人來將使用者新增到您的空間。",
"SpaceMembers": "空間成員",
"SpaceMembersHelp": "空間中的使用者及其權限。 ",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"SpaceSettings": "空間設定",

View File

@@ -2148,6 +2148,11 @@ export interface ApiUserRetrieveRequest {
id: number;
}
export interface ApiUserSpaceAllPersonalListRequest {
page?: number;
pageSize?: number;
}
export interface ApiUserSpaceDestroyRequest {
id: number;
}
@@ -16234,6 +16239,44 @@ export class ApiApi extends runtime.BaseAPI {
return await response.value();
}
/**
* return all userspaces for the user requesting the endpoint :param request: :return:
*/
async apiUserSpaceAllPersonalListRaw(requestParameters: ApiUserSpaceAllPersonalListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedUserSpaceList>> {
const queryParameters: any = {};
if (requestParameters['page'] != null) {
queryParameters['page'] = requestParameters['page'];
}
if (requestParameters['pageSize'] != null) {
queryParameters['page_size'] = requestParameters['pageSize'];
}
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.apiKey) {
headerParameters["Authorization"] = await this.configuration.apiKey("Authorization"); // ApiKeyAuth authentication
}
const response = await this.request({
path: `/api/user-space/all_personal/`,
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => PaginatedUserSpaceListFromJSON(jsonValue));
}
/**
* return all userspaces for the user requesting the endpoint :param request: :return:
*/
async apiUserSpaceAllPersonalList(requestParameters: ApiUserSpaceAllPersonalListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedUserSpaceList> {
const response = await this.apiUserSpaceAllPersonalListRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* logs request counts to redis cache total/per user/
*/

View File

@@ -34,9 +34,12 @@
</v-card-actions>
<v-card-text v-if="genericModel.model.name == 'AiLog'">
{{ $t('MonthlyCreditsUsed') }} ({{ useUserPreferenceStore().activeSpace.aiMonthlyCreditsUsed }} / {{ useUserPreferenceStore().activeSpace.aiCreditsMonthly }})
{{ $t('MonthlyCreditsUsed') }} ({{ useUserPreferenceStore().activeSpace.aiMonthlyCreditsUsed }} / {{
useUserPreferenceStore().activeSpace.aiCreditsMonthly
}})
{{ $t('AiCreditsBalance') }} : {{ useUserPreferenceStore().activeSpace.aiCreditsBalance }}
<v-progress-linear :model-value="useUserPreferenceStore().activeSpace.aiMonthlyCreditsUsed" :max="useUserPreferenceStore().activeSpace.aiCreditsMonthly"></v-progress-linear>
<v-progress-linear :model-value="useUserPreferenceStore().activeSpace.aiMonthlyCreditsUsed"
:max="useUserPreferenceStore().activeSpace.aiCreditsMonthly"></v-progress-linear>
</v-card-text>
</v-card>
</v-col>
@@ -83,7 +86,7 @@
<v-chip label v-else color="info">{{ $t('Space') }}</v-chip>
</template>
<template v-slot:item.groups="{ item }" v-if="genericModel.model.name == 'UserSpace'">
{{item.groups.flatMap((x: Group) => x.name).join(', ')}}
{{ item.groups.flatMap((x: Group) => x.name).join(', ') }}
</template>
<template v-slot:item.action="{ item }">
<v-btn class="float-right" icon="$menu" variant="plain">
@@ -114,6 +117,11 @@
<v-list-item prepend-icon="fa-solid fa-rotate" v-if="genericModel.model.name == 'RecipeImport'" @click="importRecipe(item)">
{{ $t('Import') }}
</v-list-item>
<v-list-item prepend-icon="fa-solid fa-arrow-right-from-bracket"
v-if="genericModel.model.name == 'Space' && item.createdBy.id != useUserPreferenceStore().userSettings.user.id!"
@click="leaveSpace(item)">
{{ $t('LeaveSpace') }}
</v-list-item>
</v-list>
</v-menu>
</v-btn>
@@ -147,7 +155,7 @@ import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
import ModelMergeDialog from "@/components/dialogs/ModelMergeDialog.vue";
import {VDataTableUpdateOptions} from "@/vuetify";
import SyncDialog from "@/components/dialogs/SyncDialog.vue";
import {ApiApi, ApiRecipeListRequest, Group, RecipeImport} from "@/openapi";
import {ApiApi, ApiRecipeListRequest, Group, RecipeImport, Space, UserSpace} from "@/openapi";
import {useTitle} from "@vueuse/core";
import RecipeShareDialog from "@/components/dialogs/RecipeShareDialog.vue";
import AddToShoppingDialog from "@/components/dialogs/AddToShoppingDialog.vue";
@@ -264,6 +272,26 @@ function importAllRecipes() {
})
}
/**
* leave the selected space as a user
* @param space to leave
*/
function leaveSpace(space: Space) {
let api = new ApiApi()
useUserPreferenceStore().userSpaces.forEach((us: UserSpace) => {
if (us.space == space.id!) {
loading.value = true
api.apiUserSpaceDestroy({id: us.id!}).then(r => {
}).catch(err => {
useMessageStore().addError(ErrorMessageType.DELETE_ERROR, err)
}).finally(() => {
loading.value = false
})
}
})
}
</script>
<style scoped>

View File

@@ -130,7 +130,7 @@ export const useUserPreferenceStore = defineStore('user_preference_store', () =>
*/
function loadUserSpaces() {
let api = new ApiApi()
return api.apiUserSpaceList().then(r => {
return api.apiUserSpaceAllPersonalList().then(r => {
userSpaces.value = r.results
}).catch(err => {
if (err.response.status != 403) {