129 lines
3.9 KiB
Python
129 lines
3.9 KiB
Python
from flask import Blueprint, render_template, session, request, jsonify, make_response
|
|
import json
|
|
from db import get_db
|
|
from utils.theme_engine import get_theme_config
|
|
|
|
|
|
elementor_bp = Blueprint(
|
|
'elementor',
|
|
__name__,
|
|
template_folder='templates',
|
|
static_folder='static',
|
|
static_url_path='/elementor/static'
|
|
)
|
|
|
|
|
|
def _render_builder(site_id, builder_mode='default', preview_only=False, **_kwargs):
|
|
conn = get_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 {}
|
|
if not isinstance(content, dict):
|
|
content = {}
|
|
|
|
theme = site[2]
|
|
theme_config = get_theme_config(theme)
|
|
|
|
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'
|
|
|
|
html = render_template(
|
|
'elementor_builder.html',
|
|
site_id=site_id,
|
|
slug=site[1],
|
|
theme=theme,
|
|
content=content,
|
|
theme_config=theme_config,
|
|
user_plan=user_plan,
|
|
rubro=user_rubro,
|
|
builder_mode=builder_mode,
|
|
preview_only=bool(preview_only)
|
|
)
|
|
response = make_response(html)
|
|
# Dynamic builder output should never be cached.
|
|
response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0'
|
|
response.headers['Pragma'] = 'no-cache'
|
|
response.headers['Expires'] = '0'
|
|
return response
|
|
|
|
|
|
@elementor_bp.route('/elementor/<int:site_id>')
|
|
def elementor_view(site_id):
|
|
return _render_builder(site_id, builder_mode='default')
|
|
|
|
|
|
@elementor_bp.route('/elementor/<int:site_id>/preview-final')
|
|
def elementor_preview_final(site_id):
|
|
return _render_builder(site_id, builder_mode='default', preview_only=True)
|
|
|
|
|
|
@elementor_bp.route('/ub24/<int:site_id>')
|
|
def ub24_view(site_id):
|
|
return _render_builder(site_id, builder_mode='ub24')
|
|
|
|
|
|
@elementor_bp.route('/ub24/<int:site_id>/preview-final')
|
|
def ub24_preview_final(site_id):
|
|
return _render_builder(site_id, builder_mode='ub24', preview_only=True)
|
|
|
|
|
|
@elementor_bp.route('/api/elementor/save', methods=['POST'])
|
|
def save_elementor():
|
|
data = request.get_json(silent=True) or {}
|
|
site_id = data.get('site_id')
|
|
content = data.get('content')
|
|
publish = bool(data.get('publish'))
|
|
|
|
if not site_id or not isinstance(content, dict):
|
|
return jsonify({'success': False, 'error': 'Payload invalido'}), 400
|
|
|
|
conn = get_db()
|
|
c = conn.cursor()
|
|
c.execute('SELECT user_id, content_json FROM sites WHERE id = ?', (site_id,))
|
|
row = c.fetchone()
|
|
if not row:
|
|
conn.close()
|
|
return jsonify({'success': False, 'error': 'Sitio no encontrado'}), 404
|
|
|
|
owner_id = row[0]
|
|
if 'user_id' in session and session['user_id'] != owner_id:
|
|
conn.close()
|
|
return jsonify({'success': False, 'error': 'No autorizado'}), 403
|
|
|
|
current_content = {}
|
|
try:
|
|
if row[1]:
|
|
current_content = json.loads(row[1]) or {}
|
|
except Exception:
|
|
current_content = {}
|
|
|
|
merged = dict(current_content)
|
|
merged.update(content)
|
|
|
|
if publish:
|
|
c.execute('UPDATE sites SET content_json = ?, status = ? WHERE id = ?', (json.dumps(merged), 'published', site_id))
|
|
else:
|
|
c.execute('UPDATE sites SET content_json = ? WHERE id = ?', (json.dumps(merged), site_id))
|
|
|
|
conn.commit()
|
|
conn.close()
|
|
response = jsonify({'success': True, 'published': publish})
|
|
response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0'
|
|
response.headers['Pragma'] = 'no-cache'
|
|
response.headers['Expires'] = '0'
|
|
return response
|
|
|