personal_site/blog_manager.py
2025-07-05 15:29:33 -05:00

92 lines
No EOL
2.7 KiB
Python

import json
import os
from datetime import datetime
class BlogManager:
def __init__(self, data_file='data/blog_posts.json'):
self.data_file = data_file
self.ensure_data_file()
def ensure_data_file(self):
"""Ensure the data file and directory exist"""
os.makedirs(os.path.dirname(self.data_file), exist_ok=True)
if not os.path.exists(self.data_file):
with open(self.data_file, 'w') as f:
json.dump([], f)
def load_posts(self):
"""Load all blog posts"""
try:
with open(self.data_file, 'r') as f:
return json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
return []
def save_posts(self, posts):
"""Save all blog posts"""
with open(self.data_file, 'w') as f:
json.dump(posts, f, indent=2)
def get_next_id(self):
"""Get the next available ID"""
posts = self.load_posts()
if not posts:
return 1
return max(post['id'] for post in posts) + 1
def create_post(self, title, content, category, excerpt=None):
"""Create a new blog post"""
posts = self.load_posts()
# Auto-generate excerpt if not provided
if not excerpt:
excerpt = content[:150] + "..." if len(content) > 150 else content
new_post = {
'id': self.get_next_id(),
'title': title,
'content': content,
'excerpt': excerpt,
'category': category,
'date': datetime.now().strftime('%Y-%m-%d'),
'created_at': datetime.now().isoformat()
}
posts.append(new_post)
self.save_posts(posts)
return new_post
def get_post(self, post_id):
"""Get a specific post by ID"""
posts = self.load_posts()
return next((p for p in posts if p['id'] == post_id), None)
def update_post(self, post_id, title, content, category, excerpt=None):
"""Update an existing post"""
posts = self.load_posts()
post = next((p for p in posts if p['id'] == post_id), None)
if not post:
return None
if not excerpt:
excerpt = content[:150] + "..." if len(content) > 150 else content
post.update({
'title': title,
'content': content,
'excerpt': excerpt,
'category': category,
'updated_at': datetime.now().isoformat()
})
self.save_posts(posts)
return post
def delete_post(self, post_id):
"""Delete a post"""
posts = self.load_posts()
posts = [p for p in posts if p['id'] != post_id]
self.save_posts(posts)
return True