""" Single post adder: CLI tool to add a single post to the database. Usage: python scripts/add_post.py --title "Title" --slug "slug" \ --content-file drafts/foo.md --category "Category" \ --content-format markdown """ import os import sys import argparse from datetime import datetime sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from app import app, db, Post, prepare_post_content, calculate_content_hash def add_post(title, slug, content_file, category, content_format='markdown'): """ Add a single post to the database. Args: title (str): Post title slug (str): URL-friendly slug content_file (str): Path to content file category (str): Post category content_format (str): 'markdown' or 'html' """ # Read content file if not os.path.exists(content_file): print(f"Error: Content file not found: {content_file}") return False with open(content_file, 'r', encoding='utf-8') as f: raw_content = f.read() # Check if slug already exists existing = Post.query.filter_by(slug=slug).first() if existing: print(f"Error: Slug '{slug}' already exists in database") return False # Process content if content_format == 'markdown': html_content = prepare_post_content(raw_content) else: html_content = raw_content # Calculate hash content_hash = calculate_content_hash(raw_content) # Extract summary (first 200 chars) summary = raw_content[:200] # Create post post = Post( title=title, slug=slug, content=html_content, summary=summary, pub_date=datetime.utcnow(), category=category, published=True, content_hash=content_hash ) try: db.session.add(post) db.session.commit() print(f"Success: Post '{title}' added with slug '{slug}'") return True except Exception as e: db.session.rollback() print(f"Error: Failed to add post: {e}") return False def main(): parser = argparse.ArgumentParser(description='Add a single post to the database') parser.add_argument('--title', required=True, help='Post title') parser.add_argument('--slug', required=True, help='URL-friendly slug') parser.add_argument('--content-file', required=True, help='Path to content file') parser.add_argument('--category', default='General', help='Post category') parser.add_argument('--content-format', default='markdown', choices=['markdown', 'html'], help='Content format') args = parser.parse_args() with app.app_context(): db.create_all() success = add_post( title=args.title, slug=args.slug, content_file=args.content_file, category=args.category, content_format=args.content_format ) sys.exit(0 if success else 1) if __name__ == "__main__": main()