2023-11-06 17:04:17 +05:30
|
|
|
from typing import Any
|
2023-11-19 12:13:39 +05:30
|
|
|
from sqlmodel import Field, SQLModel, JSON, TEXT, Column
|
2023-11-17 11:35:09 +05:30
|
|
|
from pydantic import computed_field
|
2023-11-06 17:04:17 +05:30
|
|
|
|
2023-11-17 11:35:09 +05:30
|
|
|
from .metadata import gisaf_survey
|
2023-11-06 17:04:17 +05:30
|
|
|
|
|
|
|
mapbox_type_mapping = {
|
|
|
|
'Point': 'symbol',
|
|
|
|
'Line': 'line',
|
|
|
|
'Polygon': 'fill',
|
|
|
|
}
|
|
|
|
|
|
|
|
class CategoryGroup(SQLModel, table=True):
|
2023-11-17 11:35:09 +05:30
|
|
|
metadata = gisaf_survey
|
2023-11-06 17:04:17 +05:30
|
|
|
name: str = Field(min_length=4, max_length=4,
|
|
|
|
default=None, primary_key=True)
|
|
|
|
major: str
|
|
|
|
long_name: str
|
|
|
|
|
|
|
|
class Admin:
|
|
|
|
menu = 'Other'
|
|
|
|
flask_admin_model_view = 'CategoryGroupModelView'
|
|
|
|
|
|
|
|
|
|
|
|
class CategoryModelType(SQLModel, table=True):
|
2023-11-17 11:35:09 +05:30
|
|
|
metadata = gisaf_survey
|
2023-11-06 17:04:17 +05:30
|
|
|
name: str = Field(default=None, primary_key=True)
|
|
|
|
|
|
|
|
class Admin:
|
|
|
|
menu = 'Other'
|
|
|
|
flask_admin_model_view = 'MyModelViewWithPrimaryKey'
|
|
|
|
|
|
|
|
|
|
|
|
class CategoryBase(SQLModel):
|
|
|
|
class Admin:
|
|
|
|
menu = 'Other'
|
|
|
|
flask_admin_model_view = 'CategoryModelView'
|
|
|
|
|
|
|
|
name: str | None = Field(default=None, primary_key=True)
|
|
|
|
description: str | None
|
|
|
|
group: str = Field(min_length=4, max_length=4,
|
|
|
|
foreign_key="CategoryGroup.name", index=True)
|
|
|
|
#group_: CategoryGroup = Relationship()
|
|
|
|
minor_group_1: str = Field(min_length=4, max_length=4, default='----')
|
|
|
|
minor_group_2: str = Field(min_length=4, max_length=4, default='----')
|
|
|
|
status: str = Field(min_length=1, max_length=1)
|
|
|
|
custom: bool | None
|
|
|
|
auto_import: bool = True
|
|
|
|
model_type: str = Field(max_length=50,
|
2023-11-17 11:35:09 +05:30
|
|
|
foreign_key='CategoryModelType.name',
|
|
|
|
default='Point')
|
2023-11-06 17:04:17 +05:30
|
|
|
long_name: str | None = Field(max_length=50)
|
|
|
|
style: str | None = Field(sa_column=Column(TEXT))
|
|
|
|
symbol: str | None = Field(max_length=1)
|
|
|
|
mapbox_type_custom: str | None = Field(max_length=32)
|
2023-11-17 11:35:09 +05:30
|
|
|
mapbox_paint: dict[str, Any] | None = Field(sa_column=Column(JSON(none_as_null=True)))
|
|
|
|
mapbox_layout: dict[str, Any] | None = Field(sa_column=Column(JSON(none_as_null=True)))
|
2023-11-06 17:04:17 +05:30
|
|
|
viewable_role: str | None
|
2023-11-17 11:35:09 +05:30
|
|
|
extra: dict[str, Any] | None = Field(sa_column=Column(JSON(none_as_null=True)))
|
2023-11-06 17:04:17 +05:30
|
|
|
|
|
|
|
|
|
|
|
class Category(CategoryBase, table=True):
|
2023-11-17 11:35:09 +05:30
|
|
|
metadata = gisaf_survey
|
2023-11-06 17:04:17 +05:30
|
|
|
name: str = Field(default=None, primary_key=True)
|
|
|
|
|
|
|
|
|
|
|
|
class CategoryRead(CategoryBase):
|
|
|
|
name: str
|
2023-11-17 11:35:09 +05:30
|
|
|
domain: str = 'V' # Survey
|
2023-11-06 17:04:17 +05:30
|
|
|
|
2023-11-17 11:35:09 +05:30
|
|
|
@computed_field
|
2023-11-06 17:04:17 +05:30
|
|
|
@property
|
2023-11-17 11:35:09 +05:30
|
|
|
def layer_name(self) -> str:
|
2023-11-06 17:04:17 +05:30
|
|
|
"""
|
|
|
|
ISO compliant layer name (see ISO 13567)
|
|
|
|
:return: str
|
|
|
|
"""
|
|
|
|
return '{self.domain}-{self.group:4s}-{self.minor_group_1:4s}-{self.minor_group_2:4s}-{self.status:1s}'.format(self=self)
|
|
|
|
|
2023-11-17 11:35:09 +05:30
|
|
|
@computed_field
|
2023-11-06 17:04:17 +05:30
|
|
|
@property
|
2023-11-17 11:35:09 +05:30
|
|
|
def table_name(self) -> str:
|
2023-11-06 17:04:17 +05:30
|
|
|
"""
|
|
|
|
Table name
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
if self.minor_group_2 == '----':
|
|
|
|
return '{self.domain}_{self.group:4s}_{self.minor_group_1:4s}'.format(self=self)
|
|
|
|
else:
|
|
|
|
return '{self.domain}_{self.group:4s}_{self.minor_group_1:4s}_{self.minor_group_2:4s}'.format(self=self)
|
|
|
|
|
2023-11-17 11:35:09 +05:30
|
|
|
@computed_field
|
2023-11-06 17:04:17 +05:30
|
|
|
@property
|
2023-11-17 11:35:09 +05:30
|
|
|
def raw_survey_table_name(self) -> str:
|
2023-11-06 17:04:17 +05:30
|
|
|
"""
|
|
|
|
Table name
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
if self.minor_group_2 == '----':
|
|
|
|
return 'RAW_{self.domain}_{self.group:4s}_{self.minor_group_1:4s}'.format(self=self)
|
|
|
|
else:
|
|
|
|
return 'RAW_{self.domain}_{self.group:4s}_{self.minor_group_1:4s}_{self.minor_group_2:4s}'.format(self=self)
|
|
|
|
|
2023-11-17 11:35:09 +05:30
|
|
|
@computed_field
|
2023-11-06 17:04:17 +05:30
|
|
|
@property
|
2023-11-17 11:35:09 +05:30
|
|
|
def mapbox_type(self) -> str:
|
2023-11-06 17:04:17 +05:30
|
|
|
return self.mapbox_type_custom or mapbox_type_mapping[self.model_type]
|