diff --git a/tools/.DS_Store b/tools/.DS_Store index 56d7ac2..55ab033 100644 Binary files a/tools/.DS_Store and b/tools/.DS_Store differ diff --git a/tools/qmratool/.DS_Store b/tools/qmratool/.DS_Store index 0cb7680..33b07d4 100644 Binary files a/tools/qmratool/.DS_Store and b/tools/qmratool/.DS_Store differ diff --git a/tools/qmratool/forms.py b/tools/qmratool/forms.py index 33fe717..344632a 100644 --- a/tools/qmratool/forms.py +++ b/tools/qmratool/forms.py @@ -14,7 +14,7 @@ from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Field, ButtonHolder, Submit, Div from formtools.wizard.views import SessionWizardView - +from django.forms import modelformset_factory class RAForm(forms.ModelForm): def __init__(self, user, *args, **kwargs): @@ -64,10 +64,26 @@ class Meta: class InflowForm(forms.ModelForm): + #min = forms.DecimalField(label="Minimum Logremoval") + #max = forms.DecimalField(label="Maximum Logremoval") class Meta: model = Inflow - fields = ["pathogen", "min", "max", "reference"] - + fields = ['pathogen', 'min', 'max'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.helper = FormHelper(self) + self.fields['pathogen'].disabled = True + self.fields['min'].label = "Minimum concentration" + self.fields['max'].label = "Maximum concentration" + + self.helper.layout = Layout( + 'pathogen', + 'min', + 'max', + # Add more fields as needed + ) +InflowFormSet = modelformset_factory(Inflow, form=InflowForm, extra=3) class ExposureForm(forms.ModelForm): class Meta: @@ -109,12 +125,18 @@ class Meta: class LogRemovalForm(forms.ModelForm): class Meta: model = LogRemoval - fields = ["min", "max", "pathogen_group", "reference"] + fields = ["pathogen_group", "reference","min", "max"] def __init__(self, *args, **kwargs): super(LogRemovalForm, self).__init__(*args, **kwargs) self.fields["reference"].queryset = Reference.objects.filter(id=51) - self.fields["pathogen_group"].widget = forms.HiddenInput() + self.fields['reference'].disabled = True + self.fields['pathogen_group'].disabled = True + self.fields['min'].label = "Minimum Logremoval" + self.fields['max'].label = "Maximum Logremoval" + #self.fields["pathogen_group"].widget = forms.HiddenInput() + +LogRemovalFormSet = modelformset_factory(LogRemoval, form=LogRemovalForm, extra=3) class ComparisonForm(forms.ModelForm): diff --git a/tools/qmratool/migrations/0003_sourcewater_user_alter_inflow_water_source.py b/tools/qmratool/migrations/0003_sourcewater_user_alter_inflow_water_source.py new file mode 100644 index 0000000..0254901 --- /dev/null +++ b/tools/qmratool/migrations/0003_sourcewater_user_alter_inflow_water_source.py @@ -0,0 +1,33 @@ +# Generated by Django 4.1.2 on 2024-04-23 14:31 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + dependencies = [ + ("qmratool", "0002_riskassessment_created_at"), + ] + + operations = [ + migrations.AddField( + model_name="sourcewater", + name="user", + field=models.ForeignKey( + default=1, + on_delete=django.db.models.deletion.CASCADE, + related_name="sourcewaters", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="inflow", + name="water_source", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="inflow", + to="qmratool.sourcewater", + ), + ), + ] diff --git a/tools/qmratool/models.py b/tools/qmratool/models.py index d5af806..bf732e6 100644 --- a/tools/qmratool/models.py +++ b/tools/qmratool/models.py @@ -9,8 +9,11 @@ class User(AbstractUser): class SourceWater(models.Model): + user = models.ForeignKey( + User, related_name="sourcewaters", default=1, on_delete=models.CASCADE + ) water_source_name = models.CharField(max_length=64) - water_source_description = models.CharField(max_length=2000) + water_source_description = models.TextField(max_length=2000) def __str__(self): return self.water_source_name @@ -40,16 +43,38 @@ class Treatment(models.Model): ) description = models.TextField(max_length=1000) - # category = models.CharField(max_length=64, default = "wastewater") def __str__(self): return self.name + def get_lrv(self, pathogen_group): + try: + return self.logremoval.get(pathogen_group__pathogen_group=pathogen_group) + except self.logremoval.model.DoesNotExist: + return None + def serialize(self): + def get_min_max(pathogen_group): + lrv = self.get_lrv(pathogen_group) + if lrv is not None: + return float(lrv.min), float(lrv.max) + else: + return 'n.a.', 'n. a.' + + virus_min, virus_max = get_min_max("Viruses") + bacteria_min, bacteria_max = get_min_max("Bacteria") + protozoa_min, protozoa_max = get_min_max("Protozoa") + return { "id": self.id, "name": self.name, "description": self.description, "group": self.group, + "virus_min": virus_min, + "virus_max": virus_max, + "bacteria_min": bacteria_min, + "bacteria_max": bacteria_max, + "protozoa_min": protozoa_min, + "protozoa_max": protozoa_max, } @@ -103,9 +128,9 @@ class LogRemoval(models.Model): class Inflow(models.Model): pathogen = models.ForeignKey(Pathogen, on_delete=models.CASCADE) reference = models.ForeignKey(Reference, on_delete=models.CASCADE) - water_source = models.ForeignKey(SourceWater, on_delete=models.CASCADE) - min = models.DecimalField(decimal_places=8, default=-100, max_digits=20) - max = models.DecimalField(decimal_places=8, default=-100, max_digits=20) + water_source = models.ForeignKey(SourceWater, on_delete=models.CASCADE, related_name="inflow") + min = models.DecimalField(decimal_places=8, default=100, max_digits=20) + max = models.DecimalField(decimal_places=8, default=100, max_digits=20) mean = models.DecimalField(decimal_places=8, max_digits=20, default=-100, null=True) alpha = models.DecimalField( decimal_places=8, max_digits=20, default=-100, null=True @@ -115,6 +140,9 @@ class Inflow(models.Model): pathogen_in_ref = models.CharField(max_length=200, default="unknown") notes = models.CharField(max_length=200, default="unknown") + #def get_absolute_url(self): + # return reverse("inflow-detail", kwargs={"pk": self.pk}) + class Health(models.Model): pathogen = models.ForeignKey(Pathogen, on_delete=models.CASCADE) diff --git a/tools/qmratool/static/qmratool/option.js b/tools/qmratool/static/qmratool/option.js index f95133c..abdc173 100644 --- a/tools/qmratool/static/qmratool/option.js +++ b/tools/qmratool/static/qmratool/option.js @@ -76,7 +76,14 @@ document.addEventListener('DOMContentLoaded', function() { // Customize content based on the field if (fieldName === 'exposure') { return `${titleCaseDataName}
${data.description}
Events per year [N]: ${data.events_per_year}
Volume per event [L]: ${data.volume_per_event}`; - } else { + } else if (fieldName === 'treatment') { + return `${titleCaseDataName}
${data.description}
+ Virus removal: ${data.virus_min}-${data.virus_max}
+ Bacteria removal:: ${data.bacteria_min}-${data.bacteria_max}
+ Protozoa removal:: ${data.protozoa_min}-${data.protozoa_max}`; + + } + else { return `${titleCaseDataName}
${data.description}`; } } diff --git a/tools/qmratool/templates/qmratool/inflow_form.html b/tools/qmratool/templates/qmratool/inflow_form.html new file mode 100644 index 0000000..751ddde --- /dev/null +++ b/tools/qmratool/templates/qmratool/inflow_form.html @@ -0,0 +1,24 @@ + +{% extends "qmratool/layout.html" %}!-- Extend your base template --> +{% load crispy_forms_tags %} +{% block body %} + +
+
+
+

Create a new Inflow

+
+ {% csrf_token %} + {{ source_form|crispy }} + {{ inflow_formset.management_form }} + {% for form in inflow_formset %} +
+ {{ form|crispy }} +
+ {% endfor %} + +
+
+
+
+{% endblock %} diff --git a/tools/qmratool/templates/qmratool/layout.html b/tools/qmratool/templates/qmratool/layout.html index bf85bc8..ffb3843 100644 --- a/tools/qmratool/templates/qmratool/layout.html +++ b/tools/qmratool/templates/qmratool/layout.html @@ -41,10 +41,10 @@

QMRA

My Risk Assessments