Skip to content
Merged
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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ qmra-prod.db
dump*
prod-migrations/
*.tar
.vscode
.vscode
test.zip
18 changes: 9 additions & 9 deletions infra/helm/qmra/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,6 @@ spec:
{{- include "app.labels" . | nindent 8 }}
spec:
initContainers:
- name: move-static
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
envFrom:
- configMapRef:
name: {{ .Values.configmap_name }}
volumeMounts:
- name: static
mountPath: {{ .Values.static.mount_path }}
command: [ python, manage.py, collectstatic, --noinput ]
- name: migrate
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
envFrom:
Expand All @@ -46,6 +37,15 @@ spec:
- name: qmra-default
mountPath: {{ .Values.qmra_default.mount_path }}
command: [ python, manage.py, migrate, --database, qmra ]
- name: move-static
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
envFrom:
- configMapRef:
name: {{ .Values.configmap_name }}
volumeMounts:
- name: static
mountPath: {{ .Values.static.mount_path }}
command: [ python, manage.py, collectstatic, --noinput ]
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
Expand Down
6 changes: 5 additions & 1 deletion qmra/risk_assessment/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,14 @@ class QMRATreatmentAdmin(admin.ModelAdmin):
("name", "group"),
("bacteria_min", "bacteria_max"),
"bacteria_reference",
"bacteria_references",
("viruses_min", "viruses_max"),
"viruses_reference",
"viruses_references",
("protozoa_min", "protozoa_max"),
"protozoa_reference"
"protozoa_reference",
"protozoa_references"
]
filter_horizontal = ["bacteria_references", "viruses_references", "protozoa_references"]

save_model = save_model
3 changes: 2 additions & 1 deletion qmra/risk_assessment/dbrouter.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
if model_name is not None and "qmra" in model_name:
return db == "qmra"
return db == "default"
# model_name is None when the migration is a RunPython or a RunSQL
return db == "default" or model_name is None
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 5.0.6 on 2026-01-15 12:42

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('risk_assessment', '0006_qmrapathogen_qmrareference_qmrasource_qmraexposure_and_more'),
]

operations = [
migrations.AddField(
model_name='qmratreatment',
name='bacteria_references',
field=models.ManyToManyField(related_name='bacteria_lrvs', to='risk_assessment.qmrareference'),
),
migrations.AddField(
model_name='qmratreatment',
name='protozoa_references',
field=models.ManyToManyField(related_name='protozoa_lrvs', to='risk_assessment.qmrareference'),
),
migrations.AddField(
model_name='qmratreatment',
name='viruses_references',
field=models.ManyToManyField(related_name='viruses_lrvs', to='risk_assessment.qmrareference'),
),
]
25 changes: 25 additions & 0 deletions qmra/risk_assessment/migrations/0008_auto_20260115_1342.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 5.0.6 on 2026-01-15 12:42

from django.db import migrations


def migrate_references(apps, schema_editor):
if schema_editor.connection.alias != "qmra":
return
QMRATreatment = apps.get_model("risk_assessment", "QMRATreatment")
for treatment in QMRATreatment.objects.all():

treatment.bacteria_references.add(treatment.bacteria_reference)
treatment.viruses_references.add(treatment.viruses_reference)
treatment.protozoa_references.add(treatment.protozoa_reference)


class Migration(migrations.Migration):

dependencies = [
('risk_assessment', '0007_qmratreatment_bacteria_references_and_more'),
]

operations = [
migrations.RunPython(migrate_references),
]
31 changes: 31 additions & 0 deletions qmra/risk_assessment/migrations/0009_auto_20260121_1454.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Generated by Django 5.0.6 on 2026-01-15 12:42
from django.core.management import call_command
from django.db import migrations


def migrate_references(apps, schema_editor):
if schema_editor.connection.alias != "qmra":
return
QMRATreatment = apps.get_model("risk_assessment", "QMRATreatment")
all_treatments = QMRATreatment.objects.all()
if len(all_treatments) == 0:
call_command("seed_default_db")
all_treatments = QMRATreatment.objects.all()
for treatment in all_treatments:

treatment.bacteria_references.add(treatment.bacteria_reference)
treatment.viruses_references.add(treatment.viruses_reference)
treatment.protozoa_references.add(treatment.protozoa_reference)
treatment.save()
call_command("export_default")


class Migration(migrations.Migration):

dependencies = [
('risk_assessment', '0008_auto_20260115_1342'),
]

operations = [
migrations.RunPython(migrate_references),
]
9 changes: 9 additions & 0 deletions qmra/risk_assessment/qmra_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,14 +270,19 @@ class QMRATreatment(models.Model):
bacteria_max: Optional[float] = models.FloatField(blank=True, null=True)
bacteria_reference = models.ForeignKey(QMRAReference, blank=True, null=True, on_delete=models.CASCADE,
related_name="bacteria_lrv")
bacteria_references = models.ManyToManyField(QMRAReference, related_name="bacteria_lrvs")

viruses_min: Optional[float] = models.FloatField(blank=True, null=True)
viruses_max: Optional[float] = models.FloatField(blank=True, null=True)
viruses_reference = models.ForeignKey(QMRAReference, blank=True, null=True, on_delete=models.CASCADE,
related_name="viruses_lrv")
viruses_references = models.ManyToManyField(QMRAReference, related_name="viruses_lrvs")

protozoa_min: Optional[float] = models.FloatField(blank=True, null=True)
protozoa_max: Optional[float] = models.FloatField(blank=True, null=True)
protozoa_reference = models.ForeignKey(QMRAReference, blank=True, null=True, on_delete=models.CASCADE,
related_name="protozoa_lrv")
protozoa_references = models.ManyToManyField(QMRAReference, related_name="protozoa_lrvs")

@classmethod
def from_dict(cls, data):
Expand All @@ -288,6 +293,7 @@ def from_dict(cls, data):
description=data['description'],
bacteria_min=data['bacteria_min'],
bacteria_max=data['bacteria_max'],
# TODO: *_referenceS (m2m fields...)
bacteria_reference_id=int(data["bacteria_reference"]) \
if data["bacteria_reference"] is not None else None,
viruses_min=data['viruses_min'],
Expand All @@ -303,8 +309,11 @@ def from_dict(cls, data):
def to_dict(self):
data = model_to_dict(self)
data["bacteria_reference"] = str(self.bacteria_reference.pk) if self.bacteria_reference is not None else None
data["bacteria_references"] = [str(ref.pk) for ref in self.bacteria_references.all()]
data["viruses_reference"] = str(self.viruses_reference.pk) if self.viruses_reference is not None else None
data["viruses_references"] = [str(ref.pk) for ref in self.viruses_references.all()]
data["protozoa_reference"] = str(self.protozoa_reference.pk) if self.protozoa_reference is not None else None
data["protozoa_references"] = [str(ref.pk) for ref in self.protozoa_references.all()]
return data


Expand Down
24 changes: 13 additions & 11 deletions qmra/risk_assessment/templates/treatments-form-js.html
Original file line number Diff line number Diff line change
Expand Up @@ -388,22 +388,24 @@
var inner = "";
for (const treatment of this.treatments){
if (!uniques.has(treatment.name)){
const virus_ref = this.references[treatment.viruses_reference]
const bacteria_ref = this.references[treatment.bacteria_reference]
const protozoa_ref = this.references[treatment.protozoa_reference]
const all_refs_id = new Set();
for (const r of [...treatment.viruses_references, ...treatment.bacteria_references, ...treatment.protozoa_references]){
all_refs_id.add(r);
}
const superscripts = [...all_refs_id].map((r, i) => { return `<sup>[${i+1}]</sup>` }).join('');
const ref_footnotes = [...all_refs_id].map((r, i) => {
const ref = this.references[r];
return `<div class="small"><sup>[${i+1}]</sup>values taken from <a href="${ref.ReferenceLink}">${ref.ReferenceName}</a></div>`;
}).join('');
uniques.add(treatment.name)
const ref = virus_ref === undefined ?
bacteria_ref === undefined ? protozoa_ref === undefined ? "#" : protozoa_ref : bacteria_ref : virus_ref
const link = ref.ReferenceLink;
const name = ref.ReferenceName;
inner += `<li>
<h5>${treatment.name}</h5>
<h5>${treatment.name}${superscripts}</h5>
<div class="text-muted small mb-4">${treatment.description}</div>
<table class="table small">
<tr>
<th>Pathogen group</th>
<th>Minimum LRV<sup>[1]</sup></th>
<th>Maximum LRV<sup>[1]</sup></th>
<th>Minimum LRV</th>
<th>Maximum LRV</th>
</tr>
<tr>
<td>Viruses</td>
Expand All @@ -422,7 +424,7 @@ <h5>${treatment.name}</h5>
</tr>

</table>
<div class="small"><sup>[1]</sup>values taken from <a href="${link}">${name}</a></p>
${ref_footnotes}
</li>
`
}
Expand Down
2 changes: 1 addition & 1 deletion qmra/risk_assessment/tests/test_assess_risk.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def test_with_all_pathogens(self):
) for p, _ in QMRAPathogens.data.items()
]
given_treatments = [
Treatment.from_default(QMRATreatments.get("Conventional clarification"), given_ra),
Treatment.from_default(QMRATreatments.get("Coagulation, flocculation and media filtration"), given_ra),
Treatment.from_default(QMRATreatments.get("Slow sand filtration"), given_ra),
]
given_ra.inflows.set(given_inflows, bulk=False)
Expand Down
2 changes: 1 addition & 1 deletion qmra/static/data/default-references.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion qmra/static/data/default-treatments.json

Large diffs are not rendered by default.

Loading