From 9d6e219070d6dc1dd6281585f133d068704d4ea1 Mon Sep 17 00:00:00 2001 From: Rob Hudson Date: Thu, 21 May 2015 15:36:11 -0700 Subject: [PATCH] Upgrade jingo and remove urlparams (bug 1080270) --- mkt/account/helpers.py | 2 +- mkt/account/tests/test_views.py | 3 +- mkt/api/oauth.py | 2 +- mkt/api/tests/test_oauth.py | 2 +- mkt/api/tests/test_views.py | 2 +- mkt/developers/tests/test_views.py | 2 +- mkt/developers/tests/test_views_api.py | 3 +- mkt/files/models.py | 3 +- mkt/files/views.py | 3 +- mkt/purchase/models.py | 2 +- mkt/reviewers/tests/test_views.py | 4 +-- mkt/reviewers/views.py | 3 +- mkt/site/helpers.py | 11 +++--- mkt/site/tests/test_helpers.py | 46 -------------------------- mkt/site/utils.py | 23 ------------- mkt/site/views.py | 3 +- mkt/users/tests/test_views.py | 2 +- mkt/webapps/models.py | 3 +- mkt/webpay/views.py | 2 +- requirements/prod.txt | 2 +- 20 files changed, 29 insertions(+), 94 deletions(-) diff --git a/mkt/account/helpers.py b/mkt/account/helpers.py index 21d3522a0df..c8898472c32 100644 --- a/mkt/account/helpers.py +++ b/mkt/account/helpers.py @@ -4,9 +4,9 @@ import jinja2 from jingo import register +from jingo.helpers import urlparams from mkt.account.views import fxa_oauth_api -from mkt.site.utils import urlparams @jinja2.contextfunction diff --git a/mkt/account/tests/test_views.py b/mkt/account/tests/test_views.py index 65a7ecbe285..df4015e0d0f 100644 --- a/mkt/account/tests/test_views.py +++ b/mkt/account/tests/test_views.py @@ -10,6 +10,7 @@ from django.http import QueryDict from django.utils.http import urlencode +from jingo.helpers import urlparams from mock import patch, Mock from nose.tools import eq_, ok_ @@ -19,7 +20,7 @@ from mkt.constants.apps import INSTALL_TYPE_REVIEWER from mkt.site.fixtures import fixture from mkt.site.tests import TestCase -from mkt.site.utils import app_factory, urlparams +from mkt.site.utils import app_factory from mkt.webapps.models import Installed, Webapp from mkt.users.models import UserProfile diff --git a/mkt/api/oauth.py b/mkt/api/oauth.py index 04eed177f2c..2228355340f 100644 --- a/mkt/api/oauth.py +++ b/mkt/api/oauth.py @@ -8,10 +8,10 @@ import commonware.log from oauthlib import oauth1 from oauthlib.common import safe_string_equals +from jingo.helpers import urlparams from mkt.api.models import Access, Nonce, Token, REQUEST_TOKEN, ACCESS_TOKEN from mkt.site.decorators import login_required -from mkt.site.utils import urlparams DUMMY_CLIENT_KEY = u'DummyOAuthClientKeyString' diff --git a/mkt/api/tests/test_oauth.py b/mkt/api/tests/test_oauth.py index 7c1f3e6cf44..dc02d3da549 100644 --- a/mkt/api/tests/test_oauth.py +++ b/mkt/api/tests/test_oauth.py @@ -10,6 +10,7 @@ from django.utils.encoding import iri_to_uri, smart_str from django_browserid.tests import mock_browserid +from jingo.helpers import urlparams from nose.tools import eq_, ok_ from oauthlib import oauth1 from pyquery import PyQuery as pq @@ -22,7 +23,6 @@ from mkt.site.fixtures import fixture from mkt.site.helpers import absolutify from mkt.site.tests import JSONClient, TestCase -from mkt.site.utils import urlparams from mkt.users.models import UserProfile diff --git a/mkt/api/tests/test_views.py b/mkt/api/tests/test_views.py index 784c84cabd4..bdb618dd11a 100644 --- a/mkt/api/tests/test_views.py +++ b/mkt/api/tests/test_views.py @@ -1,5 +1,6 @@ import json +from jingo.helpers import urlparams from mock import patch from nose import SkipTest from nose.tools import eq_, ok_ @@ -15,7 +16,6 @@ from mkt.api.tests.test_oauth import RestOAuth from mkt.api.views import endpoint_removed, ErrorViewSet from mkt.site.fixtures import fixture -from mkt.site.utils import urlparams class TestErrorService(RestOAuth): diff --git a/mkt/developers/tests/test_views.py b/mkt/developers/tests/test_views.py index 42364432ad5..e55bcad87e8 100644 --- a/mkt/developers/tests/test_views.py +++ b/mkt/developers/tests/test_views.py @@ -15,6 +15,7 @@ from django.utils.encoding import smart_unicode import mock +from jingo.helpers import urlparams from jinja2.utils import escape from nose.plugins.attrib import attr from nose.tools import eq_, ok_ @@ -38,7 +39,6 @@ from mkt.site.tests import assert_no_validation_errors from mkt.site.utils import app_factory, version_factory from mkt.site.tests.test_utils_ import get_image_path -from mkt.site.utils import urlparams from mkt.submit.models import AppSubmissionChecklist from mkt.translations.models import Translation from mkt.users.models import UserProfile diff --git a/mkt/developers/tests/test_views_api.py b/mkt/developers/tests/test_views_api.py index 604b9d328e9..d072abf84ba 100644 --- a/mkt/developers/tests/test_views_api.py +++ b/mkt/developers/tests/test_views_api.py @@ -6,6 +6,7 @@ from django.test.utils import override_settings import mock +from jingo.helpers import urlparams from nose.tools import eq_ import mkt @@ -13,7 +14,7 @@ from mkt.api.tests.test_oauth import RestOAuth from mkt.site.fixtures import fixture from mkt.site.tests import TestCase -from mkt.site.utils import app_factory, urlparams +from mkt.site.utils import app_factory from mkt.webapps.models import ContentRating, Geodata from mkt.users.models import UserProfile diff --git a/mkt/files/models.py b/mkt/files/models.py index e400b800fb4..9f905faf611 100644 --- a/mkt/files/models.py +++ b/mkt/files/models.py @@ -13,6 +13,7 @@ from django.utils.encoding import smart_str import commonware +from jingo.helpers import urlparams from uuidfield.fields import UUIDField import mkt @@ -20,7 +21,7 @@ from mkt.site.decorators import use_master from mkt.site.helpers import absolutify from mkt.site.models import ModelBase, OnChangeMixin, UncachedManagerBase -from mkt.site.utils import smart_path, urlparams +from mkt.site.utils import smart_path log = commonware.log.getLogger('z.files') diff --git a/mkt/files/views.py b/mkt/files/views.py index 6e4419edef4..7b1bf30b90a 100644 --- a/mkt/files/views.py +++ b/mkt/files/views.py @@ -10,6 +10,7 @@ import commonware.log from cache_nuggets.lib import Message, Token +from jingo.helpers import urlparams from tower import ugettext as _ from mkt.access import acl @@ -19,7 +20,7 @@ webapp_file_view_token) from mkt.files.tasks import extract_file from mkt.site.decorators import json_view -from mkt.site.utils import HttpResponseSendFile, urlparams +from mkt.site.utils import HttpResponseSendFile log = commonware.log.getLogger('z.addons') diff --git a/mkt/purchase/models.py b/mkt/purchase/models.py index d3820030c15..e5325b10766 100644 --- a/mkt/purchase/models.py +++ b/mkt/purchase/models.py @@ -7,13 +7,13 @@ import tower from babel import Locale, numbers from jingo import env +from jingo.helpers import urlparams from jinja2.filters import do_dictsort import mkt from mkt.site.helpers import absolutify from mkt.site.mail import send_mail from mkt.site.models import ModelBase -from mkt.site.utils import urlparams from mkt.translations.utils import get_locale_from_lang diff --git a/mkt/reviewers/tests/test_views.py b/mkt/reviewers/tests/test_views.py index 1b3e0b3a3a1..64228f21218 100644 --- a/mkt/reviewers/tests/test_views.py +++ b/mkt/reviewers/tests/test_views.py @@ -19,6 +19,7 @@ import requests import waffle from cache_nuggets.lib import Token +from jingo.helpers import urlparams from nose import SkipTest from nose.tools import eq_, ok_ from pyquery import PyQuery as pq @@ -46,8 +47,7 @@ from mkt.site.helpers import absolutify, isotime from mkt.site.tests import (check_links, days_ago, formset, initial, req_factory_factory, user_factory) -from mkt.site.utils import (app_factory, make_game, paginate, urlparams, - version_factory) +from mkt.site.utils import app_factory, make_game, paginate, version_factory from mkt.submit.tests.test_views import BasePackagedAppTest from mkt.tags.models import Tag from mkt.users.models import UserProfile diff --git a/mkt/reviewers/views.py b/mkt/reviewers/views.py index d4ebaaddce1..7ba4b37de8b 100644 --- a/mkt/reviewers/views.py +++ b/mkt/reviewers/views.py @@ -26,6 +26,7 @@ import waffle from appvalidator.constants import PERMISSIONS from cache_nuggets.lib import Token +from jingo.helpers import urlparams from rest_framework import viewsets from rest_framework.exceptions import ParseError from rest_framework.generics import (CreateAPIView, ListAPIView, UpdateAPIView, @@ -71,7 +72,7 @@ from mkt.site.helpers import absolutify, product_as_dict from mkt.site.utils import (days_ago, escape_all, HttpResponseSendFile, JSONEncoder, paginate, redirect_for_login, - smart_decode, urlparams) + smart_decode) from mkt.submit.forms import AppFeaturesForm from mkt.tags.models import Tag from mkt.users.models import UserProfile diff --git a/mkt/site/helpers.py b/mkt/site/helpers.py index 955dcf92d74..f553888df1a 100644 --- a/mkt/site/helpers.py +++ b/mkt/site/helpers.py @@ -21,14 +21,11 @@ from mkt.translations.helpers import truncate from mkt.translations.utils import get_locale_from_lang -from mkt.site.utils import append_tz, urlparams +from mkt.site.utils import append_tz log = commonware.log.getLogger('z.mkt.site') -# Registering some utils as filters: -register.filter(urlparams) - @jinja2.contextfunction @register.function @@ -121,7 +118,7 @@ def product_as_dict(request, product, purchased=None, receipt_type=None, 'name': product.name, 'categories': product.categories, 'manifest_url': product.get_manifest_url(reviewer), - 'recordUrl': urlparams(receipt_url, src=src), + 'recordUrl': helpers.urlparams(receipt_url, src=src), 'tokenUrl': token_url, 'is_packaged': product.is_packaged, 'src': src @@ -325,7 +322,7 @@ def url(viewname, *args, **kwargs): src = kwargs.pop('src', '') url = '%s%s' % (host, reverse(viewname, args=args, kwargs=kwargs)) if src: - url = urlparams(url, src=src) + url = helpers.urlparams(url, src=src) return url @@ -353,7 +350,7 @@ def media(context, url, key='MEDIA_URL'): build = context['BUILD_ID_CSS'] else: build = context['BUILD_ID_IMG'] - return urljoin(context[key], urlparams(url, b=build)) + return urljoin(context[key], helpers.urlparams(url, b=build)) @register.function diff --git a/mkt/site/tests/test_helpers.py b/mkt/site/tests/test_helpers.py index 0e0c539f173..8629ce6fb11 100644 --- a/mkt/site/tests/test_helpers.py +++ b/mkt/site/tests/test_helpers.py @@ -11,7 +11,6 @@ import mkt.site.tests from mkt.site.helpers import absolutify, css, js, product_as_dict, timesince from mkt.site.fixtures import fixture -from mkt.site.utils import urlparams from mkt.webapps.models import Webapp @@ -177,48 +176,3 @@ def test_isotime(): eq_(s, '2009-12-25T18:11:12Z') s = render('{{ d|isotime }}', {'d': None}) eq_(s, '') - - -def test_urlparams(): - url = '/developers' - c = {'base': url, - 'base_frag': url + '#hash', - 'base_query': url + '?x=y', - 'sort': 'name', 'frag': 'frag'} - - # Adding a query. - s = render('{{ base_frag|urlparams(sort=sort) }}', c) - eq_(s, '%s?sort=name#hash' % url) - - # Adding a fragment. - s = render('{{ base|urlparams(frag) }}', c) - eq_(s, '%s#frag' % url) - - # Replacing a fragment. - s = render('{{ base_frag|urlparams(frag) }}', c) - eq_(s, '%s#frag' % url) - - # Adding query and fragment. - s = render('{{ base_frag|urlparams(frag, sort=sort) }}', c) - eq_(s, '%s?sort=name#frag' % url) - - # Adding query with existing params. - s = render('{{ base_query|urlparams(frag, sort=sort) }}', c) - eq_(s, '%s?sort=name&x=y#frag' % url) - - # Replacing a query param. - s = render('{{ base_query|urlparams(frag, x="z") }}', c) - eq_(s, '%s?x=z#frag' % url) - - # Params with value of None get dropped. - s = render('{{ base|urlparams(sort=None) }}', c) - eq_(s, url) - - # Removing a query - s = render('{{ base_query|urlparams(x=None) }}', c) - eq_(s, url) - - -def test_urlparams_unicode(): - url = u'/xx?evil=reco\ufffd\ufffd\ufffd\u02f5' - urlparams(url) diff --git a/mkt/site/utils.py b/mkt/site/utils.py index 19cb96c1720..3d7bcef4d64 100644 --- a/mkt/site/utils.py +++ b/mkt/site/utils.py @@ -10,7 +10,6 @@ import time import unicodedata import urllib -import urlparse import uuid from django import forms, http @@ -56,28 +55,6 @@ def days_ago(n): log = commonware.log.getLogger('z.mkt') -def urlparams(url_, hash=None, **query): - """ - Add a fragment and/or query paramaters to a URL. - - New query params will be appended to exising parameters, except duplicate - names, which will be replaced. - """ - url = urlparse.urlparse(url_) - fragment = hash if hash is not None else url.fragment - - # Use dict(parse_qsl) so we don't get lists of values. - q = url.query - query_dict = dict(urlparse.parse_qsl(smart_str(q))) if q else {} - query_dict.update((k, v) for k, v in query.items()) - - query_string = _urlencode([(k, v) for k, v in query_dict.items() - if v is not None]) - new = urlparse.ParseResult(url.scheme, url.netloc, url.path, url.params, - query_string, fragment) - return new.geturl() - - def epoch(t): """Date/Time converted to seconds since epoch""" if not hasattr(t, 'tzinfo'): diff --git a/mkt/site/views.py b/mkt/site/views.py index a2982911a07..5f904424a19 100644 --- a/mkt/site/views.py +++ b/mkt/site/views.py @@ -17,6 +17,7 @@ import commonware.log import jingo_minify import waffle +from jingo.helpers import urlparams from django_statsd.clients import statsd from django_statsd.views import record as django_statsd_record @@ -25,7 +26,7 @@ from mkt.site import monitors from mkt.site.context_processors import get_collect_timings from mkt.site.helpers import media -from mkt.site.utils import log_cef, urlparams +from mkt.site.utils import log_cef log = commonware.log.getLogger('z.mkt.site') diff --git a/mkt/users/tests/test_views.py b/mkt/users/tests/test_views.py index 5ff5bf88ebb..ed45968cf0d 100644 --- a/mkt/users/tests/test_views.py +++ b/mkt/users/tests/test_views.py @@ -4,13 +4,13 @@ from django.core.urlresolvers import reverse +from jingo.helpers import urlparams from nose.tools import eq_, ok_ from pyquery import PyQuery as pq from waffle import helpers # NOQA from mkt.site.fixtures import fixture from mkt.site.tests import TestCase -from mkt.site.utils import urlparams from mkt.users.models import UserProfile diff --git a/mkt/webapps/models.py b/mkt/webapps/models.py index c26ceee7aea..34b85880607 100644 --- a/mkt/webapps/models.py +++ b/mkt/webapps/models.py @@ -23,6 +23,7 @@ import commonware.log from cache_nuggets.lib import memoize, memoize_key from django_extensions.db.fields.json import JSONField +from jingo.helpers import urlparams from jinja2.filters import do_dictsort from tower import ugettext as _ from tower import ugettext_lazy as _lazy @@ -49,7 +50,7 @@ OnChangeMixin) from mkt.site.storage_utils import copy_stored_file from mkt.site.utils import (cached_property, get_icon_url, slugify, smart_path, - sorted_groupby, urlparams) + sorted_groupby) from mkt.tags.models import Tag from mkt.translations.fields import (PurifiedField, save_signal, TranslatedField, Translation) diff --git a/mkt/webpay/views.py b/mkt/webpay/views.py index 1772e7adefc..7ae89d6d7bf 100644 --- a/mkt/webpay/views.py +++ b/mkt/webpay/views.py @@ -7,6 +7,7 @@ from django.http import Http404 import commonware.log +from jingo.helpers import urlparams from rest_framework import status from rest_framework.decorators import api_view, permission_classes from rest_framework.generics import GenericAPIView @@ -27,7 +28,6 @@ from mkt.receipts.utils import create_inapp_receipt from mkt.site.mail import send_mail_jinja from mkt.site.helpers import absolutify -from mkt.site.utils import urlparams from mkt.webpay.forms import FailureForm, PrepareInAppForm, PrepareWebAppForm from mkt.webpay.models import ProductIcon from mkt.webpay.serializers import (ContributionSerializer, diff --git a/requirements/prod.txt b/requirements/prod.txt index 7367c884213..741d04754db 100644 --- a/requirements/prod.txt +++ b/requirements/prod.txt @@ -58,6 +58,7 @@ html5lib==0.999 # httplib2 is required by curling, google-api-python-client httplib2==0.9.1 importlib-no-failure==1.0.2 +jingo==0.7.1 # kombu is required by celery kombu==2.5.16 heka-py==0.30.3 @@ -120,7 +121,6 @@ urllib3==1.10.3 -e git+https://github.com/mozilla/django-session-csrf@f00ad913c62e139d36078e8a7e07dab65a021386#egg=django-session-csrf -e git+https://github.com/washort/django-browserid.git@5a6ebfa#egg=django-browserid -e git+https://github.com/diox/django-cache-machine@ad16132780d40beff01803f5ca5d91a69236d105#egg=django-cache-machine --e git+https://github.com/jbalogh/jingo@fce09043542e71d972cc97d2ae703740741f80d0#egg=jingo ## Forked. -e git+https://github.com/andymckay/django-uuidfield.git@029dd1263794ec36c327617cd6c2346da81c8c33#egg=django-uuidfield