[extensions-web/bugfix/incompatible-extensions/776460] extensions: guess "best" suitable Shell version.



commit f95fff5a4d8abaf20ca0c894b49d4a76b30a6f42
Author: Yuri Konotopov <ykonotopov gnome org>
Date:   Sun Apr 9 23:21:33 2017 +0400

    extensions: guess "best" suitable Shell version.
    
    Since we disabled control switch for incompatible extensions download
    requests should be made now only by purpose.
    So we may "guess" best suitable Shell version for download and info
    requests.
    For update-info requests parameter "disable_version_validation" is expected
    and default to False.
    
    Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=776460

 sweettooth/extensions/tests.py |   26 +++++++++++++++++++++++++-
 sweettooth/extensions/views.py |   30 +++++++++++++++++++++++++-----
 2 files changed, 50 insertions(+), 6 deletions(-)
---
diff --git a/sweettooth/extensions/tests.py b/sweettooth/extensions/tests.py
index ffa3839..9fcc920 100644
--- a/sweettooth/extensions/tests.py
+++ b/sweettooth/extensions/tests.py
@@ -14,7 +14,7 @@ except ImportError:
 from django.test import TestCase, TransactionTestCase
 from django.core.files.base import File
 from django.core.urlresolvers import reverse
-from sweettooth.extensions import models
+from sweettooth.extensions import models, views
 
 from sweettooth.testutils import BasicUserTestCase
 
@@ -652,3 +652,27 @@ class QueryExtensionsTest(BasicUserTestCase, TestCase):
         self.assertEqual(uuids, [one.uuid, two.uuid])
         uuids = self.gather_uuids(dict(sort="downloads", order="asc"))
         self.assertEqual(uuids, [two.uuid, one.uuid])
+
+    def test_grab_proper_extension_version(self):
+        extension = self.create_extension("extension")
+
+        v = models.ExtensionVersion.objects.create(extension=extension, status=models.STATUS_ACTIVE)
+        v.parse_metadata_json({"shell-version": ["3.10"]})
+
+        v = models.ExtensionVersion.objects.create(extension=extension, status=models.STATUS_ACTIVE)
+        v.parse_metadata_json({"shell-version": ["3.13.4"]})
+
+        v = models.ExtensionVersion.objects.create(extension=extension, status=models.STATUS_ACTIVE)
+        v.parse_metadata_json({"shell-version": ["3.20.0"]})
+
+        self.assertEqual(views.grab_proper_extension_version(extension, "3.20.0").version, 3)
+        self.assertEqual(views.grab_proper_extension_version(extension, "3.2.0"), None)
+        self.assertEqual(views.grab_proper_extension_version(extension, "3.4.0"), None)
+        self.assertEqual(views.grab_proper_extension_version(extension, "3.4.0", True).version, 1)
+        self.assertEqual(views.grab_proper_extension_version(extension, "3.7.4.1", True).version, 1)
+        self.assertEqual(views.grab_proper_extension_version(extension, "3.10.0", True).version, 1)
+        self.assertEqual(views.grab_proper_extension_version(extension, "3.13.4", True).version, 2)
+        self.assertEqual(views.grab_proper_extension_version(extension, "3.11.2", True).version, 3)
+        self.assertEqual(views.grab_proper_extension_version(extension, "3.20.0", True).version, 3)
+        self.assertEqual(views.grab_proper_extension_version(extension, "3.24.0", True).version, 3)
+        self.assertEqual(views.grab_proper_extension_version(extension, "4.14.0", True).version, 3)
diff --git a/sweettooth/extensions/views.py b/sweettooth/extensions/views.py
index a43c9e0..6315914 100644
--- a/sweettooth/extensions/views.py
+++ b/sweettooth/extensions/views.py
@@ -44,23 +44,42 @@ def get_versions_for_version_strings(version_strings):
         if base_version:
             yield base_version
 
-def grab_proper_extension_version(extension, shell_version):
+def grab_proper_extension_version(extension, shell_version, disable_version_validation=False):
+    def get_best_shell_version():
+        visible_versions = extension.visible_versions
+
+        supported_shell_versions = set(shell_version
+                                       for version in visible_versions
+                                       for shell_version in version.shell_versions.all())
+        supported_shell_versions = sorted(supported_shell_versions, key=lambda x: (x.major, x.minor, 
x.point))
+        requested_shell_version = models.parse_version_string(shell_version)
+
+        if cmp((supported_shell_versions[0].major, supported_shell_versions[0].minor,
+                supported_shell_versions[0].point), requested_shell_version) > 0:
+            versions = visible_versions.filter(shell_versions=supported_shell_versions[0])
+        else:
+            versions = visible_versions.filter(shell_versions=supported_shell_versions[-1])
+
+        return versions.order_by('-version')[0]
+
     shell_versions = set(get_versions_for_version_strings([shell_version]))
     if not shell_versions:
-        return None
+        return get_best_shell_version() if disable_version_validation else None
 
     versions = extension.visible_versions.filter(shell_versions__in=shell_versions)
     if versions.count() < 1:
-        return None
+        return get_best_shell_version() if disable_version_validation else None
     else:
         return versions.order_by('-version')[0]
 
 def find_extension_version_from_params(extension, params):
     vpk = params.get('version_tag', '')
     shell_version = params.get('shell_version', '')
+    disable_version_validation = False if params.get('disable_version_validation', "1").lower() in ["0",
+                                                                                                    "false"] 
else True
 
     if shell_version:
-        return grab_proper_extension_version(extension, shell_version)
+        return grab_proper_extension_version(extension, shell_version, disable_version_validation)
     elif vpk:
         try:
             return extension.visible_versions.get(pk=int(vpk))
@@ -86,6 +105,7 @@ def shell_update(request):
     try:
         installed = json.loads(request.GET['installed'])
         shell_version = request.GET['shell_version']
+        disable_version_validation = request.GET.get('disable_version_validation', False)
     except (KeyError, ValueError):
         return HttpResponseBadRequest()
 
@@ -112,7 +132,7 @@ def shell_update(request):
             # The user may have a newer version than what's on the site.
             continue
 
-        proper_version = grab_proper_extension_version(extension, shell_version)
+        proper_version = grab_proper_extension_version(extension, shell_version, disable_version_validation)
 
         if proper_version is not None:
             if version < proper_version.version:


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