mirror of
				https://github.com/open-webui/open-webui
				synced 2025-06-26 18:26:48 +00:00 
			
		
		
		
	refac: get permissions
This commit is contained in:
		
							parent
							
								
									c0371f6525
								
							
						
					
					
						commit
						07e0712b87
					
				@ -1,37 +1,41 @@
 | 
			
		||||
from typing import Optional, Union, List, Dict
 | 
			
		||||
from typing import Optional, Union, List, Dict, Any
 | 
			
		||||
from open_webui.apps.webui.models.groups import Groups
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_permissions(
 | 
			
		||||
    user_id: str,
 | 
			
		||||
    default_permissions: Dict[str, bool] = {},
 | 
			
		||||
) -> dict:
 | 
			
		||||
    default_permissions: Dict[str, Any] = {},
 | 
			
		||||
) -> Dict[str, Any]:
 | 
			
		||||
    """
 | 
			
		||||
    Get all permissions for a user by combining the permissions of all groups the user is a member of.
 | 
			
		||||
    If a permission is defined in multiple groups, the most permissive value is used.
 | 
			
		||||
    If a permission is defined in multiple groups, the most permissive value is used (True > False).
 | 
			
		||||
    Permissions are nested in a dict with the permission key as the key and a boolean as the value.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def merge_permissions(
 | 
			
		||||
        permissions: Dict[str, bool], new_permissions: Dict[str, bool]
 | 
			
		||||
    ) -> Dict[str, bool]:
 | 
			
		||||
        """Merge two permission dictionaries, keeping the most permissive value."""
 | 
			
		||||
        for key, value in new_permissions.items():
 | 
			
		||||
            if key not in permissions:
 | 
			
		||||
                permissions[key] = value
 | 
			
		||||
    def combine_permissions(
 | 
			
		||||
        permissions: Dict[str, Any], group_permissions: Dict[str, Any]
 | 
			
		||||
    ) -> Dict[str, Any]:
 | 
			
		||||
        """Combine permissions from multiple groups by taking the most permissive value."""
 | 
			
		||||
        for key, value in group_permissions.items():
 | 
			
		||||
            if isinstance(value, dict):
 | 
			
		||||
                if key not in permissions:
 | 
			
		||||
                    permissions[key] = {}
 | 
			
		||||
                permissions[key] = combine_permissions(permissions[key], value)
 | 
			
		||||
            else:
 | 
			
		||||
                permissions[key] = (
 | 
			
		||||
                    permissions[key] or value
 | 
			
		||||
                )  # Use the most permissive value
 | 
			
		||||
 | 
			
		||||
                if key not in permissions:
 | 
			
		||||
                    permissions[key] = value
 | 
			
		||||
                else:
 | 
			
		||||
                    permissions[key] = permissions[key] or value
 | 
			
		||||
        return permissions
 | 
			
		||||
 | 
			
		||||
    user_groups = Groups.get_groups_by_member_id(user_id)
 | 
			
		||||
    user_permissions = default_permissions.copy()
 | 
			
		||||
    permissions = default_permissions.copy()
 | 
			
		||||
 | 
			
		||||
    for group in user_groups:
 | 
			
		||||
        user_permissions = merge_permissions(user_permissions, group.permissions)
 | 
			
		||||
        group_permissions = group.permissions
 | 
			
		||||
        permissions = combine_permissions(permissions, group_permissions)
 | 
			
		||||
 | 
			
		||||
    return user_permissions
 | 
			
		||||
    return permissions
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def has_permission(
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user