From 680eef84452d958821482bea217db46e4b78967e Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Thu, 2 Apr 2020 14:27:22 +0200 Subject: [PATCH] TT#78800 release_dashboard: use human sorting for tags/branches Change-Id: Ic9362c40e34f18bb465e0ab29c118e1dfe37bd0c --- release_dashboard/test/test_views.py | 36 ++++++++++++++++++++++++++++ release_dashboard/views/__init__.py | 11 +++++---- requirements/common.txt | 1 + t/Dockerfile | 2 +- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/release_dashboard/test/test_views.py b/release_dashboard/test/test_views.py index 75cef18..8c8ff1d 100644 --- a/release_dashboard/test/test_views.py +++ b/release_dashboard/test/test_views.py @@ -12,7 +12,10 @@ # # You should have received a copy of the GNU General Public License along # with this prograproj. If not, see . +from unittest.mock import patch + from django.contrib.auth.models import User +from django.test import override_settings from django.test import TestCase from django.urls import reverse @@ -28,6 +31,39 @@ class TestHotfix(TestCase): res = self.client.get(reverse("release_dashboard:hotfix")) self.assertEqual(res.status_code, 200) + @override_settings(RELEASE_DASHBOARD_PROJECTS=["fake"]) + @patch("release_dashboard.views.get_tags") + @patch("release_dashboard.views.get_branches") + def test_natural_sort(self, gb, gt): + user = User.objects.create_user(username="test") + self.client.force_login(user) + gt.return_value = [] + gb.return_value = [ + "branch/mr5.1", + "branch/mr8.1.1", + "branch/mr8.1.2", + "branch/mr8.1.10", + "branch/mr7.5.1", + "branch/mr6.10.1", + ] + res = self.client.get(reverse("release_dashboard:hotfix")) + self.assertEqual(res.status_code, 200) + expected = [ + { + "name": "fake", + "tags": [], + "branches": [ + "branch/mr8.1.10", + "branch/mr8.1.2", + "branch/mr8.1.1", + "branch/mr7.5.1", + "branch/mr6.10.1", + "branch/mr5.1", + ], + }, + ] + self.assertEqual(res.context["projects"], expected) + class TestDocker(TestCase): def test_no_login(self): diff --git a/release_dashboard/views/__init__.py b/release_dashboard/views/__init__.py index 51ce4b8..7a86da8 100644 --- a/release_dashboard/views/__init__.py +++ b/release_dashboard/views/__init__.py @@ -15,6 +15,7 @@ import re from django.views.generic.base import TemplateView +from natsort import humansorted from ..conf import settings from release_dashboard.utils import get_branches @@ -43,9 +44,11 @@ def _projects_versions( "name": project, } if tags: - info["tags"] = get_tags(project, regex) + info["tags"] = humansorted(get_tags(project, regex), reverse=True) if branches: - info["branches"] = get_branches(project, regex) + info["branches"] = humansorted( + get_branches(project, regex), reverse=True + ) if master: info["branches"].append("master") res.append(info) @@ -61,8 +64,8 @@ def _common_versions(context, tags=True, branches=True): if branches: common_versions["branches"] |= set(project["branches"]) context["common_versions"] = { - "tags": sorted(common_versions["tags"], reverse=True), - "branches": sorted(common_versions["branches"], reverse=True), + "tags": humansorted(common_versions["tags"], reverse=True), + "branches": humansorted(common_versions["branches"], reverse=True), } diff --git a/requirements/common.txt b/requirements/common.txt index 3b71c09..80059db 100644 --- a/requirements/common.txt +++ b/requirements/common.txt @@ -15,6 +15,7 @@ djangorestframework>=3.6,<3.7 drfapikey flower markdown +natsort python-debian PyYAML six>=1.9 diff --git a/t/Dockerfile b/t/Dockerfile index 493a142..ce5843d 100644 --- a/t/Dockerfile +++ b/t/Dockerfile @@ -5,7 +5,7 @@ FROM docker.mgm.sipwise.com/sipwise-buster:latest # is updated with the current date. It will force refresh of all # of the base images and things like `apt-get update` won't be using # old cached versions when the Dockerfile is built. -ENV REFRESHED_AT 2020-03-21 +ENV REFRESHED_AT 2020-04-02 # test execution; we need the backport of python3-junitxml from our own # repository since it's not part of Debian/buster