| """ |
| PIOE Database Models - Version 2.0 |
| Personal Advantage Engine |
| """ |
| from sqlalchemy import Column, String, Float, DateTime, Text, Boolean, Integer, JSON, ForeignKey, Enum as SQLEnum |
| from sqlalchemy.orm import relationship |
| from datetime import datetime |
| import uuid |
| import enum |
|
|
| from .database import Base |
|
|
|
|
| class OpportunityCategory(str, enum.Enum): |
| """Categories for opportunity classification - PIOE 2.0 Extended.""" |
| |
| SCHOLARSHIP = "scholarship" |
| FELLOWSHIP = "fellowship" |
| INTERNSHIP = "internship" |
| JOB = "job" |
| RESEARCH = "research" |
| HACKATHON = "hackathon" |
| COMPETITION = "competition" |
| CONFERENCE = "conference" |
| OPEN_SOURCE = "open_source" |
| |
| |
| GRANT = "grant" |
| MICRO_GRANT = "micro_grant" |
| ECOSYSTEM_GRANT = "ecosystem_grant" |
| INNOVATION_FUND = "innovation_fund" |
| |
| |
| PARTNERSHIP = "partnership" |
| COLLABORATION = "collaboration" |
| |
| |
| PITCH_EVENT = "pitch_event" |
| DEMO_DAY = "demo_day" |
| TALENT_CALL = "talent_call" |
| |
| |
| BOUNTY = "bounty" |
| AMBASSADOR = "ambassador" |
| |
| |
| PRE_GRANT_SIGNAL = "pre_grant_signal" |
| PRE_HIRING_SIGNAL = "pre_hiring_signal" |
| WEAK_SIGNAL = "weak_signal" |
| |
| |
| INVESTMENT = "investment" |
| OTHER = "other" |
|
|
|
|
| class OpportunityStatus(str, enum.Enum): |
| """User interaction status.""" |
| NEW = "new" |
| SAVED = "saved" |
| APPLIED = "applied" |
| TRACKING = "tracking" |
| DISMISSED = "dismissed" |
| EXPIRED = "expired" |
|
|
|
|
| class SourceType(str, enum.Enum): |
| """Types of data sources.""" |
| ARXIV = "arxiv" |
| GITHUB = "github" |
| RSS = "rss" |
| REDDIT = "reddit" |
| TWITTER = "twitter" |
| LINKEDIN = "linkedin" |
| SUPERTEAM = "superteam" |
| WEB_SCRAPE = "web_scrape" |
| DISCORD = "discord" |
| GOV_PORTAL = "gov_portal" |
| GRANT_PLATFORM = "grant_platform" |
|
|
|
|
| class Domain(str, enum.Enum): |
| """Domain classification.""" |
| AI = "ai" |
| COMPUTER_VISION = "computer_vision" |
| ROBOTICS = "robotics" |
| FINANCE = "finance" |
| CRYPTO = "crypto" |
| ACADEMIA = "academia" |
| WEB3 = "web3" |
| MIXED = "mixed" |
|
|
|
|
| class Region(str, enum.Enum): |
| """Regional accessibility - PIOE 2.0.""" |
| NIGERIA = "nigeria" |
| AFRICA = "africa" |
| GLOBAL = "global" |
| REMOTE_AFRICA = "remote_africa" |
| REMOTE_GLOBAL = "remote_global" |
|
|
|
|
| class RiskLevel(str, enum.Enum): |
| """Time investment risk level.""" |
| LOW = "low" |
| MEDIUM = "medium" |
| HIGH = "high" |
|
|
|
|
| class Source(Base): |
| """Data source configuration.""" |
| __tablename__ = "sources" |
| |
| id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) |
| name = Column(String, nullable=False) |
| type = Column(SQLEnum(SourceType), nullable=False) |
| url = Column(String) |
| config = Column(JSON, default={}) |
| credibility_score = Column(Float, default=0.7) |
| last_fetch = Column(DateTime) |
| is_active = Column(Boolean, default=True) |
| created_at = Column(DateTime, default=datetime.utcnow) |
| |
| opportunities = relationship("Opportunity", back_populates="source") |
|
|
|
|
| class Opportunity(Base): |
| """Normalized opportunity item - PIOE 2.0 Enhanced.""" |
| __tablename__ = "opportunities" |
| |
| id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) |
| title = Column(String, nullable=False) |
| source_id = Column(String, ForeignKey("sources.id")) |
| source_name = Column(String) |
| source_type = Column(SQLEnum(SourceType)) |
| domain = Column(SQLEnum(Domain), default=Domain.MIXED) |
| category = Column(SQLEnum(OpportunityCategory), default=OpportunityCategory.OTHER) |
| |
| |
| region = Column(SQLEnum(Region), default=Region.GLOBAL) |
| region_weight = Column(Float, default=1.0) |
| |
| |
| discovered_at = Column(DateTime, default=datetime.utcnow) |
| published_at = Column(DateTime) |
| deadline = Column(DateTime) |
| |
| |
| raw_text = Column(Text) |
| summary = Column(Text) |
| url = Column(String) |
| |
| |
| relevance_score = Column(Float, default=0.0) |
| novelty_score = Column(Float, default=1.0) |
| credibility_score = Column(Float, default=0.5) |
| signal_strength = Column(Float, default=0.5) |
| combined_score = Column(Float, default=0.0) |
| |
| |
| roi_score = Column(Float, default=0.5) |
| unlock_potential = Column(Float, default=0.0) |
| risk_level = Column(SQLEnum(RiskLevel), default=RiskLevel.MEDIUM) |
| competition_level = Column(Float, default=0.5) |
| |
| |
| social_engagement = Column(Integer, default=0) |
| |
| |
| status = Column(SQLEnum(OpportunityStatus), default=OpportunityStatus.NEW) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| extra_data = Column(JSON, default={}) |
| |
| |
| embedding = Column(JSON) |
| |
| source = relationship("Source", back_populates="opportunities") |
| interactions = relationship("UserInteraction", back_populates="opportunity") |
|
|
|
|
| class UserInteraction(Base): |
| """Track user actions for personalization.""" |
| __tablename__ = "user_interactions" |
| |
| id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) |
| opportunity_id = Column(String, ForeignKey("opportunities.id")) |
| action = Column(String) |
| timestamp = Column(DateTime, default=datetime.utcnow) |
| |
| opportunity = relationship("Opportunity", back_populates="interactions") |
|
|
|
|
| class Author(Base): |
| """Track authors for credibility and social graph.""" |
| __tablename__ = "authors" |
| |
| id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) |
| name = Column(String, nullable=False) |
| platform = Column(String) |
| platform_id = Column(String) |
| credibility_score = Column(Float, default=0.5) |
| opportunity_creator_score = Column(Float, default=0.0) |
| first_seen = Column(DateTime, default=datetime.utcnow) |
| extra_data = Column(JSON, default={}) |
|
|
|
|
| class OpportunityChain(Base): |
| """Track opportunity sequences/paths - PIOE 2.0.""" |
| __tablename__ = "opportunity_chains" |
| |
| id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) |
| name = Column(String) |
| description = Column(Text) |
| steps = Column(JSON) |
| success_rate = Column(Float, default=0.0) |
| example_urls = Column(JSON, default=[]) |
| created_at = Column(DateTime, default=datetime.utcnow) |
|
|