Skip to content

Commit

Permalink
Added a way to prevent deleting/modifying the name of core conf param…
Browse files Browse the repository at this point in the history
…eters via admin UI (#267)
  • Loading branch information
ricardogsilva authored Oct 8, 2024
1 parent 0033026 commit 319faca
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 7 deletions.
15 changes: 8 additions & 7 deletions arpav_ppcv/bootstrapper/configurationparameters.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from ..schemas.base import CoreConfParamName
from ..schemas.coverages import (
ConfigurationParameterCreate,
ConfigurationParameterValueCreateEmbeddedInConfigurationParameter,
Expand All @@ -7,7 +8,7 @@
def generate_configuration_parameters() -> list[ConfigurationParameterCreate]:
return [
ConfigurationParameterCreate(
name="historical_variable",
name=CoreConfParamName.HISTORICAL_VARIABLE.value,
display_name_english="Variable",
display_name_italian="Variabile",
description_english="Historical variable",
Expand Down Expand Up @@ -103,7 +104,7 @@ def generate_configuration_parameters() -> list[ConfigurationParameterCreate]:
],
),
ConfigurationParameterCreate(
name="climatological_variable",
name=CoreConfParamName.CLIMATOLOGICAL_VARIABLE.value,
display_name_english="Variable",
display_name_italian="Variabile",
description_english="Climatological variable",
Expand Down Expand Up @@ -203,7 +204,7 @@ def generate_configuration_parameters() -> list[ConfigurationParameterCreate]:
],
),
ConfigurationParameterCreate(
name="scenario",
name=CoreConfParamName.SCENARIO.value,
display_name_english="Scenario",
display_name_italian="Scenario",
description_english="Climate model scenario",
Expand Down Expand Up @@ -498,7 +499,7 @@ def generate_configuration_parameters() -> list[ConfigurationParameterCreate]:
],
),
ConfigurationParameterCreate(
name="measure",
name=CoreConfParamName.MEASURE.value,
display_name_english="Measurement type",
display_name_italian="Tipo di misurazione",
description_english="Type of climatological measurement",
Expand Down Expand Up @@ -529,7 +530,7 @@ def generate_configuration_parameters() -> list[ConfigurationParameterCreate]:
],
),
ConfigurationParameterCreate(
name="climatological_model",
name=CoreConfParamName.CLIMATOLOGICAL_MODEL.value,
display_name_english="Forecast model",
display_name_italian="Modello di previsione",
description_english=(
Expand Down Expand Up @@ -600,7 +601,7 @@ def generate_configuration_parameters() -> list[ConfigurationParameterCreate]:
],
),
ConfigurationParameterCreate(
name="aggregation_period",
name=CoreConfParamName.AGGREGATION_PERIOD.value,
display_name_english="Temporal aggregation period",
display_name_italian="Periodo di aggregazione temporale",
description_english="Aggregation period for climatological datasets",
Expand Down Expand Up @@ -662,7 +663,7 @@ def generate_configuration_parameters() -> list[ConfigurationParameterCreate]:
],
),
ConfigurationParameterCreate(
name="archive",
name=CoreConfParamName.ARCHIVE.value,
display_name_english="Dataset archive",
display_name_italian="archivio di dataset",
description_english="The archive that the dataset belongs to",
Expand Down
10 changes: 10 additions & 0 deletions arpav_ppcv/schemas/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@ def get_display_name(self, locale: babel.Locale) -> str:
...


class CoreConfParamName(enum.Enum):
AGGREGATION_PERIOD = "aggregation_period"
ARCHIVE = "archive"
CLIMATOLOGICAL_MODEL = "climatological_model"
CLIMATOLOGICAL_VARIABLE = "climatological_variable"
HISTORICAL_VARIABLE = "historical_variable"
MEASURE = "measure"
SCENARIO = "scenario"


class Season(enum.Enum):
WINTER = "WINTER"
SPRING = "SPRING"
Expand Down
37 changes: 37 additions & 0 deletions arpav_ppcv/webapp/admin/views/coverages.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import anyio.to_thread
import starlette_admin
from starlette.requests import Request
from starlette_admin import exceptions as starlette_admin_exceptions
from starlette_admin.contrib.sqlmodel import ModelView

from .... import database
Expand Down Expand Up @@ -179,10 +180,33 @@ async def create(self, request: Request, data: Dict[str, Any]) -> Any:
except Exception as e:
return self.handle_exception(e)

async def check_modifications_to_core_configuration_parameters(
self,
request: Request,
pk: uuid.UUID,
data: Dict[str, Any],
):
conf_param = await anyio.to_thread.run_sync(
database.get_configuration_parameter, request.state.session, pk
)
if conf_param.name in [p.value for p in base.CoreConfParamName]:
if data.get("name") != conf_param.name:
raise starlette_admin_exceptions.FormValidationError(
errors={
"name": (
f"Cannot change parameter {conf_param.name!r}'s name - it "
f"is a core system parameter"
)
}
)

async def edit(self, request: Request, pk: Any, data: Dict[str, Any]) -> Any:
try:
data = await self._arrange_data(request, data, True)
await self.validate(request, data)
await self.check_modifications_to_core_configuration_parameters(
request, pk, data
)
config_param_update = coverages.ConfigurationParameterUpdate(
name=data.get("name"),
display_name_english=data["display_name_english"],
Expand Down Expand Up @@ -268,6 +292,19 @@ async def find_all(
)
return result

async def delete(self, request: Request, pks: List[Any]) -> Optional[int]:
for pk in pks:
conf_param = await anyio.to_thread.run_sync(
database.get_configuration_parameter, request.state.session, pk
)
if conf_param.name in (p.value for p in base.CoreConfParamName):
raise starlette_admin_exceptions.ActionFailed(
f"Cannot delete configuration parameter {conf_param.name!r} - it "
f"is a core system parameter"
)
else:
return await super().delete(request, pks)


class CoverageConfigurationView(ModelView):
identity = "coverage_configurations"
Expand Down

0 comments on commit 319faca

Please sign in to comment.