File size: 4,153 Bytes
09ecaf7
1686de5
 
09ecaf7
1686de5
09ecaf7
 
 
 
d25db6b
 
 
 
 
 
 
 
 
 
 
 
 
 
09ecaf7
 
 
 
 
 
 
 
d25db6b
09ecaf7
 
 
1686de5
 
d25db6b
1686de5
09ecaf7
 
d25db6b
09ecaf7
 
d25db6b
09ecaf7
d25db6b
 
1686de5
 
d25db6b
1686de5
d25db6b
 
 
 
 
 
 
 
09ecaf7
d7291ef
1686de5
d7291ef
1686de5
 
 
 
 
 
 
 
 
09ecaf7
d25db6b
 
1686de5
65933cd
 
 
1686de5
 
65933cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1686de5
09ecaf7
 
 
d25db6b
09ecaf7
 
65933cd
 
 
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
98
99
100
101
102
103
104
105
106
107
108
109
from sqlalchemy import (
    Column, String, DateTime, SmallInteger, Table, ForeignKey, Boolean,
    CheckConstraint, UniqueConstraint, Text
)
from sqlalchemy.dialects.postgresql import UUID, TIMESTAMP, CHAR, JSONB
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 EventType(Base):
    __tablename__ = "event_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)
    is_available = Column(Boolean, default=True)
    config = Column(JSONB, nullable=True)

class JSONSchema(Base):
    __tablename__ = "json_schemas"
    schema_id = Column(String, primary_key=True)
    title     = Column(String, nullable=False)
    schema    = Column(JSONB, nullable=False)
    version   = Column(String, nullable=False)
    created_at = Column(TIMESTAMP(timezone=True), default=datetime.datetime.utcnow)

class Images(Base):
    __tablename__ = "images"
    __table_args__ = (
        CheckConstraint('accuracy  IS NULL OR (accuracy  BETWEEN 0 AND 100)', name='chk_images_accuracy'),
        CheckConstraint('context   IS NULL OR (context   BETWEEN 0 AND 100)', name='chk_images_context'),
        CheckConstraint('usability IS NULL OR (usability BETWEEN 0 AND 100)', name='chk_images_usability'),
    )

    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)
    event_type  = Column(String, ForeignKey("event_types.t_code"), nullable=False)
    epsg        = Column(String, ForeignKey("spatial_references.epsg"), nullable=False)
    image_type  = Column(String, ForeignKey("image_types.image_type"), nullable=False)
    created_at  = Column(TIMESTAMP(timezone=True), default=datetime.datetime.utcnow)
    captured_at = Column(TIMESTAMP(timezone=True))

    title      = Column(String, nullable=True)
    prompt     = Column(String, nullable=True)
    model      = Column(String, ForeignKey("models.m_code"), nullable=True)
    schema_id  = Column(String, ForeignKey("json_schemas.schema_id"), nullable=True)
    raw_json   = Column(JSONB, nullable=True)
    generated  = Column(Text, nullable=True)
    edited     = Column(Text)
    accuracy   = Column(SmallInteger)
    context    = Column(SmallInteger)
    usability  = Column(SmallInteger)
    starred    = Column(Boolean, default=False)
    updated_at = Column(TIMESTAMP(timezone=True), onupdate=datetime.datetime.utcnow)

    countries = relationship("Country", secondary=image_countries, backref="images")
    schema    = relationship("JSONSchema")
    model_r   = relationship("Models", foreign_keys=[model])