diff --git a/bitbake/lib/toaster/toastergui/api.py b/bitbake/lib/toaster/toastergui/api.py index 961b594ef4..a024748271 100644 --- a/bitbake/lib/toaster/toastergui/api.py +++ b/bitbake/lib/toaster/toastergui/api.py @@ -20,11 +20,14 @@ # Temporary home for the UI's misc API import re -from orm.models import Project, ProjectTarget, Build +from orm.models import Project, ProjectTarget, Build, Layer_Version +from orm.models import LayerVersionDependency, LayerSource, ProjectLayer from bldcontrol.models import BuildRequest from bldcontrol import bbcontroller from django.http import HttpResponse, JsonResponse from django.views.generic import View +from django.core.urlresolvers import reverse + class XhrBuildRequest(View): @@ -109,3 +112,97 @@ class XhrBuildRequest(View): response = HttpResponse() response.status_code = 500 return response + + +class XhrLayer(View): + """ Get and Update Layer information """ + + def post(self, request, *args, **kwargs): + """ + Update a layer + + Entry point: /xhr_layer/ + Method: POST + + Args: + vcs_url, dirpath, commit, up_branch, summary, description + + add_dep = append a layerversion_id as a dependency + rm_dep = remove a layerversion_id as a depedency + Returns: + {"error": "ok"} + or + {"error": } + """ + + def error_response(error): + return JsonResponse({"error": error}) + + try: + # We currently only allow Imported layers to be edited + layer_version = Layer_Version.objects.get( + id=kwargs['layerversion_id'], + project=kwargs['pid'], + layer_source__sourcetype=LayerSource.TYPE_IMPORTED) + + except Layer_Version.DoesNotExist: + return error_response("Cannot find imported layer to update") + + if "vcs_url" in request.POST: + layer_version.layer.vcs_url = request.POST["vcs_url"] + if "dirpath" in request.POST: + layer_version.dirpath = request.POST["dirpath"] + if "commit" in request.POST: + layer_version.commit = request.POST["commit"] + layer_version.branch = request.POST["commit"] + if "up_branch" in request.POST: + layer_version.up_branch_id = int(request.POST["up_branch"]) + if "summary" in request.POST: + layer_version.layer.summary = request.POST["summary"] + if "description" in request.POST: + layer_version.layer.description = request.POST["description"] + + if "add_dep" in request.POST: + lvd = LayerVersionDependency( + layer_version=layer_version, + depends_on_id=request.POST["add_dep"]) + lvd.save() + + if "rm_dep" in request.POST: + rm_dep = LayerVersionDependency.objects.get( + layer_version=layer_version, + depends_on_id=request.POST["rm_dep"]) + rm_dep.delete() + + try: + layer_version.layer.save() + layer_version.save() + except Exception as e: + return error_response("Could not update layer version entry: %s" + % e) + + return JsonResponse({"error": "ok"}) + + def delete(self, request, *args, **kwargs): + try: + # We currently only allow Imported layers to be deleted + layer_version = Layer_Version.objects.get( + id=kwargs['layerversion_id'], + project=kwargs['pid'], + layer_source__sourcetype=LayerSource.TYPE_IMPORTED) + except Layer_Version.DoesNotExist: + return error_response("Cannot find imported layer to delete") + + try: + ProjectLayer.objects.get(project=kwargs['pid'], + layercommit=layer_version).delete() + except ProjectLayer.DoesNotExist: + pass + + layer_version.layer.delete() + layer_version.delete() + + return JsonResponse({ + "error": "ok", + "redirect": reverse('project', args=(kwargs['pid'],)) + }) diff --git a/bitbake/lib/toaster/toastergui/templates/layerdetails.html b/bitbake/lib/toaster/toastergui/templates/layerdetails.html index 0f0b2b49e6..143ec25dd7 100644 --- a/bitbake/lib/toaster/toastergui/templates/layerdetails.html +++ b/bitbake/lib/toaster/toastergui/templates/layerdetails.html @@ -44,7 +44,7 @@ $(document).ready(function(){ var ctx = { - xhrUpdateLayerUrl : "{% url 'xhr_updatelayer' %}", + xhrUpdateLayerUrl : "{% url 'xhr_layer' layerversion.pk %}", layerVersion : { name : "{{layerversion.layer.name}}", id : {{layerversion.id}}, diff --git a/bitbake/lib/toaster/toastergui/urls.py b/bitbake/lib/toaster/toastergui/urls.py index 9510a386ea..15b1063c59 100644 --- a/bitbake/lib/toaster/toastergui/urls.py +++ b/bitbake/lib/toaster/toastergui/urls.py @@ -190,7 +190,10 @@ urlpatterns = patterns('toastergui.views', name='xhr_configvaredit'), url(r'^xhr_importlayer/$', 'xhr_importlayer', name='xhr_importlayer'), - url(r'^xhr_updatelayer/$', 'xhr_updatelayer', name='xhr_updatelayer'), + + url(r'^xhr_layer/(?P\d+)$', + api.XhrLayer.as_view(), + name='xhr_layer'), # JS Unit tests url(r'^js-unit-tests/$', 'jsunittests', name='js-unit-tests'), diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index 2db68bdd4d..ad85fafb4d 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py @@ -1739,49 +1739,6 @@ if True: return HttpResponse(jsonfilter(json_response), content_type = "application/json") - def xhr_updatelayer(request): - - def error_response(error): - return HttpResponse(jsonfilter({"error": error}), content_type = "application/json") - - if "layer_version_id" not in request.POST: - return error_response("Please specify a layer version id") - try: - layer_version_id = request.POST["layer_version_id"] - layer_version = Layer_Version.objects.get(id=layer_version_id) - except Layer_Version.DoesNotExist: - return error_response("Cannot find layer to update") - - - if "vcs_url" in request.POST: - layer_version.layer.vcs_url = request.POST["vcs_url"] - if "dirpath" in request.POST: - layer_version.dirpath = request.POST["dirpath"] - if "commit" in request.POST: - layer_version.commit = request.POST["commit"] - if "up_branch" in request.POST: - layer_version.up_branch_id = int(request.POST["up_branch"]) - - if "add_dep" in request.POST: - lvd = LayerVersionDependency(layer_version=layer_version, depends_on_id=request.POST["add_dep"]) - lvd.save() - - if "rm_dep" in request.POST: - rm_dep = LayerVersionDependency.objects.get(layer_version=layer_version, depends_on_id=request.POST["rm_dep"]) - rm_dep.delete() - - if "summary" in request.POST: - layer_version.layer.summary = request.POST["summary"] - if "description" in request.POST: - layer_version.layer.description = request.POST["description"] - - try: - layer_version.layer.save() - layer_version.save() - except Exception as e: - return error_response("Could not update layer version entry: %s" % e) - - return HttpResponse(jsonfilter({"error": "ok",}), content_type = "application/json") @xhr_response def xhr_customrecipe(request):