Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions src/routers/resource_routers/case_study_router.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
from fastapi import Query, Depends, APIRouter

from authentication import KeycloakUser, get_user_or_none
from database.model.case_study.case_study import CaseStudy, case_study_versions
from dependencies.filtering import ResourceFiltersParams
from dependencies.pagination import PaginationParams
from dependencies.sorting import SortingParams
from routers.resource_routers.organisation_router import add_custom_routes
from routers.resource_ai_asset_router import ResourceAIAssetRouter
from versioning import Version


class CaseStudyRouter(ResourceAIAssetRouter):
Expand All @@ -19,6 +27,49 @@ def resource_name_plural(self) -> str:
def resource_class(self) -> type[CaseStudy]:
return CaseStudy

def get_resources_func(self):
def get_resources(
pagination: PaginationParams,
sorting: SortingParams,
resource_filters: ResourceFiltersParams,
schema: self._possible_schemas_type = "aiod", # type:ignore
get_image: bool = Query(False, description="Include image bytes in response?"),
user: KeycloakUser | None = Depends(get_user_or_none),
):
return self.get_resources(
schema=schema,
pagination=pagination,
sorting=sorting,
resource_filters=resource_filters,
user=user,
get_image=get_image,
)

return get_resources

def get_resource_func(self):
def get_resource(
identifier: str,
schema: self._possible_schemas_type = "aiod", # type: ignore
get_image: bool = Query(False, description="Include image bytes in response?"),
user: KeycloakUser | None = Depends(get_user_or_none),
):
resource = self.get_resource(
identifier=identifier, schema=schema, user=user, platform=None, get_image=get_image
)

return resource

return get_resource

def create(self, url_prefix: str, version: Version = Version.LATEST) -> APIRouter:
router = super().create(url_prefix, version)

path = f"/{self.resource_name_plural}/{{identifier}}/image"
add_custom_routes(self, router, path)

return router


case_study_routers = {
version: CaseStudyRouter(versioned_resource)
Expand Down
51 changes: 51 additions & 0 deletions src/routers/resource_routers/event_router.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
from fastapi import Query, Depends, APIRouter

from authentication import KeycloakUser, get_user_or_none
from database.model.event.event import Event, event_versions
from dependencies.filtering import ResourceFiltersParams
from dependencies.pagination import PaginationParams
from dependencies.sorting import SortingParams
from routers.resource_routers.organisation_router import add_custom_routes
from routers.resource_router import ResourceRouter
from versioning import Version


class EventRouter(ResourceRouter):
Expand All @@ -19,6 +27,49 @@ def resource_name_plural(self) -> str:
def resource_class(self) -> type[Event]:
return Event

def get_resources_func(self):
def get_resources(
pagination: PaginationParams,
sorting: SortingParams,
resource_filters: ResourceFiltersParams,
schema: self._possible_schemas_type = "aiod", # type:ignore
get_image: bool = Query(False, description="Include image bytes in response?"),
user: KeycloakUser | None = Depends(get_user_or_none),
):
return self.get_resources(
schema=schema,
pagination=pagination,
sorting=sorting,
resource_filters=resource_filters,
user=user,
get_image=get_image,
)

return get_resources

def get_resource_func(self):
def get_resource(
identifier: str,
schema: self._possible_schemas_type = "aiod", # type: ignore
get_image: bool = Query(False, description="Include image bytes in response?"),
user: KeycloakUser | None = Depends(get_user_or_none),
):
resource = self.get_resource(
identifier=identifier, schema=schema, user=user, platform=None, get_image=get_image
)

return resource

return get_resource

def create(self, url_prefix: str, version: Version = Version.LATEST) -> APIRouter:
router = super().create(url_prefix, version)

path = f"/{self.resource_name_plural}/{{identifier}}/image"
add_custom_routes(self, router, path)

return router


event_routers = {
version: EventRouter(versioned_resource)
Expand Down
51 changes: 51 additions & 0 deletions src/routers/resource_routers/news_router.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
from fastapi import Query, Depends, APIRouter

from authentication import KeycloakUser, get_user_or_none
from database.model.news.news import News, news_versions
from dependencies.filtering import ResourceFiltersParams
from dependencies.pagination import PaginationParams
from dependencies.sorting import SortingParams
from routers.resource_routers.organisation_router import add_custom_routes
from routers.resource_router import ResourceRouter
from versioning import Version


class NewsRouter(ResourceRouter):
Expand All @@ -19,6 +27,49 @@ def resource_name_plural(self) -> str:
def resource_class(self) -> type[News]:
return News

def get_resources_func(self):
def get_resources(
pagination: PaginationParams,
sorting: SortingParams,
resource_filters: ResourceFiltersParams,
schema: self._possible_schemas_type = "aiod", # type:ignore
get_image: bool = Query(False, description="Include image bytes in response?"),
user: KeycloakUser | None = Depends(get_user_or_none),
):
return self.get_resources(
schema=schema,
pagination=pagination,
sorting=sorting,
resource_filters=resource_filters,
user=user,
get_image=get_image,
)

return get_resources

def get_resource_func(self):
def get_resource(
identifier: str,
schema: self._possible_schemas_type = "aiod", # type: ignore
get_image: bool = Query(False, description="Include image bytes in response?"),
user: KeycloakUser | None = Depends(get_user_or_none),
):
resource = self.get_resource(
identifier=identifier, schema=schema, user=user, platform=None, get_image=get_image
)

return resource

return get_resource

def create(self, url_prefix: str, version: Version = Version.LATEST) -> APIRouter:
router = super().create(url_prefix, version)

path = f"/{self.resource_name_plural}/{{identifier}}/image"
add_custom_routes(self, router, path)

return router


news_routers = {
version: NewsRouter(versioned_resource) for version, versioned_resource in news_versions.items()
Expand Down
47 changes: 24 additions & 23 deletions src/tests/routers/resource_routers/test_image_subrouters.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@


@pytest.fixture(params=[
"organisation", "project",
"organisation", "project", "case_study", "event", "news",
])
def resource_pair(request):
resource_name = request.param
resource = request.getfixturevalue(request.param)
return resource_name, resource
plural_name = "case_studies" if resource_name == "case_study" else ("news" if resource_name == "news" else f"{resource_name}s")
return plural_name, resource


def test_post_image(
Expand All @@ -30,7 +31,7 @@ def test_post_image(

with logged_in_user():
response = client.post(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "logo"},
files={"file": ("logo.png", fake_image, "image/png")},
headers={"Authorization": "Fake token"},
Expand All @@ -50,7 +51,7 @@ def test_post_image_too_large(

with logged_in_user():
response = client.post(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "big_logo"},
files={"file": ("big_logo.png", large_image, "image/png")},
headers={"Authorization": "Fake token"},
Expand All @@ -67,7 +68,7 @@ def test_post_image_incorrect_type(client: TestClient, resource_pair):

with logged_in_user():
response = client.post(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "wrong_logo_type"},
files={"file": ("wrong_logo_type.pdf", pdf_data, "application/pdf")},
headers={"Authorization": "Fake token"},
Expand All @@ -89,14 +90,14 @@ def test_put_image(

with logged_in_user():
response = client.post(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "logo"},
files={"file": ("logo.png", fake_image, "image/png")},
headers={"Authorization": "Fake token"},
)

response = client.put(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "logo"},
files={"file": ("logo.png", fake_image, "image/png")},
headers={"Authorization": "Fake token"},
Expand All @@ -117,7 +118,7 @@ def test_put_image_non_existent(
with logged_in_user():

response = client.put(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "LOGO"},
files={"file": ("logo.png", fake_image, "image/png")},
headers={"Authorization": "Fake token"},
Expand All @@ -136,15 +137,15 @@ def test_get_with_and_without_image(client: TestClient, resource_pair, get_image

with logged_in_user():
response = client.post(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "logo"},
files={"file": ("logo.png", fake_image, "image/png")},
headers={"Authorization": "Fake token"},
)

assert response.status_code == HTTPStatus.OK, response.json()

response = client.get(f"/{name}s/{identifier}?get_image={str(get_image).lower()}")
response = client.get(f"/{name}/{identifier}?get_image={str(get_image).lower()}")
assert response.status_code == HTTPStatus.OK

response = response.json()
Expand All @@ -169,15 +170,15 @@ def test_get_image(

with logged_in_user():
response = client.post(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "logo"},
files={"file": ("logo.png", fake_image, "image/png")},
headers={"Authorization": "Fake token"},
)


response = client.get(
f"/{name}s/{identifier}/image"
f"/{name}/{identifier}/image"
)
assert response.status_code == HTTPStatus.OK
response = response.json()
Expand All @@ -193,7 +194,7 @@ def test_get_image_non_existent(
name, resource = resource_pair
identifier = register_asset(resource)
response = client.get(
f"/{name}s/{identifier}/image"
f"/{name}/{identifier}/image"
)
assert response.status_code == HTTPStatus.OK
assert response.json() == []
Expand All @@ -209,21 +210,21 @@ def test_delete_image(

with logged_in_user():
response = client.post(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "logo"},
files={"file": ("logo.png", fake_image, "image/png")},
headers={"Authorization": "Fake token"},
)

response = client.delete(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "logo"},
headers={"Authorization": "Fake token"},
)
assert response.status_code == HTTPStatus.OK

second_delete_response = client.delete(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "logo"},
headers={"Authorization": "Fake token"},
)
Expand All @@ -244,7 +245,7 @@ def test_put_without_media_keeps_media(

with logged_in_user():
response = client.post(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "logo"},
files={"file": ("logo.png", fake_image, "image/png")},
headers={"Authorization": "Fake token"},
Expand All @@ -253,13 +254,13 @@ def test_put_without_media_keeps_media(

resource.name = "new name"
response = client.put(
f"/{name}s/{identifier}",
f"/{name}/{identifier}",
json=jsonable_encoder(resource.dict()),
headers={"Authorization": "Fake token"},
)
assert response.status_code == HTTPStatus.OK, response.json()
response = client.get(
f"/{name}s/{identifier}",
f"/{name}/{identifier}",
headers={"Authorization": "Fake token"},
)
assert response.status_code == HTTPStatus.OK, response.json()
Expand All @@ -280,15 +281,15 @@ def test_put_with_media_keeps_media_if_no_new_binary(

with logged_in_user():
response = client.post(
f"/{name}s/{identifier}/image",
f"/{name}/{identifier}/image",
params={"name": "logo"},
files={"file": ("logo.png", fake_image, "image/png")},
headers={"Authorization": "Fake token"},
)
assert response.status_code == HTTPStatus.OK, response.json()

response = client.get(
f"/{name}s/{identifier}?get_image=true",
f"/{name}/{identifier}?get_image=true",
headers={"Authorization": "Fake token"},
)
org = response.json()
Expand All @@ -297,15 +298,15 @@ def test_put_with_media_keeps_media_if_no_new_binary(
{"name": "foo", "binary_blob": "bar="},
)
response = client.put(
f"/{name}s/{identifier}",
f"/{name}/{identifier}",
json=org,
headers={"Authorization": "Fake token"},
)
assert response.status_code == HTTPStatus.BAD_REQUEST, "No new binary may be added through a PUT request"

org["media"].pop()
response = client.put(
f"/{name}s/{identifier}",
f"/{name}/{identifier}",
json=org,
headers={"Authorization": "Fake token"},
)
Expand Down
Loading