refactor: Migrate file-based data storage to database
This commit is contained in:
@@ -1,22 +1,31 @@
|
||||
import os
|
||||
import json
|
||||
from flask import Blueprint, render_template, request, redirect, url_for, flash
|
||||
from flask_login import login_required
|
||||
from core import config, utils
|
||||
from core import utils
|
||||
from ai import models as ai_models
|
||||
from ai import setup as ai_setup
|
||||
from web.db import db, Persona
|
||||
|
||||
persona_bp = Blueprint('persona', __name__)
|
||||
|
||||
|
||||
def _all_personas_dict():
|
||||
"""Return all personas as a dict keyed by name, matching the old personas.json structure."""
|
||||
records = Persona.query.all()
|
||||
result = {}
|
||||
for rec in records:
|
||||
try:
|
||||
details = json.loads(rec.details_json) if rec.details_json else {}
|
||||
except Exception:
|
||||
details = {}
|
||||
result[rec.name] = details
|
||||
return result
|
||||
|
||||
|
||||
@persona_bp.route('/personas')
|
||||
@login_required
|
||||
def list_personas():
|
||||
personas = {}
|
||||
if os.path.exists(config.PERSONAS_FILE):
|
||||
try:
|
||||
with open(config.PERSONAS_FILE, 'r') as f: personas = json.load(f)
|
||||
except: pass
|
||||
personas = _all_personas_dict()
|
||||
return render_template('personas.html', personas=personas)
|
||||
|
||||
|
||||
@@ -29,17 +38,16 @@ def new_persona():
|
||||
@persona_bp.route('/persona/<string:name>')
|
||||
@login_required
|
||||
def edit_persona(name):
|
||||
personas = {}
|
||||
if os.path.exists(config.PERSONAS_FILE):
|
||||
try:
|
||||
with open(config.PERSONAS_FILE, 'r') as f: personas = json.load(f)
|
||||
except: pass
|
||||
|
||||
persona = personas.get(name)
|
||||
if not persona:
|
||||
record = Persona.query.filter_by(name=name).first()
|
||||
if not record:
|
||||
flash(f"Persona '{name}' not found.")
|
||||
return redirect(url_for('persona.list_personas'))
|
||||
|
||||
try:
|
||||
persona = json.loads(record.details_json) if record.details_json else {}
|
||||
except Exception:
|
||||
persona = {}
|
||||
|
||||
return render_template('persona_edit.html', persona=persona, name=name)
|
||||
|
||||
|
||||
@@ -53,16 +61,7 @@ def save_persona():
|
||||
flash("Persona name is required.")
|
||||
return redirect(url_for('persona.list_personas'))
|
||||
|
||||
personas = {}
|
||||
if os.path.exists(config.PERSONAS_FILE):
|
||||
try:
|
||||
with open(config.PERSONAS_FILE, 'r') as f: personas = json.load(f)
|
||||
except: pass
|
||||
|
||||
if old_name and old_name != name and old_name in personas:
|
||||
del personas[old_name]
|
||||
|
||||
persona = {
|
||||
persona_data = {
|
||||
"name": name,
|
||||
"bio": request.form.get('bio'),
|
||||
"age": request.form.get('age'),
|
||||
@@ -75,10 +74,21 @@ def save_persona():
|
||||
"style_inspirations": request.form.get('style_inspirations')
|
||||
}
|
||||
|
||||
personas[name] = persona
|
||||
# If name changed, remove old record
|
||||
if old_name and old_name != name:
|
||||
old_record = Persona.query.filter_by(name=old_name).first()
|
||||
if old_record:
|
||||
db.session.delete(old_record)
|
||||
db.session.flush()
|
||||
|
||||
with open(config.PERSONAS_FILE, 'w') as f: json.dump(personas, f, indent=2)
|
||||
record = Persona.query.filter_by(name=name).first()
|
||||
if record:
|
||||
record.details_json = json.dumps(persona_data)
|
||||
else:
|
||||
record = Persona(name=name, details_json=json.dumps(persona_data))
|
||||
db.session.add(record)
|
||||
|
||||
db.session.commit()
|
||||
flash(f"Persona '{name}' saved.")
|
||||
return redirect(url_for('persona.list_personas'))
|
||||
|
||||
@@ -86,15 +96,10 @@ def save_persona():
|
||||
@persona_bp.route('/persona/delete/<string:name>', methods=['POST'])
|
||||
@login_required
|
||||
def delete_persona(name):
|
||||
personas = {}
|
||||
if os.path.exists(config.PERSONAS_FILE):
|
||||
try:
|
||||
with open(config.PERSONAS_FILE, 'r') as f: personas = json.load(f)
|
||||
except: pass
|
||||
|
||||
if name in personas:
|
||||
del personas[name]
|
||||
with open(config.PERSONAS_FILE, 'w') as f: json.dump(personas, f, indent=2)
|
||||
record = Persona.query.filter_by(name=name).first()
|
||||
if record:
|
||||
db.session.delete(record)
|
||||
db.session.commit()
|
||||
flash(f"Persona '{name}' deleted.")
|
||||
|
||||
return redirect(url_for('persona.list_personas'))
|
||||
|
||||
Reference in New Issue
Block a user