def export(request, pk): form = request.GET.get("format", "bioopt") if form not in ["bioopt", "sbml"]: return HttpResponseBadRequest("Bad format") try: model = DesignModel.objects.get(user=UserProfile.get_profile( request.user), pk=pk) content = model.get_latest_revision().content except ObjectDoesNotExist: return HttpResponseBadRequest("Bad Model") org = Metabolism(StringIO(content)) ss = StringIO() if form == "sbml": org.write_sbml(ss) elif form == "bioopt": org.write_bioopt(ss) #org.to_model().dump(fileout=ss, filetype="opt" if form == "bioopt" else "sbml") response = HttpResponse(ss.getvalue(), content_type="application/x-bioopt" if form == "bioopt" else "application/sbml+xml") ss.close() response['Content-Disposition'] = "attachment; filename=" + model.filename return response
def upload(request, pk): data = {} if request.method == 'POST': if pk == "1": # Uploaded model form = UploadModelForm(request.POST, request.FILES) if form.is_valid(): name = form.cleaned_data.get('name') #save to temporary file freq = request.FILES['file'] filename = freq.name ss = StringIO() for chunk in freq.chunks(): try: ss.write(chunk.decode("utf-8")) except UnicodeDecodeError: form.add_error("file", "File does not have UTF-8 encoding") form_html = render_crispy_form(form, context=request) return {'success': False, 'form_html': form_html} #try: ss.seek(0) model = Metabolism(ss, filename=freq.name) if len(model.enzymes) == 0 or len(model.mets) == 0: raise ValueError("Model is empty") #except Exception as e: # form.add_error("file", "Not a valid model: " + str(e)) # form_html = render_crispy_form(form, context=request) # return {'success': False, 'form_html': form_html} dm = DesignModel.objects.create(user=request.user.profile, name=name, filename=filename, content=ss.getvalue()) #try: # jm = JsonModel.from_model(model).to_json() #except ValueError: # return BadRequest(str(ValueError)) sio = StringIO() model.write_sbml(fileout=sio) Revision(model=dm, content=sio.getvalue(), reason="Initial version").save() return {'success': True} else: form_html = render_crispy_form(form, context=request) return {'success': False, 'form_html': form_html} if pk == "2": # from template templates = DesignTemplate.objects.values_list("pk", "name") form = ModelFromTemplateForm(templates, request.POST, request.FILES) if form.is_valid(): name = form.cleaned_data.get('name') choice = form.cleaned_data.get('choice') template = DesignTemplate.objects.get(pk=choice) dm = DesignModel.objects.create(user=UserProfile.get_profile( request.user), name=name, filename=template.filename, content="") Revision(model=dm, content=template.content, reason="Initial version").save() return {'success': True} else: form_html = render_crispy_form(form, context=request) return {'success': False, 'form_html': form_html} return BadRequest()
def save(request, pk): if not all(x in request.POST for x in ["changes", "objectives"]): raise BadRequest("Request incomplete") try: model = DesignModel.objects.get(user=UserProfile.get_profile( request.user), pk=pk) except ObjectDoesNotExist: raise BadRequest("Bad Model") try: revision = request.POST["revision"] try: revision = Revision.objects.get(model=model, pk=revision) except ObjectDoesNotExist: raise BadRequest("Bad Revision") except KeyError: revision = model.get_latest_revision() org = Metabolism(StringIO(revision.content)) try: changes = json.loads(request.POST["changes"]) objectives = json.loads(request.POST["objectives"]) except ValueError: return BadRequest("Invalid JSON data") summary = request.POST.get("summary") try: apply_commandlist(org, changes) org = Metabolism(StringIO(revision.content)) changes = compress_command_list(changes) apply_commandlist(org, changes) if objectives: org.objectives = [] for obj in objectives: if len(obj["name"]) > 0: obj_reac = org.get_reaction(obj["name"]) if obj_reac is None: raise BadRequest("Objective not in model: " + obj["name"]) org.obj = [] org.obj.append( [obj_reac.id, "1" if obj["maximize"] else "-1"]) except ValueError as e: raise BadRequest("Model error: " + str(e)) if len(changes) == 0: raise BadRequest("Model not saved: No changes found") sio = StringIO() org.write_sbml(fileout=sio) Revision(model=model, content=sio.getvalue(), changes=dict(changes=changes, objectives=objectives), reason=summary).save() return {}