From 60dd98e48fb22c7b3ea04d628dacdf9bdac7db87 Mon Sep 17 00:00:00 2001 From: "pyup.io bot" Date: Mon, 5 Nov 2018 04:39:42 -0800 Subject: [PATCH] Update flake8 to 3.6.0 (#9795) --- requirements/flake8.txt | 12 +- services/theme_update.py | 2 +- setup.cfg | 6 +- src/olympia/activity/utils.py | 2 +- src/olympia/addons/urls.py | 46 ++--- src/olympia/amo/fields.py | 2 +- .../management/commands/compress_assets.py | 2 +- src/olympia/amo/templatetags/jinja_helpers.py | 12 +- src/olympia/amo/tests/test_redirects.py | 6 +- src/olympia/amo/urls.py | 20 +-- src/olympia/amo/utils.py | 2 +- src/olympia/applications/urls.py | 4 +- src/olympia/bandwagon/urls.py | 46 ++--- src/olympia/browse/tests.py | 2 +- src/olympia/browse/urls.py | 46 ++--- src/olympia/constants/applications.py | 10 +- src/olympia/constants/base.py | 2 +- src/olympia/devhub/urls.py | 161 +++++++++--------- src/olympia/files/models.py | 2 +- src/olympia/files/urls.py | 4 +- src/olympia/files/utils.py | 4 +- src/olympia/legacy_api/urls.py | 20 +-- src/olympia/legacy_discovery/urls.py | 4 +- src/olympia/lib/crypto/tasks.py | 2 +- src/olympia/pages/urls.py | 46 ++--- src/olympia/ratings/forms.py | 6 +- src/olympia/ratings/urls.py | 20 +-- src/olympia/reviewers/urls.py | 26 +-- src/olympia/search/urls.py | 6 +- src/olympia/signing/urls.py | 2 +- src/olympia/stats/urls.py | 40 ++--- src/olympia/tags/urls.py | 2 +- src/olympia/urls.py | 78 ++++----- src/olympia/users/forms.py | 2 +- src/olympia/users/urls.py | 26 +-- src/olympia/versions/urls.py | 16 +- src/olympia/zadmin/urls.py | 40 ++--- 37 files changed, 361 insertions(+), 368 deletions(-) diff --git a/requirements/flake8.txt b/requirements/flake8.txt index f6cae8c167..92a4224ba3 100644 --- a/requirements/flake8.txt +++ b/requirements/flake8.txt @@ -9,9 +9,9 @@ enum34==1.1.6 \ --hash=sha256:8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1 \ --hash=sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850 # flake8 is required by flake8-mutable -flake8==3.5.0 \ - --hash=sha256:c7841163e2b576d435799169b78703ad6ac1bbb0f199994fc05f700b2a90ea37 \ - --hash=sha256:7253265f7abd8b313e3892944044a365e3f4ac3fcdcfb4298f55ee9ddf188ba0 +flake8==3.6.0 \ + --hash=sha256:c01f8a3963b3571a8e6bd7a4063359aff90749e160778e03817cd9b71c9e07d2 \ + --hash=sha256:6a35f5b8761f45c5513e3405f110a86bea57982c3b75b766ce7b65217abe1670 flake8-mutable==1.2.0 \ --hash=sha256:ee9b77111b867d845177bbc289d87d541445ffcc6029a0c5c65865b42b18c6a6 \ --hash=sha256:38fd9dadcbcda6550a916197bc40ed76908119dabb37fbcca30873666c31d2d5 @@ -22,9 +22,9 @@ mccabe==0.6.1 \ # pycodestyle is required by flake8 # See https://gitlab.com/pycqa/flake8/issues/444 and related merge requests # for why this is pinned. -pycodestyle==2.3.1 \ - --hash=sha256:6c4245ade1edfad79c3446fadfc96b0de2759662dc29d07d80a6f27ad1ca6ba9 \ - --hash=sha256:682256a5b318149ca0d2a9185d365d8864a768a28db66a84a2ea946bcc426766 # pyup: <2.4.0 +pycodestyle==2.4.0 \ + --hash=sha256:cbc619d09254895b0d12c2c691e237b2e91e9b2ecf5e84c26b35400f93dcfb83 \ + --hash=sha256:74abc4e221d393ea5ce1f129ea6903209940c1ecd29e002e8c6933c2b21026e0 # pyup: <2.5.0 # pyflakes is required by flake8 pyflakes==2.0.0 \ --hash=sha256:f661252913bc1dbe7fcfcbf0af0db3f42ab65aabd1a6ca68fe5d466bace94dae \ diff --git a/services/theme_update.py b/services/theme_update.py index d495ee3764..26de2f929e 100644 --- a/services/theme_update.py +++ b/services/theme_update.py @@ -223,7 +223,7 @@ class LWThemeUpdate(ThemeUpdate): return '%s/%s%s' % (domain, self.data.get('locale', 'en-US'), url) -url_re = re.compile('(?P.+)?/themes/update-check/(?P\d+)$') +url_re = re.compile(r'(?P.+)?/themes/update-check/(?P\d+)$') def application(environ, start_response): diff --git a/setup.cfg b/setup.cfg index b681b2a05d..b4e0e07999 100644 --- a/setup.cfg +++ b/setup.cfg @@ -18,9 +18,8 @@ filterwarnings = ignore:::csp.utils [flake8] -ignore = F999,F405 +ignore = F999,F405,W504 exclude = - services, src/olympia/wsgi.py, docs, node_modules, @@ -28,9 +27,8 @@ exclude = build*.py .tox, media, - user-media, + storage, logs, - tmp, site-static, static, .git diff --git a/src/olympia/activity/utils.py b/src/olympia/activity/utils.py index 1227ab9e0f..ff87811932 100644 --- a/src/olympia/activity/utils.py +++ b/src/olympia/activity/utils.py @@ -80,7 +80,7 @@ class ActivityEmailParser(object): followed by headers like "From: nobody@mozilla.org" and strips that part out. """ - email_header_re = re.compile('From: [^@]+@[^@]+\.[^@]+') + email_header_re = re.compile(r'From: [^@]+@[^@]+\.[^@]+') split_email = email_header_re.split(email) if split_email[0].startswith('From: '): # In case, it's a bottom reply, return everything. diff --git a/src/olympia/addons/urls.py b/src/olympia/addons/urls.py index c49d4b3d63..dd30926982 100644 --- a/src/olympia/addons/urls.py +++ b/src/olympia/addons/urls.py @@ -11,43 +11,43 @@ ADDON_ID = r"""(?P[^/<>"']+)""" # These will all start with /addon// detail_patterns = [ - url('^$', views.addon_detail, name='addons.detail'), - url('^more$', views.addon_detail, name='addons.detail_more'), - url('^eula/(?P\d+)?$', views.eula, name='addons.eula'), - url('^license/(?P[^/]+)?', views.license, name='addons.license'), - url('^privacy/', views.privacy, name='addons.privacy'), - url('^abuse/', views.report_abuse, name='addons.abuse'), + url(r'^$', views.addon_detail, name='addons.detail'), + url(r'^more$', views.addon_detail, name='addons.detail_more'), + url(r'^eula/(?P\d+)?$', views.eula, name='addons.eula'), + url(r'^license/(?P[^/]+)?', views.license, name='addons.license'), + url(r'^privacy/', views.privacy, name='addons.privacy'), + url(r'^abuse/', views.report_abuse, name='addons.abuse'), - url('^reviews/', include('olympia.ratings.urls')), - url('^statistics/', include(stats_patterns)), - url('^versions/', include('olympia.versions.urls')), + url(r'^reviews/', include('olympia.ratings.urls')), + url(r'^statistics/', include(stats_patterns)), + url(r'^versions/', include('olympia.versions.urls')), # Old contribution urls - url('^developers$', + url(r'^developers$', lambda r, addon_id: redirect('addons.detail', addon_id, permanent=True), name='addons.meet'), - url('^contribute/roadblock/', + url(r'^contribute/roadblock/', lambda r, addon_id: redirect('addons.detail', addon_id, permanent=True), name='addons.roadblock'), - url('^contribute/installed/', + url(r'^contribute/installed/', lambda r, addon_id: redirect('addons.detail', addon_id, permanent=True), name='addons.installed'), - url('^contribute/thanks', + url(r'^contribute/thanks', lambda r, addon_id: redirect('addons.detail', addon_id, permanent=True), name='addons.thanks'), - url('^contribute/$', + url(r'^contribute/$', lambda r, addon_id: redirect('addons.detail', addon_id, permanent=True), name='addons.contribute'), - url('^contribute/(?Pcancel|complete)$', + url(r'^contribute/(?Pcancel|complete)$', lambda r, addon_id, status: redirect('addons.detail', addon_id, permanent=True), name='addons.contribute_status'), - url('^about$', + url(r'^about$', lambda r, addon_id: redirect('addons.detail', addon_id, permanent=True), name='addons.about'), @@ -56,27 +56,27 @@ detail_patterns = [ urlpatterns = [ # Promo modules for the homepage - url('^i/promos$', views.homepage_promos, name='addons.homepage_promos'), + url(r'^i/promos$', views.homepage_promos, name='addons.homepage_promos'), # See https://github.com/mozilla/addons-server/issues/3130 # Hardcode because there is no relation from blocklist items and the # add-on they block :-( - url('^addon/icloud-bookmarks/$', views.icloud_bookmarks_redirect, + url(r'^addon/icloud-bookmarks/$', views.icloud_bookmarks_redirect, name='addons.icloudbookmarksredirect'), # URLs for a single add-on. - url('^addon/%s/' % ADDON_ID, include(detail_patterns)), + url(r'^addon/%s/' % ADDON_ID, include(detail_patterns)), # Remora EULA and Privacy policy URLS - url('^addons/policy/0/(?P\d+)/(?P\d+)', + url(r'^addons/policy/0/(?P\d+)/(?P\d+)', lambda r, addon_id, file_id: redirect( 'addons.eula', addon_id, file_id, permanent=True)), - url('^addons/policy/0/(?P\d+)/', + url(r'^addons/policy/0/(?P\d+)/', lambda r, addon_id: redirect( 'addons.privacy', addon_id, permanent=True)), - url('^versions/license/(\d+)$', views.license_redirect), + url(r'^versions/license/(\d+)$', views.license_redirect), - url('^find-replacement/$', views.find_replacement_addon, + url(r'^find-replacement/$', views.find_replacement_addon, name='addons.find_replacement'), ] diff --git a/src/olympia/amo/fields.py b/src/olympia/amo/fields.py index d6e0b897da..690e376534 100644 --- a/src/olympia/amo/fields.py +++ b/src/olympia/amo/fields.py @@ -77,7 +77,7 @@ class ColorField(fields.CharField): def clean(self, value): super(ColorField, self).clean(value) - if value and not re.match('^\#([0-9a-fA-F]{6})$', value): + if value and not re.match(r'^\#([0-9a-fA-F]{6})$', value): raise exceptions.ValidationError(ugettext( u'This must be a valid hex color code, such as #000000.')) return value diff --git a/src/olympia/amo/management/commands/compress_assets.py b/src/olympia/amo/management/commands/compress_assets.py index 380983c692..b31eb5d8c1 100644 --- a/src/olympia/amo/management/commands/compress_assets.py +++ b/src/olympia/amo/management/commands/compress_assets.py @@ -177,7 +177,7 @@ class Command(BaseCommand): def _parse(url): return self._cachebust_regex(url, css_file) - css_parsed = re.sub('url\(([^)]*?)\)', _parse, css_content) + css_parsed = re.sub(r'url\(([^)]*?)\)', _parse, css_content) with open(css_file, 'w') as css_out: css_out.write(css_parsed) diff --git a/src/olympia/amo/templatetags/jinja_helpers.py b/src/olympia/amo/templatetags/jinja_helpers.py index dfc5bf6177..730af959ab 100644 --- a/src/olympia/amo/templatetags/jinja_helpers.py +++ b/src/olympia/amo/templatetags/jinja_helpers.py @@ -543,23 +543,15 @@ def format_html(string, *args, **kwargs): @library.global_function -def js(bundle, debug=None, defer=False, async=False): +def js(bundle, debug=None): """ If we are in debug mode, just output a single script tag for each js file. If we are not in debug mode, return a script that points at bundle-min.js. Copied from jingo-minify until we switch to something better... """ - attrs = [] urls = get_js_urls(bundle, debug) - - attrs.append('src="%s"') - - if defer: - attrs.append('defer') - - if async: - attrs.append('async') + attrs = ['src="%s"'] return _build_html(urls, '' % ' '.join(attrs)) diff --git a/src/olympia/amo/tests/test_redirects.py b/src/olympia/amo/tests/test_redirects.py index 845ccc890e..fda1c57e96 100644 --- a/src/olympia/amo/tests/test_redirects.py +++ b/src/olympia/amo/tests/test_redirects.py @@ -17,8 +17,8 @@ class TestRedirects(TestCase): '/en-US/firefox/themes/film-and-tv/') def test_contribute_installed(self): - """`/addon/\d+/about` should go to - `/addon/\d+/contribute/installed`.""" + r"""`/addon/\d+/about` should go to + `/addon/\d+/contribute/installed`.""" r = self.client.get(u'/addon/5326/about', follow=True) redirect = r.redirect_chain[-1][0] assert redirect.endswith( @@ -162,7 +162,7 @@ class TestPersonaRedirect(TestCase): fixtures = ['addons/persona'] def test_persona_redirect(self): - """`/persona/\d+` should go to `/addon/\d+`.""" + r"""`/persona/\d+` should go to `/addon/\d+`.""" r = self.client.get('/persona/813', follow=True) self.assert3xx(r, '/en-US/firefox/addon/a15663/', status_code=301) diff --git a/src/olympia/amo/urls.py b/src/olympia/amo/urls.py index 35189807ec..1a96377041 100644 --- a/src/olympia/amo/urls.py +++ b/src/olympia/amo/urls.py @@ -7,21 +7,21 @@ from . import views services_patterns = [ - url('^monitor\.json$', never_cache(views.monitor), + url(r'^monitor\.json$', never_cache(views.monitor), name='amo.monitor'), - url('^loaded$', never_cache(views.loaded), name='amo.loaded'), - url('^403', views.handler403), - url('^404', views.handler404), - url('^500', views.handler500), + url(r'^loaded$', never_cache(views.loaded), name='amo.loaded'), + url(r'^403', views.handler403), + url(r'^404', views.handler404), + url(r'^500', views.handler500), ] urlpatterns = [ - url('^robots\.txt$', views.robots, name='robots.txt'), - url('^contribute\.json$', views.contribute, name='contribute.json'), - url('^services/', include(services_patterns)), - url('^__version__$', views.version, name='version.json'), + url(r'^robots\.txt$', views.robots, name='robots.txt'), + url(r'^contribute\.json$', views.contribute, name='contribute.json'), + url(r'^services/', include(services_patterns)), + url(r'^__version__$', views.version, name='version.json'), - url('^opensearch\.xml$', legacy_views.render_xml, + url(r'^opensearch\.xml$', legacy_views.render_xml, {'template': 'amo/opensearch.xml'}, name='amo.opensearch'), ] diff --git a/src/olympia/amo/utils.py b/src/olympia/amo/utils.py index 69eb73c13d..66e32d14ba 100644 --- a/src/olympia/amo/utils.py +++ b/src/olympia/amo/utils.py @@ -452,7 +452,7 @@ def slugify(s, ok=SLUG_OK, lower=True, spaces=False, delimiter='-'): rv.append(' ') new = ''.join(rv).strip() if not spaces: - new = re.sub('[-\s]+', delimiter, new) + new = re.sub(r'[-\s]+', delimiter, new) return new.lower() if lower else new diff --git a/src/olympia/applications/urls.py b/src/olympia/applications/urls.py index 87a3c2ab30..b09d183bd2 100644 --- a/src/olympia/applications/urls.py +++ b/src/olympia/applications/urls.py @@ -4,6 +4,6 @@ from . import views urlpatterns = [ - url('^$', views.appversions, name='apps.appversions'), - url('^format:rss$', views.AppversionsFeed(), name='apps.appversions.rss'), + url(r'^$', views.appversions, name='apps.appversions'), + url(r'^format:rss$', views.AppversionsFeed(), name='apps.appversions.rss'), ] diff --git a/src/olympia/bandwagon/urls.py b/src/olympia/bandwagon/urls.py index 493d8e2e9f..8cd362dd62 100644 --- a/src/olympia/bandwagon/urls.py +++ b/src/olympia/bandwagon/urls.py @@ -4,47 +4,47 @@ from . import views edit_urls = [ - url('^$', views.edit, name='collections.edit'), - url('^addons$', views.edit_addons, name='collections.edit_addons'), - url('^privacy$', views.edit_privacy, name='collections.edit_privacy'), + url(r'^$', views.edit, name='collections.edit'), + url(r'^addons$', views.edit_addons, name='collections.edit_addons'), + url(r'^privacy$', views.edit_privacy, name='collections.edit_privacy'), ] detail_urls = [ - url('^$', views.collection_detail, name='collections.detail'), - url('^format:json$', views.collection_detail_json, + url(r'^$', views.collection_detail, name='collections.detail'), + url(r'^format:json$', views.collection_detail_json, name='collections.detail.json'), - url('^edit/', include(edit_urls)), - url('^delete$', views.delete, name='collections.delete'), - url('^delete_icon$', views.delete_icon, name='collections.delete_icon'), - url('^(?Padd|remove)$', views.collection_alter, + url(r'^edit/', include(edit_urls)), + url(r'^delete$', views.delete, name='collections.delete'), + url(r'^delete_icon$', views.delete_icon, name='collections.delete_icon'), + url(r'^(?Padd|remove)$', views.collection_alter, name='collections.alter'), ] ajax_urls = [ - url('^list$', views.ajax_list, name='collections.ajax_list'), - url('^add$', views.ajax_collection_alter, {'action': 'add'}, + url(r'^list$', views.ajax_list, name='collections.ajax_list'), + url(r'^add$', views.ajax_collection_alter, {'action': 'add'}, name='collections.ajax_add'), - url('^remove$', views.ajax_collection_alter, {'action': 'remove'}, + url(r'^remove$', views.ajax_collection_alter, {'action': 'remove'}, name='collections.ajax_remove'), - url('^new$', views.ajax_new, name='collections.ajax_new'), + url(r'^new$', views.ajax_new, name='collections.ajax_new'), ] urlpatterns = [ - url('^collection/(?P[^/]+)/?$', views.legacy_redirect), - url('^collections/view/(?P[^/]+)/?$', views.legacy_redirect), - url('^collections/edit/(?P[^/]+)/?$', views.legacy_redirect, + url(r'^collection/(?P[^/]+)/?$', views.legacy_redirect), + url(r'^collections/view/(?P[^/]+)/?$', views.legacy_redirect), + url(r'^collections/edit/(?P[^/]+)/?$', views.legacy_redirect, {'edit': True}), - url('^collections/$', views.collection_listing, name='collections.list'), + url(r'^collections/$', views.collection_listing, name='collections.list'), - url('^collections/(editors_picks|popular|favorites)/?$', + url(r'^collections/(editors_picks|popular|favorites)/?$', views.legacy_directory_redirects), - url('^collections/mine/(?P[^/]+)?$', views.mine, + url(r'^collections/mine/(?P[^/]+)?$', views.mine, name='collections.mine', kwargs={'username': 'mine'}), - url('^collections/(?P[^/]+)/$', views.user_listing, + url(r'^collections/(?P[^/]+)/$', views.user_listing, name='collections.user'), - url('^collections/(?P[^/]+)/(?P[^/]+)/', + url(r'^collections/(?P[^/]+)/(?P[^/]+)/', include(detail_urls)), - url('^collections/add$', views.add, name='collections.add'), - url('^collections/ajax/', include(ajax_urls)), + url(r'^collections/add$', views.add, name='collections.add'), + url(r'^collections/ajax/', include(ajax_urls)), ] diff --git a/src/olympia/browse/tests.py b/src/olympia/browse/tests.py index f1ceea7127..47445438e9 100644 --- a/src/olympia/browse/tests.py +++ b/src/olympia/browse/tests.py @@ -461,7 +461,7 @@ class TestFeaturedLocale(TestCase): # are changing. doc = pq(content) ass = doc('.featured-inner .item a') - rx = re.compile('/(en-US|es)/firefox/addon/(\d+)/$') + rx = re.compile(r'/(en-US|es)/firefox/addon/(\d+)/$') for a in ass: mtch = rx.match(a.attrib['href']) if mtch: diff --git a/src/olympia/browse/urls.py b/src/olympia/browse/urls.py index 78e0f756db..40b7eef06f 100644 --- a/src/olympia/browse/urls.py +++ b/src/olympia/browse/urls.py @@ -10,82 +10,82 @@ from . import views impala_patterns = [ # TODO: Impalacize these views. - url('^extensions/(?P[^/]+)/featured$', + url(r'^extensions/(?P[^/]+)/featured$', views.legacy_creatured_redirect, name='i_browse.creatured'), - url('^language-tools/(?P[^/]+)?$', views.language_tools, + url(r'^language-tools/(?P[^/]+)?$', views.language_tools, name='i_browse.language-tools'), - url('^search-tools/(?P[^/]+)?$', views.search_tools, + url(r'^search-tools/(?P[^/]+)?$', views.search_tools, name='i_browse.search-tools'), ] urlpatterns = [ - url('^i/', include(impala_patterns)), + url(r'^i/', include(impala_patterns)), - url('^language-tools/(?P[^/]+)?$', views.language_tools, + url(r'^language-tools/(?P[^/]+)?$', views.language_tools, name='browse.language-tools'), - url('^dictionaries$', + url(r'^dictionaries$', lambda r: redirect(reverse('browse.language-tools'), permanent=True)), - url('^featured$', + url(r'^featured$', lambda r: redirect(reverse('browse.extensions') + '?sort=featured', permanent=True)), # Full Themes are now Complete Themes. - url('^full-themes/(?P[^ /]+)?$', + url(r'^full-themes/(?P[^ /]+)?$', views.legacy_fulltheme_redirects), # Personas are now Themes. - url('^personas/(?P[^ /]+)?$', + url(r'^personas/(?P[^ /]+)?$', views.legacy_theme_redirects), - url('^themes/(?:(?P[^ /]+)/)?$', views.personas, + url(r'^themes/(?:(?P[^ /]+)/)?$', views.personas, name='browse.personas'), # Themes are now Complete Themes. - url('^themes/(?P[^/]+)/format:rss$', + url(r'^themes/(?P[^/]+)/format:rss$', views.legacy_theme_redirects), - url('^complete-themes/(?P[^/]+)?$', views.themes, + url(r'^complete-themes/(?P[^/]+)?$', views.themes, name='browse.themes'), - url('^complete-themes/(?:(?P[^/]+)/)?format:rss$', + url(r'^complete-themes/(?:(?P[^/]+)/)?format:rss$', ThemeCategoriesRss(), name='browse.themes.rss'), # This won't let you browse any themes but detail page needs the url. - url('^static-themes/(?:(?P[^/]+)/)?$', + url(r'^static-themes/(?:(?P[^/]+)/)?$', lambda r, category: redirect( reverse('browse.personas', kwargs=({'category': category} if category else {}))), name='browse.static-themes'), - url('^extensions/(?:(?P[^/]+)/)?$', views.extensions, + url(r'^extensions/(?:(?P[^/]+)/)?$', views.extensions, name='browse.extensions'), # Creatured URLs now redirect to browse.extensions - url('^extensions/(?P[^/]+)/featured$', + url(r'^extensions/(?P[^/]+)/featured$', views.legacy_creatured_redirect), - url('^extensions/(?:(?P[^/]+)/)?format:rss$', + url(r'^extensions/(?:(?P[^/]+)/)?format:rss$', ExtensionCategoriesRss(), name='browse.extensions.rss'), - url('^browse/type:7$', + url(r'^browse/type:7$', lambda r: redirect("https://www.mozilla.org/plugincheck/", permanent=True)), - url('^browse/type:(?P\d)(?:/cat:(?P\d+))?' + url(r'^browse/type:(?P\d)(?:/cat:(?P\d+))?' '(?:/sort:(?P[^/]+))?(?:/format:(?P[^/]+).*)?', views.legacy_redirects), - url('^search-tools/(?:(?P[^/]+)/)?format:rss$', + url(r'^search-tools/(?:(?P[^/]+)/)?format:rss$', SearchToolsRss(), name='browse.search-tools.rss'), - url('^search-tools/(?P[^/]+)?$', views.search_tools, + url(r'^search-tools/(?P[^/]+)?$', views.search_tools, name='browse.search-tools'), - url('^featured/format:rss$', FeaturedRss(), name='browse.featured.rss'), + url(r'^featured/format:rss$', FeaturedRss(), name='browse.featured.rss'), # The plugins page was moved to mozilla.org and so now it is just a # redirect, per bug 775799. - url('^plugins$', + url(r'^plugins$', lambda r: redirect('http://www.mozilla.org/en-US/plugincheck/', permanent=True)), ] diff --git a/src/olympia/constants/applications.py b/src/olympia/constants/applications.py index 36794dae5b..c24b6a1316 100644 --- a/src/olympia/constants/applications.py +++ b/src/olympia/constants/applications.py @@ -117,11 +117,11 @@ class ANDROID(App): user_agent_string = 'Fennec' # Mobile and Android have the same user agent. The only way to distinguish # is by the version number. - user_agent_re = [re.compile('Fennec/([\d.]+)'), - re.compile('Android; Mobile; rv:([\d.]+)'), - re.compile('Android; Tablet; rv:([\d.]+)'), - re.compile('Mobile; rv:([\d.]+)'), - re.compile('Tablet; rv:([\d.]+)')] + user_agent_re = [re.compile(r'Fennec/([\d.]+)'), + re.compile(r'Android; Mobile; rv:([\d.]+)'), + re.compile(r'Android; Tablet; rv:([\d.]+)'), + re.compile(r'Mobile; rv:([\d.]+)'), + re.compile(r'Tablet; rv:([\d.]+)')] platforms = 'mobile' latest_version = None diff --git a/src/olympia/constants/base.py b/src/olympia/constants/base.py index a345b65a45..7de39cba87 100644 --- a/src/olympia/constants/base.py +++ b/src/olympia/constants/base.py @@ -387,7 +387,7 @@ VALIDATOR_SKELETON_EXCEPTION_WEBEXT = { "ending_tier": 5, } -VERSION_SEARCH = re.compile('\.(\d+)$') +VERSION_SEARCH = re.compile(r'\.(\d+)$') # Types of SiteEvent SITE_EVENT_OTHER = 1 diff --git a/src/olympia/devhub/urls.py b/src/olympia/devhub/urls.py index b3c33d64a9..f19bb73b87 100644 --- a/src/olympia/devhub/urls.py +++ b/src/olympia/devhub/urls.py @@ -11,197 +11,200 @@ from . import views # These will all start with /theme// theme_detail_patterns = [ - url('^$', lambda r, + url(r'^$', lambda r, addon_id: redirect('devhub.themes.edit', addon_id, permanent=True)), - url('^delete$', views.delete, name='devhub.themes.delete'), + url(r'^delete$', views.delete, name='devhub.themes.delete'), # Upload url here to satisfy CSRF. - url('^edit/upload/' + url(r'^edit/upload/' '(?Ppersona_header)$', views.ajax_upload_image, name='devhub.personas.reupload_persona'), - url('^edit$', views.edit_theme, name='devhub.themes.edit'), - url('^rmlocale$', views.remove_locale, name='devhub.themes.remove-locale'), + url(r'^edit$', views.edit_theme, name='devhub.themes.edit'), + url(r'^rmlocale$', views.remove_locale, + name='devhub.themes.remove-locale'), ] # These will all start with /addon// detail_patterns = [ # Redirect to the edit page from the base. - url('^$', lambda r, addon_id: redirect('devhub.addons.edit', addon_id, - permanent=True)), - url('^edit$', views.edit, name='devhub.addons.edit'), - url('^delete$', views.delete, name='devhub.addons.delete'), - url('^disable$', views.disable, name='devhub.addons.disable'), - url('^enable$', views.enable, name='devhub.addons.enable'), - url('^cancel$', views.cancel, name='devhub.addons.cancel'), - url('^ownership$', views.ownership, name='devhub.addons.owner'), - url('^edit_(?P
[^/]+)(?:/(?P[^/]+))?$', + url(r'^$', lambda r, addon_id: redirect('devhub.addons.edit', addon_id, + permanent=True)), + url(r'^edit$', views.edit, name='devhub.addons.edit'), + url(r'^delete$', views.delete, name='devhub.addons.delete'), + url(r'^disable$', views.disable, name='devhub.addons.disable'), + url(r'^enable$', views.enable, name='devhub.addons.enable'), + url(r'^cancel$', views.cancel, name='devhub.addons.cancel'), + url(r'^ownership$', views.ownership, name='devhub.addons.owner'), + url(r'^edit_(?P
[^/]+)(?:/(?P[^/]+))?$', views.addons_section, name='devhub.addons.section'), - url('^upload_preview$', views.upload_image, {'upload_type': 'preview'}, + url(r'^upload_preview$', views.upload_image, {'upload_type': 'preview'}, name='devhub.addons.upload_preview'), - url('^upload_icon$', views.upload_image, {'upload_type': 'icon'}, + url(r'^upload_icon$', views.upload_image, {'upload_type': 'icon'}, name='devhub.addons.upload_icon'), - url('^upload-(?Plisted|unlisted)$', views.upload_for_version, + url(r'^upload-(?Plisted|unlisted)$', views.upload_for_version, name='devhub.upload_for_version'), - url('^upload/(?P[^/]+)$', views.upload_detail_for_version, + url(r'^upload/(?P[^/]+)$', views.upload_detail_for_version, name='devhub.upload_detail_for_version'), - url('^versions$', views.version_list, name='devhub.addons.versions'), - url('^versions/delete$', views.version_delete, + url(r'^versions$', views.version_list, name='devhub.addons.versions'), + url(r'^versions/delete$', views.version_delete, name='devhub.versions.delete'), - url('^versions/reenable$', views.version_reenable, + url(r'^versions/reenable$', views.version_reenable, name='devhub.versions.reenable'), - url('^versions/stats$', views.version_stats, + url(r'^versions/stats$', views.version_stats, name='devhub.versions.stats'), - url('^versions/(?P\d+)$', views.version_edit, + url(r'^versions/(?P\d+)$', views.version_edit, name='devhub.versions.edit'), - url('^versions/(?P[^/]+)$', views.version_bounce), + url(r'^versions/(?P[^/]+)$', views.version_bounce), # New version submission - url('^versions/submit/$', + url(r'^versions/submit/$', views.submit_version_auto, name='devhub.submit.version'), - url('^versions/submit/agreement$', + url(r'^versions/submit/agreement$', views.submit_version_agreement, name='devhub.submit.version.agreement'), - url('^versions/submit/distribution$', + url(r'^versions/submit/distribution$', views.submit_version_distribution, name='devhub.submit.version.distribution'), - url('^versions/submit/upload-(?Plisted|unlisted)$', + url(r'^versions/submit/upload-(?Plisted|unlisted)$', views.submit_version_upload, name='devhub.submit.version.upload'), - url('^versions/submit/(?P\d+)/source$', + url(r'^versions/submit/(?P\d+)/source$', views.submit_version_source, name='devhub.submit.version.source'), - url('^versions/submit/(?P\d+)/details$', + url(r'^versions/submit/(?P\d+)/details$', views.submit_version_details, name='devhub.submit.version.details'), - url('^versions/submit/(?P\d+)/finish$', + url(r'^versions/submit/(?P\d+)/finish$', views.submit_version_finish, name='devhub.submit.version.finish'), - url('^versions/submit/wizard-(?Plisted|unlisted)$', + url(r'^versions/submit/wizard-(?Plisted|unlisted)$', views.submit_version_theme_wizard, name='devhub.submit.version.wizard'), url('^versions/submit/wizard-(?Plisted|unlisted)/background$', views.theme_background_image, name='devhub.submit.version.previous_background'), - url('^file/(?P[^/]+)/validation$', views.file_validation, + url(r'^file/(?P[^/]+)/validation$', views.file_validation, name='devhub.file_validation'), - url('^file/(?P[^/]+)/validation\.json$', + url(r'^file/(?P[^/]+)/validation\.json$', views.json_file_validation, name='devhub.json_file_validation'), - url('^submit/$', + url(r'^submit/$', lambda r, addon_id: redirect('devhub.submit.finish', addon_id)), - url('^submit/source$', + url(r'^submit/source$', views.submit_addon_source, name='devhub.submit.source'), - url('^submit/details$', + url(r'^submit/details$', views.submit_addon_details, name='devhub.submit.details'), - url('^submit/finish$', views.submit_addon_finish, + url(r'^submit/finish$', views.submit_addon_finish, name='devhub.submit.finish'), - url('^request-review$', + url(r'^request-review$', views.request_review, name='devhub.request-review'), - url('^rmlocale$', views.remove_locale, name='devhub.addons.remove-locale'), + url(r'^rmlocale$', views.remove_locale, + name='devhub.addons.remove-locale'), ] # These will all start with /ajax/addon// ajax_patterns = [ - url('^dependencies$', views.ajax_dependencies, + url(r'^dependencies$', views.ajax_dependencies, name='devhub.ajax.dependencies'), - url('^versions/compatibility/status$', + url(r'^versions/compatibility/status$', views.ajax_compat_status, name='devhub.ajax.compat.status'), - url('^versions/compatibility/error$', + url(r'^versions/compatibility/error$', views.ajax_compat_error, name='devhub.ajax.compat.error'), - url('^versions/(?P\d+)/compatibility$', + url(r'^versions/(?P\d+)/compatibility$', views.ajax_compat_update, name='devhub.ajax.compat.update'), - url('^image/status$', views.image_status, name='devhub.ajax.image.status'), + url(r'^image/status$', views.image_status, + name='devhub.ajax.image.status'), ] redirect_patterns = [ - url('^addon/edit/(\d+)', + url(r'^addon/edit/(\d+)', lambda r, id: redirect('devhub.addons.edit', id, permanent=True)), - url('^addon/status/(\d+)', + url(r'^addon/status/(\d+)', lambda r, id: redirect('devhub.addons.versions', id, permanent=True)), - url('^versions/(\d+)', + url(r'^versions/(\d+)', lambda r, id: redirect('devhub.addons.versions', id, permanent=True)), ] urlpatterns = decorate(use_primary_db, [ - url('^$', views.index, name='devhub.index'), - url('', include(redirect_patterns)), + url(r'^$', views.index, name='devhub.index'), + url(r'', include(redirect_patterns)), # Redirect people who have /addons/ instead of /addon/. - url('^addons/\d+/.*', + url(r'^addons/\d+/.*', lambda r: redirect(r.path.replace('addons', 'addon', 1))), # Add-on submission - url('^addon/submit/(?:1)?$', + url(r'^addon/submit/(?:1)?$', lambda r: redirect('devhub.submit.agreement', permanent=True)), - url('^addon/submit/agreement$', views.submit_addon, + url(r'^addon/submit/agreement$', views.submit_addon, name='devhub.submit.agreement'), - url('^addon/submit/distribution$', views.submit_addon_distribution, + url(r'^addon/submit/distribution$', views.submit_addon_distribution, name='devhub.submit.distribution'), - url('^addon/submit/upload-(?Plisted|unlisted)$', + url(r'^addon/submit/upload-(?Plisted|unlisted)$', views.submit_addon_upload, name='devhub.submit.upload'), - url('^addon/submit/wizard-(?Plisted|unlisted)$', + url(r'^addon/submit/wizard-(?Plisted|unlisted)$', views.submit_addon_theme_wizard, name='devhub.submit.wizard'), # Submission API - url('^addon/agreement/$', views.api_key_agreement, + url(r'^addon/agreement/$', views.api_key_agreement, name='devhub.api_key_agreement'), - url('^addon/api/key/$', views.api_key, name='devhub.api_key'), + url(r'^addon/api/key/$', views.api_key, name='devhub.api_key'), # Standalone validator: - url('^addon/validate/?$', views.validate_addon, + url(r'^addon/validate/?$', views.validate_addon, name='devhub.validate_addon'), # Redirect to /addons/ at the base. - url('^addon$', lambda r: redirect('devhub.addons', permanent=True)), - url('^addons$', views.dashboard, name='devhub.addons'), - url('^themes$', views.dashboard, name='devhub.themes', + url(r'^addon$', lambda r: redirect('devhub.addons', permanent=True)), + url(r'^addons$', views.dashboard, name='devhub.addons'), + url(r'^themes$', views.dashboard, name='devhub.themes', kwargs={'theme': True}), - url('^feed$', views.feed, name='devhub.feed_all'), + url(r'^feed$', views.feed, name='devhub.feed_all'), # TODO: not necessary when devhub homepage is moved out of remora - url('^feed/all$', lambda r: redirect('devhub.feed_all', permanent=True)), - url('^feed/%s$' % ADDON_ID, views.feed, name='devhub.feed'), + url(r'^feed/all$', lambda r: redirect('devhub.feed_all', permanent=True)), + url(r'^feed/%s$' % ADDON_ID, views.feed, name='devhub.feed'), - url('^upload$', views.upload, name='devhub.upload'), - url('^upload/unlisted$', + url(r'^upload$', views.upload, name='devhub.upload'), + url(r'^upload/unlisted$', partial(views.upload, channel='unlisted'), name='devhub.upload_unlisted'), - url('^upload/([^/]+)(?:/([^/]+))?$', views.upload_detail, + url(r'^upload/([^/]+)(?:/([^/]+))?$', views.upload_detail, name='devhub.upload_detail'), - url('^standalone-upload$', + url(r'^standalone-upload$', partial(views.upload, is_standalone=True), name='devhub.standalone_upload'), - url('^standalone-upload-unlisted$', + url(r'^standalone-upload-unlisted$', partial(views.upload, is_standalone=True, channel='unlisted'), name='devhub.standalone_upload_unlisted'), - url('^standalone-upload/([^/]+)$', views.standalone_upload_detail, + url(r'^standalone-upload/([^/]+)$', views.standalone_upload_detail, name='devhub.standalone_upload_detail'), # URLs for a single add-on. - url('^addon/%s/' % ADDON_ID, include(detail_patterns)), + url(r'^addon/%s/' % ADDON_ID, include(detail_patterns)), - url('^ajax/addon/%s/' % ADDON_ID, include(ajax_patterns)), + url(r'^ajax/addon/%s/' % ADDON_ID, include(ajax_patterns)), # Themes submission. - url('^theme/submit/?$', views.submit_theme, name='devhub.themes.submit'), - url('^theme/%s/submit/done$' % ADDON_ID, views.submit_theme_done, + url(r'^theme/submit/?$', views.submit_theme, name='devhub.themes.submit'), + url(r'^theme/%s/submit/done$' % ADDON_ID, views.submit_theme_done, name='devhub.themes.submit.done'), - url('^theme/submit/upload/' + url(r'^theme/submit/upload/' '(?Ppersona_header)$', views.ajax_upload_image, name='devhub.personas.upload_persona'), - url('^theme/%s/' % ADDON_ID, include(theme_detail_patterns)), + url(r'^theme/%s/' % ADDON_ID, include(theme_detail_patterns)), # Add-on SDK page - url('builder$', lambda r: redirect(views.MDN_BASE)), + url(r'builder$', lambda r: redirect(views.MDN_BASE)), # Developer docs - url('docs/(?P[-_\w]+(?:/[-_\w]+)?)?$', + url(r'docs/(?P[-_\w]+(?:/[-_\w]+)?)?$', views.docs, name='devhub.docs'), ]) diff --git a/src/olympia/files/models.py b/src/olympia/files/models.py index 6ec56455c4..077ceaadac 100644 --- a/src/olympia/files/models.py +++ b/src/olympia/files/models.py @@ -351,7 +351,7 @@ class File(OnChangeMixin, ModelBase): self.move_file( src, dst, 'Moving undisabled file: {source} => {destination}') - _get_localepicker = re.compile('^locale browser ([\w\-_]+) (.*)$', re.M) + _get_localepicker = re.compile(r'^locale browser ([\w\-_]+) (.*)$', re.M) @memoize(prefix='localepicker', timeout=None) def get_localepicker(self): diff --git a/src/olympia/files/urls.py b/src/olympia/files/urls.py index c0a579cd35..f55e1c7364 100644 --- a/src/olympia/files/urls.py +++ b/src/olympia/files/urls.py @@ -21,7 +21,7 @@ compare_patterns = [ ] urlpatterns = [ - url('^browse/(?P\d+)/', include(file_patterns)), - url('^compare/(?P\d+)\.{3}(?P\d+)/', + url(r'^browse/(?P\d+)/', include(file_patterns)), + url(r'^compare/(?P\d+)\.{3}(?P\d+)/', include(compare_patterns)), ] diff --git a/src/olympia/files/utils.py b/src/olympia/files/utils.py index df3578e72b..607da17f90 100644 --- a/src/olympia/files/utils.py +++ b/src/olympia/files/utils.py @@ -55,8 +55,8 @@ class ParseError(forms.ValidationError): pass -VERSION_RE = re.compile('^[-+*.\w]{,32}$') -SIGNED_RE = re.compile('^META\-INF/(\w+)\.(rsa|sf)$') +VERSION_RE = re.compile(r'^[-+*.\w]{,32}$') +SIGNED_RE = re.compile(r'^META\-INF/(\w+)\.(rsa|sf)$') # This is essentially what Firefox matches # (see toolkit/components/extensions/ExtensionUtils.jsm) diff --git a/src/olympia/legacy_api/urls.py b/src/olympia/legacy_api/urls.py index 39fa518e07..d18205da76 100644 --- a/src/olympia/legacy_api/urls.py +++ b/src/olympia/legacy_api/urls.py @@ -33,20 +33,20 @@ def build_urls(base, appendages): base_search_regexp = r'search/(?P[^/]+)' appendages = [ # Regular expressions that we use in our urls. - '/(?P[^/]*)', - '/(?P\d*)', - '/(?P\w*)', - '/(?P[^/]*)', - '(?:/(?P(?:strict|normal|ignore)))?', + r'/(?P[^/]*)', + r'/(?P\d*)', + r'/(?P\w*)', + r'/(?P[^/]*)', + r'(?:/(?P(?:strict|normal|ignore)))?', ] search_regexps = build_urls(base_search_regexp, appendages) -appendages.insert(0, '/(?P[^/]+)') +appendages.insert(0, r'/(?P[^/]+)') list_regexps = build_urls(r'list', appendages) legacy_api_patterns = [ # Addon_details - url('addon/%s$' % ADDON_ID, api_view(views.AddonDetailView), + url(r'addon/%s$' % ADDON_ID, api_view(views.AddonDetailView), name='legacy_api.addon_detail'), url(r'^get_language_packs$', api_view(views.LanguageView), name='legacy_api.language'), @@ -54,17 +54,17 @@ legacy_api_patterns = [ for regexp in search_regexps: legacy_api_patterns.append( - url(regexp + '/?$', api_view(views.SearchView), + url(regexp + r'/?$', api_view(views.SearchView), name='legacy_api.search')) for regexp in list_regexps: legacy_api_patterns.append( - url(regexp + '/?$', api_view(views.ListView), + url(regexp + r'/?$', api_view(views.ListView), name='legacy_api.list')) urlpatterns = [ # Redirect api requests without versions - url('^((?:addon|search|list)/.*)$', views.redirect_view), + url(r'^((?:addon|search|list)/.*)$', views.redirect_view), # Endpoints. url(r'^1.5/search_suggestions/', views.search_suggestions), diff --git a/src/olympia/legacy_discovery/urls.py b/src/olympia/legacy_discovery/urls.py index 673f676698..0cc33f8547 100644 --- a/src/olympia/legacy_discovery/urls.py +++ b/src/olympia/legacy_discovery/urls.py @@ -5,7 +5,7 @@ from .views import module_admin urlpatterns = [ - url('^modules$', module_admin, name='discovery.module_admin'), - url('^.*', lambda request: redirect( + url(r'^modules$', module_admin, name='discovery.module_admin'), + url(r'^.*', lambda request: redirect( 'https://www.mozilla.org/firefox/new/', permanent=True)), ] diff --git a/src/olympia/lib/crypto/tasks.py b/src/olympia/lib/crypto/tasks.py index 4e903fbc19..978b25f8a3 100644 --- a/src/olympia/lib/crypto/tasks.py +++ b/src/olympia/lib/crypto/tasks.py @@ -72,7 +72,7 @@ on https://addons.mozilla.org """ version_regex = re.compile( - '^(?P.*)(?P\.1\-signed)(|\-(?P\d+))$') + r'^(?P.*)(?P\.1\-signed)(|\-(?P\d+))$') def get_new_version_number(version): diff --git a/src/olympia/pages/urls.py b/src/olympia/pages/urls.py index c79b168fb0..fa061029cb 100644 --- a/src/olympia/pages/urls.py +++ b/src/olympia/pages/urls.py @@ -7,74 +7,74 @@ from olympia.amo.urlresolvers import reverse urlpatterns = [ - url('^about$', + url(r'^about$', TemplateView.as_view(template_name='pages/about.lhtml'), name='pages.about'), - url('^google1f3e37b7351799a5\.html$', + url(r'^google1f3e37b7351799a5\.html$', TemplateView.as_view( template_name='pages/google_webmaster_verification.html')), - url('^google231a41e803e464e9\.html$', + url(r'^google231a41e803e464e9\.html$', TemplateView.as_view( template_name='pages/google_search_console.html')), - url('^review_guide$', + url(r'^review_guide$', TemplateView.as_view(template_name='pages/review_guide.html'), name='pages.review_guide'), - url('^shield-study-2/', + url(r'^shield-study-2/', TemplateView.as_view(template_name='pages/shield_study_2.html'), name='pages.shield_study_2'), - url('^shield_study_3$', + url(r'^shield_study_3$', TemplateView.as_view(template_name='pages/shield_study_3.html'), name='pages.shield_study_3'), - url('^shield_study_4$', + url(r'^shield_study_4$', TemplateView.as_view(template_name='pages/shield_study_4.html'), name='pages.shield_study_4'), - url('^shield_study_5$', + url(r'^shield_study_5$', TemplateView.as_view(template_name='pages/shield_study_5.html'), name='pages.shield_study_5'), - url('^shield_study_6$', + url(r'^shield_study_6$', TemplateView.as_view(template_name='pages/shield_study_6.html'), name='pages.shield_study_6'), - url('^shield_study_7$', + url(r'^shield_study_7$', TemplateView.as_view(template_name='pages/shield_study_7.html'), name='pages.shield_study_7'), - url('^shield_study_8$', + url(r'^shield_study_8$', TemplateView.as_view(template_name='pages/shield_study_8.html'), name='pages.shield_study_8'), - url('^shield_study_9$', + url(r'^shield_study_9$', TemplateView.as_view(template_name='pages/shield_study_9.html'), name='pages.shield_study_9'), - url('^shield_study_10$', + url(r'^shield_study_10$', TemplateView.as_view(template_name='pages/shield_study_10.html'), name='pages.shield_study_10'), - url('^shield_study_11$', + url(r'^shield_study_11$', TemplateView.as_view(template_name='pages/shield_study_11.html'), name='pages.shield_study_11'), - url('^shield_study_12$', + url(r'^shield_study_12$', TemplateView.as_view(template_name='pages/shield_study_12.html'), name='pages.shield_study_12'), - url('^shield_study_13$', + url(r'^shield_study_13$', TemplateView.as_view(template_name='pages/shield_study_13.html'), name='pages.shield_study_13'), - url('^shield_study_14$', + url(r'^shield_study_14$', TemplateView.as_view(template_name='pages/shield_study_14.html'), name='pages.shield_study_14'), - url('^shield_study_15$', + url(r'^shield_study_15$', TemplateView.as_view(template_name='pages/shield_study_15.html'), name='pages.shield_study_15'), - url('^shield_study_16$', + url(r'^shield_study_16$', TemplateView.as_view(template_name='pages/shield_study_16.html'), name='pages.shield_study_16'), - url('^pages/review_guide$', + url(r'^pages/review_guide$', lambda r: perma_redirect(reverse('pages.review_guide'))), - url('^pages/developer_agreement$', + url(r'^pages/developer_agreement$', lambda r: perma_redirect(reverse('devhub.docs', args=['policies/agreement']))), - url('^pages/validation$', + url(r'^pages/validation$', lambda r: perma_redirect(settings.VALIDATION_FAQ_URL)), - url('^pioneer$', + url(r'^pioneer$', TemplateView.as_view(template_name='pages/pioneer.html'), name='pages.pioneer'), ] diff --git a/src/olympia/ratings/forms.py b/src/olympia/ratings/forms.py index 32de30d745..06ac561c64 100644 --- a/src/olympia/ratings/forms.py +++ b/src/olympia/ratings/forms.py @@ -48,9 +48,9 @@ class RatingForm(RatingReplyForm): # octets. It does not match IPv6 addresses or long strings such as # "example dot com". link_pattern = re.compile( - '((://)|' # Protocols (e.g.: http://) - '((\d{1,3}\.){3}(\d{1,3}))|' - '([0-9a-z\-%%]+\.(%s)))' % '|'.join(TLDS), + r'((://)|' # Protocols (e.g.: http://) + r'((\d{1,3}\.){3}(\d{1,3}))|' + r'([0-9a-z\-%%]+\.(%s)))' % '|'.join(TLDS), flags) def _post_clean(self): diff --git a/src/olympia/ratings/urls.py b/src/olympia/ratings/urls.py index 8d56ed51ec..740b2c87e9 100644 --- a/src/olympia/ratings/urls.py +++ b/src/olympia/ratings/urls.py @@ -7,19 +7,19 @@ from . import views # These all start with /addon/:id/reviews/:review_id/. rating_detail_patterns = [ - url('^$', views.review_list, name='addons.ratings.detail'), - url('^reply$', views.reply, name='addons.ratings.reply'), - url('^flag$', views.flag, name='addons.ratings.flag'), - url('^delete$', views.delete, name='addons.ratings.delete'), - url('^edit$', views.edit, name='addons.ratings.edit'), + url(r'^$', views.review_list, name='addons.ratings.detail'), + url(r'^reply$', views.reply, name='addons.ratings.reply'), + url(r'^flag$', views.flag, name='addons.ratings.flag'), + url(r'^delete$', views.delete, name='addons.ratings.delete'), + url(r'^edit$', views.edit, name='addons.ratings.edit'), ] urlpatterns = [ - url('^$', views.review_list, name='addons.ratings.list'), - url('^add$', views.add, name='addons.ratings.add'), - url('^(?P\d+)/', include(rating_detail_patterns)), - url('^format:rss$', RatingsRss(), name='addons.ratings.list.rss'), - url('^user:(?P\d+)$', views.review_list, + url(r'^$', views.review_list, name='addons.ratings.list'), + url(r'^add$', views.add, name='addons.ratings.add'), + url(r'^(?P\d+)/', include(rating_detail_patterns)), + url(r'^format:rss$', RatingsRss(), name='addons.ratings.list.rss'), + url(r'^user:(?P\d+)$', views.review_list, name='addons.ratings.user'), ] diff --git a/src/olympia/reviewers/urls.py b/src/olympia/reviewers/urls.py index 4bbbac71ea..663b180c33 100644 --- a/src/olympia/reviewers/urls.py +++ b/src/olympia/reviewers/urls.py @@ -59,34 +59,34 @@ urlpatterns = ( name='reviewers.abuse_reports'), url(r'^leaderboard/$', views.leaderboard, name='reviewers.leaderboard'), - url('^themes$', + url(r'^themes$', lambda request: redirect('reviewers.dashboard', permanent=True)), - url('^themes/pending$', views_themes.themes_list, + url(r'^themes/pending$', views_themes.themes_list, name='reviewers.themes.list'), - url('^themes/flagged$', views_themes.themes_list, + url(r'^themes/flagged$', views_themes.themes_list, name='reviewers.themes.list_flagged', kwargs={'flagged': True}), - url('^themes/updates$', views_themes.themes_list, + url(r'^themes/updates$', views_themes.themes_list, name='reviewers.themes.list_rereview', kwargs={'rereview': True}), - url('^themes/queue/$', views_themes.themes_queue, + url(r'^themes/queue/$', views_themes.themes_queue, name='reviewers.themes.queue_themes'), - url('^themes/queue/flagged$', views_themes.themes_queue_flagged, + url(r'^themes/queue/flagged$', views_themes.themes_queue_flagged, name='reviewers.themes.queue_flagged'), - url('^themes/queue/updates$', views_themes.themes_queue_rereview, + url(r'^themes/queue/updates$', views_themes.themes_queue_rereview, name='reviewers.themes.queue_rereview'), - url('^themes/queue/commit$', views_themes.themes_commit, + url(r'^themes/queue/commit$', views_themes.themes_commit, name='reviewers.themes.commit'), - url('^themes/queue/single/(?P[^ /]+)$', views_themes.themes_single, + url(r'^themes/queue/single/(?P[^ /]+)$', views_themes.themes_single, name='reviewers.themes.single'), - url('^themes/history/(?P[^ /]+)?$', + url(r'^themes/history/(?P[^ /]+)?$', views_themes.themes_history, name='reviewers.themes.history'), url(r'^themes/logs$', views_themes.themes_logs, name='reviewers.themes.logs'), - url('^themes/release$', views_themes.release_locks, + url(r'^themes/release$', views_themes.release_locks, name='reviewers.themes.release_locks'), - url('^themes/logs/deleted/$', views_themes.deleted_themes, + url(r'^themes/logs/deleted/$', views_themes.deleted_themes, name='reviewers.themes.deleted'), - url('^themes/search/$', views_themes.themes_search, + url(r'^themes/search/$', views_themes.themes_search, name='reviewers.themes.search'), ) diff --git a/src/olympia/search/urls.py b/src/olympia/search/urls.py index dec3a1f9f8..02053a8730 100644 --- a/src/olympia/search/urls.py +++ b/src/olympia/search/urls.py @@ -4,8 +4,8 @@ from . import views urlpatterns = [ - url('^(?:es)?$', views.search, name='search.search'), - url('^ajax$', views.ajax_search, name='search.ajax'), - url('^suggestions$', views.ajax_search_suggestions, + url(r'^(?:es)?$', views.search, name='search.search'), + url(r'^ajax$', views.ajax_search, name='search.ajax'), + url(r'^suggestions$', views.ajax_search_suggestions, name='search.suggestions'), ] diff --git a/src/olympia/signing/urls.py b/src/olympia/signing/urls.py index e3742b4206..09ee39cd05 100644 --- a/src/olympia/signing/urls.py +++ b/src/olympia/signing/urls.py @@ -16,6 +16,6 @@ urlpatterns = [ name='signing.version'), # .* at the end to match filenames. # /file/:id/some-file.xpi - url('^file/(?P\d+)(?:/.*)?', + url(r'^file/(?P\d+)(?:/.*)?', views.SignedFile.as_view(), name='signing.file'), ] diff --git a/src/olympia/stats/urls.py b/src/olympia/stats/urls.py index b689b99c9b..0dc26d83e3 100644 --- a/src/olympia/stats/urls.py +++ b/src/olympia/stats/urls.py @@ -4,22 +4,22 @@ from django.shortcuts import redirect from . import views -group_re = '(?P' + '|'.join(views.SERIES_GROUPS) + ')' -group_date_re = '(?P' + '|'.join(views.SERIES_GROUPS_DATE) + ')' -range_re = '(?P\d{8})-(?P\d{8})' -format_re = '(?P' + '|'.join(views.SERIES_FORMATS) + ')' -series_re = '%s-%s\.%s$' % (group_re, range_re, format_re) -series = dict((type, '%s-%s' % (type, series_re)) for type in views.SERIES) -global_series = dict((type, '%s-%s' % (type, series_re)) +group_re = r'(?P' + '|'.join(views.SERIES_GROUPS) + ')' +group_date_re = r'(?P' + '|'.join(views.SERIES_GROUPS_DATE) + ')' +range_re = r'(?P\d{8})-(?P\d{8})' +format_re = r'(?P' + '|'.join(views.SERIES_FORMATS) + ')' +series_re = r'%s-%s\.%s$' % (group_re, range_re, format_re) +series = dict((type, r'%s-%s' % (type, series_re)) for type in views.SERIES) +global_series = dict((type, r'%s-%s' % (type, series_re)) for type in views.GLOBAL_SERIES) urlpatterns = [ - url('^$', lambda r: redirect('stats.addons_in_use', permanent=False), + url(r'^$', lambda r: redirect('stats.addons_in_use', permanent=False), name='stats.dashboard'), - url('^site%s/%s$' % (format_re, group_date_re), + url(r'^site%s/%s$' % (format_re, group_date_re), views.site, name='stats.site'), - url('^site-%s' % series_re, views.site, name='stats.site.new'), + url(r'^site-%s' % series_re, views.site, name='stats.site.new'), ] # These are the front end pages, so that when you click the links on the @@ -30,7 +30,7 @@ keys = ['addons_in_use', 'addons_updated', 'addons_downloaded', for key in keys: urlpatterns.append(url( - '^%s/$' % key, views.site_stats_report, + r'^%s/$' % key, views.site_stats_report, name='stats.%s' % key, kwargs={'report': key})) urlpatterns.append(url( global_series[key], views.site_series, @@ -40,23 +40,23 @@ for key in keys: # Addon specific stats. stats_patterns = [ # page URLs - url('^$', views.stats_report, name='stats.overview', + url(r'^$', views.stats_report, name='stats.overview', kwargs={'report': 'overview'}), - url('^downloads/$', views.stats_report, name='stats.downloads', + url(r'^downloads/$', views.stats_report, name='stats.downloads', kwargs={'report': 'downloads'}), - url('^downloads/sources/$', views.stats_report, name='stats.sources', + url(r'^downloads/sources/$', views.stats_report, name='stats.sources', kwargs={'report': 'sources'}), - url('^usage/$', views.stats_report, name='stats.usage', + url(r'^usage/$', views.stats_report, name='stats.usage', kwargs={'report': 'usage'}), - url('^usage/languages/$', views.stats_report, name='stats.locales', + url(r'^usage/languages/$', views.stats_report, name='stats.locales', kwargs={'report': 'locales'}), - url('^usage/versions/$', views.stats_report, name='stats.versions', + url(r'^usage/versions/$', views.stats_report, name='stats.versions', kwargs={'report': 'versions'}), - url('^usage/status/$', views.stats_report, name='stats.statuses', + url(r'^usage/status/$', views.stats_report, name='stats.statuses', kwargs={'report': 'statuses'}), - url('^usage/applications/$', views.stats_report, name='stats.apps', + url(r'^usage/applications/$', views.stats_report, name='stats.apps', kwargs={'report': 'apps'}), - url('^usage/os/$', views.stats_report, name='stats.os', + url(r'^usage/os/$', views.stats_report, name='stats.os', kwargs={'report': 'os'}), # time series URLs following this pattern: diff --git a/src/olympia/tags/urls.py b/src/olympia/tags/urls.py index dd7edc8486..4418a1991b 100644 --- a/src/olympia/tags/urls.py +++ b/src/olympia/tags/urls.py @@ -4,5 +4,5 @@ from olympia.search.views import search urlpatterns = [ - url('^tag/(?P[^/]+)$', search, name='tags.detail'), + url(r'^tag/(?P[^/]+)$', search, name='tags.detail'), ] diff --git a/src/olympia/urls.py b/src/olympia/urls.py index c0b8e272e6..3a226723c7 100644 --- a/src/olympia/urls.py +++ b/src/olympia/urls.py @@ -23,130 +23,130 @@ handler500 = 'olympia.amo.views.handler500' urlpatterns = [ # Legacy Discovery pane is first for undetectable efficiency wins. - url('^discovery/', include('olympia.legacy_discovery.urls')), + url(r'^discovery/', include('olympia.legacy_discovery.urls')), # Home. - url('^$', addons_views.home, name='home'), + url(r'^$', addons_views.home, name='home'), # Add-ons. - url('', include('olympia.addons.urls')), + url(r'', include('olympia.addons.urls')), # Browse pages. - url('', include('olympia.browse.urls')), + url(r'', include('olympia.browse.urls')), # Tags. - url('', include('olympia.tags.urls')), + url(r'', include('olympia.tags.urls')), # Collections. - url('', include('olympia.bandwagon.urls')), + url(r'', include('olympia.bandwagon.urls')), # Files - url('^files/', include('olympia.files.urls')), + url(r'^files/', include('olympia.files.urls')), # Downloads. - url('^downloads/', include(download_patterns)), + url(r'^downloads/', include(download_patterns)), # Users - url('', include('olympia.users.urls')), + url(r'', include('olympia.users.urls')), # Developer Hub. - url('^developers/', include('olympia.devhub.urls')), + url(r'^developers/', include('olympia.devhub.urls')), # Reviewers Hub. - url('^reviewers/', include('olympia.reviewers.urls')), + url(r'^reviewers/', include('olympia.reviewers.urls')), # Redirect everything under editors/ (old reviewer urls) to reviewers/. - url('^editors/(.*)', + url(r'^editors/(.*)', lambda r, path: redirect('/reviewers/%s' % path, permanent=True)), # AMO admin (not django admin). - url('^admin/', include('olympia.zadmin.urls')), + url(r'^admin/', include('olympia.zadmin.urls')), # Localizable pages. - url('', include('olympia.pages.urls')), + url(r'', include('olympia.pages.urls')), # App versions. - url('pages/appversions/', include('olympia.applications.urls')), + url(r'pages/appversions/', include('olympia.applications.urls')), # Services - url('', include('olympia.amo.urls')), + url(r'', include('olympia.amo.urls')), # Search - url('^search/', include('olympia.search.urls')), + url(r'^search/', include('olympia.search.urls')), # Javascript translations. # Should always be called with a cache-busting querystring. - url('^jsi18n\.js$', cache_page(60 * 60 * 24 * 365)(javascript_catalog), + url(r'^jsi18n\.js$', cache_page(60 * 60 * 24 * 365)(javascript_catalog), {'domain': 'djangojs', 'packages': []}, name='jsi18n'), # SAMO (Legacy API) - url('^api/', include('olympia.legacy_api.urls')), + url(r'^api/', include('olympia.legacy_api.urls')), # API v3+. - url('^api/', include('olympia.api.urls')), + url(r'^api/', include('olympia.api.urls')), # Site events data. - url('^statistics/events-(?P\d{8})-(?P\d{8})\.json$', + url(r'^statistics/events-(?P\d{8})-(?P\d{8})\.json$', stats_views.site_events, name='amo.site_events'), # Site statistics that we are going to catch, the rest will fall through. - url('^statistics/', include('olympia.stats.urls')), + url(r'^statistics/', include('olympia.stats.urls')), # Fall through for any URLs not matched above stats dashboard. - url('^statistics/', lambda r: redirect('/'), name='statistics.dashboard'), + url(r'^statistics/', lambda r: redirect('/'), name='statistics.dashboard'), # Redirect patterns. - url('^bookmarks/?$', + url(r'^bookmarks/?$', lambda r: redirect('browse.extensions', 'bookmarks', permanent=True)), - url('^reviews/display/(\d+)', + url(r'^reviews/display/(\d+)', lambda r, id: redirect('addons.ratings.list', id, permanent=True)), - url('^reviews/add/(\d+)', + url(r'^reviews/add/(\d+)', lambda r, id: redirect('addons.ratings.add', id, permanent=True)), - url('^users/info/(\d+)', + url(r'^users/info/(\d+)', lambda r, id: redirect('users.profile', id, permanent=True)), - url('^pages/about$', + url(r'^pages/about$', lambda r: redirect('pages.about', permanent=True)), # Redirect persona/xxx - url('^getpersonas$', + url(r'^getpersonas$', lambda r: redirect('http://www.getpersonas.com/gallery/All/Popular', permanent=True)), - url('^persona/(?P\d+)', + url(r'^persona/(?P\d+)', addons_views.persona_redirect, name='persona'), - url('^personas/film and tv/?$', + url(r'^personas/film and tv/?$', lambda r: redirect('browse.personas', 'film-and-tv', permanent=True)), - url('^addons/versions/(\d+)/?$', + url(r'^addons/versions/(\d+)/?$', lambda r, id: redirect('addons.versions', id, permanent=True)), - url('^addons/versions/(\d+)/format:rss$', + url(r'^addons/versions/(\d+)/format:rss$', lambda r, id: redirect('addons.versions.rss', id, permanent=True)), # Legacy redirect. Requires a view to get extra data not provided in URL. - url('^versions/updateInfo/(?P\d+)', + url(r'^versions/updateInfo/(?P\d+)', version_views.update_info_redirect), - url('^addons/reviews/(\d+)/format:rss$', + url(r'^addons/reviews/(\d+)/format:rss$', lambda r, id: redirect('addons.ratings.list.rss', id, permanent=True)), - url('^search-engines.*$', + url(r'^search-engines.*$', lambda r: redirect(urlparams(reverse('search.search'), atype=4), permanent=True)), - url('^addons/contribute/(\d+)/?$', + url(r'^addons/contribute/(\d+)/?$', lambda r, id: redirect('addons.contribute', id, permanent=True)), - url('^recommended$', + url(r'^recommended$', lambda r: redirect(reverse('browse.extensions') + '?sort=featured', permanent=True)), - url('^recommended/format:rss$', + url(r'^recommended/format:rss$', lambda r: redirect('browse.featured.rss', permanent=True)), ] diff --git a/src/olympia/users/forms.py b/src/olympia/users/forms.py index cda05d7ebc..9fee24658d 100644 --- a/src/olympia/users/forms.py +++ b/src/olympia/users/forms.py @@ -28,7 +28,7 @@ from .widgets import ( log = olympia.core.logger.getLogger('z.users') -admin_re = re.compile('(?=.*\d)(?=.*[a-zA-Z])') +admin_re = re.compile(r'(?=.*\d)(?=.*[a-zA-Z])') class UserDeleteForm(forms.Form): diff --git a/src/olympia/users/urls.py b/src/olympia/users/urls.py index 70b53e50fd..323b7fb53c 100644 --- a/src/olympia/users/urls.py +++ b/src/olympia/users/urls.py @@ -9,23 +9,23 @@ USER_ID = r"""(?P[^/<>"']+)""" # These will all start with /user// detail_patterns = [ - url('^$', views.profile, name='users.profile'), - url('^themes(?:/(?P[^ /]+))?$', views.themes, + url(r'^$', views.profile, name='users.profile'), + url(r'^themes(?:/(?P[^ /]+))?$', views.themes, name='users.themes'), - url('^abuse', views.report_abuse, name='users.abuse'), + url(r'^abuse', views.report_abuse, name='users.abuse'), ] users_patterns = [ - url('^ajax$', views.ajax, name='users.ajax'), - url('^delete$', views.delete, name='users.delete'), - url('^delete_photo/(?P\d+)?$', views.delete_photo, + url(r'^ajax$', views.ajax, name='users.ajax'), + url(r'^delete$', views.delete, name='users.delete'), + url(r'^delete_photo/(?P\d+)?$', views.delete_photo, name='users.delete_photo'), - url('^edit$', views.edit, name='users.edit'), - url('^edit(?:/(?P\d+))?$', views.admin_edit, + url(r'^edit$', views.edit, name='users.edit'), + url(r'^edit(?:/(?P\d+))?$', views.admin_edit, name='users.admin_edit'), - url('^login', views.login, name='users.login'), - url('^logout', views.logout, name='users.logout'), - url('^register$', + url(r'^login', views.login, name='users.login'), + url(r'^logout', views.logout, name='users.logout'), + url(r'^register$', RedirectView.as_view(pattern_name='users.login', permanent=True), name='users.register'), url(r'^unsubscribe/(?P[-\w]+={0,3})/(?P[\w]+)/' @@ -36,6 +36,6 @@ users_patterns = [ urlpatterns = [ # URLs for a single user. - url('^user/%s/' % USER_ID, include(detail_patterns)), - url('^users/', include(users_patterns)), + url(r'^user/%s/' % USER_ID, include(detail_patterns)), + url(r'^users/', include(users_patterns)), ] diff --git a/src/olympia/versions/urls.py b/src/olympia/versions/urls.py index 24eb22ba29..abf7d2f677 100644 --- a/src/olympia/versions/urls.py +++ b/src/olympia/versions/urls.py @@ -7,27 +7,27 @@ from . import views urlpatterns = [ - url('^$', + url(r'^$', views.version_list, name='addons.versions'), - url('^format:rss$', + url(r'^format:rss$', VersionsRss(), name='addons.versions.rss'), - url('^(?P[^/]+)$', views.version_detail, + url(r'^(?P[^/]+)$', views.version_detail, name='addons.versions'), - url('^(?P[^/]+)/updateinfo/$', views.update_info, + url(r'^(?P[^/]+)/updateinfo/$', views.update_info, name='addons.versions.update_info'), ] download_patterns = [ # .* at the end to match filenames. # /file/:id/type:attachment - url('^file/(?P\d+)(?:/type:(?P\w+))?(?:/.*)?', + url(r'^file/(?P\d+)(?:/type:(?P\w+))?(?:/.*)?', views.download_file, name='downloads.file'), - url('^source/(?P\d+)', + url(r'^source/(?P\d+)', views.download_source, name='downloads.source'), # /latest/1865/type:xpi/platform:5 - url('^latest/%s/(?:type:(?P\w+)/)?' - '(?:platform:(?P\d+)/)?.*' % ADDON_ID, + url(r'^latest/%s/(?:type:(?P\w+)/)?' + r'(?:platform:(?P\d+)/)?.*' % ADDON_ID, views.download_latest, name='downloads.latest'), ] diff --git a/src/olympia/zadmin/urls.py b/src/olympia/zadmin/urls.py index 99dd2721c0..7028462552 100644 --- a/src/olympia/zadmin/urls.py +++ b/src/olympia/zadmin/urls.py @@ -25,44 +25,44 @@ admin.site.login = login urlpatterns = [ # AMO stuff. - url('^$', views.index, name='zadmin.index'), - url('^models$', lambda r: redirect('admin:index'), name='zadmin.home'), - url('^addon/manage/%s/$' % ADDON_ID, + url(r'^$', views.index, name='zadmin.index'), + url(r'^models$', lambda r: redirect('admin:index'), name='zadmin.home'), + url(r'^addon/manage/%s/$' % ADDON_ID, views.addon_manage, name='zadmin.addon_manage'), - url('^addon/recalc-hash/(?P\d+)/', views.recalc_hash, + url(r'^addon/recalc-hash/(?P\d+)/', views.recalc_hash, name='zadmin.recalc_hash'), - url('^env$', views.env, name='zadmin.env'), - url('^memcache$', views.memcache, name='zadmin.memcache'), - url('^settings', views.show_settings, name='zadmin.settings'), - url('^fix-disabled', views.fix_disabled_file, name='zadmin.fix-disabled'), + url(r'^env$', views.env, name='zadmin.env'), + url(r'^memcache$', views.memcache, name='zadmin.memcache'), + url(r'^settings', views.show_settings, name='zadmin.settings'), + url(r'^fix-disabled', views.fix_disabled_file, name='zadmin.fix-disabled'), url(r'^email_preview/(?P.*)\.csv$', views.email_preview_csv, name='zadmin.email_preview_csv'), url(r'^file-upload/(?P[0-9a-f]{32})/download$', views.download_file_upload, name='zadmin.download_file_upload'), - url('^features$', views.features, name='zadmin.features'), - url('^features/collections\.json$', views.es_collections_json, + url(r'^features$', views.features, name='zadmin.features'), + url(r'^features/collections\.json$', views.es_collections_json, name='zadmin.collections_json'), - url('^features/featured-collection$', views.featured_collection, + url(r'^features/featured-collection$', views.featured_collection, name='zadmin.featured_collection'), - url('^monthly-pick$', views.monthly_pick, + url(r'^monthly-pick$', views.monthly_pick, name='zadmin.monthly_pick'), - url('^elastic$', views.elastic, name='zadmin.elastic'), - url('^mail$', views.mail, name='zadmin.mail'), - url('^email-devs$', views.email_devs, name='zadmin.email_devs'), - url('^addon-search$', views.addon_search, name='zadmin.addon-search'), + url(r'^elastic$', views.elastic, name='zadmin.elastic'), + url(r'^mail$', views.mail, name='zadmin.mail'), + url(r'^email-devs$', views.email_devs, name='zadmin.email_devs'), + url(r'^addon-search$', views.addon_search, name='zadmin.addon-search'), # Site Event admin. - url('^events/(?P\d+)?$', views.site_events, + url(r'^events/(?P\d+)?$', views.site_events, name='zadmin.site_events'), - url('^events/(?P\d+)/delete$', views.delete_site_event, + url(r'^events/(?P\d+)/delete$', views.delete_site_event, name='zadmin.site_events.delete'), # The Django admin. - url('^models/', include(admin.site.urls)), - url('^models/(?P.+)/(?P.+)/search\.json$', + url(r'^models/', include(admin.site.urls)), + url(r'^models/(?P.+)/(?P.+)/search\.json$', views.general_search, name='zadmin.search'), ]