")
@@ -123,7 +122,7 @@ class CountrySelectForm(forms.Form):
def __init__(self, locale, *args, **kwargs):
regions = product_details.get_regions(locale)
regions = sorted(iter(regions.items()), key=itemgetter(1))
- super(CountrySelectForm, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
self.fields["country"].choices = regions
@@ -193,7 +192,7 @@ def __init__(self, locale, *args, **kwargs):
initial["lang"] = lang
kwargs["initial"] = initial
- super(ManageSubscriptionsForm, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
self.fields["country"].choices = regions
self.fields["lang"].choices = lang_choices
@@ -205,7 +204,7 @@ def clean(self):
if newsletter not in valid_newsletters:
msg = ftl("newsletters-is-not-a-valid-newsletter", newsletter=newsletter, ftl_files=["mozorg/newsletters"])
raise ValidationError(msg)
- return super(ManageSubscriptionsForm, self).clean()
+ return super().clean()
class NewsletterForm(forms.Form):
@@ -273,7 +272,7 @@ def __init__(self, newsletters, locale, data=None, *args, **kwargs):
lang = ""
lang_choices.insert(0, ("", ftl_lazy("newsletter-form-available-languages")))
- super(NewsletterFooterForm, self).__init__(data, *args, **kwargs)
+ super().__init__(data, *args, **kwargs)
required_args = {
"required": "required",
diff --git a/bedrock/newsletter/management/commands/update_newsletter_data.py b/bedrock/newsletter/management/commands/update_newsletter_data.py
index 1e568a0b47f..ec2242a2cec 100644
--- a/bedrock/newsletter/management/commands/update_newsletter_data.py
+++ b/bedrock/newsletter/management/commands/update_newsletter_data.py
@@ -23,6 +23,6 @@ def handle(self, *args, **options):
count = Newsletter.objects.refresh(newsletters)
if not options["quiet"]:
if count:
- print("Updated %d newsletters" % count)
+ print(f"Updated {count} newsletters")
else:
print("Nothing to update")
diff --git a/bedrock/newsletter/migrations/0001_initial.py b/bedrock/newsletter/migrations/0001_initial.py
index 6a301c26428..cdfc4aca33d 100644
--- a/bedrock/newsletter/migrations/0001_initial.py
+++ b/bedrock/newsletter/migrations/0001_initial.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
diff --git a/bedrock/newsletter/tests/__init__.py b/bedrock/newsletter/tests/__init__.py
index f22f82db3dd..edd8b577a7c 100644
--- a/bedrock/newsletter/tests/__init__.py
+++ b/bedrock/newsletter/tests/__init__.py
@@ -2,7 +2,7 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from mock import Mock
+from unittest.mock import Mock
from bedrock.newsletter import utils
diff --git a/bedrock/newsletter/tests/test_footer_form.py b/bedrock/newsletter/tests/test_footer_form.py
index 45e50842296..c0f6c2dc416 100644
--- a/bedrock/newsletter/tests/test_footer_form.py
+++ b/bedrock/newsletter/tests/test_footer_form.py
@@ -2,9 +2,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+from unittest.mock import patch
+
from django.test.utils import override_settings
-from mock import patch
from pyquery import PyQuery as pq
from bedrock.base.urlresolvers import reverse
diff --git a/bedrock/newsletter/tests/test_forms.py b/bedrock/newsletter/tests/test_forms.py
index 006c8396191..d25bf7f1566 100644
--- a/bedrock/newsletter/tests/test_forms.py
+++ b/bedrock/newsletter/tests/test_forms.py
@@ -1,7 +1,7 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-import mock
+from unittest import mock
from bedrock.mozorg.tests import TestCase
from bedrock.newsletter.forms import (
diff --git a/bedrock/newsletter/tests/test_misc.py b/bedrock/newsletter/tests/test_misc.py
index f4b8eb9598b..ad28c88be4e 100644
--- a/bedrock/newsletter/tests/test_misc.py
+++ b/bedrock/newsletter/tests/test_misc.py
@@ -2,7 +2,7 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-import mock
+from unittest import mock
from bedrock.mozorg.tests import TestCase
from bedrock.newsletter import utils
diff --git a/bedrock/newsletter/tests/test_views.py b/bedrock/newsletter/tests/test_views.py
index 19b19c79f45..03f15d1ea91 100644
--- a/bedrock/newsletter/tests/test_views.py
+++ b/bedrock/newsletter/tests/test_views.py
@@ -3,13 +3,13 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import json
import uuid
+from unittest.mock import ANY, DEFAULT, patch
from django.http import HttpResponse
from django.test.client import RequestFactory
from django.test.utils import override_settings
import basket
-from mock import ANY, DEFAULT, patch
from pyquery import PyQuery as pq
from bedrock.base.urlresolvers import reverse
@@ -85,14 +85,14 @@ def setUp(self):
"form-3-subscribed_check": "false",
"submit": "Save Preferences",
}
- super(TestExistingNewsletterView, self).setUp()
+ super().setUp()
@patch("bedrock.newsletter.utils.get_newsletters")
def test_will_show_confirm_copy(self, get_newsletters, mock_basket_request):
# After successful confirm, ensure proper context var is set to display
# confirmation-specific copy.
get_newsletters.return_value = newsletters
- url = "%s?confirm=1" % reverse("newsletter.existing.token", args=(self.token,))
+ url = f"{reverse('newsletter.existing.token', args=(self.token,))}?confirm=1"
# noinspection PyUnresolvedReferences
with patch.multiple("basket", request=DEFAULT) as basket_patches:
with patch("lib.l10n_utils.render") as render:
@@ -138,9 +138,9 @@ def test_show(self, get_newsletters, mock_basket_request):
request, template_name, context = render.call_args[0]
forms = context["formset"].initial_forms
- shown = set([form.initial["newsletter"] for form in forms])
- inactive = set([newsletter for newsletter, data in newsletters.items() if not data.get("active", False)])
- to_show = set([newsletter for newsletter, data in newsletters.items() if data.get("show", False)]) - inactive
+ shown = {form.initial["newsletter"] for form in forms}
+ inactive = {newsletter for newsletter, data in newsletters.items() if not data.get("active", False)}
+ to_show = {newsletter for newsletter, data in newsletters.items() if data.get("show", False)} - inactive
subscribed = set(self.user["newsletters"])
# All subscribed newsletters except inactive ones are shown
@@ -226,9 +226,9 @@ def test_subscribing(self, get_newsletters, mock_basket_request):
# Should have called update_user with subscription list
self.assertEqual(1, basket_patches["update_user"].call_count)
kwargs = basket_patches["update_user"].call_args[1]
- self.assertEqual(set(kwargs), set(["api_key", "newsletters", "lang"]))
+ self.assertEqual(set(kwargs), {"api_key", "newsletters", "lang"})
self.assertEqual(kwargs["lang"], "en")
- self.assertEqual(set(kwargs["newsletters"].split(",")), set(["mozilla-and-you", "firefox-tips"]))
+ self.assertEqual(set(kwargs["newsletters"].split(",")), {"mozilla-and-you", "firefox-tips"})
# Should not have called unsubscribe
self.assertEqual(0, basket_patches["unsubscribe"].call_count)
# Should not have called subscribe
@@ -278,8 +278,7 @@ def test_remove_all(self, get_newsletters, mock_basket_request):
self.assertEqual((self.token, self.user["email"]), args)
self.assertTrue(kwargs["optout"])
# Should redirect to the 'updated' view with unsub=1 and token
- url = reverse("newsletter.updated") + "?unsub=1"
- url += "&token=%s" % self.token
+ url = f"{reverse('newsletter.updated')}?unsub=1&token={self.token}"
assert rsp["Location"] == url
@patch("bedrock.newsletter.utils.get_newsletters")
@@ -365,7 +364,7 @@ def test_normal(self):
confirm.return_value = {"status": "ok"}
rsp = self.client.get(self.url)
self.assertEqual(302, rsp.status_code)
- self.assertTrue(rsp["Location"].endswith("%s?confirm=1" % reverse("newsletter.existing.token", kwargs={"token": self.token})))
+ self.assertTrue(rsp["Location"].endswith(f"{reverse('newsletter.existing.token', kwargs={'token': self.token})}?confirm=1"))
def test_normal_with_query_params(self):
"""Confirm works with a valid token"""
@@ -375,8 +374,8 @@ def test_normal_with_query_params(self):
self.assertEqual(302, rsp.status_code)
self.assertTrue(
rsp["Location"].endswith(
- "%s?confirm=1&utm_tracking=oh+definitely+yes&"
- "utm_source=malibu" % reverse("newsletter.existing.token", kwargs={"token": self.token})
+ f"{reverse('newsletter.existing.token', kwargs={'token': self.token})}"
+ "?confirm=1&utm_tracking=oh+definitely+yes&utm_source=malibu"
)
)
diff --git a/bedrock/newsletter/views.py b/bedrock/newsletter/views.py
index 2e939c03a6e..9ea18bf6863 100644
--- a/bedrock/newsletter/views.py
+++ b/bedrock/newsletter/views.py
@@ -230,7 +230,7 @@ def confirm(request, token):
try:
result = basket.confirm(token)
except basket.BasketException as e:
- log.exception("Exception confirming token %s" % token)
+ log.exception(f"Exception confirming token {token}")
if e.code == basket.errors.BASKET_UNKNOWN_TOKEN:
token_error = True
elif e.code == basket.errors.BASKET_USAGE_ERROR:
@@ -253,7 +253,7 @@ def confirm(request, token):
qs = request.META.get("QUERY_STRING", "")
if qs:
qparams.append(qs)
- return HttpResponseRedirect("%s?%s" % (reverse("newsletter.existing.token", kwargs={"token": token}), "&".join(qparams)))
+ return HttpResponseRedirect("{}?{}".format(reverse("newsletter.existing.token", kwargs={"token": token}), "&".join(qparams)))
else:
return l10n_utils.render(
request, "newsletter/confirm.html", {"success": success, "generic_error": generic_error, "token_error": token_error}, ftl_files=FTL_FILES
@@ -400,13 +400,11 @@ def existing(request, token=None):
if formset.is_valid():
formset_is_valid = True
# What newsletters do they say they want to be subscribed to?
- newsletters = set(
- [
- subform.cleaned_data["newsletter"]
- for subform in formset
- if (subform.cleaned_data["subscribed_radio"] or subform.cleaned_data["subscribed_check"])
- ]
- )
+ newsletters = {
+ subform.cleaned_data["newsletter"]
+ for subform in formset
+ if (subform.cleaned_data["subscribed_radio"] or subform.cleaned_data["subscribed_check"])
+ }
form_kwargs["newsletters"] = newsletters
form = ManageSubscriptionsForm(locale, data=request.POST, initial=user, **form_kwargs)
@@ -445,7 +443,7 @@ def existing(request, token=None):
messages.add_message(request, messages.ERROR, general_error)
return l10n_utils.render(request, "newsletter/existing.html", ftl_files=FTL_FILES)
# We need to pass their token to the next view
- url = reverse("newsletter.updated") + "?unsub=%s&token=%s" % (UNSUB_UNSUBSCRIBED_ALL, token)
+ url = reverse("newsletter.updated") + f"?unsub={UNSUB_UNSUBSCRIBED_ALL}&token={token}"
return redirect(url)
# We're going to redirect, so the only way to tell the next
@@ -453,7 +451,7 @@ def existing(request, token=None):
# template is to modify the URL
url = reverse("newsletter.updated")
if unsub_parm:
- url += "?unsub=%s" % unsub_parm
+ url += f"?unsub={unsub_parm}"
return redirect(url)
# FALL THROUGH so page displays errors
@@ -540,7 +538,7 @@ def updated(request):
# paste together the English versions of the reasons they submitted,
# so we can read them. (Well, except for the free-form reason.)
for i, reason in enumerate(REASONS):
- if _post_or_get(request, "reason%d" % i):
+ if _post_or_get(request, f"reason{i}"):
reasons.append(str(reason))
if _post_or_get(request, "reason-text-p"):
reasons.append(_post_or_get(request, "reason-text", ""))
@@ -617,8 +615,8 @@ def newsletter_subscribe(request):
kwargs = {"format": data["fmt"]}
# add optional data
kwargs.update(
- dict(
- (k, data[k])
+ {
+ k: data[k]
for k in [
"country",
"lang",
@@ -627,7 +625,7 @@ def newsletter_subscribe(request):
"last_name",
]
if data[k]
- )
+ }
)
# NOTE this is not a typo; Referrer is misspelled in the HTTP spec
@@ -641,7 +639,7 @@ def newsletter_subscribe(request):
if e.code == basket.errors.BASKET_INVALID_EMAIL:
errors.append(str(invalid_email_address))
else:
- log.exception("Error subscribing %s to newsletter %s" % (data["email"], data["newsletters"]))
+ log.exception(f"Error subscribing {data['email']} to newsletter {data['newsletters']}")
errors.append(str(general_error))
else:
diff --git a/bedrock/pocketfeed/management/commands/update_pocketfeed.py b/bedrock/pocketfeed/management/commands/update_pocketfeed.py
index 361c97fcd4f..8fcd1e610d2 100644
--- a/bedrock/pocketfeed/management/commands/update_pocketfeed.py
+++ b/bedrock/pocketfeed/management/commands/update_pocketfeed.py
@@ -23,10 +23,10 @@ def handle(self, *args, **options):
if not options["quiet"]:
if updated:
- print("Refreshed %s articles from Pocket" % updated)
+ print(f"Refreshed {updated} articles from Pocket")
if deleted:
- print("Deleted %s old articles" % deleted)
+ print(f"Deleted {deleted} old articles")
else:
print("Pocket feed is already up to date")
else:
diff --git a/bedrock/pocketfeed/migrations/0001_initial.py b/bedrock/pocketfeed/migrations/0001_initial.py
index f4181e383b2..bda03c290b0 100644
--- a/bedrock/pocketfeed/migrations/0001_initial.py
+++ b/bedrock/pocketfeed/migrations/0001_initial.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
diff --git a/bedrock/pocketfeed/migrations/0002_auto_20180723_0805.py b/bedrock/pocketfeed/migrations/0002_auto_20180723_0805.py
index d18ae8b593a..3b8fb9634f0 100644
--- a/bedrock/pocketfeed/migrations/0002_auto_20180723_0805.py
+++ b/bedrock/pocketfeed/migrations/0002_auto_20180723_0805.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
diff --git a/bedrock/pocketfeed/models.py b/bedrock/pocketfeed/models.py
index 7ea4a0ec944..0ede0d0250b 100644
--- a/bedrock/pocketfeed/models.py
+++ b/bedrock/pocketfeed/models.py
@@ -1,5 +1,3 @@
-# -*- coding: utf-8 -*-
-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
diff --git a/bedrock/pocketfeed/tests/test_api.py b/bedrock/pocketfeed/tests/test_api.py
index cfb6feed223..ca87627fe3e 100644
--- a/bedrock/pocketfeed/tests/test_api.py
+++ b/bedrock/pocketfeed/tests/test_api.py
@@ -3,12 +3,11 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import datetime
+from unittest.mock import patch
from django.test import override_settings
from django.utils.timezone import make_aware, utc
-from mock import patch
-
from bedrock.pocketfeed import api
diff --git a/bedrock/press/forms.py b/bedrock/press/forms.py
index 3c7dc26affa..12505c275fa 100644
--- a/bedrock/press/forms.py
+++ b/bedrock/press/forms.py
@@ -1,5 +1,3 @@
-# coding: utf-8
-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
@@ -44,7 +42,7 @@ class PressInquiryForm(forms.Form):
office_fax = forms.CharField(widget=HoneyPotWidget, required=False)
def clean_office_fax(self):
- cleaned_data = super(PressInquiryForm, self).clean()
+ cleaned_data = super().clean()
honeypot = cleaned_data.pop("office_fax", None)
if honeypot:
@@ -299,7 +297,7 @@ class SpeakerRequestForm(forms.Form):
office_fax = forms.CharField(widget=HoneyPotWidget, required=False)
def clean_sr_attachment(self):
- cleaned_data = super(SpeakerRequestForm, self).clean()
+ cleaned_data = super().clean()
attachment = cleaned_data.get("sr_attachment")
if attachment:
@@ -309,7 +307,7 @@ def clean_sr_attachment(self):
return attachment
def clean_office_fax(self):
- cleaned_data = super(SpeakerRequestForm, self).clean()
+ cleaned_data = super().clean()
honeypot = cleaned_data.pop("office_fax", None)
if honeypot:
diff --git a/bedrock/press/tests/test_base.py b/bedrock/press/tests/test_base.py
index 7fa2c7266fa..98e642fec89 100644
--- a/bedrock/press/tests/test_base.py
+++ b/bedrock/press/tests/test_base.py
@@ -1,15 +1,13 @@
-# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import datetime
+from unittest.mock import Mock, patch
from django.core import mail
from django.test.client import RequestFactory
-from mock import Mock, patch
-
from bedrock.base.urlresolvers import reverse
from bedrock.mozorg.tests import TestCase
from bedrock.press import forms as press_forms, views as press_views
diff --git a/bedrock/press/views.py b/bedrock/press/views.py
index 86ada0e645c..509f0c4892e 100644
--- a/bedrock/press/views.py
+++ b/bedrock/press/views.py
@@ -26,10 +26,10 @@ class PressInquiryView(FormView):
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
- return super(PressInquiryView, self).dispatch(request, *args, **kwargs)
+ return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
- context = super(PressInquiryView, self).get_context_data(**kwargs)
+ context = super().get_context_data(**kwargs)
context["form_success"] = "success" in self.request.GET
return context
@@ -38,7 +38,7 @@ def get_success_url(self):
def form_valid(self, form):
self.send_email(form)
- return super(PressInquiryView, self).form_valid(form)
+ return super().form_valid(form)
def send_email(self, form):
subject = PRESS_INQUIRY_EMAIL_SUBJECT
@@ -59,15 +59,15 @@ class SpeakerRequestView(FormView):
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
- return super(SpeakerRequestView, self).dispatch(request, *args, **kwargs)
+ return super().dispatch(request, *args, **kwargs)
def get_form_kwargs(self):
- kwargs = super(SpeakerRequestView, self).get_form_kwargs()
+ kwargs = super().get_form_kwargs()
kwargs["auto_id"] = "%s"
return kwargs
def get_context_data(self, **kwargs):
- context = super(SpeakerRequestView, self).get_context_data(**kwargs)
+ context = super().get_context_data(**kwargs)
context["form_success"] = "success" in self.request.GET
return context
@@ -76,7 +76,7 @@ def get_success_url(self):
def form_valid(self, form):
self.send_email(form)
- return super(SpeakerRequestView, self).form_valid(form)
+ return super().form_valid(form)
def send_email(self, form):
subject = SPEAKER_REQUEST_EMAIL_SUBJECT
diff --git a/bedrock/privacy/views.py b/bedrock/privacy/views.py
index 36eb26f6dc1..126cd86ed3f 100644
--- a/bedrock/privacy/views.py
+++ b/bedrock/privacy/views.py
@@ -34,7 +34,7 @@ def process_legal_doc(content):
class PrivacyDocView(LegalDocView):
def get_legal_doc(self):
- doc = super(PrivacyDocView, self).get_legal_doc()
+ doc = super().get_legal_doc()
if doc is not None:
doc["content"] = process_legal_doc(doc["content"])
return doc
@@ -42,7 +42,7 @@ def get_legal_doc(self):
class FirefoxPrivacyDocView(PrivacyDocView):
def get_legal_doc(self):
- doc = super(FirefoxPrivacyDocView, self).get_legal_doc()
+ doc = super().get_legal_doc()
if len(doc["content"].select(".privacy-header-firefox")) > 0:
self.template_name = "privacy/notices/firefox.html"
else:
diff --git a/bedrock/products/templatetags/misc.py b/bedrock/products/templatetags/misc.py
index 74210e122b3..46e8ce9d37d 100644
--- a/bedrock/products/templatetags/misc.py
+++ b/bedrock/products/templatetags/misc.py
@@ -29,14 +29,14 @@ def _vpn_product_link(product_url, entrypoint, link_text, class_name=None, optio
href = f"{product_url}{separator}entrypoint={entrypoint}&form_type=button&service={client_id}&utm_source={entrypoint}&utm_medium=referral"
if optional_parameters:
- params = "&".join("%s=%s" % (param, val) for param, val in optional_parameters.items())
+ params = "&".join(f"{param}={val}" for param, val in optional_parameters.items())
href += f"&{params}"
css_class = "js-vpn-cta-link js-fxa-product-button"
attrs = ""
if optional_attributes:
- attrs += " ".join('%s="%s"' % (attr, val) for attr, val in optional_attributes.items())
+ attrs += " ".join(f'{attr}="{val}"' for attr, val in optional_attributes.items())
# If there's a `data-cta-position` attribute for GA, also pass that as a query param to vpn.m.o.
position = optional_attributes.get("data-cta-position", None)
@@ -201,7 +201,7 @@ def vpn_product_referral_link(ctx, referral_id="", page_anchor="", link_text=Non
attrs = f'data-referral-id="{referral_id}" '
if optional_attributes:
- attrs += " ".join('%s="%s"' % (attr, val) for attr, val in optional_attributes.items())
+ attrs += " ".join(f'{attr}="{val}"' for attr, val in optional_attributes.items())
if class_name:
css_class += f" {class_name}"
diff --git a/bedrock/products/tests/test_helper_misc.py b/bedrock/products/tests/test_helper_misc.py
index 79cb0040336..3d26bb65827 100644
--- a/bedrock/products/tests/test_helper_misc.py
+++ b/bedrock/products/tests/test_helper_misc.py
@@ -704,7 +704,7 @@ class TestVPNMonthlyPrice(TestCase):
def _render(self, plan, country_code, lang):
req = self.rf.get("/")
req.locale = "en-US"
- return render("{{{{ vpn_monthly_price('{0}', '{1}', '{2}') }}}}".format(plan, country_code, lang), {"request": req})
+ return render(f"{{{{ vpn_monthly_price('{plan}', '{country_code}', '{lang}') }}}}", {"request": req})
def test_vpn_monthly_price_usd(self):
"""Should return expected markup"""
diff --git a/bedrock/products/tests/test_views.py b/bedrock/products/tests/test_views.py
index f1ca36d55b6..08eee946c4d 100644
--- a/bedrock/products/tests/test_views.py
+++ b/bedrock/products/tests/test_views.py
@@ -3,14 +3,13 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import json
+from unittest.mock import Mock, patch
from django.http import HttpResponse
from django.test import override_settings
from django.test.client import RequestFactory
from django.urls import reverse
-from mock import Mock, patch
-
from bedrock.contentful.constants import (
CONTENT_CLASSIFICATION_VPN,
CONTENT_TYPE_PAGE_RESOURCE_CENTER,
diff --git a/bedrock/redirects/tests/test_util.py b/bedrock/redirects/tests/test_util.py
index 51536ffd72f..f2f96c55ffc 100644
--- a/bedrock/redirects/tests/test_util.py
+++ b/bedrock/redirects/tests/test_util.py
@@ -1,14 +1,13 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+from unittest.mock import patch
from urllib.parse import parse_qs, urlparse
from django.test import TestCase
from django.test.client import RequestFactory
from django.urls import URLPattern
-from mock import patch
-
from bedrock.redirects.middleware import RedirectsMiddleware
from bedrock.redirects.util import (
get_resolver,
diff --git a/bedrock/redirects/util.py b/bedrock/redirects/util.py
index 41d45f6e093..3846e5dfe32 100644
--- a/bedrock/redirects/util.py
+++ b/bedrock/redirects/util.py
@@ -102,7 +102,7 @@ def no_redirect(pattern, locale_prefix=True, re_flags=None):
pattern = LOCALE_RE + pattern
if re_flags:
- pattern = "(?{})".format(re_flags) + pattern
+ pattern = f"(?{re_flags})" + pattern
def _view(request, *args, **kwargs):
return None
@@ -175,7 +175,7 @@ def redirect(
pattern = LOCALE_RE + pattern
if re_flags:
- pattern = "(?{})".format(re_flags) + pattern
+ pattern = f"(?{re_flags})" + pattern
view_decorators = []
if cache_timeout is not None:
diff --git a/bedrock/releasenotes/management/commands/update_release_notes.py b/bedrock/releasenotes/management/commands/update_release_notes.py
index 642c668a2c2..864719fc8f5 100644
--- a/bedrock/releasenotes/management/commands/update_release_notes.py
+++ b/bedrock/releasenotes/management/commands/update_release_notes.py
@@ -32,7 +32,7 @@ def handle(self, *args, **options):
self.output("Loading releases into database")
count = ProductRelease.objects.refresh()
- self.output("%s release notes successfully loaded" % count)
+ self.output(f"{count} release notes successfully loaded")
repo.set_db_latest()
diff --git a/bedrock/releasenotes/migrations/0001_initial.py b/bedrock/releasenotes/migrations/0001_initial.py
index be9e3956280..4d5110a5f74 100644
--- a/bedrock/releasenotes/migrations/0001_initial.py
+++ b/bedrock/releasenotes/migrations/0001_initial.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
diff --git a/bedrock/releasenotes/models.py b/bedrock/releasenotes/models.py
index 52b151a7631..4c17613d3d8 100644
--- a/bedrock/releasenotes/models.py
+++ b/bedrock/releasenotes/models.py
@@ -123,7 +123,7 @@ class MarkdownField(models.TextField):
"""Field that takes Markdown text as input and saves HTML to the database"""
def pre_save(self, model_instance, add):
- value = super(MarkdownField, self).pre_save(model_instance, add)
+ value = super().pre_save(model_instance, add)
value = process_markdown(value)
setattr(model_instance, self.attname, value)
return value
@@ -271,7 +271,7 @@ def equivalent_release_for_product(self, product):
channel and major version with the highest minor version,
or None if no such releases exist
"""
- releases = ProductRelease.objects.product(product, self.channel).filter(version__startswith="%s." % self.major_version)
+ releases = ProductRelease.objects.product(product, self.channel).filter(version__startswith=f"{self.major_version}.")
if releases:
return sorted(releases, reverse=True, key=attrgetter("version_obj"))[0]
diff --git a/bedrock/releasenotes/tests/test__utils.py b/bedrock/releasenotes/tests/test__utils.py
index ab6618f07f3..239e0a686de 100644
--- a/bedrock/releasenotes/tests/test__utils.py
+++ b/bedrock/releasenotes/tests/test__utils.py
@@ -3,11 +3,10 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import time
+from unittest.mock import Mock, patch
from django.core.cache import caches
-from mock import Mock, patch
-
from bedrock.mozorg.tests import TestCase
from bedrock.releasenotes import utils
diff --git a/bedrock/releasenotes/tests/test_base.py b/bedrock/releasenotes/tests/test_base.py
index e88dd29bae1..03d304854b8 100644
--- a/bedrock/releasenotes/tests/test_base.py
+++ b/bedrock/releasenotes/tests/test_base.py
@@ -3,14 +3,13 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from pathlib import Path
+from unittest.mock import Mock, patch
from django.core.cache import caches
from django.http import Http404, HttpResponse
from django.test.client import RequestFactory
from django.test.utils import override_settings
-from mock import Mock, patch
-
from bedrock.base.urlresolvers import reverse
from bedrock.firefox.firefox_details import FirefoxDesktop
from bedrock.mozorg.tests import TestCase
diff --git a/bedrock/releasenotes/tests/test_models.py b/bedrock/releasenotes/tests/test_models.py
index 51598abd1df..5a9dc8e3b69 100644
--- a/bedrock/releasenotes/tests/test_models.py
+++ b/bedrock/releasenotes/tests/test_models.py
@@ -4,12 +4,11 @@
from itertools import chain
from pathlib import Path
+from unittest.mock import call, patch
from django.core.cache import caches
from django.test.utils import override_settings
-from mock import call, patch
-
from bedrock.mozorg.tests import TestCase
from bedrock.releasenotes import models
diff --git a/bedrock/releasenotes/utils.py b/bedrock/releasenotes/utils.py
index efa0308b430..f8fbacd77cb 100644
--- a/bedrock/releasenotes/utils.py
+++ b/bedrock/releasenotes/utils.py
@@ -28,14 +28,14 @@ class ReleaseMemoizer(Memoizer):
def __init__(self, version_timeout=300):
self.version_timeout = version_timeout
- return super(ReleaseMemoizer, self).__init__(cache=caches["release-notes"])
+ return super().__init__(cache=caches["release-notes"])
def _memoize_make_version_hash(self):
return get_data_version()
def _memoize_version(self, f, args=None, reset=False, delete=False, timeout=None):
"""Use a shorter timeout for the version so that we can refresh based on git hash"""
- return super(ReleaseMemoizer, self)._memoize_version(f, args, reset, delete, self.version_timeout)
+ return super()._memoize_version(f, args, reset, delete, self.version_timeout)
memoizer = ReleaseMemoizer()
diff --git a/bedrock/releasenotes/views.py b/bedrock/releasenotes/views.py
index c1536e9773d..afdb7565e82 100644
--- a/bedrock/releasenotes/views.py
+++ b/bedrock/releasenotes/views.py
@@ -35,7 +35,7 @@ def release_notes_template(channel, product, version=None):
dir = "firefox"
- return "{dir}/releases/{channel}-notes.html".format(dir=dir, channel=channel.lower())
+ return f"{dir}/releases/{channel.lower()}-notes.html"
def equivalent_release_url(release):
@@ -130,7 +130,7 @@ def release_notes(request, version, product="Firefox"):
def system_requirements(request, version, product="Firefox"):
release = get_release_or_404(version, product)
dir = "firefox"
- return l10n_utils.render(request, "{dir}/releases/system_requirements.html".format(dir=dir), {"release": release, "version": version})
+ return l10n_utils.render(request, f"{dir}/releases/system_requirements.html", {"release": release, "version": version})
def latest_release(product="firefox", platform=None, channel=None):
@@ -184,9 +184,7 @@ def releases_index(request, product):
),
}
- return l10n_utils.render(
- request, "{product}/releases/index.html".format(product=product.lower()), {"releases": sorted(releases.items(), reverse=True)}
- )
+ return l10n_utils.render(request, f"{product.lower()}/releases/index.html", {"releases": sorted(releases.items(), reverse=True)})
def nightly_feed(request):
@@ -205,7 +203,7 @@ def nightly_feed(request):
continue
if note.is_public and note.tag:
- note.link = "%s#note-%s" % (link, note.id)
+ note.link = f"{link}#note-{note.id}"
note.version = release.version
notes[note.id] = note
diff --git a/bedrock/security/management/commands/update_security_advisories.py b/bedrock/security/management/commands/update_security_advisories.py
index 94b0f7cb810..e6cfce65361 100644
--- a/bedrock/security/management/commands/update_security_advisories.py
+++ b/bedrock/security/management/commands/update_security_advisories.py
@@ -175,7 +175,7 @@ def update_db_from_file(filename):
elif filename.endswith(".yml"):
parser = parse_yml_file
else:
- raise RuntimeError("Unknown file type %s" % filename)
+ raise RuntimeError(f"Unknown file type {filename}")
data, html = parser(filename)
if "advisories" in data:
@@ -207,7 +207,7 @@ def get_files_to_delete_from_db(filenames):
file_ids = set(get_ids_from_files(filenames))
db_ids = set(SecurityAdvisory.objects.values_list("id", flat=True))
to_delete = db_ids - file_ids
- return ["mfsa{0}.md".format(fid) for fid in to_delete]
+ return [f"mfsa{fid}.md" for fid in to_delete]
def delete_orphaned_products():
@@ -280,7 +280,7 @@ def printout(msg, ending=None):
try:
update_db_from_file(mf)
except Exception as e:
- errors.append("ERROR parsing %s: %s" % (mf, e))
+ errors.append(f"ERROR parsing {mf}: {e}")
if not quiet:
sys.stdout.write("E")
sys.stdout.flush()
@@ -289,17 +289,17 @@ def printout(msg, ending=None):
sys.stdout.write(".")
sys.stdout.flush()
updates += 1
- printout("\nUpdated {0} files.".format(updates))
+ printout(f"\nUpdated {updates} files.")
if not clear_db:
deleted_files = get_files_to_delete_from_db(all_files)
delete_files(deleted_files)
- printout("Deleted {0} files.".format(len(deleted_files)))
+ printout(f"Deleted {len(deleted_files)} files.")
num_products = delete_orphaned_products()
if num_products:
- printout("Deleted {0} orphaned products.".format(num_products))
+ printout(f"Deleted {num_products} orphaned products.")
if errors:
- raise CommandError("Encountered {0} errors:\n\n".format(len(errors)) + "\n==========\n".join(errors))
+ raise CommandError(f"Encountered {len(errors)} errors:\n\n" + "\n==========\n".join(errors))
repo.set_db_latest()
diff --git a/bedrock/security/migrations/0001_initial.py b/bedrock/security/migrations/0001_initial.py
index 91877af6dab..b094c5f37ec 100644
--- a/bedrock/security/migrations/0001_initial.py
+++ b/bedrock/security/migrations/0001_initial.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
diff --git a/bedrock/security/migrations/0002_auto_20161013_0642.py b/bedrock/security/migrations/0002_auto_20161013_0642.py
index 91d870c1870..b2007f49c08 100644
--- a/bedrock/security/migrations/0002_auto_20161013_0642.py
+++ b/bedrock/security/migrations/0002_auto_20161013_0642.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
diff --git a/bedrock/security/migrations/0003_halloffamer.py b/bedrock/security/migrations/0003_halloffamer.py
index 860fcc2c162..e288e83f903 100644
--- a/bedrock/security/migrations/0003_halloffamer.py
+++ b/bedrock/security/migrations/0003_halloffamer.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
diff --git a/bedrock/security/migrations/0004_mitrecve.py b/bedrock/security/migrations/0004_mitrecve.py
index e0abe3a2162..88d6a305445 100644
--- a/bedrock/security/migrations/0004_mitrecve.py
+++ b/bedrock/security/migrations/0004_mitrecve.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
diff --git a/bedrock/security/migrations/0005_mitrecve_mfsa_ids.py b/bedrock/security/migrations/0005_mitrecve_mfsa_ids.py
index bede135af24..10ebb77a3da 100644
--- a/bedrock/security/migrations/0005_mitrecve_mfsa_ids.py
+++ b/bedrock/security/migrations/0005_mitrecve_mfsa_ids.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
diff --git a/bedrock/security/models.py b/bedrock/security/models.py
index f2cb859f133..6b653344ee3 100644
--- a/bedrock/security/models.py
+++ b/bedrock/security/models.py
@@ -58,8 +58,8 @@ def save(self, force_insert=False, force_update=False, using=None, update_fields
product, vers = self.name_and_version
self.product = product
self.product_slug = slugify(product)
- self.slug = "{0}-{1}".format(self.product_slug, vers)
- super(Product, self).save(force_insert, force_update, using, update_fields)
+ self.slug = f"{self.product_slug}-{vers}"
+ super().save(force_insert, force_update, using, update_fields)
class SecurityAdvisory(models.Model):
@@ -80,7 +80,7 @@ class Meta:
get_latest_by = "last_modified"
def __str__(self):
- return "MFSA {0}".format(self.id)
+ return f"MFSA {self.id}"
def get_absolute_url(self):
return reverse("security.advisory", kwargs={"pk": self.id})
@@ -94,7 +94,7 @@ def impact_class(self):
@property
def products(self):
- prods_set = set(v.product for v in self.fixed_in.all())
+ prods_set = {v.product for v in self.fixed_in.all()}
return sorted(prods_set)
@@ -129,7 +129,7 @@ def year_quarter(self):
@property
def quarter_string(self):
year, quarter = self.year_quarter
- return "%s Quarter %s" % (self.ORDINALS[quarter], year)
+ return f"{self.ORDINALS[quarter]} Quarter {year}"
class MitreCVE(models.Model):
@@ -165,7 +165,7 @@ def product_versions(self):
def get_description(self):
versions = []
for prod_name, prod_versions in self.product_versions().items():
- versions.extend("%s < %s" % (prod_name, v) for v in prod_versions)
+ versions.extend(f"{prod_name} < {v}" for v in prod_versions)
description = self.description.strip()
if versions:
@@ -182,7 +182,7 @@ def get_description(self):
else:
description += ". "
- description += "This vulnerability affects %s." % vers_str
+ description += f"This vulnerability affects {vers_str}."
return description
@@ -201,7 +201,7 @@ def get_product_data(self):
return product_data
def get_reference_data(self):
- reference_data = [{"url": "https://www.mozilla.org/security/advisories/mfsa{}/".format(mfsa_id)} for mfsa_id in set(self.mfsa_ids)]
+ reference_data = [{"url": f"https://www.mozilla.org/security/advisories/mfsa{mfsa_id}/"} for mfsa_id in set(self.mfsa_ids)]
reference_data.extend([{"url": bug["url"]} for bug in self.bugs])
return reference_data
diff --git a/bedrock/security/tests/test_commands.py b/bedrock/security/tests/test_commands.py
index ca2d437aac8..0744321dc8e 100644
--- a/bedrock/security/tests/test_commands.py
+++ b/bedrock/security/tests/test_commands.py
@@ -3,11 +3,10 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import os.path
+from unittest.mock import patch
from django.conf import settings
-from mock import patch
-
from bedrock.mozorg.tests import TestCase
from bedrock.security.management.commands import update_security_advisories
from bedrock.security.models import Product
@@ -72,7 +71,7 @@ def test_get_files_to_delete_from_db(self):
make_mfsa("2015-102")
make_mfsa("2015-103")
all_files = ["mfsa2015-100.md", "mfsa2015-101.md"]
- assert set(update_security_advisories.get_files_to_delete_from_db(all_files)) == set(["mfsa2015-102.md", "mfsa2015-103.md"])
+ assert set(update_security_advisories.get_files_to_delete_from_db(all_files)) == {"mfsa2015-102.md", "mfsa2015-103.md"}
def test_delete_orphaned_products(self):
make_mfsa("2015-100")
diff --git a/bedrock/security/tests/test_models.py b/bedrock/security/tests/test_models.py
index 6331df24252..49f30f5fb6e 100644
--- a/bedrock/security/tests/test_models.py
+++ b/bedrock/security/tests/test_models.py
@@ -50,7 +50,7 @@ def _create_cve(self, products=None):
self.cve_id_order += 1
products = products or ["Firefox 60", "Firefox 60.0.1"]
return MitreCVE.objects.create(
- id="CVE-2018-%s" % self.cve_id_order,
+ id=f"CVE-2018-{self.cve_id_order}",
year=2018,
order=self.cve_id_order,
title="A Testing Problem",
diff --git a/bedrock/security/tests/test_utils.py b/bedrock/security/tests/test_utils.py
index 1b3cce49bac..32a5583a43f 100644
--- a/bedrock/security/tests/test_utils.py
+++ b/bedrock/security/tests/test_utils.py
@@ -4,9 +4,9 @@
from datetime import date
from io import StringIO
from textwrap import dedent
+from unittest.mock import call, patch
import pytest
-from mock import call, patch
from bedrock.security.utils import (
check_hof_data,
diff --git a/bedrock/security/tests/test_views.py b/bedrock/security/tests/test_views.py
index 0fcb9cd304a..167fb994b34 100644
--- a/bedrock/security/tests/test_views.py
+++ b/bedrock/security/tests/test_views.py
@@ -2,7 +2,8 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
-from mock import patch
+from unittest.mock import patch
+
from product_details.version_compare import Version
from bedrock.mozorg.tests import TestCase
@@ -68,7 +69,7 @@ def test_product_version_view_filter_minor(self):
class TestKVRedirects(TestCase):
def _test_names(self, url_component, expected):
# old urls lack '/en-US' prefix, but that will be the first redirect.
- path = "/en-US/security/known-vulnerabilities/{0}.html".format(url_component)
+ path = f"/en-US/security/known-vulnerabilities/{url_component}.html"
resp = self.client.get(path)
assert resp.status_code == 301
assert expected == resp["Location"].split("/")[-2]
diff --git a/bedrock/security/utils.py b/bedrock/security/utils.py
index e947139d514..dc4791e7597 100644
--- a/bedrock/security/utils.py
+++ b/bedrock/security/utils.py
@@ -83,7 +83,7 @@ def update_advisory_bugs(advisory):
if advisory.get("bugs", None):
for bug in advisory["bugs"]:
if not bug.get("desc", None):
- bug["desc"] = "Bug %s" % bug["url"]
+ bug["desc"] = f"Bug {bug['url']}"
bug["url"] = parse_bug_url(bug["url"])
@@ -110,10 +110,10 @@ def parse_bug_url(url):
# could be an int
url = str(url).strip()
if re.match(r"^\d+$", url):
- url = "https://bugzilla.mozilla.org/show_bug.cgi?id=%s" % url
+ url = f"https://bugzilla.mozilla.org/show_bug.cgi?id={url}"
elif re.match(r"^[\d\s,]+$", url):
url = re.sub(r"\s", "", url).replace(",", "%2C")
- url = "https://bugzilla.mozilla.org/buglist.cgi?bug_id=%s" % url
+ url = f"https://bugzilla.mozilla.org/buglist.cgi?bug_id={url}"
return url
@@ -153,6 +153,6 @@ def check_hof_data(data):
if "date" not in name:
raise ValueError('Key "date" required for every entry in "names"')
if not isinstance(name["date"], date):
- raise ValueError('Key "date" should be formatted as a date (YYYY-MM-DD): %s' % name["date"])
+ raise ValueError(f'Key "date" should be formatted as a date (YYYY-MM-DD): {name["date"]}')
if name["date"] < date(2004, 11, 9):
raise ValueError("A date can't be set before the launch date of Firefox")
diff --git a/bedrock/security/views.py b/bedrock/security/views.py
index 87bc6f74eb8..168106037df 100644
--- a/bedrock/security/views.py
+++ b/bedrock/security/views.py
@@ -108,7 +108,7 @@ def get_queryset(self):
return sorted(versions, reverse=True)
def get_context_data(self, **kwargs):
- cxt = super(ProductView, self).get_context_data(**kwargs)
+ cxt = super().get_context_data(**kwargs)
cxt["product_name"] = cxt["product_versions"][0].product
return cxt
@@ -132,10 +132,10 @@ def get_queryset(self):
return sorted(versions, reverse=True)
def get_context_data(self, **kwargs):
- cxt = super(ProductVersionView, self).get_context_data(**kwargs)
+ cxt = super().get_context_data(**kwargs)
prod_name, version = self.kwargs["product"], self.kwargs["version"]
cxt["is_obsolete"] = product_is_obsolete(prod_name, version)
- cxt["product_name"] = "{0} {1}".format(cxt["product_versions"][0].product, version)
+ cxt["product_name"] = f"{cxt['product_versions'][0].product} {version}"
cxt["product_slug"] = prod_name
return cxt
@@ -145,7 +145,7 @@ class CachedRedirectView(RedirectView):
@method_decorator(cache_control_expires(24 * 30)) # 30 days
def dispatch(self, request, *args, **kwargs):
- return super(CachedRedirectView, self).dispatch(request, *args, **kwargs)
+ return super().dispatch(request, *args, **kwargs)
class OldAdvisoriesView(CachedRedirectView):
@@ -175,8 +175,7 @@ def get_redirect_args(self, url_component):
match = self.prod_ver_re.match(url_component)
if match:
product, version = match.groups()
- version = "{0}.{1}".format(*version)
- return dict(viewname="security.product-version-advisories", kwargs={"product": product, "version": version})
+ return dict(viewname="security.product-version-advisories", kwargs={"product": product, "version": f"{version[0]}.{version[1]}"})
if url_component.endswith("ESR"):
return dict(viewname="security.product-advisories", kwargs={"slug": url_component[:-3] + "-esr"})
diff --git a/bedrock/settings/base.py b/bedrock/settings/base.py
index 0444f60e78e..62d858ad03f 100644
--- a/bedrock/settings/base.py
+++ b/bedrock/settings/base.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
@@ -488,7 +487,7 @@ def lazy_langs():
def set_whitenoise_headers(headers, path, url):
if "/fonts/" in url or "/caldata/" in url:
- cache_control = "public, max-age={}".format(604800) # one week
+ cache_control = "public, max-age=604800" # one week
headers["Cache-Control"] = cache_control
if url.startswith("/.well-known/matrix/"):
@@ -1127,7 +1126,7 @@ def get_default_gateway_linux():
return socket.inet_ntoa(struct.pack("