This commit is contained in:
pyup.io bot 2018-11-05 04:39:42 -08:00 коммит произвёл Andrew Williamson
Родитель e798f6771f
Коммит 60dd98e48f
37 изменённых файлов: 361 добавлений и 368 удалений

Просмотреть файл

@ -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'),
]