import os import json from datetime import datetime import pytz from flask import current_app from utils.file_utils import load_json_file, save_json_file def get_schemas_file_path(): """Obtener ruta al archivo de esquemas.""" storage_path = current_app.config["STORAGE_PATH"] return os.path.join(storage_path, "schemas", "schema.json") def get_all_schemas(): """Obtener todos los esquemas disponibles.""" return load_json_file(get_schemas_file_path(), {}) def get_schema_by_id(schema_id): """ Obtener un esquema por su ID. Args: schema_id (str): ID del esquema a buscar Returns: dict: Datos del esquema o None si no existe """ schemas = get_all_schemas() return schemas.get(schema_id) def create_schema(schema_data, user_id): """ Crear un nuevo esquema. Args: schema_data (dict): Datos del esquema user_id (str): ID del usuario que crea el esquema Returns: tuple: (éxito, mensaje) """ schemas = get_all_schemas() # Verificar si ya existe un esquema con ese código schema_id = schema_data["codigo"] if schema_id in schemas: return False, f"Ya existe un esquema con el código {schema_id}." # Añadir metadatos schema_data["fecha_creacion"] = datetime.now(pytz.UTC).isoformat() schema_data["creado_por"] = user_id # Guardar esquema schemas[schema_id] = schema_data save_json_file(get_schemas_file_path(), schemas) return True, f"Esquema '{schema_data['descripcion']}' creado correctamente." def update_schema(schema_id, schema_data): """ Actualizar un esquema existente. Args: schema_id (str): ID del esquema a actualizar schema_data (dict): Nuevos datos del esquema Returns: tuple: (éxito, mensaje) """ schemas = get_all_schemas() # Verificar si existe el esquema if schema_id not in schemas: return False, f"No existe un esquema con el código {schema_id}." # Preservar metadatos originales schema_data["fecha_creacion"] = schemas[schema_id].get("fecha_creacion") schema_data["creado_por"] = schemas[schema_id].get("creado_por") schema_data["ultima_modificacion"] = datetime.now(pytz.UTC).isoformat() # Actualizar esquema schemas[schema_id] = schema_data save_json_file(get_schemas_file_path(), schemas) return True, f"Esquema '{schema_data['descripcion']}' actualizado correctamente." def delete_schema(schema_id): """ Eliminar un esquema. Args: schema_id (str): ID del esquema a eliminar Returns: tuple: (éxito, mensaje) """ schemas = get_all_schemas() # Verificar si existe el esquema if schema_id not in schemas: return False, f"No existe un esquema con el código {schema_id}." # Verificar si el esquema está en uso # [Implementar verificación si el esquema está asociado a proyectos] # Eliminar esquema schema_desc = schemas[schema_id].get("descripcion", schema_id) del schemas[schema_id] save_json_file(get_schemas_file_path(), schemas) return True, f"Esquema '{schema_desc}' eliminado correctamente." def initialize_default_schemas(): """Inicializar esquemas predeterminados si no existen.""" schemas = get_all_schemas() # Si ya hay esquemas, no hacer nada if schemas: return # Esquema predeterminado para proyecto estándar default_schema = { "ESQ001": { "codigo": "ESQ001", "descripcion": "Proyecto estándar", "fecha_creacion": datetime.now(pytz.UTC).isoformat(), "creado_por": "admin", "documentos": [ { "tipo": "pdf", "nombre": "Manual de Usuario", "nivel_ver": 0, "nivel_editar": 5000, }, { "tipo": "dwg", "nombre": "Planos Técnicos", "nivel_ver": 0, "nivel_editar": 5000, }, { "tipo": "zip", "nombre": "Archivos Fuente", "nivel_ver": 1000, "nivel_editar": 5000, }, ], } } save_json_file(get_schemas_file_path(), default_schema) current_app.logger.info("Esquemas predeterminados inicializados.") def get_schema_document_types(schema_id): """ Obtener los tipos de documentos definidos en un esquema. Args: schema_id (str): ID del esquema Returns: list: Lista de tipos de documentos en el esquema, o lista vacía si no existe """ schema = get_schema_by_id(schema_id) if not schema or "documentos" not in schema: return [] return schema["documentos"]