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