2026-01-27 02:11:58 +00:00
|
|
|
from datetime import datetime
|
|
|
|
|
from enum import Enum
|
2026-02-10 01:57:02 +00:00
|
|
|
from typing import Any, Dict, List
|
|
|
|
|
from pydantic import BaseModel
|
2026-01-27 02:11:58 +00:00
|
|
|
|
|
|
|
|
import uuid6
|
|
|
|
|
from pytz import timezone
|
|
|
|
|
from sqlalchemy import UUID, Boolean, Column, DateTime, ForeignKey, Integer, String, Text
|
|
|
|
|
from sqlalchemy.orm import relationship
|
|
|
|
|
|
|
|
|
|
from app.core.config import settings
|
|
|
|
|
|
|
|
|
|
from . import Base
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MapsetStatus(str, Enum):
|
|
|
|
|
approved = "approved"
|
|
|
|
|
rejected = "rejected"
|
|
|
|
|
on_verification = "on_verification"
|
2026-02-10 01:57:02 +00:00
|
|
|
on_process = "on_process"
|
2026-01-27 02:11:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class MapsetModel(Base):
|
|
|
|
|
__tablename__ = "mapsets"
|
|
|
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, index=True, default=uuid6.uuid7)
|
|
|
|
|
name = Column(String(255), nullable=False)
|
|
|
|
|
description = Column(Text, nullable=True)
|
|
|
|
|
scale = Column(String(29), nullable=False)
|
|
|
|
|
layer_url = Column(Text)
|
|
|
|
|
layer_type = Column(String(20), nullable=True)
|
|
|
|
|
metadata_url = Column(Text)
|
|
|
|
|
category_id = Column(UUID(as_uuid=True), ForeignKey("categories.id"))
|
|
|
|
|
classification_id = Column(UUID(as_uuid=True), ForeignKey("classifications.id"))
|
|
|
|
|
regional_id = Column(UUID(as_uuid=True), ForeignKey("regionals.id"), nullable=True)
|
|
|
|
|
projection_system_id = Column(UUID(as_uuid=True), ForeignKey("map_projection_systems.id"))
|
|
|
|
|
producer_id = Column(UUID(as_uuid=True), ForeignKey("organizations.id"))
|
|
|
|
|
status_validation = Column(String(20), nullable=True)
|
|
|
|
|
data_status = Column(String(20), nullable=False)
|
|
|
|
|
data_update_period = Column(String(20), nullable=False)
|
|
|
|
|
data_version = Column(String(20), nullable=False)
|
|
|
|
|
coverage_level = Column(String(20), nullable=True)
|
|
|
|
|
coverage_area = Column(String(20), nullable=True)
|
|
|
|
|
view_count = Column(Integer, default=0)
|
|
|
|
|
download_count = Column(Integer, default=0)
|
|
|
|
|
order = Column(Integer, default=0)
|
|
|
|
|
is_popular = Column(Boolean, default=False)
|
|
|
|
|
is_active = Column(Boolean, default=True)
|
|
|
|
|
is_deleted = Column(Boolean, default=False)
|
|
|
|
|
created_at = Column(DateTime(timezone=True), default=datetime.now(timezone(settings.TIMEZONE)))
|
|
|
|
|
updated_at = Column(
|
|
|
|
|
DateTime(timezone=True),
|
|
|
|
|
default=datetime.now(timezone(settings.TIMEZONE)),
|
|
|
|
|
onupdate=datetime.now(timezone(settings.TIMEZONE)),
|
|
|
|
|
)
|
|
|
|
|
created_by = Column(UUID(as_uuid=True), ForeignKey("users.id"))
|
|
|
|
|
updated_by = Column(UUID(as_uuid=True), ForeignKey("users.id"))
|
|
|
|
|
|
|
|
|
|
projection_system = relationship("MapProjectionSystemModel", uselist=False, lazy="selectin")
|
|
|
|
|
classification = relationship("ClassificationModel", uselist=False, lazy="selectin")
|
|
|
|
|
category = relationship("CategoryModel", uselist=False, lazy="selectin")
|
|
|
|
|
regional = relationship("RegionalModel", uselist=False, lazy="selectin")
|
|
|
|
|
source_usages = relationship("SourceUsageModel", back_populates="mapset", lazy="selectin")
|
|
|
|
|
sources = relationship(
|
|
|
|
|
"MapSourceModel",
|
|
|
|
|
secondary="source_usages",
|
|
|
|
|
primaryjoin="MapsetModel.id == SourceUsageModel.mapset_id",
|
|
|
|
|
secondaryjoin="SourceUsageModel.source_id == MapSourceModel.id",
|
|
|
|
|
lazy="selectin",
|
|
|
|
|
viewonly=True,
|
|
|
|
|
)
|
|
|
|
|
producer = relationship("OrganizationModel", back_populates="mapsets", uselist=False, lazy="joined")
|
2026-02-10 01:57:02 +00:00
|
|
|
|
|
|
|
|
class MapsetFile(BaseModel):
|
|
|
|
|
title: str
|
|
|
|
|
path: str
|
|
|
|
|
columns: List[str]
|
|
|
|
|
author: Dict[str, Any]
|
|
|
|
|
style: str
|