Skip to content

Commit

Permalink
Import config waffles to django waffles 🧇
Browse files Browse the repository at this point in the history
  • Loading branch information
robhudson committed Sep 20, 2024
1 parent bc4773b commit db68aa9
Show file tree
Hide file tree
Showing 13 changed files with 51 additions and 325 deletions.
29 changes: 29 additions & 0 deletions bedrock/base/management/commands/import_waffle_switches.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# 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 django.core.management.base import BaseCommand

from waffle.models import Switch

from bedrock.base.models import ConfigValue
from bedrock.utils.management.decorators import alert_sentry_on_exception


@alert_sentry_on_exception
class Command(BaseCommand):
def handle(self, *args, **options):
prefix = "SWITCH_"

for config in ConfigValue.objects.all():
# Ignore funnelcakes and other yummy things.
if not config.name.startswith(prefix):
continue

# Remove prefix.
name = config.name[len(prefix) :]
# Set active to boolean.
active = config.value == "on"

switch, created = Switch.objects.update_or_create(name=name, defaults={"active": active})
print(f"{'Created new' if created else 'Updated'} switch: {name} = {'on' if active else 'off'}")
27 changes: 1 addition & 26 deletions bedrock/firefox/firefox_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,15 @@
# 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/.

# coding=utf-8

import re
from collections import OrderedDict
from operator import itemgetter
from urllib.parse import urlencode

from django.conf import settings

from everett.manager import ListOf
from product_details import ProductDetails

from bedrock.base.waffle import config


# TODO: port this to django-mozilla-product-details
class _ProductDetails(ProductDetails):
Expand Down Expand Up @@ -225,8 +220,6 @@ def get_download_url(
locale,
force_direct=False,
force_full_installer=False,
force_funnelcake=False,
funnelcake_id=None,
locale_in_transition=False,
):
"""
Expand All @@ -239,9 +232,6 @@ def get_download_url(
always True for non-release URLs.
:param force_full_installer: Force the installer download to not be
the stub installer (for aurora).
:param force_funnelcake: Force the download version for en-US Windows to be
'latest', which bouncer will translate to the funnelcake build.
:param funnelcake_id: ID for the the funnelcake build.
:param locale_in_transition: Include the locale in the transition URL
:return: string url
"""
Expand All @@ -253,29 +243,18 @@ def get_download_url(
force_direct = True if channel != "release" else force_direct
stub_platforms = ["win", "win64"]
esr_channels = ["esr", "esr_next"]
include_funnelcake_param = False

# support optional MSI installer downloads
# bug 1493205
is_msi = platform.endswith("-msi")
if is_msi:
platform = platform[:-4]

# Bug 1345467 - Only allow specifically configured funnelcake builds
if funnelcake_id:
fc_platforms = config(f"FUNNELCAKE_{funnelcake_id}_PLATFORMS", default="", parser=ListOf(str))
fc_locales = config(f"FUNNELCAKE_{funnelcake_id}_LOCALES", default="", parser=ListOf(str))
include_funnelcake_param = platform in fc_platforms and _locale in fc_locales

# Check if direct download link has been requested
# if not just use transition URL
if not force_direct:
# build a link to the transition page
transition_url = self.download_base_url_transition
if funnelcake_id:
# include funnelcake in scene 2 URL
transition_url += f"?f={funnelcake_id}"

if locale_in_transition:
transition_url = f"/{locale}{transition_url}"

Expand All @@ -294,11 +273,7 @@ def get_download_url(
prod_name = "firefox-esr-next"
elif platform in stub_platforms and not is_msi and not force_full_installer:
# Use the stub installer for approved platforms
# append funnelcake id to version if we have one
if include_funnelcake_param:
suffix = f"stub-f{funnelcake_id}"
else:
suffix = "stub"
suffix = "stub"
elif channel == "nightly" and locale != "en-US":
# Nightly uses a different product name for localized builds,
# and is the only one ಠ_ಠ
Expand Down
25 changes: 4 additions & 21 deletions bedrock/firefox/templatetags/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ def desktop_builds(
locale=None,
force_direct=False,
force_full_installer=False,
force_funnelcake=False,
funnelcake_id=False,
locale_in_transition=False,
classified=False,
):
Expand Down Expand Up @@ -65,8 +63,6 @@ def desktop_builds(
locale,
force_direct=force_direct,
force_full_installer=force_full_installer,
force_funnelcake=force_funnelcake,
funnelcake_id=funnelcake_id,
locale_in_transition=locale_in_transition,
)

Expand All @@ -83,8 +79,6 @@ def desktop_builds(
locale,
force_direct=True,
force_full_installer=force_full_installer,
force_funnelcake=force_funnelcake,
funnelcake_id=funnelcake_id,
)
if download_link_direct == download_link:
download_link_direct = False
Expand Down Expand Up @@ -120,7 +114,6 @@ def download_firefox(
locale=None,
force_direct=False,
force_full_installer=False,
force_funnelcake=False,
alt_copy=None,
button_class="mzp-t-xl",
locale_in_transition=False,
Expand All @@ -136,8 +129,6 @@ def download_firefox(
:param force_direct: Force the download URL to be direct.
:param force_full_installer: Force the installer download to not be
the stub installer (for aurora).
:param force_funnelcake: Force the download version for en-US Windows to be
'latest', which bouncer will translate to the funnelcake build.
:param alt_copy: Specifies alternate copy to use for download buttons.
:param button_class: Classes to add to the download button, contains size mzp-t-xl by default
:param locale_in_transition: Include the page locale in transitional download link.
Expand All @@ -149,15 +140,14 @@ def download_firefox(
show_ios = platform in ["all", "ios"]
alt_channel = "" if channel == "release" else channel
locale = locale or get_locale(ctx["request"])
funnelcake_id = ctx.get("funnelcake_id", False)
dom_id = dom_id or f"download-button-{'desktop' if platform == 'all' else platform}-{channel}"

# Gather data about the build for each platform
builds = []

if show_desktop:
version = firefox_desktop.latest_version(channel)
builds = desktop_builds(channel, builds, locale, force_direct, force_full_installer, force_funnelcake, funnelcake_id, locale_in_transition)
builds = desktop_builds(channel, builds, locale, force_direct, force_full_installer, locale_in_transition)

if show_android:
version = firefox_android.latest_version(channel)
Expand Down Expand Up @@ -208,16 +198,10 @@ def download_firefox_thanks(ctx, dom_id=None, locale=None, alt_copy=None, button

channel = "release"
locale = locale or get_locale(ctx["request"])
funnelcake_id = ctx.get("funnelcake_id", False)
dom_id = dom_id or "download-button-thanks"
transition_url = "/firefox/download/thanks/"
version = firefox_desktop.latest_version(channel)

# if there's a funnelcake param in the page URL e.g. ?f=123
if funnelcake_id:
# include param in transitional URL e.g. /firefox/download/thanks/?f=123
transition_url += f"?f={funnelcake_id}"

if locale_in_transition:
transition_url = f"/{locale}{transition_url}"

Expand All @@ -228,8 +212,6 @@ def download_firefox_thanks(ctx, dom_id=None, locale=None, alt_copy=None, button
locale,
force_direct=True,
force_full_installer=False,
force_funnelcake=False,
funnelcake_id=funnelcake_id,
)

data = {
Expand Down Expand Up @@ -262,8 +244,9 @@ def download_firefox_desktop_list(ctx, channel="release", dom_id=None, locale=No
dom_id = dom_id or f"download-platform-list-{channel}"
locale = locale or get_locale(ctx["request"])

# Make sure funnelcake_id is not passed as builds are often Windows only.
builds = desktop_builds(channel, None, locale, True, force_full_installer, False, False, False, True)
builds = desktop_builds(
channel, builds=None, locale=locale, force_direct=True, force_full_installer=force_full_installer, locale_in_transition=False, classified=True
)

recommended_builds = []
traditional_builds = []
Expand Down
86 changes: 0 additions & 86 deletions bedrock/firefox/tests/test_firefox_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -655,28 +655,6 @@ def test_get_download_url_nightly_l10n(self):
],
)

def test_get_download_url_scene2_funnelcake(self):
scene2 = self.firefox_desktop.download_base_url_transition
url = self.firefox_desktop.get_download_url("release", "45.0", "win", "en-US")
self.assertEqual(url, scene2)
url = self.firefox_desktop.get_download_url("release", "45.0", "win", "en-US", funnelcake_id="64")
self.assertEqual(url, scene2 + "?f=64")

def test_get_download_url_scene2_with_locale(self):
scene2 = self.firefox_desktop.download_base_url_transition
url = self.firefox_desktop.get_download_url("release", "45.0", "win", "de", locale_in_transition=True)
self.assertEqual(url, "/de" + scene2)

url = self.firefox_desktop.get_download_url(
"release",
"45.0",
"win",
"fr",
locale_in_transition=True,
funnelcake_id="64",
)
self.assertEqual(url, "/fr" + scene2 + "?f=64")

def get_download_url_ssl(self):
"""
SSL-enabled links should always be used except Windows stub installers.
Expand Down Expand Up @@ -810,70 +788,6 @@ def test_latest_major_version_no_int(self):
):
assert self.firefox_desktop.latest_major_version("release") == 0

@patch.dict(os.environ, FUNNELCAKE_64_LOCALES="en-US", FUNNELCAKE_64_PLATFORMS="win")
def test_funnelcake_direct_links_en_us_win_only(self):
"""
Ensure funnelcake params are included for Windows en-US builds only.
"""
url = self.firefox_desktop.get_download_url("release", "45.0", "win", "en-US", force_direct=True, funnelcake_id="64")
assert "product=firefox-stub-f64" in url

url = self.firefox_desktop.get_download_url("release", "45.0", "win64", "en-US", force_direct=True, funnelcake_id="64")
assert "product=firefox-stub-f64" not in url

url = self.firefox_desktop.get_download_url("release", "45.0", "win", "de", force_direct=True, funnelcake_id="64")
assert "product=firefox-stub-f64" not in url

url = self.firefox_desktop.get_download_url("release", "45.0", "osx", "en-US", force_direct=True, funnelcake_id="64")
assert "product=firefox-stub-f64" not in url

def test_no_funnelcake_direct_links_if_not_configured(self):
"""
Ensure funnelcake params are included for Linux and OSX en-US builds only.
"""
url = self.firefox_desktop.get_download_url("release", "45.0", "win", "en-US", force_direct=True, funnelcake_id="64")
assert "-f64" not in url

url = self.firefox_desktop.get_download_url(
"release",
"45.0",
"win",
"en-US",
force_direct=True,
force_full_installer=True,
funnelcake_id="64",
)
assert "-f64" not in url

url = self.firefox_desktop.get_download_url(
"release",
"45.0",
"win",
"en-US",
force_direct=True,
force_funnelcake=True,
funnelcake_id="64",
)
assert "-f64" not in url

url = self.firefox_desktop.get_download_url("release", "45.0", "osx", "de", force_direct=True, funnelcake_id="64")
assert "-f64" not in url

url = self.firefox_desktop.get_download_url("release", "45.0", "osx", "en-US", force_direct=True, funnelcake_id="64")
assert "-f64" not in url

url = self.firefox_desktop.get_download_url("release", "45.0", "osx", "fr", force_direct=True, funnelcake_id="64")
assert "-f64" not in url

url = self.firefox_desktop.get_download_url("release", "45.0", "linux", "de", force_direct=True, funnelcake_id="64")
assert "-f64" not in url

url = self.firefox_desktop.get_download_url("release", "45.0", "linux", "en-US", force_direct=True, funnelcake_id="64")
assert "-f64" not in url

url = self.firefox_desktop.get_download_url("release", "45.0", "linux", "fr", force_direct=True, funnelcake_id="64")
assert "-f64" not in url

def test_stub_installer_win_only(self):
"""
Ensure that builds not in the setting don't get stub.
Expand Down
17 changes: 0 additions & 17 deletions bedrock/mozorg/context_processors.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
from datetime import datetime

from django.conf import settings
from django.urls import reverse

# match 1 - 4 digits only
FC_RE = re.compile(r"^\d{1,4}$")
Expand All @@ -26,21 +25,5 @@ def current_year(request):
return {"current_year": datetime.today().year}


def funnelcake_param(request):
"""If a query param for a funnelcake is sent, add it to the context."""
fc_id = request.GET.get("f", None)
context = {}

if fc_id and FC_RE.match(fc_id):
# special case for installer-help page
# bug 933852
installer_help_url = reverse("firefox.installer-help")
if installer_help_url in request.path_info:
fc_id = str(int(fc_id) + 1)
context["funnelcake_id"] = fc_id

return context


def contrib_numbers(request):
return settings.CONTRIBUTE_NUMBERS
43 changes: 0 additions & 43 deletions bedrock/mozorg/tests/test_context_processors.py

This file was deleted.

Loading

0 comments on commit db68aa9

Please sign in to comment.