Files
gkachele-saas/demo/routes/customizer.py

1 line
6.5 KiB
Python

from flask import Blueprint, render_template, request, jsonify, session, current_appimport sqlite3import jsonimport timeimport osfrom config import MAIN_DB, THEMES_DIRfrom utils.theme_engine import scan_available_themes, get_theme_config, render_gkachele_templatefrom utils.auth_decorators import login_requiredcustomizer_bp = Blueprint('customizer', __name__)@customizer_bp.route('/customizer', strict_slashes=False)def customizer_demo(): """Ruta de conveniencia: si se pasa ?site_id=ID delega a customizer_view, si no muestra demo""" sid = request.args.get('site_id') if sid: try: return customizer_view(int(sid)) except Exception: pass # Render demo template with empty content return render_template('customizer.html', site_id='demo', slug='demo', theme=None, content={}, theme_template=None, theme_config={}, available_themes={}, user_plan='base', rubro='demo', site_name='Demo Site', security_hash='96CA...B852')@customizer_bp.route('/api/themes')def list_themes(): """Listar todos los templates disponibles filtrados por plan""" from utils.theme_engine import get_themes_by_rubro rubro = request.args.get('rubro', None) user_id = session.get('user_id') user_plan = 'base' if user_id: conn = sqlite3.connect(MAIN_DB) c = conn.cursor() c.execute('SELECT plan FROM users WHERE id = ?', (user_id,)) res = c.fetchone() conn.close() if res: user_plan = res[0] themes = get_themes_by_rubro(rubro, user_plan) if rubro else scan_available_themes() return jsonify({'success': True, 'themes': themes, 'total': len(themes)})@customizer_bp.route('/customizer/<int:site_id>', strict_slashes=False)def customizer_view(site_id): """Customizer: Sidebar + Preview""" conn = sqlite3.connect(MAIN_DB) c = conn.cursor() c.execute('SELECT user_id, slug, theme, content_json FROM sites WHERE id = ?', (site_id,)) site = c.fetchone() if not site: conn.close() return "Sitio no encontrado", 404 if 'user_id' in session and site[0] != session['user_id']: conn.close() return "No autorizado", 403 content = json.loads(site[3]) if site[3] else {} theme = site[2] # Obtener plan del usuario para filtrar templates y settings c.execute('SELECT plan, rubro FROM users WHERE id = ?', (site[0],)) user_data = c.fetchone() conn.close() user_plan = user_data[0] if user_data else 'base' user_rubro = user_data[1] if user_data else 'restaurante' return render_template('customizer.html', site_id=site_id, slug=site[1], site=site, # Pass full site object if needed for ID site_name=content.get('site_name', 'Mi Sitio'), rubro=user_rubro, content=content, user_plan=user_plan, security_hash='96CA...B852')@customizer_bp.route('/api/customizer/save', methods=['POST'])def save_customizer(): data = request.get_json() site_id = data.get('site_id') # Datos parciales enviados por frontend new_blocks = data.get('blocks') new_bg = data.get('bg') conn = sqlite3.connect(MAIN_DB) c = conn.cursor() # 1. Obtener contenido actual para no perder otros datos (colores, site_name...) c.execute('SELECT content_json FROM sites WHERE id = ?', (site_id,)) row = c.fetchone() if not row: conn.close() return jsonify({'success': False, 'error': 'Site not found'}), 404 current_content = json.loads(row[0]) if row[0] else {} # 2. Merge changes if new_blocks is not None: current_content['blocks'] = new_blocks if new_bg is not None: current_content['bg'] = new_bg # 3. Save back c.execute('UPDATE sites SET content_json = ? WHERE id = ?', (json.dumps(current_content), site_id)) conn.commit() conn.close() return jsonify({'success': True})@customizer_bp.route('/api/customizer/get-blocks/<int:site_id>', methods=['GET'])def get_blocks(site_id): """Retorna los bloques de un sitio""" conn = sqlite3.connect(MAIN_DB) c = conn.cursor() c.execute('SELECT content_json FROM sites WHERE id = ?', (site_id,)) result = c.fetchone() conn.close() if not result or not result[0]: return jsonify([]) try: content = json.loads(result[0]) return jsonify(content.get('blocks', [])) except: return jsonify([])@customizer_bp.route('/api/customizer/get-content/<int:site_id>', methods=['GET'])def get_content(site_id): """Retorna el contenido completo (blocks + settings) de un sitio""" conn = sqlite3.connect(MAIN_DB) c = conn.cursor() c.execute('SELECT content_json FROM sites WHERE id = ?', (site_id,)) result = c.fetchone() conn.close() if not result or not result[0]: return jsonify({'success': True, 'content': {}}) try: content = json.loads(result[0]) return jsonify({'success': True, 'content': content}) except Exception: return jsonify({'success': True, 'content': {}})@customizer_bp.route('/api/customizer/add-block', methods=['POST'])def add_block(): data = request.get_json() site_id = data.get('site_id') block_type = data.get('block_type') conn = sqlite3.connect(MAIN_DB) c = conn.cursor() c.execute('SELECT content_json FROM sites WHERE id = ?', (site_id,)) result = c.fetchone() if not result: conn.close() return jsonify({'success': False, 'error': 'Sitio no encontrado'}), 404 content = json.loads(result[0]) if result[0] else {} if 'blocks' not in content: content['blocks'] = [] new_block = { 'id': f'block_{int(time.time() * 1000)}', 'type': block_type, 'content': data.get('content', {}), 'order': len(content['blocks']) } content['blocks'].append(new_block) c.execute('UPDATE sites SET content_json = ? WHERE id = ?', (json.dumps(content), site_id)) conn.commit() conn.close() return jsonify({'success': True, 'block': new_block})@customizer_bp.route('/api/customizer/preview-frame/<int:site_id>')def preview_frame(site_id): conn = sqlite3.connect(MAIN_DB) c = conn.cursor() c.execute('SELECT theme, content_json, user_id FROM sites WHERE id = ?', (site_id,)) site = c.fetchone() conn.close() if not site: return "Sitio no encontrado", 404 try: return render_gkachele_template(site[0], json.loads(site[1]), site_id, site[2]) except Exception as e: return f"Error renderizando preview: {e}", 500