File size: 3,690 Bytes
09ecaf7
d25db6b
09ecaf7
 
 
 
 
 
d25db6b
 
 
 
 
 
 
 
 
 
 
 
 
 
09ecaf7
 
 
 
 
 
 
 
d25db6b
09ecaf7
 
 
d25db6b
 
 
09ecaf7
 
 
d25db6b
09ecaf7
 
d25db6b
09ecaf7
d25db6b
 
 
 
 
 
 
 
 
 
 
 
 
 
09ecaf7
d7291ef
 
 
 
09ecaf7
d25db6b
 
 
09ecaf7
 
 
d25db6b
 
09ecaf7
d25db6b
09ecaf7
d25db6b
d7291ef
09ecaf7
d25db6b
09ecaf7
 
d7291ef
d25db6b
 
 
09ecaf7
 
 
 
 
 
d25db6b
09ecaf7
 
 
d25db6b
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
89
90
91
92
93
94
95
96
97
from sqlalchemy import (
    Column, String, DateTime, JSON, SmallInteger, Table, ForeignKey, Boolean
)
from sqlalchemy.dialects.postgresql import UUID, TIMESTAMP, CHAR
from sqlalchemy.orm import relationship
import datetime, uuid
from .database import Base

image_countries = Table(
    "image_countries", Base.metadata,
    Column(
      "image_id",
      UUID(as_uuid=True),
      ForeignKey("images.image_id", ondelete="CASCADE"),
      primary_key=True,
    ),
    Column(
      "c_code",
      CHAR(2),
      ForeignKey("countries.c_code"),
      primary_key=True,
    ),
)

class Source(Base):
    __tablename__ = "sources"
    s_code = Column(String, primary_key=True)
    label  = Column(String, nullable=False)

class Region(Base):
    __tablename__ = "regions"
    r_code = Column(String, primary_key=True)
    label  = Column(String, nullable=False)

class Type(Base):
    __tablename__ = "types"
    t_code = Column(String, primary_key=True)
    label    = Column(String, nullable=False)

class Country(Base):
    __tablename__ = "countries"
    c_code = Column(CHAR(2), primary_key=True)
    label  = Column(String, nullable=False)
    r_code = Column(String, ForeignKey("regions.r_code"), nullable=False)

class SpatialReference(Base):
    __tablename__ = "spatial_references"
    epsg = Column(String, primary_key=True)
    srid = Column(String, nullable=False)
    proj4 = Column(String, nullable=False)
    wkt = Column(String, nullable=False)

class ImageTypes(Base):
    __tablename__ = "image_types"
    image_type = Column(String, primary_key=True)
    label = Column(String, nullable=False)

class Models(Base):
    __tablename__ = "models"
    m_code = Column(String, primary_key=True)
    label = Column(String, nullable=False)
    model_type = Column(String, nullable=False)  # gpt4v, claude, gemini, etc.
    is_available = Column(Boolean, default=True)
    config = Column(JSON, nullable=True)  # Model-specific configuration

class Images(Base):
    __tablename__ = "images"
    image_id     = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    file_key   = Column(String, nullable=False)
    sha256     = Column(String, nullable=False)
    source     = Column(String, ForeignKey("sources.s_code"), nullable=False)
    type   = Column(String, ForeignKey("types.t_code"), nullable=False)
    epsg = Column(String, ForeignKey("spatial_references.epsg"), nullable=False)
    created_at = Column(TIMESTAMP(timezone=True), default=datetime.datetime.utcnow)
    image_type = Column(String, ForeignKey("image_types.image_type"), nullable=False)

    countries = relationship("Country", secondary=image_countries, backref="images")
    caption   = relationship("Captions", back_populates="image", cascade="all, delete-orphan")

class Captions(Base):
    __tablename__ = "captions"
    cap_id     = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    image_id     = Column(UUID(as_uuid=True), ForeignKey("images.image_id", ondelete="CASCADE"))
    title      = Column(String, nullable=False)
    prompt     = Column(String, nullable=False)
    model      = Column(String, ForeignKey("models.m_code"), nullable=False)
    raw_json   = Column(JSON, nullable=False)
    generated  = Column(String, nullable=False)
    edited     = Column(String)
    accuracy   = Column(SmallInteger)
    context    = Column(SmallInteger)
    usability  = Column(SmallInteger)
    starred    = Column(Boolean, default=False)
    created_at = Column(TIMESTAMP(timezone=True), default=datetime.datetime.utcnow)
    updated_at = Column(TIMESTAMP(timezone=True), onupdate=datetime.datetime.utcnow)

    image = relationship("Images", back_populates="caption")