From d9a1fd827df55b79a30fc97d37ab58f49f29d40f Mon Sep 17 00:00:00 2001
From: karlnyr
Date: Fri, 7 Nov 2025 10:39:03 +0100
Subject: [PATCH 1/6] alter species parsing from url
---
microSALT/utils/referencer.py | 31 ++++++++++++++++---------------
1 file changed, 16 insertions(+), 15 deletions(-)
diff --git a/microSALT/utils/referencer.py b/microSALT/utils/referencer.py
index d76d8cde..55d21211 100644
--- a/microSALT/utils/referencer.py
+++ b/microSALT/utils/referencer.py
@@ -1,5 +1,5 @@
"""Compares existing organism references with available and updates as needed
- By: Isak Sylvin, @sylvinite"""
+By: Isak Sylvin, @sylvinite"""
#!/usr/bin/env python
import glob
@@ -8,13 +8,13 @@
import shutil
import subprocess
import urllib.request
-from Bio import Entrez
-from typing import Tuple, Union, Optional
import xml.etree.ElementTree as ET
+from typing import Optional, Tuple, Union
+
+from Bio import Entrez
-from microSALT.utils.pubmlst.client import BaseClient, PubMLSTClient, get_client
-from microSALT.utils.pubmlst.authentication import ClientAuthentication
from microSALT.store.db_manipulator import DB_Manipulator
+from microSALT.utils.pubmlst.client import BaseClient, get_client
from microSALT.utils.pubmlst.exceptions import InvalidURLError, PubMLSTError
from microSALT.utils.pubmlst.helpers import get_service_by_url
@@ -68,16 +68,16 @@ def identify_new(self, cg_id="", project=False):
if ref not in self.organisms and org not in neworgs:
neworgs.append(org)
if (
- not "{}.fasta".format(entry.get("reference"))
- in os.listdir(self.config["folders"]["genomes"])
- and not entry.get("reference") in newrefs
+ "{}.fasta".format(entry.get("reference"))
+ not in os.listdir(self.config["folders"]["genomes"])
+ and entry.get("reference") not in newrefs
):
newrefs.append(entry.get("reference"))
for org in neworgs:
self.add_pubmlst(org)
for org in newrefs:
self.download_ncbi(org)
- except Exception as e:
+ except Exception:
self.logger.error(
"Unable to retrieve reference! Analysis using said reference will fail!"
)
@@ -128,7 +128,7 @@ def index_db(self, full_dir, suffix):
)
proc = subprocess.Popen(bash_cmd.split(), cwd=full_dir, stdout=subprocess.PIPE)
proc.communicate()
- except Exception as e:
+ except Exception:
self.logger.error(
"Unable to index requested target {} in {}".format(file, full_dir)
)
@@ -267,8 +267,9 @@ def fetch_external(self) -> None:
return
try:
for entry in root:
- species = entry.text.strip()
- organ = species.lower().replace(" ", "_")
+ # Some species have extra names that are not expected, such as Klebsiella pneumoniae species complex, when we expect just Klebsiella pneumoniae
+ species = entry.text.strip().lower.split(" ")[:2]
+ organ = "_".join(species)
if "escherichia_coli" in organ and "#1" in organ:
organ = organ[:-2]
if organ in self.organisms:
@@ -352,7 +353,7 @@ def fetch_resistances(self, force=False):
stderr=subprocess.STDOUT,
)
output, error = process.communicate()
- if not "Already up-to-date." in str(output):
+ if "Already up-to-date." not in str(output):
self.logger.info("Remote resFinder database updated. Syncing...")
wipeIndex = True
else:
@@ -427,7 +428,7 @@ def download_ncbi(self, reference):
)
out, err = proc.communicate()
self.logger.info("Downloaded reference {}".format(reference))
- except Exception as e:
+ except Exception:
self.logger.warning("Unable to download genome '{}' from NCBI".format(reference))
def add_pubmlst(self, organism: str):
@@ -452,7 +453,7 @@ def add_pubmlst(self, organism: str):
if not subtype["description"].lower().startswith(part):
missingPart = True
else:
- if not part in subtype["description"].lower():
+ if part not in subtype["description"].lower():
missingPart = True
if not missingPart:
# Seqdef always appear after isolates, so this is fine
From 134b772fd7ef844fe0bee73fd51ea1a8dfcfde51 Mon Sep 17 00:00:00 2001
From: karlnyr
Date: Fri, 7 Nov 2025 10:51:46 +0100
Subject: [PATCH 2/6] add list of verified organism to typing report
---
microSALT/server/templates/typing_page.html | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/microSALT/server/templates/typing_page.html b/microSALT/server/templates/typing_page.html
index c167642e..253829dd 100644
--- a/microSALT/server/templates/typing_page.html
+++ b/microSALT/server/templates/typing_page.html
@@ -213,6 +213,11 @@ Analysbegränsningar för: {{topsample.application_tag}}
Laboratoriet har inte haft ansvar för provtagningsstadiet och extraktion, resultaten gäller för provet såsom det har mottagits.
Typningen begränsas av den information som vid analys återfinns i de publikt tillgängliga databaserna pubMLST och resFinder.
Tillförlitligheten hos resultaten förutsätter dels att informationen som bifogats från kund är korrekt. Dels att proverna uppnår de fördefinierade tröskelvärdena; och dels att de organismerna som analyseras har tidigare manuellt verifierats tidigare av personal på Clinical Genomics.
+ Clinical Genomics har verifierat och validerat resultaten för följande organismer:
+
+ {% for org in verified_organisms %}
+ {{org}}
+ {% endfor %}.
Avvikelser från metoden
From 28e7520f5853749cfd2a67c49ab339c608597cab Mon Sep 17 00:00:00 2001
From: karlnyr
Date: Fri, 7 Nov 2025 10:55:31 +0100
Subject: [PATCH 3/6] update version
---
microSALT/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/microSALT/__init__.py b/microSALT/__init__.py
index a0b8416e..b33329d4 100644
--- a/microSALT/__init__.py
+++ b/microSALT/__init__.py
@@ -12,7 +12,7 @@
from flask import Flask
-__version__ = "4.2.5"
+__version__ = "4.2.7"
app = Flask(__name__, template_folder="server/templates")
app.config.setdefault("SQLALCHEMY_DATABASE_URI", "sqlite:///:memory:")
From 4802785d5e52a5cf6cf1d5aebe2468d514baf393 Mon Sep 17 00:00:00 2001
From: karlnyr
Date: Mon, 10 Nov 2025 15:05:21 +0100
Subject: [PATCH 4/6] move list to its own ul section
---
microSALT/server/templates/typing_page.html | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/microSALT/server/templates/typing_page.html b/microSALT/server/templates/typing_page.html
index 253829dd..3a38fca3 100644
--- a/microSALT/server/templates/typing_page.html
+++ b/microSALT/server/templates/typing_page.html
@@ -213,12 +213,14 @@ Analysbegränsningar för: {{topsample.application_tag}}
Laboratoriet har inte haft ansvar för provtagningsstadiet och extraktion, resultaten gäller för provet såsom det har mottagits.
Typningen begränsas av den information som vid analys återfinns i de publikt tillgängliga databaserna pubMLST och resFinder.
Tillförlitligheten hos resultaten förutsätter dels att informationen som bifogats från kund är korrekt. Dels att proverna uppnår de fördefinierade tröskelvärdena; och dels att de organismerna som analyseras har tidigare manuellt verifierats tidigare av personal på Clinical Genomics.
+
Clinical Genomics har verifierat och validerat resultaten för följande organismer:
-
+
+
{% for org in verified_organisms %}
- {{org}}
- {% endfor %}.
-
+ {% endfor %}
+
Avvikelser från metoden
From 9777e68411d3850c181c7675368125c885884c16 Mon Sep 17 00:00:00 2001
From: karlnyr
Date: Mon, 10 Nov 2025 15:05:42 +0100
Subject: [PATCH 5/6] add split to external reference split
---
microSALT/utils/referencer.py | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/microSALT/utils/referencer.py b/microSALT/utils/referencer.py
index 55d21211..357b4dee 100644
--- a/microSALT/utils/referencer.py
+++ b/microSALT/utils/referencer.py
@@ -152,12 +152,12 @@ def _find_entry_for_organism(
"""Find the XML entry for a given organism name."""
organism_name = organism_name.lower().replace(" ", "_")
for entry in root:
- species = entry.text.strip()
- organ: str = species.lower().replace(" ", "_")
+ species = entry.text.strip().lower().split(" ")[:2]
+ organ: str = "_".join(species)
if "escherichia_coli" in organ and "#1" in organ:
- organ: str = organ[:-2]
- if organism_name.split("_")[0] == "escherichia":
- return entry, organ
+ if organism_name.startswith("escherichia"):
+ organ_no_suffix: str = organ[:-2]
+ return entry, organ_no_suffix
if organ == organism_name:
return entry, organ
return None, None
From ef33d53f0a1f1a70bbafc25431e74171322de0b8 Mon Sep 17 00:00:00 2001
From: karlnyr
Date: Mon, 10 Nov 2025 15:38:41 +0100
Subject: [PATCH 6/6] stylised the text
---
microSALT/server/templates/typing_page.html | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/microSALT/server/templates/typing_page.html b/microSALT/server/templates/typing_page.html
index 3a38fca3..9ddb556a 100644
--- a/microSALT/server/templates/typing_page.html
+++ b/microSALT/server/templates/typing_page.html
@@ -210,10 +210,18 @@ Teknisk beskrivning av analysen: {{topsample.application_tag}}
Analysbegränsningar för: {{topsample.application_tag}}
Analysen kan enbart beställas av gruppen Klinisk Mikrobiologi.
- Laboratoriet har inte haft ansvar för provtagningsstadiet och extraktion, resultaten gäller för provet såsom det har mottagits.
- Typningen begränsas av den information som vid analys återfinns i de publikt tillgängliga databaserna pubMLST och resFinder.
- Tillförlitligheten hos resultaten förutsätter dels att informationen som bifogats från kund är korrekt. Dels att proverna uppnår de fördefinierade tröskelvärdena; och dels att de organismerna som analyseras har tidigare manuellt verifierats tidigare av personal på Clinical Genomics.
-
+ Laboratoriet har inte haft ansvar för provtagningsstadiet och extraktion,
+ resultaten gäller för provet såsom det har mottagits.Typningen
+ begränsas av den information som vid analys återfinns i de publikt
+ tillgängliga databaserna pubMLST och resFinder.
+
+
+ Tillförlitligheten hos resultaten förutsätter dels att informationen
+ som bifogats från kund är korrekt. Dels att proverna uppnår de
+ fördefinierade tröskelvärdena; och dels att de organismerna som
+ analyseras har tidigare manuellt verifierats tidigare av personal på Clinical Genomics.
+
+
Clinical Genomics har verifierat och validerat resultaten för följande organismer: