import os from datetime import datetime from flask_sqlalchemy import SQLAlchemy from sqlalchemy.orm import DeclarativeBase class Base(DeclarativeBase): pass db = SQLAlchemy(model_class=Base) class Horoscope(db.Model): """Model for storing horoscope data""" id = db.Column(db.Integer, primary_key=True) sign = db.Column(db.String(20), nullable=False) date = db.Column(db.Date, nullable=False) prediction = db.Column(db.Text, nullable=False) source = db.Column(db.String(100), nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) def __repr__(self): return f"" def to_dict(self): return { "id": self.id, "sign": self.sign, "date": self.date.isoformat(), "prediction": self.prediction, "source": self.source, "created_at": self.created_at.isoformat() } class ConsolidatedHoroscope(db.Model): """Model for storing LLM-consolidated horoscope data""" id = db.Column(db.Integer, primary_key=True) sign = db.Column(db.String(20), nullable=False) date = db.Column(db.Date, nullable=False) consolidated_prediction = db.Column(db.Text, nullable=False) sources = db.Column(db.Text, nullable=False) # JSON string of source URLs created_at = db.Column(db.DateTime, default=datetime.utcnow) def __repr__(self): return f"" def to_dict(self): return { "id": self.id, "sign": self.sign, "date": self.date.isoformat(), "consolidated_prediction": self.consolidated_prediction, "sources": self.sources, "created_at": self.created_at.isoformat() } class ScheduledJob(db.Model): """Model for tracking scheduled scraping jobs""" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False, unique=True) frequency = db.Column(db.String(50), nullable=False) # daily, hourly, etc. last_run = db.Column(db.DateTime, nullable=True) next_run = db.Column(db.DateTime, nullable=True) enabled = db.Column(db.Boolean, default=True) created_at = db.Column(db.DateTime, default=datetime.utcnow) def __repr__(self): return f"" def to_dict(self): return { "id": self.id, "name": self.name, "frequency": self.frequency, "last_run": self.last_run.isoformat() if self.last_run else None, "next_run": self.next_run.isoformat() if self.next_run else None, "enabled": self.enabled, "created_at": self.created_at.isoformat() } class WordPressExport(db.Model): """Model for tracking WordPress exports""" id = db.Column(db.Integer, primary_key=True) horoscope_id = db.Column(db.Integer, db.ForeignKey("consolidated_horoscope.id"), nullable=False) wordpress_post_id = db.Column(db.Integer, nullable=True) wordpress_url = db.Column(db.String(255), nullable=True) status = db.Column(db.String(50), default="pending") # pending, published, failed created_at = db.Column(db.DateTime, default=datetime.utcnow) def __repr__(self): return f"" def to_dict(self): return { "id": self.id, "horoscope_id": self.horoscope_id, "wordpress_post_id": self.wordpress_post_id, "wordpress_url": self.wordpress_url, "status": self.status, "created_at": self.created_at.isoformat() }