From 17709467f065ab9ad1c1085dee843b139593ee4a Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Wed, 11 Mar 2020 12:50:00 +0100 Subject: [PATCH] TT#43813 build: add refresh_projects If the list of projects has changed after the creation of the BuildRelease object Change-Id: I68c31adbb7e465ea4253a85da9d2be3c29af5c90 --- build/models/br.py | 4 ++ build/test/test_rest.py | 32 +++++++++++++ build/views.py | 9 ++++ .../release_dashboard/build_release.html | 45 ++++++++++++++++++- 4 files changed, 88 insertions(+), 2 deletions(-) diff --git a/build/models/br.py b/build/models/br.py index d575370..d3b5182 100644 --- a/build/models/br.py +++ b/build/models/br.py @@ -100,6 +100,10 @@ class BuildRelease(models.Model): def __str__(self): return "%s[%s]" % (self.release, self.uuid) + def refresh_projects(self): + self.projects = ",".join(self.config.projects) + self.save() + @property def projects_list(self): return [x.strip() for x in self.projects.split(",")] diff --git a/build/test/test_rest.py b/build/test/test_rest.py index 79849b0..943bab6 100644 --- a/build/test/test_rest.py +++ b/build/test/test_rest.py @@ -182,3 +182,35 @@ class TestBuildDeleteRest(APIAuthenticatedTestCase): ).count(), 0, ) + + +@override_settings(DEBUG=True) +class TestBuildPatchRest(APIAuthenticatedTestCase): + fixtures = [ + "test_models", + ] + release = "release-mr8.1" + release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559649b" + + def test_refresh(self): + br = models.BuildRelease.objects.get(uuid=self.release_uuid) + self.assertEqual(br.projects, "kamailio,lua-ngcp-kamailio,ngcp-panel") + data = {"action": "refresh"} + url = reverse("build:detail", args=[br.id]) + response = self.client.patch(url, data, format="json") + self.assertEqual(response.status_code, status.HTTP_200_OK) + br = models.BuildRelease.objects.get(uuid=self.release_uuid) + self.assertNotEqual( + br.projects, "kamailio,lua-ngcp-kamailio,ngcp-panel" + ) + self.assertEqual(len(br.projects_list), 73) + + def test_no_action(self): + br = models.BuildRelease.objects.get(uuid=self.release_uuid) + self.assertEqual(br.projects, "kamailio,lua-ngcp-kamailio,ngcp-panel") + data = {} + url = reverse("build:detail", args=[br.id]) + response = self.client.patch(url, data, format="json") + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + br = models.BuildRelease.objects.get(uuid=self.release_uuid) + self.assertEqual(br.projects, "kamailio,lua-ngcp-kamailio,ngcp-panel") diff --git a/build/views.py b/build/views.py index 8962272..7b652a1 100644 --- a/build/views.py +++ b/build/views.py @@ -61,6 +61,15 @@ class BuildReleaseDetail(generics.RetrieveDestroyAPIView): models.BuildRelease.objects.jbi(instance.uuid).delete() instance.delete() + def patch(self, request, *args, **kwargs): + action = request.data.get("action") + if action == "refresh": + instance = self.get_object() + instance.refresh_projects() + serializer = self.get_serializer(instance) + return Response(serializer.data) + return JsonResponse({"error": "Action unknown"}, status=400) + class BuildProject(APIView): permission_classes = (BuildAccess,) diff --git a/release_dashboard/templates/release_dashboard/build_release.html b/release_dashboard/templates/release_dashboard/build_release.html index d7dd5ed..1932861 100644 --- a/release_dashboard/templates/release_dashboard/build_release.html +++ b/release_dashboard/templates/release_dashboard/build_release.html @@ -43,8 +43,12 @@ {{ br.uuid }} {{ br.start_date }} - + + + {% endfor %} @@ -107,5 +111,42 @@ function delete_build_release( id ) { error: errorFunc } ); } + +function click_refresh_projects(e, id) { + refresh_release_projects(id); + e.preventDefault(); +} + +function refresh_release_projects( id ) { + + function successFunc( _data, _textStatus, _jqXHR ) { + $("#refresh_" + id).attr("disabled", "disabled"); + } + + function errorFunc( _jqXHR, _status, error ) { + $( "#error" ).html( error ); + } + var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val(); + function csrfSafeMethod(method) { + // these HTTP methods do not require CSRF protection + return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); + } + $.ajaxSetup({ + beforeSend: function(xhr, settings) { + if (!csrfSafeMethod(settings.type) && !this.crossDomain) { + xhr.setRequestHeader("X-CSRFToken", csrftoken); + } + } + }); + $.ajax( { + url: "/build/" + id + "/?format=json", + data: JSON.stringify({ action: "refresh" }), + method: "PATCH", + contentType: "application/json; charset=utf-8", + dataType: "json", + success: successFunc, + error: errorFunc + } ); +} {% endblock %} \ No newline at end of file