示例#1
0
    def form_valid(self, form):
        """
        If the dosing-regime is valid, then check if the formset is valid. If
        it is, then continue saving.
        """
        self.object = form.save(commit=False)

        # unpack dose-groups into formset and validate
        fs_initial = json.loads(self.request.POST['dose_groups_json'])
        fs = forms.dosegroup_formset_factory(fs_initial, self.object.num_dose_groups)

        if fs.is_valid():
            self.object.save()

            # instead of checking existing vs. new, just delete all old
            # dose-groups, and save new formset
            models.DoseGroup.objects.filter(dose_regime=self.object).delete()

            # now save dose-groups, one for each dosing regime
            for dose in fs.forms:
                dose.instance.dose_regime = self.object

            fs.save()

            return super(DosingRegimeUpdate, self).form_valid(form)

        else:
            # invalid formset; extract formset errors
            for f in fs.forms:
                if len(f.errors.keys())>0:
                    self.dose_groups_errors = form_error_list_to_ul(f)
                    break

            return self.form_invalid(form)
示例#2
0
    def post(self, request, *args, **kwargs):
        #first, try to save endpoint
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        if form.is_valid():
            endpoint_model = form.save(commit=False)
            endpoint_model.individual_animal_data = True
            endpoint_model.animal_group = self.parent
            endpoint_model.save()
            form.save_m2m()
            self.object = endpoint_model
            #now, try to save each endpoint-group
            egs = json.loads(request.POST['egs_json'])
            iads = json.loads(request.POST['iad_json'])
            for i, eg in enumerate(egs):
                eg['endpoint'] = endpoint_model.pk
                eg_form = forms.EndpointGroupForm(eg)
                if eg_form.is_valid():
                    eg_form.save()
                    iads_for_eg = [v for v in iads if v['dose_group_id'] == eg_form.instance.dose_group_id]
                    for iad in iads_for_eg:
                        iad['endpoint_group'] = eg_form.instance.pk
                        iad_form = forms.IndividualAnimalForm(iad)
                        if iad_form.is_valid():
                            iad_form.save()
                        else:
                            self.iad_errors = form_error_list_to_ul(iad_form)
                            self.object.delete()
                            return self.form_invalid(form)
                else:
                    self.egs_errors = form_error_list_to_ul(eg_form)
                    self.object.delete()
                    return self.form_invalid(form)
        else:
            return self.form_invalid(form)

        self.send_message()  # replicate MessageMixin
        return HttpResponseRedirect(self.get_success_url())
示例#3
0
    def form_valid(self, form):
        """
        If an animal group is NOT generational, then it requires its own dosing
        regime. Thus, we must make sure the dosing regime is valid before
        attempting to save. If an animal group IS generational, a dosing-regime
        can be specified from parent groups. OR, a dosing-regime can be created.
        """
        self.object = form.save(commit=False)

        # If a dosing-regime is already specified, save as normal
        if self.is_generational and self.object.dosing_regime:
            return super(AnimalGroupCreate, self).form_valid(form)

        # Otherwise we create a new dosing-regime, as well as the associated
        # dose-groups using a formset.
        self.form_dosing_regime = forms.DosingRegimeForm(self.request.POST)
        if self.form_dosing_regime.is_valid():
            dosing_regime = self.form_dosing_regime.save(commit=False)

            # unpack dose-groups into formset and validate
            fs_initial = json.loads(self.request.POST['dose_groups_json'])
            fs = forms.dosegroup_formset_factory(fs_initial, dosing_regime.num_dose_groups)

            if fs.is_valid():
                # save dosing-regime and associate animal-group,
                # setting foreign-key interrelationships
                dosing_regime.save()
                self.object.dosing_regime = dosing_regime
                self.object.save()
                dosing_regime.dosed_animals = self.object
                dosing_regime.save()

                # now save dose-groups, one for each dosing regime
                for dose in fs.forms:
                    dose.instance.dose_regime = dosing_regime

                fs.save()

                return super(AnimalGroupCreate, self).form_valid(form)

            else:
                # invalid formset; extract formset errors
                for f in fs.forms:
                    if len(f.errors.keys())>0:
                        self.dose_groups_errors = form_error_list_to_ul(f)
                        break

                return self.form_invalid(form)
        else:
            # invalid dosing-regime
            return self.form_invalid(form)
示例#4
0
    def post(self, request, *args, **kwargs):
        """
        First check if original model is valid. If so, then add to list of valid models.
        Next, go through each EG, binding with instance if one exists. Go through
        each and make sure each is valid, and if so, add to list. Then, if all
        are valid, save each in list. Delete any EGs which greater than the list.
        """
        valid_endpoint_forms = []
        valid_iad_forms = []
        self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        if form.is_valid():
            #now, try to save each endpoint
            egs = json.loads(request.POST['egs_json'])
            iads = json.loads(request.POST['iad_json'])
            for i, eg in enumerate(egs):
                eg['endpoint'] = self.object.pk
                try:
                    eg_form = forms.EndpointGroupForm(eg,
                        instance=models.EndpointGroup.objects.get(endpoint=self.object.pk, dose_group_id=i))
                except:
                    eg_form = forms.EndpointGroupForm(eg)
                if eg_form.is_valid():
                    valid_endpoint_forms.append(eg_form)
                    #check individual animal groups
                    iads_for_eg = [v for v in iads if v['dose_group_id'] == eg_form.instance.dose_group_id]
                    for iad in iads_for_eg:
                        iad['endpoint_group'] = eg_form.instance.pk
                        iad_form = forms.IndividualAnimalForm(iad)
                        if iad_form.is_valid():
                            valid_iad_forms.append(iad_form)
                        else:
                            self.iad_errors = form_error_list_to_ul(iad_form)
                            return self.form_invalid(form)
                else:
                    self.egs_errors = form_error_list_to_ul(eg_form)
                    return self.form_invalid(form)
        else:
            return self.form_invalid(form)

        #now, save each form, and delete any existing fields not found here
        form.save()

        valid_eg_pks = []
        for form in valid_endpoint_forms:
            valid_eg = form.save()
            valid_eg_pks.append(valid_eg.pk)
        models.EndpointGroup.objects\
                .filter(endpoint=self.object.pk)\
                .exclude(pk__in=valid_eg_pks).delete()

        valid_iad_models = []
        for form in valid_iad_forms:
            valid_iad_models.append(form.save(commit=False))

        # NOTE that this doesn't update existing objects, but creates entirely new
        # ones. If update is required for auditing-logs, will need to pass the pk
        # for each group-back and forth from model. TODO in future?
        models.IndividualAnimal.objects.filter(endpoint_group__in=valid_eg_pks).delete()
        models.IndividualAnimal.objects.bulk_create(valid_iad_models)

        self.send_message()  # replicate MessageMixin
        return HttpResponseRedirect(self.get_success_url())