Пример #1
0
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
Пример #2
0
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()
Пример #3
0
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 {}