Initial commit: yu-zhi-ran platform with automation integration
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
import json
|
||||
from datetime import datetime, date
|
||||
from pathlib import Path
|
||||
from sqlalchemy.orm import Session
|
||||
from ..database import SessionLocal
|
||||
from ..models import Topic
|
||||
import os
|
||||
|
||||
# 计算项目根目录(从本文件位置上升4层)
|
||||
PROJECT_ROOT = Path(__file__).resolve().parents[4]
|
||||
if os.getenv('PROJECT_ROOT'):
|
||||
PROJECT_ROOT = Path(os.getenv('PROJECT_ROOT'))
|
||||
TOPICS_FILE = PROJECT_ROOT / "automation" / "data" / "sustainability_topics.json"
|
||||
|
||||
def sync_topic_to_db(topic_id: str, db: Session = None) -> Topic:
|
||||
topics = json.loads(TOPICS_FILE.read_text(encoding='utf-8'))
|
||||
topic_data = next((t for t in topics if t['id'] == topic_id), None)
|
||||
if not topic_data:
|
||||
raise ValueError(f"Topic {topic_id} not found in file")
|
||||
|
||||
close_db = False
|
||||
if db is None:
|
||||
db = SessionLocal()
|
||||
close_db = True
|
||||
try:
|
||||
db_topic = db.query(Topic).filter(Topic.id == topic_id).first()
|
||||
if db_topic is None:
|
||||
db_topic = Topic(
|
||||
id=topic_data['id'],
|
||||
title=topic_data['title'],
|
||||
field=topic_data['field'],
|
||||
format=topic_data.get('format'),
|
||||
core_concept=topic_data.get('core_concept'),
|
||||
audience_pain=topic_data.get('audience_pain'),
|
||||
unique_angle=topic_data.get('unique_angle'),
|
||||
priority=topic_data.get('priority'),
|
||||
priority_score=topic_data.get('priority_score', 0),
|
||||
total_score=topic_data.get('total_score')
|
||||
)
|
||||
db.add(db_topic)
|
||||
db_topic.status = topic_data.get('status', db_topic.status)
|
||||
db_topic.ready_at = datetime.strptime(topic_data['ready_at'], '%Y-%m-%d').date() if topic_data.get('ready_at') else None
|
||||
db_topic.published_at = datetime.strptime(topic_data['published_at'], '%Y-%m-%d').date() if topic_data.get('published_at') else None
|
||||
db_topic.compliance_score = topic_data.get('compliance_score', db_topic.compliance_score)
|
||||
db_topic.platform_urls = topic_data.get('platform_urls', {})
|
||||
db_topic.updated_at = datetime.now()
|
||||
db.commit()
|
||||
db.refresh(db_topic)
|
||||
return db_topic
|
||||
finally:
|
||||
if close_db:
|
||||
db.close()
|
||||
|
||||
def sync_all_topics():
|
||||
db = SessionLocal()
|
||||
try:
|
||||
topics = json.loads(TOPICS_FILE.read_text(encoding='utf-8'))
|
||||
for t in topics:
|
||||
sync_topic_to_db(t['id'], db)
|
||||
print(f"✅ 同步 {len(topics)} 个选题到数据库")
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
sync_all_topics()
|
||||
Reference in New Issue
Block a user