def handle_assay_confirm_delete(self, request, context, *args, **kwargs): self.check_write_permission(request) form = export_forms.ExportSelectionForm(data=request.POST, user=request.user, exclude_disabled=False) study = self.get_object() if form.is_valid(): # cannot directly use form.selection.assays, as it will include parent assays # for any selected measurements if "assayId" in form.cleaned_data: qs = form.cleaned_data["assayId"].filter(study_id=study.pk) assay_count = qs.update(active=False) else: # TODO: uncovered assay_count = 0 # END uncovered # OK to directly use form.selection.measurements qs = form.selection.measurements.filter(study_id=study.pk) measurement_count = qs.update(active=False) messages.success( request, _("Deleted {assay} Assays and {measurement} Measurements."). format(assay=assay_count, measurement=measurement_count), ) return True messages.error(request, _("Nothing selected to delete.")) return False
def handle_assay_edit(self, request, context, *args, **kwargs): self.check_write_permission(request) study = self.get_object() selectForm = export_forms.ExportSelectionForm(data=request.POST, user=request.user) if not selectForm.is_valid(): messages.error(request, _("Must select at least one Assay to edit.")) return False total = selectForm.selection.assays.count() saved = 0 for assay in selectForm.selection.assays: form = edd_forms.AssayForm(request.POST, instance=assay, prefix="assay", study=study) # removes fields having disabled bulk edit checkbox form.check_bulk_edit() if form.is_valid(): form.save() saved += 1 else: context["new_assay"] = form for error in form.errors.values(): messages.warning(request, error) break messages.success( request, _("Saved {saved} of {total} Assays").format(saved=saved, total=total), ) return saved > 0
def handle_enable_disable(self, request, active, **kwargs): self.check_write_permission(request) form = export_forms.ExportSelectionForm(data=request.POST, user=request.user, exclude_disabled=False) if form.is_valid(): with transaction.atomic(): if not active and form.selection.measurements.count() == 0: # true deletion only if there are zero measurements! count, details = form.selection.lines.delete() count = details[edd_models.Line._meta.label] else: count = form.selection.lines.update(active=active) # cascade deactivation to assays and measurements # NOTE: ExportSelectionForm already filters out deactivated elements, # so this will _NOT_ re-activate objects from previously # deactivated lines. form.selection.assays.update(active=active) form.selection.measurements.update(active=active) action = _("Restored") if active else _("Deleted") messages.success( request, _("{action} {count} Lines").format(action=action, count=count)) return True messages.error(request, _("Failed to validate selection.")) return False
def handle_clone(self, request, context, *args, **kwargs): self.check_write_permission(request) form = export_forms.ExportSelectionForm(data=request.POST, user=request.user) study = self.get_object() cloned = 0 if not form.is_valid(): messages.error(request, _("Failed to validate selection for clone.")) return False for line in form.selection.lines: # easy way to clone is just pretend to fill out add line form initial = edd_forms.LineForm.initial_from_model(line) # update name to indicate which is the clone initial["name"] = initial["name"] + " clone" clone = edd_forms.LineForm(initial, study=study) if clone.is_valid(): clone.save() cloned += 1 messages.success( request, _("Cloned {count} of {total} Lines").format( count=cloned, total=form.selection.lines.count()), ) return True
def handle_unreplicate(self, request, context, *args, **kwargs): self.check_write_permission(request) study = self.get_object() selectForm = export_forms.ExportSelectionForm(data=request.POST, user=request.user) replicate = edd_models.MetadataType.system("Replicate") if selectForm.is_valid(): for line in selectForm.selection.lines.filter(study_id=study.pk): line.metadata_clear(replicate) line.save() return True return False
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) request = kwargs.get("request") form = export_forms.ExportSelectionForm(data=request.POST, user=request.user, exclude_disabled=False) if form.is_valid(): count = form.selection.measurements.count() else: count = 0 context.update(cancel_link=request.path, delete_select=form, measurement_count=count) return context
def handle_measurement_edit(self, request, context, *args, **kwargs): self.check_write_permission(request) selectForm = export_forms.ExportSelectionForm(data=request.POST, user=request.user) if not selectForm.is_valid(): messages.error(request, _("Nothing selected for edit.")) return False # only pass payload to MeasurementValueFormSet when update button is hit form_payload = None if request.POST.get("action", None) == "measurement_update": form_payload = request.POST # query the exact info needed to display measures = selectForm.selection.measurements.select_related( "assay__protocol", "assay__line", "measurement_type").order_by("assay__line_id") # invert the graph to traverse based on lines first inverted = collections.defaultdict( lambda: collections.defaultdict(list)) # loop over measurements to add formset and to inverted structure show_edit = True with transaction.atomic(): for m in measures: m.form = edd_forms.MeasurementValueFormSet( form_payload, instance=m, prefix=str(m.id), queryset=m.measurementvalue_set.order_by("x"), ) # only try to save when data is there and valid save_form = m.form.is_bound and m.form.is_valid() # only show edit page if at least one form is not saved show_edit = show_edit and not save_form if save_form: m.form.save() inverted[m.assay.line][m.assay].append(m) if show_edit: # template doing inverted.items is same as inverted["items"], so disable defaults inverted.default_factory = None for adict in inverted.values(): adict.default_factory = None return render( request, "main/edit_measurement.html", context={ "inverted": inverted, "measures": measures, "study": self.get_object(), }, ) return True
def handle_line(self, request, context, *args, **kwargs): self.check_write_permission(request) study = self.get_object() selectForm = export_forms.ExportSelectionForm(data=request.POST, user=request.user) if selectForm.is_valid(): if selectForm.selection.lines.filter(study_id=study.id).exists(): return self.handle_line_edit(request, context, selectForm.selection.lines) elif "lineId" in selectForm.cleaned_data: # no selection == new line return self.handle_line_new(request, context) messages.error(request, _("Failed to load line for editing.")) return False
def handle_assay(self, request, context, *args, **kwargs): self.check_write_permission(request) study = self.get_object() selectForm = export_forms.ExportSelectionForm(data=request.POST, user=request.user) if not selectForm.is_valid(): messages.error(request, _("Must select at least one Line to add Assay.")) return False form = edd_forms.AssayForm(request.POST, lines=selectForm.selection.lines, prefix="assay", study=study) if form.is_valid(): form.save() return True context["new_assay"] = form return False
def handle_measurement_add(self, request, context, *args, **kwargs): self.check_write_permission(request) study = self.get_object() selectForm = export_forms.ExportSelectionForm(data=request.POST, user=request.user) if not selectForm.is_valid(): messages.error( request, _("Must select at least one Assay to add Measurement.")) return False form = edd_forms.MeasurementForm( request.POST, assays=selectForm.selection.assays, prefix="measurement", study=study, ) if form.is_valid(): form.save() return True context["new_measurement"] = form return False