prepared global theming trough spaces

This commit is contained in:
vabene1111
2025-06-06 19:14:45 +02:00
parent ec0bc43c21
commit 97aa3301ea
27 changed files with 1997 additions and 9 deletions

View File

@@ -1511,6 +1511,20 @@ class ServerSettingsSerializer(serializers.Serializer):
debug = serializers.BooleanField()
version = serializers.CharField()
unauthenticated_theme_from_space = serializers.IntegerField()
force_theme_from_space = serializers.IntegerField()
logo_color_32 = serializers.ImageField(default=None)
logo_color_128 = serializers.CharField(default=None)
logo_color_144 = serializers.CharField(default=None)
logo_color_180 = serializers.CharField(default=None)
logo_color_192 = serializers.CharField(default=None)
logo_color_512 = serializers.CharField(default=None)
logo_color_svg = serializers.CharField(default=None)
custom_space_theme = serializers.CharField(default=None)
nav_logo = serializers.CharField(default=None)
nav_bg_color = serializers.CharField(default=None)
class Meta:
fields = '__ALL__'
read_only_fields = '__ALL__'

View File

@@ -2236,7 +2236,32 @@ class ServerSettingsViewSet(viewsets.GenericViewSet):
s['hosted'] = settings.HOSTED
s['debug'] = settings.DEBUG
s['version'] = TANDOOR_VERSION
s['unauthenticated_theme_from_space'] = settings.UNAUTHENTICATED_THEME_FROM_SPACE
s['force_theme_from_space'] = settings.FORCE_THEME_FROM_SPACE
# include the settings handled by the space
space = None
if not request.user.is_authenticated and settings.UNAUTHENTICATED_THEME_FROM_SPACE > 0:
with scopes_disabled():
space = Space.objects.filter(id=settings.UNAUTHENTICATED_THEME_FROM_SPACE).first()
if request.user.is_authenticated and settings.FORCE_THEME_FROM_SPACE:
with scopes_disabled():
space = Space.objects.filter(id=settings.FORCE_THEME_FROM_SPACE).first()
print(f'taking theme from space: {space}')
if space:
print('applying theme from space logo_color_32:', space.logo_color_32.file)
s['logo_color_32'] = space.logo_color_32.file if space.logo_color_32 else None
s['logo_color_128'] = space.logo_color_128.file if space.logo_color_128 else None
s['logo_color_144'] = space.logo_color_144.file if space.logo_color_144 else None
s['logo_color_180'] = space.logo_color_180.file if space.logo_color_180 else None
s['logo_color_192'] = space.logo_color_192.file if space.logo_color_192 else None
s['logo_color_512'] = space.logo_color_512.file if space.logo_color_512 else None
s['logo_color_svg'] = space.logo_color_svg.file if space.logo_color_svg else None
s['custom_theme'] = space.custom_space_theme.file if space.custom_space_theme else None
s['nav_logo'] = space.nav_logo.file if space.nav_logo else None
s['nav_bg_color'] = space.nav_bg_color
print(s)
return Response(ServerSettingsSerializer(s, many=False).data)

View File

@@ -8,7 +8,8 @@
<v-card>
<v-card-title><i class="fa-solid fa-book"></i> {{ $t('Recipes') }}</v-card-title>
<v-card-text>{{ $n(space.recipeCount) }} / {{ space.maxRecipes == 0 ? '∞' : $n(space.maxRecipes) }}</v-card-text>
<v-progress-linear :color="isSpaceAboveRecipeLimit(space) ? 'error' : 'success'" height="10" :model-value="(space.recipeCount / space.maxRecipes) * 100"></v-progress-linear>
<v-progress-linear :color="isSpaceAboveRecipeLimit(space) ? 'error' : 'success'" height="10"
:model-value="(space.recipeCount / space.maxRecipes) * 100"></v-progress-linear>
</v-card>
</v-col>
<v-col cols="12" md="4">
@@ -16,7 +17,8 @@
<v-card-title><i class="fa-solid fa-users"></i> {{ $t('Users') }}</v-card-title>
<v-card-text>{{ $n(space.userCount) }} / {{ space.maxUsers == 0 ? '∞' : $n(space.maxUsers) }}</v-card-text>
<v-progress-linear :color="isSpaceAboveUserLimit(space) ? 'error' : 'success'" height="10" :model-value="(space.userCount / space.maxUsers) * 100"></v-progress-linear>
<v-progress-linear :color="isSpaceAboveUserLimit(space) ? 'error' : 'success'" height="10"
:model-value="(space.userCount / space.maxUsers) * 100"></v-progress-linear>
</v-card>
</v-col>
<v-col cols="12" md="4">
@@ -69,22 +71,28 @@
</v-alert>
<p class="text-h6 mt-2">{{ $t('Settings') }}</p>
<v-divider class="mb-2"></v-divider>
<user-file-field v-model="space.image" :label="$t('Image')" :hint="$t('CustomImageHelp')" persistent-hint></user-file-field>
<user-file-field v-model="space.navLogo" :label="$t('Logo')" :hint="$t('CustomNavLogoHelp')" persistent-hint></user-file-field>
<v-textarea v-model="space.message" :label="$t('Message')"></v-textarea>
<!-- <model-select v-model="space.foodInherit" model="FoodInheritField" mode="tags"></model-select>-->
<!-- <model-select v-model="space.foodInherit" model="FoodInheritField" mode="tags"></model-select>-->
<v-btn color="success" @click="updateSpace()" prepend-icon="$save">{{ $t('Save') }}</v-btn>
<p class="text-h6 mt-2">{{ $t('Logo') }}</p>
<v-divider></v-divider>
<p class="text-subtitle-2">{{ $t('CustomLogoHelp') }}</p>
<v-divider class="mt-4 mb-2"></v-divider>
<h2>{{$t('Cosmetic')}}</h2>
<span>{{$t('Space_Cosmetic_Settings')}}</span>
<v-label class="mt-4">{{ $t('Nav_Color') }}</v-label>
<v-color-picker v-model="space.navBgColor" class="mb-4" mode="hex" :modes="['hex']" show-swatches
:swatches="[['#ddbf86'],['#b98766'],['#b55e4f'],['#82aa8b'],['#385f84']]"></v-color-picker>
<v-btn class="mb-4" @click="space.navBgColor = ''">{{$t('Reset')}}</v-btn>
<user-file-field v-model="space.navLogo" :label="$t('Logo')" :hint="$t('CustomNavLogoHelp')" persistent-hint></user-file-field>
<user-file-field v-model="space.logoColor32" :label="$t('Logo') + ' 32x32px'"></user-file-field>
<user-file-field v-model="space.logoColor128" :label="$t('Logo') + ' 128x128px'"></user-file-field>
@@ -93,6 +101,7 @@
<user-file-field v-model="space.logoColor192" :label="$t('Logo') + ' 192x192px'"></user-file-field>
<user-file-field v-model="space.logoColor512" :label="$t('Logo') + ' 512x512px'"></user-file-field>
<user-file-field v-model="space.logoColorSvg" :label="$t('Logo') + ' SVG'"></user-file-field>
<user-file-field v-model="space.customSpaceTheme" :label="$t('CustomTheme') + ' CSS'"></user-file-field>
<v-btn color="success" @click="updateSpace()" prepend-icon="$save">{{ $t('Save') }}</v-btn>

View File

@@ -378,6 +378,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Starting_Day": "",
"Step": "",

View File

@@ -371,6 +371,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Starting_Day": "Начален ден от седмицата",
"Step": "Стъпка",

View File

@@ -429,6 +429,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Split_All_Steps": "Opdel rækker i separate trin.",
"StartDate": "Startdato",

View File

@@ -455,7 +455,7 @@
"SpaceMembers": "Space Mitglieder",
"SpaceMembersHelp": "Benutzer und Ihre Rechte in einem Space.",
"SpaceSettings": "Space Einstellungen",
"Space_Cosmetic_Settings": "Einige optische Einstellungen können von Administratoren des Bereichs geändert werden und setzen die Client-Einstellungen für diesen Bereich außer Kraft.",
"Space_Cosmetic_Settings": "Kosmetische Einstellungen auf Space Ebene überschreiben die Einstellungen der einzelnen Nutzer. ",
"Split": "Aufteilen",
"Split_All_Steps": "Teile alle Zeilen in separate Schritte auf.",
"StartDate": "Startdatum",

View File

@@ -421,6 +421,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Split_All_Steps": "Διαχωρισμός όλων των γραμμών σε χωριστά βήματα.",
"Starting_Day": "Πρώτη μέρα της εβδομάδας",

View File

@@ -300,6 +300,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Starting_Day": "Viikon aloituspäivä",
"Step": "Vaihe",

View File

@@ -423,6 +423,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Split_All_Steps": "Ossza fel az összes sort különálló lépésekbe.",
"StartDate": "Kezdés dátuma",

View File

@@ -241,6 +241,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Step": "",
"StepHelp": "",

View File

@@ -400,6 +400,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Starting_Day": "",
"Step": "Melangkah",

View File

@@ -408,6 +408,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Split_All_Steps": "Divide tutte le righe in step separati.",
"Starting_Day": "Giorno di inizio della settimana",

View File

@@ -427,6 +427,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Split_All_Steps": "",
"StartDate": "",

View File

@@ -419,6 +419,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Split_All_Steps": "",
"Starting_Day": "Dag uken skal state på",

View File

@@ -423,6 +423,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Split_All_Steps": "Splits alle rijen in aparte stappen.",
"Starting_Day": "Eerste dag van de week",

View File

@@ -365,6 +365,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Starting_Day": "Dia de início da semana",
"Step": "Passo",

View File

@@ -438,6 +438,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"StartDate": "Data Início",
"Starting_Day": "Dia de início da semana",

View File

@@ -412,6 +412,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"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",

View File

@@ -350,6 +350,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Starting_Day": "Начальный день недели",
"Step": "Шаг",

View File

@@ -339,6 +339,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Starting_Day": "Začetni dan v tednu",
"Step": "Korak",

View File

@@ -386,6 +386,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Starting_Day": "Початковий день тижня",
"Step": "Крок",

View File

@@ -211,6 +211,7 @@
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Step": "",
"StepHelp": "",

View File

@@ -7,6 +7,7 @@ models/AuthToken.ts
models/AutoMealPlan.ts
models/Automation.ts
models/AutomationTypeEnum.ts
models/BaseUnitEnum.ts
models/BookmarkletImport.ts
models/BookmarkletImportList.ts
models/ConnectorConfig.ts
@@ -40,6 +41,16 @@ models/MealPlan.ts
models/MealType.ts
models/MethodEnum.ts
models/NutritionInformation.ts
models/OpenDataCategory.ts
models/OpenDataConversion.ts
models/OpenDataFood.ts
models/OpenDataFoodProperty.ts
models/OpenDataProperty.ts
models/OpenDataStore.ts
models/OpenDataStoreCategory.ts
models/OpenDataUnit.ts
models/OpenDataUnitTypeEnum.ts
models/OpenDataVersion.ts
models/PaginatedAutomationList.ts
models/PaginatedBookmarkletImportListList.ts
models/PaginatedConnectorConfigList.ts
@@ -89,6 +100,13 @@ models/PatchedInviteLink.ts
models/PatchedKeyword.ts
models/PatchedMealPlan.ts
models/PatchedMealType.ts
models/PatchedOpenDataCategory.ts
models/PatchedOpenDataConversion.ts
models/PatchedOpenDataFood.ts
models/PatchedOpenDataProperty.ts
models/PatchedOpenDataStore.ts
models/PatchedOpenDataUnit.ts
models/PatchedOpenDataVersion.ts
models/PatchedProperty.ts
models/PatchedPropertyType.ts
models/PatchedRecipe.ts

File diff suppressed because it is too large Load Diff

View File

@@ -79,6 +79,78 @@ export interface ServerSettings {
* @memberof ServerSettings
*/
version: string;
/**
*
* @type {number}
* @memberof ServerSettings
*/
unauthenticatedThemeFromSpace: number;
/**
*
* @type {number}
* @memberof ServerSettings
*/
forceThemeFromSpace: number;
/**
*
* @type {string}
* @memberof ServerSettings
*/
logoColor32?: string;
/**
*
* @type {string}
* @memberof ServerSettings
*/
logoColor128?: string;
/**
*
* @type {string}
* @memberof ServerSettings
*/
logoColor144?: string;
/**
*
* @type {string}
* @memberof ServerSettings
*/
logoColor180?: string;
/**
*
* @type {string}
* @memberof ServerSettings
*/
logoColor192?: string;
/**
*
* @type {string}
* @memberof ServerSettings
*/
logoColor512?: string;
/**
*
* @type {string}
* @memberof ServerSettings
*/
logoColorSvg?: string;
/**
*
* @type {string}
* @memberof ServerSettings
*/
customSpaceTheme?: string;
/**
*
* @type {string}
* @memberof ServerSettings
*/
navLogo?: string;
/**
*
* @type {string}
* @memberof ServerSettings
*/
navBgColor?: string;
}
/**
@@ -95,6 +167,8 @@ export function instanceOfServerSettings(value: object): value is ServerSettings
if (!('hosted' in value) || value['hosted'] === undefined) return false;
if (!('debug' in value) || value['debug'] === undefined) return false;
if (!('version' in value) || value['version'] === undefined) return false;
if (!('unauthenticatedThemeFromSpace' in value) || value['unauthenticatedThemeFromSpace'] === undefined) return false;
if (!('forceThemeFromSpace' in value) || value['forceThemeFromSpace'] === undefined) return false;
return true;
}
@@ -118,6 +192,18 @@ export function ServerSettingsFromJSONTyped(json: any, ignoreDiscriminator: bool
'hosted': json['hosted'],
'debug': json['debug'],
'version': json['version'],
'unauthenticatedThemeFromSpace': json['unauthenticated_theme_from_space'],
'forceThemeFromSpace': json['force_theme_from_space'],
'logoColor32': json['logo_color_32'] == null ? undefined : json['logo_color_32'],
'logoColor128': json['logo_color_128'] == null ? undefined : json['logo_color_128'],
'logoColor144': json['logo_color_144'] == null ? undefined : json['logo_color_144'],
'logoColor180': json['logo_color_180'] == null ? undefined : json['logo_color_180'],
'logoColor192': json['logo_color_192'] == null ? undefined : json['logo_color_192'],
'logoColor512': json['logo_color_512'] == null ? undefined : json['logo_color_512'],
'logoColorSvg': json['logo_color_svg'] == null ? undefined : json['logo_color_svg'],
'customSpaceTheme': json['custom_space_theme'] == null ? undefined : json['custom_space_theme'],
'navLogo': json['nav_logo'] == null ? undefined : json['nav_logo'],
'navBgColor': json['nav_bg_color'] == null ? undefined : json['nav_bg_color'],
};
}
@@ -137,6 +223,18 @@ export function ServerSettingsToJSON(value?: ServerSettings | null): any {
'hosted': value['hosted'],
'debug': value['debug'],
'version': value['version'],
'unauthenticated_theme_from_space': value['unauthenticatedThemeFromSpace'],
'force_theme_from_space': value['forceThemeFromSpace'],
'logo_color_32': value['logoColor32'],
'logo_color_128': value['logoColor128'],
'logo_color_144': value['logoColor144'],
'logo_color_180': value['logoColor180'],
'logo_color_192': value['logoColor192'],
'logo_color_512': value['logoColor512'],
'logo_color_svg': value['logoColorSvg'],
'custom_space_theme': value['customSpaceTheme'],
'nav_logo': value['navLogo'],
'nav_bg_color': value['navBgColor'],
};
}

View File

@@ -5,6 +5,7 @@ export * from './AuthToken';
export * from './AutoMealPlan';
export * from './Automation';
export * from './AutomationTypeEnum';
export * from './BaseUnitEnum';
export * from './BookmarkletImport';
export * from './BookmarkletImportList';
export * from './ConnectorConfig';
@@ -38,6 +39,16 @@ export * from './MealPlan';
export * from './MealType';
export * from './MethodEnum';
export * from './NutritionInformation';
export * from './OpenDataCategory';
export * from './OpenDataConversion';
export * from './OpenDataFood';
export * from './OpenDataFoodProperty';
export * from './OpenDataProperty';
export * from './OpenDataStore';
export * from './OpenDataStoreCategory';
export * from './OpenDataUnit';
export * from './OpenDataUnitTypeEnum';
export * from './OpenDataVersion';
export * from './PaginatedAutomationList';
export * from './PaginatedBookmarkletImportListList';
export * from './PaginatedConnectorConfigList';
@@ -87,6 +98,13 @@ export * from './PatchedInviteLink';
export * from './PatchedKeyword';
export * from './PatchedMealPlan';
export * from './PatchedMealType';
export * from './PatchedOpenDataCategory';
export * from './PatchedOpenDataConversion';
export * from './PatchedOpenDataFood';
export * from './PatchedOpenDataProperty';
export * from './PatchedOpenDataStore';
export * from './PatchedOpenDataUnit';
export * from './PatchedOpenDataVersion';
export * from './PatchedProperty';
export * from './PatchedPropertyType';
export * from './PatchedRecipe';