[damned-lies] Modernized and test release comparison view



commit 0f582f8b125315113e45b3cf516f082e031f2fa0
Author: Claude Paroz <claude 2xlibre net>
Date:   Mon May 17 09:42:58 2021 +0200

    Modernized and test release comparison view

 damnedlies/urls.py   |  3 ++-
 stats/models.py      | 12 +++++-------
 stats/tests/tests.py | 14 ++++++++++++++
 stats/views.py       | 25 ++++++++++++++-----------
 4 files changed, 35 insertions(+), 19 deletions(-)
---
diff --git a/damnedlies/urls.py b/damnedlies/urls.py
index 8a394245..8065e56a 100644
--- a/damnedlies/urls.py
+++ b/damnedlies/urls.py
@@ -106,7 +106,8 @@ urlpatterns += [
             stats_views.release,
             name='release'),
     path('releases/compare/<dtype>/<path:rels_to_compare>/',
-         stats_views.compare_by_releases),
+         stats_views.compare_by_releases,
+         name='release-compare'),
 ]
 
 if settings.USE_DEBUG_TOOLBAR:
diff --git a/stats/models.py b/stats/models.py
index 363457b8..27d7e502 100644
--- a/stats/models.py
+++ b/stats/models.py
@@ -634,13 +634,11 @@ class Branch(models.Model):
         return success
 
 
-DOMAIN_TYPE_CHOICES = (
-    ('ui', 'User Interface'),
-    ('doc', 'Documentation')
-)
-
-
 class Domain(models.Model):
+    DOMAIN_TYPE_CHOICES = (
+        ('ui', 'User Interface'),
+        ('doc', 'Documentation')
+    )
     POT_METHOD_CHOICES = (
         ('auto', 'auto detected'),
         ('gettext', 'gettext'),
@@ -1977,7 +1975,7 @@ class FakeSummaryStatistics:
 
 class StatisticsArchived(models.Model):
     module = models.TextField()
-    type = models.CharField(max_length=3, choices=DOMAIN_TYPE_CHOICES)
+    type = models.CharField(max_length=3, choices=Domain.DOMAIN_TYPE_CHOICES)
     domain = models.TextField()
     branch = models.TextField()
     language = models.CharField(max_length=15)
diff --git a/stats/tests/tests.py b/stats/tests/tests.py
index f7a77c77..aa7cacb3 100644
--- a/stats/tests/tests.py
+++ b/stats/tests/tests.py
@@ -14,6 +14,7 @@ from django.core.exceptions import ValidationError
 from django.test import TestCase
 from django.test.utils import override_settings
 from django.urls import reverse
+from django.utils.translation import gettext as _
 
 from common.utils import run_shell_command
 from languages.models import Language
@@ -803,6 +804,19 @@ class StatisticsTests(TestCase):
         self.assertEqual(stat.fuzzy(), 0)
         self.assertEqual(stat.untranslated(), 0)
 
+    def test_compare_releases(self):
+        response = self.client.get(reverse('release-compare', args=['ui', '3-8/dev']))
+        self.assertContains(response, f'<h1>{_("Releases Comparison")}</h1>')
+        self.assertEqual(len(response.context['releases']), 2)
+        # wrong domain type
+        with self.assertLogs('django.request', 'WARNING'):
+            response = self.client.get(reverse('release-compare', args=['whatever', '3-8/dev']))
+        self.assertEqual(response.status_code, 404)
+        # wrong release names
+        with self.assertLogs('django.request', 'WARNING'):
+            response = self.client.get(reverse('release-compare', args=['ui', 'whatever1/whatever2']))
+        self.assertEqual(response.status_code, 404)
+
 
 class FigureTests(TestCase):
     fixtures = ['sample_data.json']
diff --git a/stats/views.py b/stats/views.py
index 1954226f..ad6736b8 100644
--- a/stats/views.py
+++ b/stats/views.py
@@ -11,7 +11,9 @@ from django.urls import reverse
 from django.utils.translation import gettext as _
 
 from common.utils import MIME_TYPES, get_user_locale, run_shell_command
-from stats.models import Statistics, FakeLangStatistics, Module, ModuleLock, Branch, Category, Release
+from stats.models import (
+    Branch, Category, Domain, FakeLangStatistics, Module, ModuleLock, Release, Statistics
+)
 from stats.forms import ModuleBranchForm
 from stats.utils import sort_object_list
 from languages.models import Language
@@ -291,19 +293,20 @@ def release(request, release_name, format='html'):
 
 
 def compare_by_releases(request, dtype, rels_to_compare):
-    releases = []
-    try:
-        if "/" in rels_to_compare:
-            # This is release names
-            releases = [Release.objects.get(name='gnome-%s' % rel_name) for rel_name in 
rels_to_compare.split("/")]
-        else:
-            releases = [Release.objects.get(id=rel_id) for rel_id in rels_to_compare.split("-")]
-    except Release.DoesNotExist:
-        raise Http404
+    if dtype not in dict(Domain.DOMAIN_TYPE_CHOICES).keys():
+        raise Http404("Wrong domain type")
+    releases = list(
+        Release.objects.in_bulk(
+            [f'gnome-{rel_name}' for rel_name in rels_to_compare.split("/")],
+            field_name='name'
+        ).values()
+    )
+    if not releases:
+        raise Http404("No matching releases")
     stats = Release.total_by_releases(dtype, releases)
     context = {
         'releases': releases,
-        'stats': stats
+        'stats': stats,
     }
     return render(request, 'release_compare.html', context)
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]