gisaf-backend/src/models/category.py

104 lines
3.3 KiB
Python
Raw Normal View History

2023-11-06 17:04:17 +05:30
from typing import Any
from sqlmodel import Field, SQLModel, MetaData, JSON, TEXT, Relationship, Column
schema = 'gisaf_survey'
metadata = MetaData(schema=schema)
mapbox_type_mapping = {
'Point': 'symbol',
'Line': 'line',
'Polygon': 'fill',
}
class CategoryGroup(SQLModel, table=True):
metadata = metadata
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):
metadata = metadata
name: str = Field(default=None, primary_key=True)
class Admin:
menu = 'Other'
flask_admin_model_view = 'MyModelViewWithPrimaryKey'
class CategoryBase(SQLModel):
metadata = metadata
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,
foreign_key='CategoryModelType.name', default='Point')
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)
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))
viewable_role: str | None
extra: dict[str, Any] | None = Field(sa_column=Column(JSON, none_as_null=True))
class Category(CategoryBase, table=True):
name: str = Field(default=None, primary_key=True)
class CategoryRead(CategoryBase):
name: str
domain = 'V' # Survey
@property
def layer_name(self):
"""
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)
@property
def table_name(self):
"""
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)
@property
def raw_survey_table_name(self):
"""
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)
@property
def mapbox_type(self):
return self.mapbox_type_custom or mapbox_type_mapping[self.model_type]