Skip to content
4 changes: 3 additions & 1 deletion app/db/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,10 @@ def load_db_model_from_pydantic[I: DeclarativeBase](
created_by_id: uuid.UUID | None,
updated_by_id: uuid.UUID | None,
ignore_attributes: set[str] | None = None,
*,
exclude_defaults: bool = False,
) -> I:
data = json_model.model_dump(by_alias=True)
data = json_model.model_dump(by_alias=True, exclude_defaults=exclude_defaults)

if created_by_id or updated_by_id:
data["created_by_id"] = created_by_id
Expand Down
22 changes: 15 additions & 7 deletions app/queries/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
from app.schemas.activity import ActivityCreate, ActivityUpdate
from app.schemas.auth import UserContext, UserContextWithProjectId, UserProfile
from app.schemas.types import ListResponse, PaginationResponse
from app.schemas.utils import NOT_SET
from app.utils.uuid import create_uuid


Expand Down Expand Up @@ -354,15 +355,17 @@ def router_update_one[T: BaseModel, I: Identifiable](
id_: uuid.UUID,
db: Session,
db_model_class: type[I],
user_context: UserContext,
user_context: UserContext | None,
json_model: BaseModel,
response_schema_class: type[T],
apply_operations: ApplyOperations | None = None,
):
query = (
sa.select(db_model_class).where(db_model_class.id == id_).with_for_update(of=db_model_class)
)
if id_model_class := get_declaring_class(db_model_class, "authorized_project_id"):
if user_context and (
id_model_class := get_declaring_class(db_model_class, "authorized_project_id")
):
query = constrain_to_private_entities(query, user_context, db_model_class=id_model_class)
if apply_operations:
query = apply_operations(query)
Expand Down Expand Up @@ -427,13 +430,15 @@ def router_update_activity_one[T: BaseModel, I: Activity](
id_: uuid.UUID,
db: Session,
db_model_class: type[I],
user_context: UserContext | UserContextWithProjectId,
user_context: UserContext | UserContextWithProjectId | None,
json_model: ActivityUpdate,
response_schema_class: type[T],
apply_operations: ApplyOperations | None = None,
) -> T:
query = sa.select(db_model_class).where(db_model_class.id == id_)
if id_model_class := get_declaring_class(db_model_class, "authorized_project_id"):
if user_context and (
id_model_class := get_declaring_class(db_model_class, "authorized_project_id")
):
query = constrain_to_accessible_entities(
query, user_context.project_id, db_model_class=id_model_class
)
Expand All @@ -446,21 +451,24 @@ def router_update_activity_one[T: BaseModel, I: Activity](
update_data = json_model.model_dump(
exclude_unset=True,
exclude_none=True,
exclude_defaults=True,
exclude={"used_ids", "generated_ids"},
exclude_defaults=True, # ignore NOT_SET default values
)

for key, value in update_data.items():
setattr(obj, key, value)

if generated_ids := json_model.generated_ids:
# ignore NOT_SET values
generated_ids = json_model.generated_ids if json_model.generated_ids != NOT_SET else []

if generated_ids:
if obj.generated:
raise HTTPException(
status_code=404,
detail="It is forbidden to update generated_ids if they exist.",
)

if (
if user_context and (
unaccessible_entities := db.execute(
select_unauthorized_entities(generated_ids, user_context.project_id)
)
Expand Down
14 changes: 12 additions & 2 deletions app/routers/brain_region.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,21 @@
from fastapi import APIRouter

import app.service.brain_region
from app.routers.admin import router as admin_router

ROUTE = "brain-region"

router = APIRouter(
prefix="/brain-region",
tags=["brain-region"],
prefix=f"/{ROUTE}",
tags=[ROUTE],
)

read_many = router.get("")(app.service.brain_region.read_many)
read_one = router.get("/{id_}")(app.service.brain_region.read_one)
create_one = router.post("")(app.service.brain_region.create_one)
update_one = router.patch("/{id_}")(app.service.brain_region.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.brain_region.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.brain_region.admin_update_one
)
1 change: 1 addition & 0 deletions app/routers/calibration.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@
update_one = router.patch("/{id_}")(app.service.calibration.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.calibration.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.calibration.admin_update_one)
1 change: 1 addition & 0 deletions app/routers/circuit.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@
update_one = router.patch("/{id_}")(app.service.circuit.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.circuit.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.circuit.admin_update_one)
3 changes: 3 additions & 0 deletions app/routers/electrical_cell_recording.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.electrical_cell_recording.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.electrical_cell_recording.admin_update_one
)
3 changes: 3 additions & 0 deletions app/routers/electrical_recording_stimulus.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.electrical_recording_stimulus.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.electrical_recording_stimulus.admin_update_one
)
12 changes: 10 additions & 2 deletions app/routers/em_cell_mesh.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
from fastapi import APIRouter

import app.service.em_cell_mesh
from app.routers.admin import router as admin_router

ROUTE = "em-cell-mesh"

router = APIRouter(
prefix="/em-cell-mesh",
tags=["em-cell-mesh"],
prefix=f"/{ROUTE}",
tags=[ROUTE],
)

read_many = router.get("")(app.service.em_cell_mesh.read_many)
read_one = router.get("/{id_}")(app.service.em_cell_mesh.read_one)
create_one = router.post("")(app.service.em_cell_mesh.create_one)
update_one = router.patch("/{id_}")(app.service.em_cell_mesh.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.em_cell_mesh.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.em_cell_mesh.admin_update_one
)
1 change: 1 addition & 0 deletions app/routers/emodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@
update_one = router.patch("/{id_}")(app.service.emodel.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.emodel.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.emodel.admin_update_one)
5 changes: 4 additions & 1 deletion app/routers/etype.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,8 @@

read_many = router.get("")(app.service.etype.read_many)
read_one = router.get("/{id_}")(app.service.etype.read_one)
create_one = router.post("")(app.service.etype.create_one)
update_one = router.patch("/{id_}")(app.service.etype.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.etype.read_one)
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.etype.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.etype.admin_update_one)
3 changes: 3 additions & 0 deletions app/routers/experimental_bouton_density.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.experimental_bouton_density.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.experimental_bouton_density.admin_update_one
)
3 changes: 3 additions & 0 deletions app/routers/experimental_neuron_density.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.experimental_neuron_density.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.experimental_neuron_density.admin_update_one
)
3 changes: 3 additions & 0 deletions app/routers/experimental_synapses_per_connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.experimental_synapses_per_connection.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.experimental_synapses_per_connection.admin_update_one
)
11 changes: 9 additions & 2 deletions app/routers/ion_channel.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
from fastapi import APIRouter

import app.service.ion_channel
from app.routers.admin import router as admin_router

ROUTE = "ion-channel"

router = APIRouter(
prefix="/ion-channel",
tags=["ion-channel"],
prefix=f"/{ROUTE}",
tags=[ROUTE],
)

read_many = router.get("")(app.service.ion_channel.read_many)
read_one = router.get("/{id_}")(app.service.ion_channel.read_one)
create_one = router.post("")(app.service.ion_channel.create_one)
update_one = router.patch("/{id_}")(app.service.ion_channel.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.ion_channel.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.ion_channel.admin_update_one)
3 changes: 3 additions & 0 deletions app/routers/ion_channel_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,6 @@
update_one = router.patch("/{id_}")(app.service.ion_channel_model.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.ion_channel_model.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.ion_channel_model.admin_update_one
)
14 changes: 12 additions & 2 deletions app/routers/ion_channel_recording.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
from fastapi import APIRouter

import app.service.ion_channel_recording
from app.routers.admin import router as admin_router

ROUTE = "ion-channel-recording"

router = APIRouter(
prefix="/ion-channel-recording",
tags=["ion-channel-recording"],
prefix=f"/{ROUTE}",
tags=[ROUTE],
)

read_many = router.get("")(app.service.ion_channel_recording.read_many)
read_one = router.get("/{id_}")(app.service.ion_channel_recording.read_one)
create_one = router.post("")(app.service.ion_channel_recording.create_one)
update_one = router.patch("/{id_}")(app.service.ion_channel_recording.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.ion_channel_recording.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.ion_channel_recording.admin_update_one
)
4 changes: 3 additions & 1 deletion app/routers/license.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,7 @@
read_many = router.get("")(app.service.license.read_many)
read_one = router.get("/{id_}")(app.service.license.read_one)
create_one = router.post("")(app.service.license.create_one)
update_one = router.patch("/{id_}")(app.service.license.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.license.read_one)
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.license.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.license.admin_update_one)
4 changes: 4 additions & 0 deletions app/routers/measurement_annotation.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@
read_one = router.get("/{id_}")(app.service.measurement_annotation.read_one)
create_one = router.post("")(app.service.measurement_annotation.create_one)
delete_one = router.delete("/{id_}")(app.service.measurement_annotation.delete_one)
update_one = router.patch("/{id_}")(app.service.measurement_annotation.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.measurement_annotation.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.measurement_annotation.admin_update_one
)
1 change: 1 addition & 0 deletions app/routers/memodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@
update_one = router.patch("/{id_}")(app.service.memodel.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.memodel.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.memodel.admin_update_one)
3 changes: 3 additions & 0 deletions app/routers/memodel_calibration_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.memodel_calibration_result.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.memodel_calibration_result.admin_update_one
)
1 change: 1 addition & 0 deletions app/routers/morphology.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@
update_one = router.patch("/{id_}")(app.service.morphology.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.morphology.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.morphology.admin_update_one)
5 changes: 4 additions & 1 deletion app/routers/mtype.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,8 @@

read_many = router.get("")(app.service.mtype.read_many)
read_one = router.get("/{id_}")(app.service.mtype.read_one)
create_one = router.post("")(app.service.mtype.create_one)
update_one = router.patch("/{id_}")(app.service.mtype.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.mtype.read_one)
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.mtype.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.mtype.admin_update_one)
2 changes: 2 additions & 0 deletions app/routers/publication.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,7 @@
read_one = router.get("/{id_}")(app.service.publication.read_one)
read_many = router.get("")(app.service.publication.read_many)
create_one = router.post("")(app.service.publication.create_one)
update_one = router.patch("/{id_}")(app.service.publication.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.publication.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.publication.admin_update_one)
4 changes: 3 additions & 1 deletion app/routers/role.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,7 @@
read_many = router.get("")(app.service.role.read_many)
read_one = router.get("/{id_}")(app.service.role.read_one)
create_one = router.post("")(app.service.role.create_one)
update_one = router.patch("/{id_}")(app.service.role.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.role.read_one)
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.role.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.role.admin_update_one)
1 change: 1 addition & 0 deletions app/routers/simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
update_one = router.patch("/{id_}")(app.service.simulation.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.simulation.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.simulation.admin_update_one)
3 changes: 3 additions & 0 deletions app/routers/simulation_campaign.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.simulation_campaign.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.simulation_campaign.admin_update_one
)
3 changes: 3 additions & 0 deletions app/routers/simulation_execution.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.simulation_execution.admin_read_one
)
admin_update_one = admin_router.patch("/simulation-execution/{id_}")(
app.service.simulation_execution.admin_update_one
)
3 changes: 3 additions & 0 deletions app/routers/simulation_generation.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.simulation_generation.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.simulation_generation.admin_update_one
)
3 changes: 3 additions & 0 deletions app/routers/simulation_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@
update_one = router.patch("/{id_}")(app.service.simulation_result.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.simulation_result.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.simulation_result.admin_update_one
)
3 changes: 3 additions & 0 deletions app/routers/single_neuron_simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.single_neuron_simulation.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.single_neuron_simulation.admin_update_one
)
3 changes: 3 additions & 0 deletions app/routers/single_neuron_synaptome.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.single_neuron_synaptome.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.single_neuron_synaptome.admin_update_one
)
3 changes: 3 additions & 0 deletions app/routers/single_neuron_synaptome_simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,6 @@
admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(
app.service.single_neuron_synaptome_simulation.admin_read_one
)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(
app.service.single_neuron_synaptome_simulation.admin_update_one
)
11 changes: 9 additions & 2 deletions app/routers/species.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
from fastapi import APIRouter

import app.service.species
from app.routers.admin import router as admin_router

ROUTE = "species"

router = APIRouter(
prefix="/species",
tags=["species"],
prefix=f"/{ROUTE}",
tags=[ROUTE],
)

read_many = router.get("")(app.service.species.read_many)
read_one = router.get("/{id_}")(app.service.species.read_one)
create_one = router.post("")(app.service.species.create_one)
update_one = router.patch("/{id_}")(app.service.species.update_one)

admin_read_one = admin_router.get(f"/{ROUTE}/{{id_}}")(app.service.species.admin_read_one)
admin_update_one = admin_router.patch(f"/{ROUTE}/{{id_}}")(app.service.species.admin_update_one)
Loading