116 lines
3.5 KiB
Python
116 lines
3.5 KiB
Python
|
from services.auth_service import (
|
||
|
get_user_by_username, get_user_by_id, get_all_users,
|
||
|
create_user, update_user, delete_user
|
||
|
)
|
||
|
|
||
|
# Este archivo importa funcionalidades de auth_service.py para mantener
|
||
|
# consistencia en la estructura del proyecto, y agrega funcionalidades específicas
|
||
|
# de gestión de usuarios que no están relacionadas con la autenticación.
|
||
|
|
||
|
def filter_users(filter_params):
|
||
|
"""
|
||
|
Filtrar usuarios según los parámetros proporcionados.
|
||
|
|
||
|
Args:
|
||
|
filter_params (dict): Diccionario con parámetros de filtrado
|
||
|
- empresa: Nombre de empresa
|
||
|
- estado: Estado del usuario ('activo', 'inactivo')
|
||
|
- nivel_min: Nivel mínimo de permiso
|
||
|
- nivel_max: Nivel máximo de permiso
|
||
|
|
||
|
Returns:
|
||
|
list: Lista de objetos User que cumplen los criterios
|
||
|
"""
|
||
|
users = get_all_users()
|
||
|
filtered_users = []
|
||
|
|
||
|
for user in users:
|
||
|
# Filtrar por empresa
|
||
|
if 'empresa' in filter_params and filter_params['empresa']:
|
||
|
if user.empresa != filter_params['empresa']:
|
||
|
continue
|
||
|
|
||
|
# Filtrar por estado
|
||
|
if 'estado' in filter_params and filter_params['estado']:
|
||
|
if user.estado != filter_params['estado']:
|
||
|
continue
|
||
|
|
||
|
# Filtrar por nivel mínimo
|
||
|
if 'nivel_min' in filter_params and filter_params['nivel_min'] is not None:
|
||
|
if user.nivel < int(filter_params['nivel_min']):
|
||
|
continue
|
||
|
|
||
|
# Filtrar por nivel máximo
|
||
|
if 'nivel_max' in filter_params and filter_params['nivel_max'] is not None:
|
||
|
if user.nivel > int(filter_params['nivel_max']):
|
||
|
continue
|
||
|
|
||
|
# Si pasó todos los filtros, agregar a la lista
|
||
|
filtered_users.append(user)
|
||
|
|
||
|
return filtered_users
|
||
|
|
||
|
def get_user_stats():
|
||
|
"""
|
||
|
Obtener estadísticas sobre los usuarios.
|
||
|
|
||
|
Returns:
|
||
|
dict: Diccionario con estadísticas
|
||
|
"""
|
||
|
users = get_all_users()
|
||
|
|
||
|
# Inicializar estadísticas
|
||
|
stats = {
|
||
|
'total': len(users),
|
||
|
'activos': 0,
|
||
|
'inactivos': 0,
|
||
|
'expirados': 0,
|
||
|
'por_empresa': {},
|
||
|
'por_nivel': {
|
||
|
'admin': 0, # Nivel 9000+
|
||
|
'gestor': 0, # Nivel 5000-8999
|
||
|
'editor': 0, # Nivel 1000-4999
|
||
|
'lector': 0 # Nivel 0-999
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# Calcular estadísticas
|
||
|
for user in users:
|
||
|
# Estado
|
||
|
if user.estado == 'activo':
|
||
|
stats['activos'] += 1
|
||
|
else:
|
||
|
stats['inactivos'] += 1
|
||
|
|
||
|
# Expirados
|
||
|
if user.is_expired():
|
||
|
stats['expirados'] += 1
|
||
|
|
||
|
# Por empresa
|
||
|
empresa = user.empresa or 'Sin empresa'
|
||
|
stats['por_empresa'][empresa] = stats['por_empresa'].get(empresa, 0) + 1
|
||
|
|
||
|
# Por nivel
|
||
|
if user.nivel >= 9000:
|
||
|
stats['por_nivel']['admin'] += 1
|
||
|
elif user.nivel >= 5000:
|
||
|
stats['por_nivel']['gestor'] += 1
|
||
|
elif user.nivel >= 1000:
|
||
|
stats['por_nivel']['editor'] += 1
|
||
|
else:
|
||
|
stats['por_nivel']['lector'] += 1
|
||
|
|
||
|
return stats
|
||
|
|
||
|
def check_username_availability(username):
|
||
|
"""
|
||
|
Verificar si un nombre de usuario está disponible.
|
||
|
|
||
|
Args:
|
||
|
username (str): Nombre de usuario a verificar
|
||
|
|
||
|
Returns:
|
||
|
bool: True si está disponible, False si ya existe
|
||
|
"""
|
||
|
user = get_user_by_username(username)
|
||
|
return user is None
|