diff --git a/app/crud/crud_body.py b/app/crud/crud_body.py index b7698fb..ac231d5 100644 --- a/app/crud/crud_body.py +++ b/app/crud/crud_body.py @@ -3,7 +3,7 @@ from fastapi.encoders import jsonable_encoder from pydantic import BaseModel -from sqlalchemy import or_ +from sqlalchemy import case, or_ from sqlalchemy.orm import Query, Session from sqlalchemy.sql import func @@ -133,6 +133,29 @@ def perform_constellation_search_filter( return query + def perform_order_by_type(self, query: Query) -> Query: + whens = { + "Other": 4, + "*": 3, + "**": 3, + "*Ass": 3, + "OCl": 2, + "GCl": 2, + "G": 1, + "Cl+N": 0, + "PN": 0, + "HII": 0, + "DrkN": 0, + "EmN": 0, + "Neb": 0, + "RfN": 0, + "SNR": 0, + } + + sort = case(value=Body.type, whens=whens).label("type") + + return query.order_by(sort) + def get_multi( self, db: Session, *, query_params: QueryParams, skip: int = 0, limit: int = 100 ) -> Tuple[List[ModelType], int]: @@ -140,6 +163,8 @@ def get_multi( # Filter w/Query Params: query = self.get_filter_query(query, query_params) + query = self.perform_order_by_type(query) + count = query.count() # Here we are ordering by apparent magnitude (mag) in descending order because diff --git a/app/tests/api/api_v1/test_bodies.py b/app/tests/api/api_v1/test_bodies.py index 25f0924..0eeabe5 100644 --- a/app/tests/api/api_v1/test_bodies.py +++ b/app/tests/api/api_v1/test_bodies.py @@ -161,16 +161,26 @@ async def test_list_bodies_within_the_constellation_orion(client: AsyncClient) - assert body["previous_page"] is None assert len(body["results"]) == 20 - assert body["results"][1]["name"] == "α Orionis" - assert body["results"][0]["name"] == "β Orionis" - assert body["results"][2]["name"] == "γ Orionis" - assert body["results"][6]["name"] == "δ Orionis" - assert body["results"][3]["name"] == "ε Orionis" - assert body["results"][4]["name"] == "ζ Orionis" - assert body["results"][7]["name"] == "ι Orionis" - assert body["results"][5]["name"] == "κ Orionis" - assert body["results"][8]["name"] == "π³ Orionis" - assert body["results"][9]["name"] == "η Orionis" + assert body["results"][0]["name"] == "Great Orion Nebula" + assert body["results"][1]["name"] == "Casper the Friendly Ghost Nebula" + assert body["results"][2]["name"] == "Da Mairan's Nebula" + assert body["results"][3]["name"] == "β Orionis" + assert body["results"][4]["name"] == "α Orionis" + assert body["results"][5]["name"] == "γ Orionis" + assert body["results"][9]["name"] == "δ Orionis" + assert body["results"][6]["name"] == "ε Orionis" + assert body["results"][7]["name"] == "ζ Orionis" + assert body["results"][10]["name"] == "ι Orionis" + assert body["results"][8]["name"] == "κ Orionis" + assert body["results"][11]["name"] == "π³ Orionis" + assert body["results"][12]["name"] == "η Orionis" + assert body["results"][13]["name"] == "λ Orionis" + assert body["results"][14]["name"] == "τ Orionis" + assert body["results"][15]["name"] == "π⁴ Orionis" + assert body["results"][16]["name"] == "ζ Orionis" + assert body["results"][17]["name"] == "π⁵ Orionis" + assert body["results"][18]["name"] == "σ Orionis" + assert body["results"][19]["name"] == "ο² Orionis" @pytest.mark.asyncio