Browse Source

py3(django): compatibility with Django 1.9 (#15323)

josh 5 years ago
parent
commit
8810c64b0d

+ 1 - 1
src/sentry/new_migrations/monkey/__init__.py

@@ -7,7 +7,7 @@ from sentry.new_migrations.monkey.writer import SENTRY_MIGRATION_TEMPLATE
 
 from django.db.migrations import migration, executor, writer
 
-LAST_VERIFIED_DJANGO_VERSION = (1, 8)
+LAST_VERIFIED_DJANGO_VERSION = (1, 9)
 CHECK_MESSAGE = """Looks like you're trying to upgrade Django! Since we monkeypatch
 the Django migration library in several places, please verify that we have the latest
 code, and that the monkeypatching still works as expected. Currently the main things

+ 1 - 1
src/sentry/plugins/sentry_mail/activity/release.py

@@ -115,7 +115,7 @@ class ReleaseActivityEmail(ActivityEmail):
         users = list(
             User.objects.filter(
                 emails__is_verified=True,
-                sentry_orgmember_set__teams=Team.objects.filter(
+                sentry_orgmember_set__teams__in=Team.objects.filter(
                     id__in=ProjectTeam.objects.filter(project__in=self.projects).values_list(
                         "team_id", flat=True
                     )

+ 2 - 1
src/sentry/templatetags/sentry_assets.py

@@ -2,6 +2,7 @@ from __future__ import absolute_import
 
 from django.conf import settings
 from django.template import Library
+from django.utils.safestring import mark_safe
 
 from sentry import options
 from sentry.utils.assets import get_asset_url
@@ -56,4 +57,4 @@ def locale_js_include(context):
         return ""
 
     href = get_asset_url("sentry", "dist/locale/" + lang_code + ".js")
-    return u'<script src="{0}"{1}></script>'.format(href, crossorigin())
+    return mark_safe('<script src="{0}"{1}></script>'.format(href, crossorigin()))

+ 3 - 2
src/sentry/templatetags/sentry_avatars.py

@@ -3,6 +3,7 @@ from __future__ import absolute_import
 from django import template
 from django.conf import settings
 from django.core.urlresolvers import reverse
+from django.utils.safestring import mark_safe
 from six.moves.urllib.parse import urlencode
 
 from sentry.models import User, UserAvatar
@@ -21,7 +22,7 @@ def gravatar_url(context, email, size, default="mm"):
 
 @register.simple_tag(takes_context=True)
 def letter_avatar_svg(context, display_name, identifier, size=None):
-    return get_letter_avatar(display_name, identifier, size=size)
+    return mark_safe(get_letter_avatar(display_name, identifier, size=size))
 
 
 @register.simple_tag(takes_context=True)
@@ -40,7 +41,7 @@ def profile_photo_url(context, user_id, size=None):
 # than 1-2 avatars. It will make a request for every user!
 @register.simple_tag(takes_context=True)
 def email_avatar(context, display_name, identifier, size=None, try_gravatar=True):
-    return get_email_avatar(display_name, identifier, size, try_gravatar)
+    return mark_safe(get_email_avatar(display_name, identifier, size, try_gravatar))
 
 
 @register.inclusion_tag("sentry/partial/avatar.html")

+ 1 - 1
src/sentry/utils/committers.py

@@ -51,7 +51,7 @@ def _get_frame_paths(event):
 def _get_commits(releases):
     return list(
         Commit.objects.filter(
-            releasecommit=ReleaseCommit.objects.filter(release__in=releases)
+            releasecommit__in=ReleaseCommit.objects.filter(release__in=releases)
         ).select_related("author")
     )
 

+ 2 - 6
tests/acceptance/test_organization_developer_settings.py

@@ -35,9 +35,7 @@ class OrganizationDeveloperSettingsNewAcceptanceTest(AcceptanceTestCase):
 
         self.browser.click('[aria-label="Save Changes"]')
 
-        self.browser.wait_until(".ref-success")
-
-        assert self.browser.find_element_by_xpath("//div[contains(text(), 'Client ID')]")
+        self.browser.wait_until(xpath="//div[contains(text(), 'Client ID')]", timeout=3)
 
     def test_create_new_internal_integration(self):
         self.load_page(self.org_developer_settings_path)
@@ -48,9 +46,7 @@ class OrganizationDeveloperSettingsNewAcceptanceTest(AcceptanceTestCase):
 
         self.browser.click('[aria-label="Save Changes"]')
 
-        self.browser.wait_until(".ref-success")
-
-        assert self.browser.find_element_by_xpath("//button//span[contains(text(), 'New Token')]")
+        self.browser.wait_until(xpath="//button//span[contains(text(), 'New Token')]", timeout=3)
 
 
 class OrganizationDeveloperSettingsEditAcceptanceTest(AcceptanceTestCase):

+ 3 - 5
tests/integration/test_sso.py

@@ -24,19 +24,17 @@ class OrganizationAuthLoginTest(AuthProviderTestCase):
         self.login_as(user)
 
         path = u"/{}/".format(organization.slug)
-        redirect_uri = u"http://testserver/auth/login/{}/".format(organization.slug)
+        redirect_uri = u"/auth/login/{}/".format(organization.slug)
 
         # we should be redirecting the user to the authentication form as they
         # haven't verified this specific organization
         resp = self.client.get(path)
-        assert resp.status_code == 302
-        assert resp["Location"] == redirect_uri
+        self.assertRedirects(resp, redirect_uri)
 
         # superuser should still require SSO as they're a member of the org
         user.update(is_superuser=True)
         resp = self.client.get(path)
-        assert resp.status_code == 302
-        assert resp["Location"] == redirect_uri
+        self.assertRedirects(resp, redirect_uri)
 
         # XXX(dcramer): using internal API as exposing a request object is hard
         self.session[SSO_SESSION_KEY] = six.text_type(organization.id)

+ 8 - 4
tests/sentry/api/endpoints/test_project_details.py

@@ -3,6 +3,7 @@ from __future__ import absolute_import
 import mock
 import six
 
+import django
 from django.core.urlresolvers import reverse
 
 from sentry.constants import RESERVED_PROJECT_SLUGS
@@ -80,10 +81,13 @@ class ProjectDetailsTest(APITestCase):
             project.organization.slug,
             "foobar",
         )
-        assert response["Location"] == "http://testserver/api/0/projects/%s/%s/" % (
-            project.organization.slug,
-            "foobar",
-        )
+        redirect_path = "/api/0/projects/%s/%s/" % (project.organization.slug, "foobar")
+        if django.VERSION < (1, 9):
+            # Django 1.9 no longer forcefully rewrites relative redirects to absolute URIs because of RFC 7231.
+            redirect_path = "http://testserver" + redirect_path
+        # XXX: AttributeError: 'Response' object has no attribute 'url'
+        # (this is with self.assertRedirects(response, ...))
+        assert response["Location"] == redirect_path
 
 
 class ProjectUpdateTest(APITestCase):

+ 11 - 7
tests/sentry/web/frontend/test_auth_login.py

@@ -146,20 +146,24 @@ class AuthLoginTest(TestCase):
         self.client.get(self.path + "?next=" + urlquote(next))
 
         resp = self.client.post(
-            self.path, {"username": self.user.username, "password": "admin", "op": "login"}
+            self.path,
+            {"username": self.user.username, "password": "admin", "op": "login"},
+            follow=False,
         )
-        assert resp.status_code == 302
-        assert next not in resp["Location"]
-        assert resp["Location"] == "http://testserver/auth/login/"
+        self.assertRedirects(resp, reverse("sentry-login"), target_status_code=302)
+        resp = self.client.post(
+            self.path,
+            {"username": self.user.username, "password": "admin", "op": "login"},
+            follow=True,
+        )
+        self.assertRedirects(resp, "/organizations/new/")
 
     def test_redirects_already_authed_non_superuser(self):
         self.user.update(is_superuser=False)
         self.login_as(self.user)
         with self.feature("organizations:create"):
             resp = self.client.get(self.path)
-
-        assert resp.status_code == 302
-        assert resp["Location"] == "http://testserver/organizations/new/"
+            self.assertRedirects(resp, "/organizations/new/")
 
     def test_doesnt_redirect_already_authed_superuser(self):
         self.login_as(self.user, superuser=False)

+ 1 - 3
tests/sentry/web/frontend/test_auth_logout.py

@@ -44,6 +44,4 @@ class AuthLogoutTest(TestCase):
         self.client.post(self.path + "?next=" + quote(next))
 
         resp = self.client.post(self.path)
-        assert resp.status_code == 302
-        assert next not in resp["Location"]
-        assert resp["Location"] == "http://testserver/auth/login/"
+        self.assertRedirects(resp, "/auth/login/")

Some files were not shown because too many files changed in this diff