92 lines
No EOL
2.7 KiB
Python
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 |