Spaces:
Sleeping
Sleeping
File size: 3,701 Bytes
f80e9b3 aabbd76 f80e9b3 ebd72bb 6d1e595 f80e9b3 ebd72bb f80e9b3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
from sqlalchemy import Column, Integer, String, DateTime, Boolean, JSON, Text, ForeignKey
from sqlalchemy.orm import relationship
from datetime import datetime
from app.database import Base
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
email = Column(String, unique=True, index=True)
name = Column(String)
created_at = Column(DateTime, default=datetime.utcnow)
integrations = relationship("Integration", back_populates="user")
assets = relationship("Asset", back_populates="user")
posts = relationship("Post", back_populates="user")
class Integration(Base):
__tablename__ = "integrations"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"))
provider = Column(String) # 'linkedin' or 'canva'
access_token = Column(Text)
refresh_token = Column(Text)
expires_at = Column(DateTime)
account_info = Column(JSON)
connected = Column(Boolean, default=False)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="integrations")
class Asset(Base):
__tablename__ = "assets"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"))
name = Column(String)
file_path = Column(String)
file_type = Column(String) # 'image', 'document', 'video'
product_category = Column(String) # 'ocr', 'p2p', 'o2c'
sub_category = Column(String, nullable=True)
size = Column(Integer) # in bytes
extra_metadata = Column(JSON, nullable=True) # Renamed from 'metadata' to avoid SQLAlchemy conflict
extracted_content = Column(JSON, nullable=True) # OCR/extracted content from document parsing API
analysis_status = Column(String, default="pending") # 'pending', 'processing', 'completed', 'failed'
analyzed_at = Column(DateTime, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow)
user = relationship("User", back_populates="assets")
class Post(Base):
__tablename__ = "posts"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"))
title = Column(String)
content = Column(Text)
post_type = Column(String) # 'carousel', 'cover_content', 'content_only', 'webinar'
product_category = Column(String)
scheduled_date = Column(DateTime)
status = Column(String) # 'draft', 'scheduled', 'published', 'failed'
linkedin_post_id = Column(String, nullable=True)
canva_design_id = Column(String, nullable=True)
assets = Column(JSON) # List of asset IDs
extra_metadata = Column(JSON, nullable=True) # Renamed from 'metadata' to avoid SQLAlchemy conflict
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="posts")
class Campaign(Base):
__tablename__ = "campaigns"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"))
name = Column(String)
date_range_start = Column(DateTime)
date_range_end = Column(DateTime)
products = Column(JSON) # List of product IDs
post_types = Column(JSON) # List of post type IDs
posts_per_week = Column(Integer)
status = Column(String) # 'active', 'paused', 'completed'
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|