Add plugin management (WIP)
Refactoring some models, prevent circular deps
This commit is contained in:
parent
f1534dfed7
commit
360a7a70f3
11 changed files with 308 additions and 160 deletions
|
@ -12,7 +12,8 @@ from gisaf.models.authentication import (
|
|||
Role, RoleRead,
|
||||
)
|
||||
from gisaf.models.category import Category, CategoryRead
|
||||
from gisaf.models.to_migrate import DataProvider
|
||||
from gisaf.models.geo_models_base import GeoModel
|
||||
from gisaf.models.info import LegendItem, ModelAction, ModelInfo, DataProvider, ModelValue, TagActions
|
||||
from gisaf.models.survey import Equipment, SurveyMeta, Surveyor
|
||||
from gisaf.config import Survey, conf
|
||||
from gisaf.models.bootstrap import BootstrapData
|
||||
|
@ -26,10 +27,13 @@ from gisaf.security import (
|
|||
)
|
||||
from gisaf.registry import registry, NotInRegistry
|
||||
from gisaf.custom_store_base import BaseStore
|
||||
from gisaf.models.to_migrate import (
|
||||
from gisaf.redis_tools import store as redis_store
|
||||
from gisaf.models.info import (
|
||||
FeatureInfo, InfoItem, Attachment, InfoCategory
|
||||
)
|
||||
from gisaf.live_utils import get_live_feature_info
|
||||
from gisaf.plugins import manager as plugin_manager, NoSuchAction
|
||||
from gisaf.utils import gisTypeSymbolMap
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -151,11 +155,11 @@ async def get_survey_meta(
|
|||
@api.get("/feature-info/{store}/{id}")
|
||||
async def get_feature_info(
|
||||
store: str, id: str,
|
||||
) -> FeatureInfo:
|
||||
) -> FeatureInfo | None:
|
||||
if store not in registry.stores.index:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
|
||||
store_record = registry.stores.loc[store]
|
||||
model = store_record.model
|
||||
model: type[GeoModel] = store_record.model
|
||||
if store_record.is_live:
|
||||
feature_info = await get_live_feature_info(store, id)
|
||||
elif issubclass(model, BaseStore):
|
||||
|
@ -168,6 +172,56 @@ async def get_feature_info(
|
|||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
|
||||
return feature_info
|
||||
|
||||
|
||||
@api.get("/model-info/{store}")
|
||||
async def get_model_info(
|
||||
store: str
|
||||
) -> ModelInfo:
|
||||
try:
|
||||
store_record = registry.stores.loc[store]
|
||||
except KeyError:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
|
||||
if store_record.is_live:
|
||||
## Get layer_defs from live redis and give symbol
|
||||
layer_def = await redis_store.get_layer_def(store)
|
||||
return ModelInfo(modelName=layer_def.pop('name'), **layer_def)
|
||||
model = store_record.model
|
||||
model_info = {
|
||||
'store': store,
|
||||
'modelName': model.__name__,
|
||||
'symbol': model.symbol or gisTypeSymbolMap[model.base_gis_type],
|
||||
}
|
||||
## Add information about the legend
|
||||
if hasattr(model, 'get_legend'):
|
||||
legend = await model.get_legend()
|
||||
model_info['legend'] = [
|
||||
LegendItem(key=k, value=v)
|
||||
for k, v in legend.items()
|
||||
]
|
||||
## Add information about values
|
||||
values_model = registry.values_for_model.get(model)
|
||||
if hasattr(values_model, 'values'):
|
||||
model_info['values'] = [ModelValue(**values) for values in values_model.values]
|
||||
## Add information about tags
|
||||
## TODO: add to plugin_manager a way to retrieve tag_store/tag_actions from a dict?
|
||||
#tag_store = [tt for tt in plugin_manager.tagsStores.stores if tt.store==store][0]
|
||||
model_info['tagActions'] = [
|
||||
TagActions(key=key, domain=domain, actions=actions)
|
||||
for domain, actions_keys in plugin_manager.tags_models[model].items()
|
||||
for key, actions in actions_keys.items()
|
||||
]
|
||||
model_info['actions'] = [
|
||||
ModelAction(
|
||||
name=name,
|
||||
icon=action.icon,
|
||||
formFields=action.formFields,
|
||||
)
|
||||
for name, actions in plugin_manager.actions_stores.get(store, {}).items()
|
||||
for action in actions
|
||||
]
|
||||
model_info['downloaders'] = plugin_manager.downloaders_stores[store]
|
||||
return ModelInfo(**model_info)
|
||||
|
||||
# @api.get("/user-role")
|
||||
# async def get_user_role_relation(
|
||||
# *, db_session: AsyncSession = Depends(get_db_session)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue