Spaces:
Running
Running
| from datetime import datetime | |
| from sqlalchemy import Column, Integer, String, Text, DateTime, Enum as SQLEnum | |
| from sqlalchemy.sql import func | |
| from database import Base | |
| import enum | |
| class PortfolioType(str, enum.Enum): | |
| """Enum for portfolio item types""" | |
| POSTER = "poster" | |
| VIDEO = "video" | |
| WEBSITE = "website" | |
| class User(Base): | |
| """User model for authentication""" | |
| __tablename__ = "users" | |
| id = Column(Integer, primary_key=True, index=True) | |
| username = Column(String(255), unique=True, index=True, nullable=False) | |
| password = Column(String(255), nullable=False) | |
| def __repr__(self): | |
| return f"<User(id={self.id}, username={self.username})>" | |
| class PortfolioItem(Base): | |
| """Portfolio item model""" | |
| __tablename__ = "portfolio_items" | |
| id = Column(Integer, primary_key=True, index=True) | |
| title = Column(String(255), nullable=False, index=True) | |
| description = Column(Text, nullable=True) | |
| type = Column(SQLEnum(PortfolioType), nullable=False, index=True) | |
| image_url = Column(String(1024), nullable=True) | |
| video_url = Column(String(1024), nullable=True) | |
| video_thumbnail = Column(String(1024), nullable=True) | |
| website_url = Column(String(1024), nullable=True) | |
| what = Column(Text, nullable=True) | |
| sort_order = Column(Integer, default=0, nullable=False, server_default="0") | |
| created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) | |
| updated_at = Column( | |
| DateTime(timezone=True), | |
| server_default=func.now(), | |
| onupdate=func.now(), | |
| nullable=False | |
| ) | |
| def __repr__(self): | |
| return f"<PortfolioItem(id={self.id}, title={self.title}, type={self.type})>" | |
| class NewsletterSubscriber(Base): | |
| """Newsletter subscriber model to store contacts locally""" | |
| __tablename__ = "newsletter_subscribers" | |
| id = Column(Integer, primary_key=True, index=True) | |
| email = Column(String(255), unique=True, index=True, nullable=False) | |
| created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) | |
| def __repr__(self): | |
| return f"<NewsletterSubscriber(id={self.id}, email={self.email})>" | |
| class VisitorTelemetry(Base): | |
| """Visitor Telemetry / Cookie Tracking model""" | |
| __tablename__ = "visitor_telemetry" | |
| id = Column(Integer, primary_key=True, index=True) | |
| visitor_id = Column(String(100), nullable=True) | |
| session_id = Column(String(100), nullable=True) | |
| ip_address = Column(String(50), nullable=True) | |
| user_agent = Column(Text, nullable=True) | |
| referrer = Column(String(255), nullable=True) | |
| landing_page = Column(String(255), nullable=True) | |
| browser = Column(String(50), nullable=True) | |
| device_type = Column(String(50), nullable=True) | |
| os = Column(String(50), nullable=True) | |
| country = Column(String(100), nullable=True) | |
| city = Column(String(100), nullable=True) | |
| visit_count = Column(Integer, default=1, nullable=True) | |
| consent = Column(String(50), nullable=True) | |
| created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) | |
| def __repr__(self): | |
| return f"<VisitorTelemetry(id={self.id}, visitor_id={self.visitor_id}, ip_address={self.ip_address})>" | |