|
|
|
|
|
from .mongo_db import get_collection, insert_document
|
|
from datetime import datetime, timezone
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
COLLECTION_NAME = 'writing_progress'
|
|
|
|
def store_writing_baseline(username, metrics, text):
|
|
"""
|
|
Guarda la línea base de escritura de un usuario.
|
|
Args:
|
|
username: ID del usuario
|
|
metrics: Diccionario con métricas iniciales
|
|
text: Texto analizado
|
|
"""
|
|
try:
|
|
document = {
|
|
'username': username,
|
|
'type': 'baseline',
|
|
'metrics': metrics,
|
|
'text': text,
|
|
'timestamp': datetime.now(timezone.utc).isoformat(),
|
|
'iteration': 0
|
|
}
|
|
|
|
|
|
collection = get_collection(COLLECTION_NAME)
|
|
existing = collection.find_one({
|
|
'username': username,
|
|
'type': 'baseline'
|
|
})
|
|
|
|
if existing:
|
|
|
|
result = collection.update_one(
|
|
{'_id': existing['_id']},
|
|
{'$set': document}
|
|
)
|
|
success = result.modified_count > 0
|
|
else:
|
|
|
|
result = collection.insert_one(document)
|
|
success = result.inserted_id is not None
|
|
|
|
logger.info(f"Línea base {'actualizada' if existing else 'creada'} para usuario: {username}")
|
|
return success
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error al guardar línea base: {str(e)}")
|
|
return False
|
|
|
|
def store_writing_progress(username, metrics, text):
|
|
"""
|
|
Guarda una nueva iteración de progreso.
|
|
"""
|
|
try:
|
|
|
|
collection = get_collection(COLLECTION_NAME)
|
|
last_progress = collection.find_one(
|
|
{'username': username},
|
|
sort=[('iteration', -1)]
|
|
)
|
|
|
|
next_iteration = (last_progress['iteration'] + 1) if last_progress else 1
|
|
|
|
document = {
|
|
'username': username,
|
|
'type': 'progress',
|
|
'metrics': metrics,
|
|
'text': text,
|
|
'timestamp': datetime.now(timezone.utc).isoformat(),
|
|
'iteration': next_iteration
|
|
}
|
|
|
|
result = collection.insert_one(document)
|
|
success = result.inserted_id is not None
|
|
|
|
if success:
|
|
logger.info(f"Progreso guardado para {username}, iteración {next_iteration}")
|
|
|
|
return success
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error al guardar progreso: {str(e)}")
|
|
return False
|
|
|
|
def get_writing_baseline(username):
|
|
"""
|
|
Obtiene la línea base de un usuario.
|
|
"""
|
|
try:
|
|
collection = get_collection(COLLECTION_NAME)
|
|
return collection.find_one({
|
|
'username': username,
|
|
'type': 'baseline'
|
|
})
|
|
except Exception as e:
|
|
logger.error(f"Error al obtener línea base: {str(e)}")
|
|
return None
|
|
|
|
def get_writing_progress(username, limit=None):
|
|
"""
|
|
Obtiene el historial de progreso de un usuario.
|
|
Args:
|
|
username: ID del usuario
|
|
limit: Número máximo de registros a retornar
|
|
"""
|
|
try:
|
|
collection = get_collection(COLLECTION_NAME)
|
|
cursor = collection.find(
|
|
{
|
|
'username': username,
|
|
'type': 'progress'
|
|
},
|
|
sort=[('iteration', -1)]
|
|
)
|
|
|
|
if limit:
|
|
cursor = cursor.limit(limit)
|
|
|
|
return list(cursor)
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error al obtener progreso: {str(e)}")
|
|
return []
|
|
|
|
def get_latest_writing_metrics(username):
|
|
"""
|
|
Obtiene las métricas más recientes (línea base o progreso).
|
|
"""
|
|
try:
|
|
collection = get_collection(COLLECTION_NAME)
|
|
return collection.find_one(
|
|
{'username': username},
|
|
sort=[('timestamp', -1)]
|
|
)
|
|
except Exception as e:
|
|
logger.error(f"Error al obtener métricas recientes: {str(e)}")
|
|
return None |