|
|
|
|
| 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 |