[extensions-web] extensions: Support 'shell_version' in the download view, add tests
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [extensions-web] extensions: Support 'shell_version' in the download view, add tests
- Date: Thu, 29 Mar 2012 21:49:08 +0000 (UTC)
commit b151b6182f8dc6a57f09db19923c1c1466b6a333
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Thu Mar 29 10:03:03 2012 -0400
extensions: Support 'shell_version' in the download view, add tests
This makes it easier for API clients to use, without having to parse the
shell version map themselves. The 'version_tag' use for general extension
downloading should be considered legacy, and only be used if a user wants
to download a specific extension version.
sweettooth/extensions/tests.py | 85 ++++++++++++++++++++++++++++++++++++++++
sweettooth/extensions/urls.py | 2 +-
sweettooth/extensions/views.py | 72 +++++++++++++++++++---------------
3 files changed, 126 insertions(+), 33 deletions(-)
---
diff --git a/sweettooth/extensions/tests.py b/sweettooth/extensions/tests.py
index 9315df6..aa87b38 100644
--- a/sweettooth/extensions/tests.py
+++ b/sweettooth/extensions/tests.py
@@ -374,6 +374,91 @@ class ShellVersionTest(TestCase):
self.assertEquals(minor, 3)
self.assertEquals(point, 2)
+class DownloadExtensionTest(BasicUserTestCase, TestCase):
+ def download(self, uuid, shell_version):
+ url = reverse('extensions-shell-download', kwargs=dict(uuid=uuid))
+ return self.client.get(url, dict(shell_version=shell_version), follow=True)
+
+ def test_basic(self):
+ zipfile = get_test_zipfile("SimpleExtension")
+
+ metadata = {"name": "Test Metadata 6",
+ "uuid": "test-6 gnome org",
+ "description": "Simple test metadata",
+ "url": "http://test-metadata.gnome.org"}
+
+ extension = models.Extension.objects.create_from_metadata(metadata, creator=self.user)
+
+ v1 = models.ExtensionVersion.objects.create(extension=extension,
+ status=models.STATUS_ACTIVE,
+ source=File(zipfile, "version1.zip"))
+ v1.parse_metadata_json({"shell-version": ['3.2']})
+
+ v2 = models.ExtensionVersion.objects.create(extension=extension,
+ status=models.STATUS_ACTIVE,
+ source=File(zipfile, "version1.zip"))
+ v2.parse_metadata_json({"shell-version": ['3.4']})
+
+ self.assertRedirects(self.download(metadata['uuid'], '3.2'), v1.source.url)
+ self.assertRedirects(self.download(metadata['uuid'], '3.4'), v2.source.url)
+
+ def test_bare_versions(self):
+ zipfile = get_test_zipfile("SimpleExtension")
+
+ metadata = {"name": "Test Metadata 7",
+ "uuid": "test-7 gnome org",
+ "description": "Simple test metadata",
+ "url": "http://test-metadata.gnome.org"}
+
+ extension = models.Extension.objects.create_from_metadata(metadata, creator=self.user)
+
+ v1 = models.ExtensionVersion.objects.create(extension=extension,
+ status=models.STATUS_ACTIVE,
+ source=File(zipfile, "version1.zip"))
+ v1.parse_metadata_json({"shell-version": ['3.2']})
+
+ v2 = models.ExtensionVersion.objects.create(extension=extension,
+ status=models.STATUS_ACTIVE,
+ source=File(zipfile, "version2.zip"))
+ v2.parse_metadata_json({"shell-version": ['3.2.1']})
+
+ self.assertRedirects(self.download(metadata['uuid'], '3.2.0'), v1.source.url)
+ self.assertRedirects(self.download(metadata['uuid'], '3.2.1'), v2.source.url)
+ self.assertRedirects(self.download(metadata['uuid'], '3.2.2'), v1.source.url)
+
+ v3 = models.ExtensionVersion.objects.create(extension=extension,
+ status=models.STATUS_ACTIVE,
+ source=File(zipfile, "version3.zip"))
+ v3.parse_metadata_json({"shell-version": ['3.2']})
+
+ self.assertRedirects(self.download(metadata['uuid'], '3.2.0'), v3.source.url)
+ self.assertRedirects(self.download(metadata['uuid'], '3.2.1'), v3.source.url)
+ self.assertRedirects(self.download(metadata['uuid'], '3.2.2'), v3.source.url)
+
+ def test_multiple_versions(self):
+ zipfile = get_test_zipfile("SimpleExtension")
+
+ metadata = {"name": "Test Metadata 8",
+ "uuid": "test-8 gnome org",
+ "description": "Simple test metadata",
+ "url": "http://test-metadata.gnome.org"}
+
+ extension = models.Extension.objects.create_from_metadata(metadata, creator=self.user)
+
+ v1 = models.ExtensionVersion.objects.create(extension=extension,
+ status=models.STATUS_ACTIVE,
+ source=File(zipfile, "version1.zip"))
+ v1.parse_metadata_json({"shell-version": ['3.2.0', '3.2.1', '3.2.2']})
+
+ v2 = models.ExtensionVersion.objects.create(extension=extension,
+ status=models.STATUS_ACTIVE,
+ source=File(zipfile, "version2.zip"))
+ v2.parse_metadata_json({"shell-version": ['3.2.2']})
+
+ self.assertRedirects(self.download(metadata['uuid'], '3.2.0'), v1.source.url)
+ self.assertRedirects(self.download(metadata['uuid'], '3.2.1'), v1.source.url)
+ self.assertRedirects(self.download(metadata['uuid'], '3.2.2'), v2.source.url)
+
class UpdateVersionTest(TestCase):
fixtures = [os.path.join(testdata_dir, 'test_upgrade_data.json')]
diff --git a/sweettooth/extensions/urls.py b/sweettooth/extensions/urls.py
index 865744d..a0a7c1c 100644
--- a/sweettooth/extensions/urls.py
+++ b/sweettooth/extensions/urls.py
@@ -25,7 +25,7 @@ shell_patterns = patterns('',
url(r'^extension-info/', views.ajax_details_view),
url(r'^download-extension/(?P<uuid>.+)\.shell-extension\.zip$',
- views.shell_download),
+ views.shell_download, name='extensions-shell-download'),
url(r'^update-info/', views.shell_update, name='extensions-shell-update'),
)
diff --git a/sweettooth/extensions/views.py b/sweettooth/extensions/views.py
index 53ee0c3..7d11584 100644
--- a/sweettooth/extensions/views.py
+++ b/sweettooth/extensions/views.py
@@ -21,16 +21,49 @@ from extensions.forms import UploadForm
from decorators import ajax_view, model_view
from utils import render
+def get_versions_for_version_strings(version_strings):
+ def get_version(major, minor, point):
+ try:
+ return models.ShellVersion.objects.get(major=major, minor=minor, point=point)
+ except models.ShellVersion.DoesNotExist:
+ return None
+
+ for version_string in version_strings:
+ try:
+ major, minor, point = models.parse_version_string(version_string, ignore_micro=True)
+ except models.InvalidShellVersion:
+ continue
+
+ version = get_version(major, minor, point)
+ if version:
+ yield version
+
+ # If we already have a base version, don't bother querying it again...
+ if point == -1:
+ continue
+
+ base_version = get_version(major, minor, -1)
+ if base_version:
+ yield base_version
+
def shell_download(request, uuid):
- pk = request.GET['version_tag']
- version = get_object_or_404(models.ExtensionVersion, pk=pk)
- extension = version.extension
+ extension = get_object_or_404(models.Extension, uuid=uuid)
- if version.extension.uuid != uuid:
- raise Http404()
+ if request.GET.get('version_tag', -1) >= 0:
+ try:
+ version = extension.visible_versions.get(pk=request.GET['version_tag'])
+ except models.ExtensionVersion.DoesNotExist:
+ raise Http404()
+ else:
+ shell_version = request.GET['shell_version']
+ shell_versions = set(get_versions_for_version_strings([shell_version]))
+ if not shell_versions:
+ raise Http404()
- if version.status != models.STATUS_ACTIVE:
- return HttpResponseForbidden()
+ try:
+ version = extension.visible_versions.filter(shell_versions__in=shell_versions).order_by('-version')[0]
+ except models.ExtensionVersion.DoesNotExist:
+ raise Http404()
extension.downloads += 1
extension.save(replace_metadata_json=False)
@@ -70,31 +103,6 @@ def shell_update(request):
return operations
-def get_versions_for_version_strings(version_strings):
- def get_version(major, minor, point):
- try:
- return models.ShellVersion.objects.get(major=major, minor=minor, point=point)
- except models.ShellVersion.DoesNotExist:
- return None
-
- for version_string in version_strings:
- try:
- major, minor, point = models.parse_version_string(version_string, ignore_micro=True)
- except models.InvalidShellVersion:
- continue
-
- version = get_version(major, minor, point)
- if version:
- yield version
-
- # If we already have a base version, don't bother querying it again...
- if point == -1:
- continue
-
- base_version = get_version(major, minor, -1)
- if base_version:
- yield base_version
-
def ajax_query_params_query(request, n_per_page=10):
version_qs = models.ExtensionVersion.objects.visible()
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]