From cc39af629928d7f707bb36befb28f5f3386ddf3a Mon Sep 17 00:00:00 2001 From: Frederick Muriuki Muriithi Date: Tue, 3 Sep 2024 13:50:30 -0500 Subject: Provide generic way to select species. --- uploader/species/models.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'uploader/species') diff --git a/uploader/species/models.py b/uploader/species/models.py index 481f8be..53e7de0 100644 --- a/uploader/species/models.py +++ b/uploader/species/models.py @@ -1,5 +1,7 @@ """Database functions for species.""" +import math from typing import Optional +from functools import reduce import MySQLdb as mdb from MySQLdb.cursors import DictCursor @@ -9,11 +11,27 @@ def all_species(conn: mdb.Connection) -> tuple: with conn.cursor(cursorclass=DictCursor) as cursor: cursor.execute( "SELECT Id AS SpeciesId, SpeciesName, LOWER(Name) AS Name, " - "MenuName, FullName, TaxonomyId FROM Species") + "MenuName, FullName, TaxonomyId, Family, FamilyOrderId, OrderId " + "FROM Species ORDER BY FamilyOrderId ASC, OrderID ASC") return tuple(cursor.fetchall()) return tuple() +def order_species_by_family(species: tuple[dict, ...]) -> list: + """Order the species by their family""" + def __family_order_id__(item): + orderid = item["FamilyOrderId"] + return math.inf if orderid is None else orderid + def __order__(ordered, current): + _key = (__family_order_id__(current), current["Family"]) + return { + **ordered, + _key: ordered.get(_key, tuple()) + (current,) + } + ordered = reduce(__order__, species, {}) + return sorted(tuple(ordered.items()), key=lambda item: item[0][0]) + + def species_by_id(conn: mdb.Connection, speciesid) -> dict: "Retrieve the species from the database by id." with conn.cursor(cursorclass=DictCursor) as cursor: -- cgit v1.2.3