From 00f24c53b52b9761cb3adc77e768766799c60c2c Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Thu, 4 Aug 2016 17:53:24 +0200 Subject: [PATCH] MT#7247 panel: add latest_uuid view * shortcut like ///latest/ * link added in project block * add 404 responses for views * format job date to UTC * align to right date and number of jobs Change-Id: Ia89662d17d3c6c9448ce91f9ca435ede37b7f705 --- panel/static/panel/js/panel.js | 11 +++- panel/templates/panel/base_project.html | 17 ++++--- panel/urls.py | 2 + panel/views.py | 67 +++++++++++++++++-------- repoapi/models/jbi.py | 43 ++++++++++++---- 5 files changed, 102 insertions(+), 38 deletions(-) diff --git a/panel/static/panel/js/panel.js b/panel/static/panel/js/panel.js index b2fb7be..7495361 100644 --- a/panel/static/panel/js/panel.js +++ b/panel/static/panel/js/panel.js @@ -154,7 +154,7 @@ function set_uuid_status(project, uuid, job, value) { } } } - div_uuid_date.html(new Date(value.date)); + div_uuid_date.html(new Date(value.date).toUTCString()); $('#' + id + '-badge').html(jobs); if (uuid == $.release[project].last_uuid) { set_project_status(project); @@ -257,6 +257,15 @@ function create_new_project_panel(project) { var div_title = $('.project-name', div_project); div_title.html('' + project + ''); + var latest_uuid_url; + if ($.panel == 'project_uuid') { + latest_uuid_url = '../latest'; + } else if ($.panel == 'release') { + latest_uuid_url = project + '/latest'; + } else { + latest_uuid_url = 'latest'; + } + $('.latest-uuid-url', div_project).attr('href', latest_uuid_url); $('.error', div_project).attr('id', project + '-error').removeClass('error'); div_project.appendTo('#project-list'); console.debug('project ' + project + ' created'); diff --git a/panel/templates/panel/base_project.html b/panel/templates/panel/base_project.html index c9445b1..ecf7587 100644 --- a/panel/templates/panel/base_project.html +++ b/panel/templates/panel/base_project.html @@ -1,21 +1,24 @@
-

+ +
+ latest +
    diff --git a/panel/urls.py b/panel/urls.py index 1240695..de7e283 100644 --- a/panel/urls.py +++ b/panel/urls.py @@ -21,6 +21,8 @@ urlpatterns = [ url(r'^(?P<_release>[^/]+)/$', views.release, name='release-view'), url(r'^(?P<_release>[^/]+)/(?P<_project>[^/]+)/$', views.project, name='project-view'), + url(r'^(?P<_release>[^/]+)/(?P<_project>[^/]+)/latest/$', + views.latest_uuid, name='latest_uuid-view'), url(r'^(?P<_release>[^/]+)/(?P<_project>[^/]+)/(?P<_uuid>[^/]+)/$', views.uuid, name='uuid-view'), ] diff --git a/panel/views.py b/panel/views.py index d9f718c..efbea5b 100644 --- a/panel/views.py +++ b/panel/views.py @@ -14,6 +14,7 @@ # with this program. If not, see . from django.shortcuts import render +from django.http import HttpResponseNotFound from repoapi.models import JenkinsBuildInfo as jbi @@ -23,29 +24,55 @@ def index(request): def release(request, _release): - projects = jbi.objects.release_projects_full(_release) - context = {'release': _release, - 'projects': projects} - return render(request, 'panel/release.html', context) + if jbi.objects.is_release(_release): + projects = jbi.objects.release_projects_full(_release) + context = {'release': _release, + 'projects': projects} + return render(request, 'panel/release.html', context) + else: + return HttpResponseNotFound('release {} not found'.format(_release)) def project(request, _release, _project): - latest_uuid = jbi.objects.latest_uuid_js(_release, _project) - uuids = jbi.objects.release_project_uuids_set(_release, _project) - context = { - 'project': _project, - 'release': _release, - 'uuids': uuids, - 'latest_uuid': latest_uuid} - return render(request, 'panel/project.html', context) + if jbi.objects.is_project(_release, _project): + latest_uuid = jbi.objects.latest_uuid_js(_release, _project) + uuids = jbi.objects.release_project_uuids_set(_release, _project) + context = { + 'project': _project, + 'release': _release, + 'uuids': uuids, + 'latest_uuid': latest_uuid} + return render(request, 'panel/project.html', context) + else: + return HttpResponseNotFound('project {} not found'.format(_project)) def uuid(request, _release, _project, _uuid): - latest_uuid = jbi.objects.is_latest_uuid_js(_release, _project, _uuid) - context = { - 'project': _project, - 'release': _release, - 'uuid': _uuid, - 'latest_uuid': latest_uuid, - } - return render(request, 'panel/project_uuid.html', context) + if jbi.objects.is_uuid(_release, _project, _uuid): + latest_uuid = jbi.objects.is_latest_uuid_js(_release, _project, _uuid) + context = { + 'project': _project, + 'release': _release, + 'uuid': _uuid, + 'latest_uuid': latest_uuid, + } + return render(request, 'panel/project_uuid.html', context) + else: + return HttpResponseNotFound('uuid {} not found'.format(_uuid)) + + +def latest_uuid(request, _release, _project): + if jbi.objects.is_project(_release, _project): + latest_uuid = jbi.objects.latest_uuid_js(_release, _project) + if latest_uuid is not None: + context = { + 'project': _project, + 'release': _release, + 'uuid': latest_uuid['tag'], + 'latest_uuid': latest_uuid, + } + return render(request, 'panel/project_uuid.html', context) + else: + return HttpResponseNotFound('no latest uuid') + else: + return HttpResponseNotFound('project {} not found'.format(_project)) diff --git a/repoapi/models/jbi.py b/repoapi/models/jbi.py index 7facef9..64e50b6 100644 --- a/repoapi/models/jbi.py +++ b/repoapi/models/jbi.py @@ -45,26 +45,42 @@ class JenkinsBuildInfoManager(models.Manager): def releases(self, flat=True): res = self.get_queryset().values('param_release').distinct() - if flat: - return res.values_list('param_release', flat=True) - else: - return res.values('param_release') + if res.exists(): + if flat: + return res.values_list('param_release', flat=True) + else: + return res.values('param_release') + + def is_release(self, release): + res = self.get_queryset().filter( + param_release=release, + tag__isnull=False) + return res.exists() def release_projects(self, release, flat=True): res = self.get_queryset().filter( param_release=release, tag__isnull=False).values('projectname').distinct() - if flat: - return res.values_list('projectname', flat=True) - else: - return res.values('projectname') + if res.exists(): + if flat: + return res.values_list('projectname', flat=True) + else: + return res.values('projectname') + + def is_project(self, release, project): + res = self.get_queryset().filter( + param_release=release, + projectname=project, + tag__isnull=False) + return res.exists() def release_project_uuids_set(self, release, project): res = self.get_queryset().filter( param_release=release, projectname=project, tag__isnull=False).distinct() - return res.order_by('projectname') + if res.exists(): + return res.order_by('projectname') def release_project_uuids(self, release, project, flat=True): res = self.get_queryset().filter( @@ -76,6 +92,13 @@ class JenkinsBuildInfoManager(models.Manager): else: return res.order_by('projectname').values('tag') + def is_uuid(self, release, project, uuid): + res = self.get_queryset().filter( + param_release=release, + projectname=project, + tag=uuid) + return res.exists() + def jobs_by_uuid(self, release, project, uuid): return self.get_queryset().filter(tag=uuid, param_release=release, projectname=project).order_by('date') @@ -86,7 +109,7 @@ class JenkinsBuildInfoManager(models.Manager): param_release=release, projectname=project, tag__isnull=False) - if res is not None: + if res.exists(): return res.latest('date') def latest_uuid(self, release, project):