Update flake8 to 3.6.0 (#9795)
This commit is contained in:
Родитель
e798f6771f
Коммит
60dd98e48f
|
@ -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 \
|
||||
|
|
|
@ -223,7 +223,7 @@ class LWThemeUpdate(ThemeUpdate):
|
|||
return '%s/%s%s' % (domain, self.data.get('locale', 'en-US'), url)
|
||||
|
||||
|
||||
url_re = re.compile('(?P<locale>.+)?/themes/update-check/(?P<id>\d+)$')
|
||||
url_re = re.compile(r'(?P<locale>.+)?/themes/update-check/(?P<id>\d+)$')
|
||||
|
||||
|
||||
def application(environ, start_response):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -11,43 +11,43 @@ ADDON_ID = r"""(?P<addon_id>[^/<>"']+)"""
|
|||
|
||||
# These will all start with /addon/<addon_id>/
|
||||
detail_patterns = [
|
||||
url('^$', views.addon_detail, name='addons.detail'),
|
||||
url('^more$', views.addon_detail, name='addons.detail_more'),
|
||||
url('^eula/(?P<file_id>\d+)?$', views.eula, name='addons.eula'),
|
||||
url('^license/(?P<version>[^/]+)?', 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<file_id>\d+)?$', views.eula, name='addons.eula'),
|
||||
url(r'^license/(?P<version>[^/]+)?', 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/(?P<status>cancel|complete)$',
|
||||
url(r'^contribute/(?P<status>cancel|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<addon_id>\d+)/(?P<file_id>\d+)',
|
||||
url(r'^addons/policy/0/(?P<addon_id>\d+)/(?P<file_id>\d+)',
|
||||
lambda r, addon_id, file_id: redirect(
|
||||
'addons.eula', addon_id, file_id, permanent=True)),
|
||||
url('^addons/policy/0/(?P<addon_id>\d+)/',
|
||||
url(r'^addons/policy/0/(?P<addon_id>\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'),
|
||||
]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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, '<script %s></script>' % ' '.join(attrs))
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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'),
|
||||
]
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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'),
|
||||
]
|
||||
|
|
|
@ -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('^(?P<action>add|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'^(?P<action>add|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<uuid>[^/]+)/?$', views.legacy_redirect),
|
||||
url('^collections/view/(?P<uuid>[^/]+)/?$', views.legacy_redirect),
|
||||
url('^collections/edit/(?P<uuid>[^/]+)/?$', views.legacy_redirect,
|
||||
url(r'^collection/(?P<uuid>[^/]+)/?$', views.legacy_redirect),
|
||||
url(r'^collections/view/(?P<uuid>[^/]+)/?$', views.legacy_redirect),
|
||||
url(r'^collections/edit/(?P<uuid>[^/]+)/?$', 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<slug>[^/]+)?$', views.mine,
|
||||
url(r'^collections/mine/(?P<slug>[^/]+)?$', views.mine,
|
||||
name='collections.mine', kwargs={'username': 'mine'}),
|
||||
url('^collections/(?P<username>[^/]+)/$', views.user_listing,
|
||||
url(r'^collections/(?P<username>[^/]+)/$', views.user_listing,
|
||||
name='collections.user'),
|
||||
url('^collections/(?P<username>[^/]+)/(?P<slug>[^/]+)/',
|
||||
url(r'^collections/(?P<username>[^/]+)/(?P<slug>[^/]+)/',
|
||||
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)),
|
||||
]
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -10,82 +10,82 @@ from . import views
|
|||
|
||||
impala_patterns = [
|
||||
# TODO: Impalacize these views.
|
||||
url('^extensions/(?P<category>[^/]+)/featured$',
|
||||
url(r'^extensions/(?P<category>[^/]+)/featured$',
|
||||
views.legacy_creatured_redirect,
|
||||
name='i_browse.creatured'),
|
||||
url('^language-tools/(?P<category>[^/]+)?$', views.language_tools,
|
||||
url(r'^language-tools/(?P<category>[^/]+)?$', views.language_tools,
|
||||
name='i_browse.language-tools'),
|
||||
url('^search-tools/(?P<category>[^/]+)?$', views.search_tools,
|
||||
url(r'^search-tools/(?P<category>[^/]+)?$', views.search_tools,
|
||||
name='i_browse.search-tools'),
|
||||
]
|
||||
|
||||
urlpatterns = [
|
||||
url('^i/', include(impala_patterns)),
|
||||
url(r'^i/', include(impala_patterns)),
|
||||
|
||||
url('^language-tools/(?P<category>[^/]+)?$', views.language_tools,
|
||||
url(r'^language-tools/(?P<category>[^/]+)?$', 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<category>[^ /]+)?$',
|
||||
url(r'^full-themes/(?P<category>[^ /]+)?$',
|
||||
views.legacy_fulltheme_redirects),
|
||||
|
||||
# Personas are now Themes.
|
||||
url('^personas/(?P<category>[^ /]+)?$',
|
||||
url(r'^personas/(?P<category>[^ /]+)?$',
|
||||
views.legacy_theme_redirects),
|
||||
url('^themes/(?:(?P<category>[^ /]+)/)?$', views.personas,
|
||||
url(r'^themes/(?:(?P<category>[^ /]+)/)?$', views.personas,
|
||||
name='browse.personas'),
|
||||
|
||||
# Themes are now Complete Themes.
|
||||
url('^themes/(?P<category_name>[^/]+)/format:rss$',
|
||||
url(r'^themes/(?P<category_name>[^/]+)/format:rss$',
|
||||
views.legacy_theme_redirects),
|
||||
url('^complete-themes/(?P<category>[^/]+)?$', views.themes,
|
||||
url(r'^complete-themes/(?P<category>[^/]+)?$', views.themes,
|
||||
name='browse.themes'),
|
||||
url('^complete-themes/(?:(?P<category_name>[^/]+)/)?format:rss$',
|
||||
url(r'^complete-themes/(?:(?P<category_name>[^/]+)/)?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<category>[^/]+)/)?$',
|
||||
url(r'^static-themes/(?:(?P<category>[^/]+)/)?$',
|
||||
lambda r, category: redirect(
|
||||
reverse('browse.personas',
|
||||
kwargs=({'category': category} if category else {}))),
|
||||
name='browse.static-themes'),
|
||||
|
||||
url('^extensions/(?:(?P<category>[^/]+)/)?$', views.extensions,
|
||||
url(r'^extensions/(?:(?P<category>[^/]+)/)?$', views.extensions,
|
||||
name='browse.extensions'),
|
||||
|
||||
# Creatured URLs now redirect to browse.extensions
|
||||
url('^extensions/(?P<category>[^/]+)/featured$',
|
||||
url(r'^extensions/(?P<category>[^/]+)/featured$',
|
||||
views.legacy_creatured_redirect),
|
||||
|
||||
url('^extensions/(?:(?P<category_name>[^/]+)/)?format:rss$',
|
||||
url(r'^extensions/(?:(?P<category_name>[^/]+)/)?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<type_>\d)(?:/cat:(?P<category>\d+))?'
|
||||
url(r'^browse/type:(?P<type_>\d)(?:/cat:(?P<category>\d+))?'
|
||||
'(?:/sort:(?P<sort>[^/]+))?(?:/format:(?P<format>[^/]+).*)?',
|
||||
views.legacy_redirects),
|
||||
|
||||
url('^search-tools/(?:(?P<category>[^/]+)/)?format:rss$',
|
||||
url(r'^search-tools/(?:(?P<category>[^/]+)/)?format:rss$',
|
||||
SearchToolsRss(), name='browse.search-tools.rss'),
|
||||
|
||||
url('^search-tools/(?P<category>[^/]+)?$', views.search_tools,
|
||||
url(r'^search-tools/(?P<category>[^/]+)?$', 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)),
|
||||
]
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -11,197 +11,200 @@ from . import views
|
|||
|
||||
# These will all start with /theme/<slug>/
|
||||
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/'
|
||||
'(?P<upload_type>persona_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/<addon_id>/
|
||||
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<section>[^/]+)(?:/(?P<editable>[^/]+))?$',
|
||||
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<section>[^/]+)(?:/(?P<editable>[^/]+))?$',
|
||||
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-(?P<channel>listed|unlisted)$', views.upload_for_version,
|
||||
url(r'^upload-(?P<channel>listed|unlisted)$', views.upload_for_version,
|
||||
name='devhub.upload_for_version'),
|
||||
url('^upload/(?P<uuid>[^/]+)$', views.upload_detail_for_version,
|
||||
url(r'^upload/(?P<uuid>[^/]+)$', 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<version_id>\d+)$', views.version_edit,
|
||||
url(r'^versions/(?P<version_id>\d+)$', views.version_edit,
|
||||
name='devhub.versions.edit'),
|
||||
url('^versions/(?P<version>[^/]+)$', views.version_bounce),
|
||||
url(r'^versions/(?P<version>[^/]+)$', 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-(?P<channel>listed|unlisted)$',
|
||||
url(r'^versions/submit/upload-(?P<channel>listed|unlisted)$',
|
||||
views.submit_version_upload,
|
||||
name='devhub.submit.version.upload'),
|
||||
url('^versions/submit/(?P<version_id>\d+)/source$',
|
||||
url(r'^versions/submit/(?P<version_id>\d+)/source$',
|
||||
views.submit_version_source,
|
||||
name='devhub.submit.version.source'),
|
||||
url('^versions/submit/(?P<version_id>\d+)/details$',
|
||||
url(r'^versions/submit/(?P<version_id>\d+)/details$',
|
||||
views.submit_version_details,
|
||||
name='devhub.submit.version.details'),
|
||||
url('^versions/submit/(?P<version_id>\d+)/finish$',
|
||||
url(r'^versions/submit/(?P<version_id>\d+)/finish$',
|
||||
views.submit_version_finish,
|
||||
name='devhub.submit.version.finish'),
|
||||
|
||||
url('^versions/submit/wizard-(?P<channel>listed|unlisted)$',
|
||||
url(r'^versions/submit/wizard-(?P<channel>listed|unlisted)$',
|
||||
views.submit_version_theme_wizard,
|
||||
name='devhub.submit.version.wizard'),
|
||||
url('^versions/submit/wizard-(?P<channel>listed|unlisted)/background$',
|
||||
views.theme_background_image,
|
||||
name='devhub.submit.version.previous_background'),
|
||||
|
||||
url('^file/(?P<file_id>[^/]+)/validation$', views.file_validation,
|
||||
url(r'^file/(?P<file_id>[^/]+)/validation$', views.file_validation,
|
||||
name='devhub.file_validation'),
|
||||
url('^file/(?P<file_id>[^/]+)/validation\.json$',
|
||||
url(r'^file/(?P<file_id>[^/]+)/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/<addon_id>/
|
||||
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<version_id>\d+)/compatibility$',
|
||||
url(r'^versions/(?P<version_id>\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-(?P<channel>listed|unlisted)$',
|
||||
url(r'^addon/submit/upload-(?P<channel>listed|unlisted)$',
|
||||
views.submit_addon_upload, name='devhub.submit.upload'),
|
||||
url('^addon/submit/wizard-(?P<channel>listed|unlisted)$',
|
||||
url(r'^addon/submit/wizard-(?P<channel>listed|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/'
|
||||
'(?P<upload_type>persona_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<doc_name>[-_\w]+(?:/[-_\w]+)?)?$',
|
||||
url(r'docs/(?P<doc_name>[-_\w]+(?:/[-_\w]+)?)?$',
|
||||
views.docs, name='devhub.docs'),
|
||||
])
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -21,7 +21,7 @@ compare_patterns = [
|
|||
]
|
||||
|
||||
urlpatterns = [
|
||||
url('^browse/(?P<file_id>\d+)/', include(file_patterns)),
|
||||
url('^compare/(?P<one_id>\d+)\.{3}(?P<two_id>\d+)/',
|
||||
url(r'^browse/(?P<file_id>\d+)/', include(file_patterns)),
|
||||
url(r'^compare/(?P<one_id>\d+)\.{3}(?P<two_id>\d+)/',
|
||||
include(compare_patterns)),
|
||||
]
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -33,20 +33,20 @@ def build_urls(base, appendages):
|
|||
base_search_regexp = r'search/(?P<query>[^/]+)'
|
||||
appendages = [
|
||||
# Regular expressions that we use in our urls.
|
||||
'/(?P<addon_type>[^/]*)',
|
||||
'/(?P<limit>\d*)',
|
||||
'/(?P<platform>\w*)',
|
||||
'/(?P<version>[^/]*)',
|
||||
'(?:/(?P<compat_mode>(?:strict|normal|ignore)))?',
|
||||
r'/(?P<addon_type>[^/]*)',
|
||||
r'/(?P<limit>\d*)',
|
||||
r'/(?P<platform>\w*)',
|
||||
r'/(?P<version>[^/]*)',
|
||||
r'(?:/(?P<compat_mode>(?:strict|normal|ignore)))?',
|
||||
]
|
||||
search_regexps = build_urls(base_search_regexp, appendages)
|
||||
|
||||
appendages.insert(0, '/(?P<list_type>[^/]+)')
|
||||
appendages.insert(0, r'/(?P<list_type>[^/]+)')
|
||||
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),
|
||||
|
|
|
@ -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)),
|
||||
]
|
||||
|
|
|
@ -72,7 +72,7 @@ on https://addons.mozilla.org
|
|||
"""
|
||||
|
||||
version_regex = re.compile(
|
||||
'^(?P<prefix>.*)(?P<version>\.1\-signed)(|\-(?P<number>\d+))$')
|
||||
r'^(?P<prefix>.*)(?P<version>\.1\-signed)(|\-(?P<number>\d+))$')
|
||||
|
||||
|
||||
def get_new_version_number(version):
|
||||
|
|
|
@ -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'),
|
||||
]
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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<review_id>\d+)/', include(rating_detail_patterns)),
|
||||
url('^format:rss$', RatingsRss(), name='addons.ratings.list.rss'),
|
||||
url('^user:(?P<user_id>\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<review_id>\d+)/', include(rating_detail_patterns)),
|
||||
url(r'^format:rss$', RatingsRss(), name='addons.ratings.list.rss'),
|
||||
url(r'^user:(?P<user_id>\d+)$', views.review_list,
|
||||
name='addons.ratings.user'),
|
||||
]
|
||||
|
|
|
@ -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<slug>[^ /]+)$', views_themes.themes_single,
|
||||
url(r'^themes/queue/single/(?P<slug>[^ /]+)$', views_themes.themes_single,
|
||||
name='reviewers.themes.single'),
|
||||
url('^themes/history/(?P<username>[^ /]+)?$',
|
||||
url(r'^themes/history/(?P<username>[^ /]+)?$',
|
||||
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'),
|
||||
)
|
||||
|
|
|
@ -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'),
|
||||
]
|
||||
|
|
|
@ -16,6 +16,6 @@ urlpatterns = [
|
|||
name='signing.version'),
|
||||
# .* at the end to match filenames.
|
||||
# /file/:id/some-file.xpi
|
||||
url('^file/(?P<file_id>\d+)(?:/.*)?',
|
||||
url(r'^file/(?P<file_id>\d+)(?:/.*)?',
|
||||
views.SignedFile.as_view(), name='signing.file'),
|
||||
]
|
||||
|
|
|
@ -4,22 +4,22 @@ from django.shortcuts import redirect
|
|||
from . import views
|
||||
|
||||
|
||||
group_re = '(?P<group>' + '|'.join(views.SERIES_GROUPS) + ')'
|
||||
group_date_re = '(?P<group>' + '|'.join(views.SERIES_GROUPS_DATE) + ')'
|
||||
range_re = '(?P<start>\d{8})-(?P<end>\d{8})'
|
||||
format_re = '(?P<format>' + '|'.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<group>' + '|'.join(views.SERIES_GROUPS) + ')'
|
||||
group_date_re = r'(?P<group>' + '|'.join(views.SERIES_GROUPS_DATE) + ')'
|
||||
range_re = r'(?P<start>\d{8})-(?P<end>\d{8})'
|
||||
format_re = r'(?P<format>' + '|'.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:
|
||||
|
|
|
@ -4,5 +4,5 @@ from olympia.search.views import search
|
|||
|
||||
|
||||
urlpatterns = [
|
||||
url('^tag/(?P<tag_name>[^/]+)$', search, name='tags.detail'),
|
||||
url(r'^tag/(?P<tag_name>[^/]+)$', search, name='tags.detail'),
|
||||
]
|
||||
|
|
|
@ -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<start>\d{8})-(?P<end>\d{8})\.json$',
|
||||
url(r'^statistics/events-(?P<start>\d{8})-(?P<end>\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<persona_id>\d+)',
|
||||
url(r'^persona/(?P<persona_id>\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<version_id>\d+)',
|
||||
url(r'^versions/updateInfo/(?P<version_id>\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)),
|
||||
]
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -9,23 +9,23 @@ USER_ID = r"""(?P<user_id>[^/<>"']+)"""
|
|||
|
||||
# These will all start with /user/<user_id>/
|
||||
detail_patterns = [
|
||||
url('^$', views.profile, name='users.profile'),
|
||||
url('^themes(?:/(?P<category>[^ /]+))?$', views.themes,
|
||||
url(r'^$', views.profile, name='users.profile'),
|
||||
url(r'^themes(?:/(?P<category>[^ /]+))?$', 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<user_id>\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<user_id>\d+)?$', views.delete_photo,
|
||||
name='users.delete_photo'),
|
||||
url('^edit$', views.edit, name='users.edit'),
|
||||
url('^edit(?:/(?P<user_id>\d+))?$', views.admin_edit,
|
||||
url(r'^edit$', views.edit, name='users.edit'),
|
||||
url(r'^edit(?:/(?P<user_id>\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<token>[-\w]+={0,3})/(?P<hash>[\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)),
|
||||
]
|
||||
|
|
|
@ -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<version_num>[^/]+)$', views.version_detail,
|
||||
url(r'^(?P<version_num>[^/]+)$', views.version_detail,
|
||||
name='addons.versions'),
|
||||
url('^(?P<version_num>[^/]+)/updateinfo/$', views.update_info,
|
||||
url(r'^(?P<version_num>[^/]+)/updateinfo/$', views.update_info,
|
||||
name='addons.versions.update_info'),
|
||||
]
|
||||
|
||||
download_patterns = [
|
||||
# .* at the end to match filenames.
|
||||
# /file/:id/type:attachment
|
||||
url('^file/(?P<file_id>\d+)(?:/type:(?P<type>\w+))?(?:/.*)?',
|
||||
url(r'^file/(?P<file_id>\d+)(?:/type:(?P<type>\w+))?(?:/.*)?',
|
||||
views.download_file, name='downloads.file'),
|
||||
|
||||
url('^source/(?P<version_id>\d+)',
|
||||
url(r'^source/(?P<version_id>\d+)',
|
||||
views.download_source, name='downloads.source'),
|
||||
|
||||
# /latest/1865/type:xpi/platform:5
|
||||
url('^latest/%s/(?:type:(?P<type>\w+)/)?'
|
||||
'(?:platform:(?P<platform>\d+)/)?.*' % ADDON_ID,
|
||||
url(r'^latest/%s/(?:type:(?P<type>\w+)/)?'
|
||||
r'(?:platform:(?P<platform>\d+)/)?.*' % ADDON_ID,
|
||||
views.download_latest, name='downloads.latest'),
|
||||
]
|
||||
|
|
|
@ -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<file_id>\d+)/', views.recalc_hash,
|
||||
url(r'^addon/recalc-hash/(?P<file_id>\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<topic>.*)\.csv$',
|
||||
views.email_preview_csv, name='zadmin.email_preview_csv'),
|
||||
|
||||
url(r'^file-upload/(?P<uuid>[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<event_id>\d+)?$', views.site_events,
|
||||
url(r'^events/(?P<event_id>\d+)?$', views.site_events,
|
||||
name='zadmin.site_events'),
|
||||
url('^events/(?P<event_id>\d+)/delete$', views.delete_site_event,
|
||||
url(r'^events/(?P<event_id>\d+)/delete$', views.delete_site_event,
|
||||
name='zadmin.site_events.delete'),
|
||||
|
||||
# The Django admin.
|
||||
url('^models/', include(admin.site.urls)),
|
||||
url('^models/(?P<app_id>.+)/(?P<model_id>.+)/search\.json$',
|
||||
url(r'^models/', include(admin.site.urls)),
|
||||
url(r'^models/(?P<app_id>.+)/(?P<model_id>.+)/search\.json$',
|
||||
views.general_search, name='zadmin.search'),
|
||||
]
|
||||
|
|
Загрузка…
Ссылка в новой задаче