renalreg/radar

View on GitHub
radar/api/serializers/salt_wasting.py

Summary

Maintainability
B
6 hrs
Test Coverage
from cornflake import fields
from cornflake.sqlalchemy_orm import ModelSerializer
from cornflake.validators import (
    max_length,
    none_if_blank,
    not_empty,
    optional,
    range_,
    required,
)

from radar.api.serializers.common import MetaMixin, PatientMixin
from radar.models.salt_wasting import SaltWastingClinicalFeatures


class SaltWastingClinicalFeaturesSerializer(PatientMixin, MetaMixin, ModelSerializer):
    normal_pregnancy = fields.BooleanField(required=False)
    abnormal_pregnancy_text = fields.StringField(
        required=False,
        validators=[none_if_blank(), optional(), max_length(10000)]
    )

    neurological_problems = fields.BooleanField(required=False)
    seizures = fields.BooleanField(required=False)
    abnormal_gait = fields.BooleanField(required=False)
    deafness = fields.BooleanField(required=False)
    other_neurological_problem = fields.BooleanField(required=False)
    other_neurological_problem_text = fields.StringField(
        required=False,
        validators=[none_if_blank(), optional(), max_length(10000)]
    )

    joint_problems = fields.BooleanField(required=False)
    joint_problems_age = fields.IntegerField(required=False, validators=[range_(0, 120)])
    x_ray_abnormalities = fields.BooleanField(required=False)
    chondrocalcinosis = fields.BooleanField(required=False)
    other_x_ray_abnormality = fields.BooleanField(required=False)
    other_x_ray_abnormality_text = fields.StringField(
        required=False,
        validators=[none_if_blank(), optional(), max_length(10000)]
    )

    class Meta(object):
        model_class = SaltWastingClinicalFeatures

    def pre_validate(self, data):
        # Remove conditional data

        if data['normal_pregnancy']:
            data['abnormal_pregnancy_text'] = None

        if not data['neurological_problems']:
            data['seizures'] = None
            data['abnormal_gait'] = None
            data['deafness'] = None
            data['other_neurological_problem'] = None
            data['other_neurological_problem_text'] = None
        elif not data['other_neurological_problem']:
            data['other_neurological_problem_text'] = None

        if not data['joint_problems']:
            data['joint_problems_age'] = None
            data['x_ray_abnormalities'] = None
            data['chondrocalcinosis'] = None
            data['other_x_ray_abnormality'] = None
            data['other_x_ray_abnormality_text'] = None
        elif not data['x_ray_abnormalities']:
            data['chondrocalcinosis'] = None
            data['other_x_ray_abnormality'] = None
            data['other_x_ray_abnormality_text'] = None
        elif not data['other_x_ray_abnormality']:
            data['other_x_ray_abnormality_text'] = None

        return data

    def validate(self, data):
        if data['normal_pregnancy'] is False:
            self.run_validators_on_field(data, 'abnormal_pregnancy_text', [not_empty()])

        if data['neurological_problems']:
            self.run_validators_on_field(data, 'seizures', [required()])
            self.run_validators_on_field(data, 'abnormal_gait', [required()])
            self.run_validators_on_field(data, 'deafness', [required()])
            self.run_validators_on_field(data, 'other_neurological_problem', [required()])

            if data['other_neurological_problem']:
                self.run_validators_on_field(data, 'other_neurological_problem_text', [not_empty()])

        if data['joint_problems']:
            self.run_validators_on_field(data, 'joint_problems_age', [required()])
            self.run_validators_on_field(data, 'x_ray_abnormalities', [required()])

            if data['x_ray_abnormalities']:
                self.run_validators_on_field(data, 'chondrocalcinosis', [required()])
                self.run_validators_on_field(data, 'other_x_ray_abnormality', [required()])

                if data['other_x_ray_abnormality']:
                    self.run_validators_on_field(data, 'other_x_ray_abnormality_text', [not_empty()])

        return data