Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Finished record samples and project data forms #227

Merged
merged 11 commits into from
Aug 31, 2023
67 changes: 50 additions & 17 deletions core/utils/samples.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,11 +174,11 @@ def save_recorded_samples(samples_data, req_user, app_name):
)

# If only recorded set sample to completed state
if sample["only_recorded"]:
if sample["only_recorded"] and sample["sample_project"] == "None":
sample["sample_state"] = "Completed"
sample["completed_date"] = datetime.datetime.now()
# If no sample project data needed set to defined
elif sample["sample_project"] == "None":
elif sample["sample_project"] is None:
sample["sample_state"] = "Defined"
else:
sample["sample_state"] = "Pre-Defined"
Expand Down Expand Up @@ -327,6 +327,40 @@ def validate_sample_data(sample_data, req_user, app_name):
return validation


def validate_project_data(project_data, project_name):
"""Sample data validation

Parameters
----------
project_data
project data formatted in json obtained from jspreadsheet

Returns
-------
validation
list with validation info for each sample with format:
[{"Sample Name": "test 01",
"Validate": True,
"Validation error": None
},
{"Sample Name": "test 02",
"Validate": False,
"Validation error": "Mandatory field is missing."
}]
"""
validation = []
for sample in project_data:
sample_dict = {}
sample_dict["Sample name"] = sample["sample_name"]
sample_dict["Project name"] = project_name
sample_dict["Validate"] = True
sample_dict["Validation error"] = ""

validation.append(sample_dict)

return validation


def save_project_data(excel_data, project_info):
"""Saves the project form data for each sample

Expand All @@ -341,16 +375,16 @@ def save_project_data(excel_data, project_info):
Returns
-------
Same project info adding keys
- project_data: field_value information for each sample
- success: True/False
- error: error message
"""
for sample in excel_data:
sample_id = core.models.Samples.objects.get(
sample_code_id__exact=sample["sample_code_id"]
)
for field in project_info["sample_project_fields"]:
field_value = {}
field_value["sample_id"] = core.models.Samples.objects.get(
sample_code_id__exact=sample["sample_code_id"]
)
field_value["sample_id"] = sample_id
field_value[
"sample_project_field_id"
] = core.models.SampleProjectsFields.objects.get(
Expand All @@ -359,25 +393,24 @@ def save_project_data(excel_data, project_info):
),
sample_project_field_name__exact=field["sample_project_field_name"],
)
field_value["sample_project_field_value"] = next(
(
sample[field["sample_project_name"]]
for sample in excel_data
if sample["sample_code_id"] == sample["sample_code_id"]
),
None,
)
field_value["sample_project_field_value"] = sample[
field["sample_project_field_name"]
]
try:
core.models.SampleProjectsFieldsValue.objects.create_project_field_value(
field_value
)
field_value["sample_id"].set_state("Defined")
project_info["success"] = True
except Exception:
project_info["success"] = False
project_info["error"] = "Error saving any of the project fields"
field_value["sample_id"].set_state("Pre-Defined")
raise

if project_info["success"] and sample["only_recorded"]:
sample_id.set_state("Completed")
elif project_info["success"]:
sample_id.set_state("Defined")
else:
sample_id.set_state("Pre-Defined")

return project_info

Expand Down
8 changes: 8 additions & 0 deletions django_utils/templatetags/common.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from django import template

register = template.Library()


@register.filter
def get(mapping, key):
return mapping.get(key, "")
9 changes: 8 additions & 1 deletion wetlab/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ class Meta:

class SampleSerializer(serializers.ModelSerializer):
lab_request = serializers.StringRelatedField(many=False, label="Laboratory")
sample_state = serializers.StringRelatedField(many=False, label="Sample state")
sample_project = serializers.StringRelatedField(many=False, label="Sample Project")
project_values = ProjectValuesSerializers(many=True)
sample_type = serializers.StringRelatedField(many=False, label="Sample type")
Expand Down Expand Up @@ -126,7 +127,11 @@ def to_representation(self, instance):
data[key] = data[key].split("T")[0]
# Change id to label for api rest output
if output_label:
data_update[self.fields[key].label] = data[key]
# output both label and value
label_value = {}
label_value["label"] = self.fields[key].label
label_value["value"] = data[key]
data_update[key] = label_value
else:
data_update[key] = data[key]
return data_update
Expand All @@ -135,12 +140,14 @@ class Meta:
model = core.models.Samples
fields = [
"sample_name",
"sample_code_id",
"lab_request",
"sample_type",
"species",
"sample_project",
"sample_entry_date",
"collection_sample_date",
"sample_state",
"project_values",
]

Expand Down
Loading
Loading