mirror of
https://github.com/open-webui/open-webui.git
synced 2026-07-26 03:14:08 -05:00
feat(permissions): add workspace.skills_import and workspace.skills_export permissions (#25921)
This commit is contained in:
@@ -1650,6 +1650,14 @@ USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT = (
|
||||
os.getenv('USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT', 'False').lower() == 'true'
|
||||
)
|
||||
|
||||
USER_PERMISSIONS_WORKSPACE_SKILLS_IMPORT = (
|
||||
os.getenv('USER_PERMISSIONS_WORKSPACE_SKILLS_IMPORT', 'False').lower() == 'true'
|
||||
)
|
||||
|
||||
USER_PERMISSIONS_WORKSPACE_SKILLS_EXPORT = (
|
||||
os.getenv('USER_PERMISSIONS_WORKSPACE_SKILLS_EXPORT', 'False').lower() == 'true'
|
||||
)
|
||||
|
||||
|
||||
USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING = (
|
||||
os.getenv('USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING', 'False').lower() == 'true'
|
||||
@@ -1813,6 +1821,8 @@ DEFAULT_USER_PERMISSIONS = {
|
||||
'prompts_export': USER_PERMISSIONS_WORKSPACE_PROMPTS_EXPORT,
|
||||
'tools_import': USER_PERMISSIONS_WORKSPACE_TOOLS_IMPORT,
|
||||
'tools_export': USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT,
|
||||
'skills_import': USER_PERMISSIONS_WORKSPACE_SKILLS_IMPORT,
|
||||
'skills_export': USER_PERMISSIONS_WORKSPACE_SKILLS_EXPORT,
|
||||
},
|
||||
'sharing': {
|
||||
'models': USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING,
|
||||
|
||||
@@ -131,7 +131,7 @@ async def export_skills(
|
||||
):
|
||||
if user.role != 'admin' and not await has_permission(
|
||||
user.id,
|
||||
'workspace.skills',
|
||||
'workspace.skills_export',
|
||||
await Config.get('user.permissions'),
|
||||
db=db,
|
||||
):
|
||||
@@ -158,8 +158,13 @@ async def create_new_skill(
|
||||
user=Depends(get_verified_user),
|
||||
db: AsyncSession = Depends(get_async_session),
|
||||
):
|
||||
if user.role != 'admin' and not await has_permission(
|
||||
user.id, 'workspace.skills', await Config.get('user.permissions'), db=db
|
||||
if user.role != 'admin' and not (
|
||||
await has_permission(
|
||||
user.id, 'workspace.skills', await Config.get('user.permissions'), db=db
|
||||
)
|
||||
or await has_permission(
|
||||
user.id, 'workspace.skills_import', await Config.get('user.permissions'), db=db
|
||||
)
|
||||
):
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
|
||||
@@ -179,6 +179,8 @@ class WorkspacePermissions(BaseModel):
|
||||
prompts_export: bool = False
|
||||
tools_import: bool = False
|
||||
tools_export: bool = False
|
||||
skills_import: bool = False
|
||||
skills_export: bool = False
|
||||
|
||||
|
||||
class SharingPermissions(BaseModel):
|
||||
|
||||
@@ -174,7 +174,22 @@
|
||||
<Switch bind:state={permissions.workspace.skills} />
|
||||
</Tooltip>
|
||||
|
||||
{#if defaultPermissions?.workspace?.skills && !permissions.workspace.skills}
|
||||
{#if permissions.workspace.skills}
|
||||
<div class="ml-2 flex flex-col gap-2 pt-0.5 pb-1">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class="self-center text-xs">
|
||||
{$i18n.t('Import Skills')}
|
||||
</div>
|
||||
<Switch bind:state={permissions.workspace.skills_import} />
|
||||
</div>
|
||||
<div class="flex w-full justify-between">
|
||||
<div class="self-center text-xs">
|
||||
{$i18n.t('Export Skills')}
|
||||
</div>
|
||||
<Switch bind:state={permissions.workspace.skills_export} />
|
||||
</div>
|
||||
</div>
|
||||
{:else if defaultPermissions?.workspace?.skills}
|
||||
<div class="pb-0.5">
|
||||
<div class="text-xs text-gray-500">
|
||||
{$i18n.t('This is a default user permission and will remain enabled.')}
|
||||
|
||||
@@ -263,7 +263,7 @@
|
||||
}}
|
||||
/>
|
||||
|
||||
{#if $user?.role === 'admin' || $user?.permissions?.workspace?.skills}
|
||||
{#if $user?.role === 'admin' || $user?.permissions?.workspace?.skills_import}
|
||||
<button
|
||||
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-200 transition"
|
||||
on:click={() => {
|
||||
@@ -276,7 +276,7 @@
|
||||
</button>
|
||||
{/if}
|
||||
|
||||
{#if total && ($user?.role === 'admin' || $user?.permissions?.workspace?.skills)}
|
||||
{#if total && ($user?.role === 'admin' || $user?.permissions?.workspace?.skills_export)}
|
||||
<button
|
||||
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-200 transition"
|
||||
on:click={async () => {
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
<div class="flex items-center">{$i18n.t('Clone')}</div>
|
||||
</button>
|
||||
|
||||
{#if $user?.role === 'admin' || $user?.permissions?.workspace?.skills}
|
||||
{#if $user?.role === 'admin' || $user?.permissions?.workspace?.skills_export}
|
||||
<button
|
||||
class="select-none flex gap-2 items-center px-3 py-1.5 text-sm cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-xl w-full"
|
||||
on:click={() => {
|
||||
|
||||
@@ -10,7 +10,9 @@ export const DEFAULT_PERMISSIONS = {
|
||||
prompts_import: false,
|
||||
prompts_export: false,
|
||||
tools_import: false,
|
||||
tools_export: false
|
||||
tools_export: false,
|
||||
skills_import: false,
|
||||
skills_export: false
|
||||
},
|
||||
sharing: {
|
||||
models: false,
|
||||
|
||||
Reference in New Issue
Block a user