Skip to content

Commit

Permalink
Remove FF_TOU (#1962)
Browse files Browse the repository at this point in the history
* Remove FF_TOU

* remove the flags

---------

Co-authored-by: Andrew <[email protected]>
  • Loading branch information
jzbahrai and andrewleith authored Oct 3, 2024
1 parent dd44169 commit 56654dd
Show file tree
Hide file tree
Showing 9 changed files with 76 additions and 96 deletions.
64 changes: 40 additions & 24 deletions app/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ class Config(object):
ALLOW_DEBUG_ROUTE = env.bool("ALLOW_DEBUG_ROUTE", False)

# List of allowed service IDs that are allowed to send HTML through their templates.
ALLOW_HTML_SERVICE_IDS: List[str] = [id.strip() for id in os.getenv("ALLOW_HTML_SERVICE_IDS", "").split(",")]
ALLOW_HTML_SERVICE_IDS: List[str] = [
id.strip() for id in os.getenv("ALLOW_HTML_SERVICE_IDS", "").split(",")]
ADMIN_BASE_URL = (
"https://" + os.environ.get("HEROKU_APP_NAME", "") + ".herokuapp.com"
if os.environ.get("HEROKU_APP_NAME", "") != ""
Expand All @@ -47,12 +48,15 @@ class Config(object):
BULK_SEND_AWS_BUCKET = os.getenv("BULK_SEND_AWS_BUCKET")

CHECK_PROXY_HEADER = False
CONTACT_EMAIL = os.environ.get("CONTACT_EMAIL", "[email protected]")
CRM_GITHUB_PERSONAL_ACCESS_TOKEN = os.getenv("CRM_GITHUB_PERSONAL_ACCESS_TOKEN")
CONTACT_EMAIL = os.environ.get(
"CONTACT_EMAIL", "[email protected]")
CRM_GITHUB_PERSONAL_ACCESS_TOKEN = os.getenv(
"CRM_GITHUB_PERSONAL_ACCESS_TOKEN")
CRM_ORG_LIST_URL = os.getenv("CRM_ORG_LIST_URL")
CSV_MAX_ROWS = env.int("CSV_MAX_ROWS", 50_000)
CSV_MAX_ROWS_BULK_SEND = env.int("CSV_MAX_ROWS_BULK_SEND", 100_000)
CSV_UPLOAD_BUCKET_NAME = os.getenv("CSV_UPLOAD_BUCKET_NAME", "notification-alpha-canada-ca-csv-upload")
CSV_UPLOAD_BUCKET_NAME = os.getenv(
"CSV_UPLOAD_BUCKET_NAME", "notification-alpha-canada-ca-csv-upload")
DANGEROUS_SALT = os.environ.get("DANGEROUS_SALT")
DEBUG = False
DEBUG_KEY = os.environ.get("DEBUG_KEY", "")
Expand All @@ -67,35 +71,42 @@ class Config(object):
"other": 25_000,
}
DEFAULT_LIVE_SERVICE_LIMIT = env.int("DEFAULT_LIVE_SERVICE_LIMIT", 10_000)
DEFAULT_LIVE_SMS_DAILY_LIMIT = env.int("DEFAULT_LIVE_SMS_DAILY_LIMIT", 1000)
DEFAULT_LIVE_SMS_DAILY_LIMIT = env.int(
"DEFAULT_LIVE_SMS_DAILY_LIMIT", 1000)
DEFAULT_SERVICE_LIMIT = env.int("DEFAULT_SERVICE_LIMIT", 50)
DEFAULT_SMS_DAILY_LIMIT = env.int("DEFAULT_SMS_DAILY_LIMIT", 50)
DOCUMENTATION_DOMAIN = os.getenv("DOCUMENTATION_DOMAIN", "documentation.notification.canada.ca")
DOCUMENTATION_DOMAIN = os.getenv(
"DOCUMENTATION_DOMAIN", "documentation.notification.canada.ca")
EMAIL_2FA_EXPIRY_SECONDS = 1_800 # 30 Minutes
EMAIL_EXPIRY_SECONDS = 3600 # 1 hour

# for waffles: pull out the routes into a flat list of the form ['/home', '/accueil', '/why-gc-notify', ...]
EXTRA_ROUTES = [item for sublist in map(lambda x: x.values(), GC_ARTICLES_ROUTES.values()) for item in sublist]
EXTRA_ROUTES = [item for sublist in map(
lambda x: x.values(), GC_ARTICLES_ROUTES.values()) for item in sublist]

# FEATURE FLAGS
FF_SALESFORCE_CONTACT = env.bool("FF_SALESFORCE_CONTACT", True)
FF_TOU = env.bool("FF_TOU", False)

FREE_YEARLY_EMAIL_LIMIT = env.int("FREE_YEARLY_EMAIL_LIMIT", 10_000_000)
FREE_YEARLY_SMS_LIMIT = env.int("FREE_YEARLY_SMS_LIMIT", 25_000)
GC_ARTICLES_API = os.environ.get("GC_ARTICLES_API", "articles.alpha.canada.ca/notification-gc-notify")
GC_ARTICLES_API_AUTH_PASSWORD = os.environ.get("GC_ARTICLES_API_AUTH_PASSWORD")
GC_ARTICLES_API_AUTH_USERNAME = os.environ.get("GC_ARTICLES_API_AUTH_USERNAME")
GC_ARTICLES_API = os.environ.get(
"GC_ARTICLES_API", "articles.alpha.canada.ca/notification-gc-notify")
GC_ARTICLES_API_AUTH_PASSWORD = os.environ.get(
"GC_ARTICLES_API_AUTH_PASSWORD")
GC_ARTICLES_API_AUTH_USERNAME = os.environ.get(
"GC_ARTICLES_API_AUTH_USERNAME")
GOOGLE_ANALYTICS_ID = os.getenv("GOOGLE_ANALYTICS_ID", "UA-102484926-14")
GOOGLE_TAG_MANAGER_ID = os.getenv("GOOGLE_TAG_MANAGER_ID", "GTM-KRKRZQV")
HC_EN_SERVICE_ID = os.getenv("HC_EN_SERVICE_ID")
HC_FR_SERVICE_ID = os.getenv("HC_FR_SERVICE_ID")
HIPB_ENABLED = True
HTTP_PROTOCOL = "http"
INVITATION_EXPIRY_SECONDS = 3_600 * 24 * 2 # 2 days - also set on api
IP_GEOLOCATE_SERVICE = os.environ.get("IP_GEOLOCATE_SERVICE", "").rstrip("/")
IP_GEOLOCATE_SERVICE = os.environ.get(
"IP_GEOLOCATE_SERVICE", "").rstrip("/")
LANGUAGES = ["en", "fr"]
LOGO_UPLOAD_BUCKET_NAME = os.getenv("ASSET_UPLOAD_BUCKET_NAME", "notification-alpha-canada-ca-asset-upload")
LOGO_UPLOAD_BUCKET_NAME = os.getenv(
"ASSET_UPLOAD_BUCKET_NAME", "notification-alpha-canada-ca-asset-upload")
MAX_FAILED_LOGIN_COUNT = 10
MOU_BUCKET_NAME = os.getenv("MOU_BUCKET_NAME", "")

Expand All @@ -118,8 +129,10 @@ class Config(object):
SCANFILES_URL = os.environ.get("SCANFILES_URL", "")

SECRET_KEY = env.list("SECRET_KEY", [])
SECURITY_EMAIL = os.environ.get("SECURITY_EMAIL", "[email protected]")
SENDING_DOMAIN = os.environ.get("SENDING_DOMAIN", "notification.alpha.canada.ca")
SECURITY_EMAIL = os.environ.get(
"SECURITY_EMAIL", "[email protected]")
SENDING_DOMAIN = os.environ.get(
"SENDING_DOMAIN", "notification.alpha.canada.ca")
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_NAME = "notify_admin_session"
SESSION_COOKIE_SAMESITE = "Lax"
Expand All @@ -133,8 +146,10 @@ class Config(object):
STATSD_PORT = 8_125
STATSD_PREFIX = os.getenv("STATSD_PREFIX")

TEMPLATE_PREVIEW_API_HOST = os.environ.get("TEMPLATE_PREVIEW_API_HOST", "http://localhost:6013")
TEMPLATE_PREVIEW_API_KEY = os.environ.get("TEMPLATE_PREVIEW_API_KEY", "my-secret-key")
TEMPLATE_PREVIEW_API_HOST = os.environ.get(
"TEMPLATE_PREVIEW_API_HOST", "http://localhost:6013")
TEMPLATE_PREVIEW_API_KEY = os.environ.get(
"TEMPLATE_PREVIEW_API_KEY", "my-secret-key")
WAF_SECRET = os.environ.get("WAF_SECRET", "waf-secret")
WTF_CSRF_ENABLED = True
WTF_CSRF_TIME_LIMIT = None
Expand All @@ -145,7 +160,8 @@ class Config(object):

NOTIFY_USER_ID = "6af522d0-2915-4e52-83a3-3690455a5fe6"
NOTIFY_SERVICE_ID = "d6aa2c68-a2d9-4437-ab19-3ae8eb202553"
NO_BRANDING_ID = os.environ.get("NO_BRANDING_ID", "0af93cf1-2c49-485f-878f-f3e662e651ef")
NO_BRANDING_ID = os.environ.get(
"NO_BRANDING_ID", "0af93cf1-2c49-485f-878f-f3e662e651ef")

@classmethod
def get_sensitive_config(cls) -> list[str]:
Expand Down Expand Up @@ -173,7 +189,8 @@ def get_safe_config(cls) -> dict[str, Any]:


class Development(Config):
ADMIN_CLIENT_SECRET = os.environ.get("ADMIN_CLIENT_SECRET", "dev-notify-secret-key")
ADMIN_CLIENT_SECRET = os.environ.get(
"ADMIN_CLIENT_SECRET", "dev-notify-secret-key")
ANTIVIRUS_API_HOST = "http://localhost:6016"
ANTIVIRUS_API_KEY = "test-key"
API_HOST_NAME = os.environ.get("API_HOST_NAME", "http://localhost:6011")
Expand All @@ -190,7 +207,8 @@ class Development(Config):


class Test(Development):
ADMIN_CLIENT_SECRET = os.environ.get("ADMIN_CLIENT_SECRET", "dev-notify-secret-key")
ADMIN_CLIENT_SECRET = os.environ.get(
"ADMIN_CLIENT_SECRET", "dev-notify-secret-key")
ANTIVIRUS_API_HOST = "https://test-antivirus"
ANTIVIRUS_API_KEY = "test-antivirus-secret"
API_HOST_NAME = os.environ.get("API_HOST_NAME", "http://localhost:6011")
Expand Down Expand Up @@ -218,11 +236,11 @@ class Test(Development):
FF_BOUNCE_RATE_V15 = True
FF_BOUNCE_RATE_BACKEND = True
FF_ABTEST_SERVICE_ID = ""
FF_TOU = True


class ProductionFF(Config):
ADMIN_CLIENT_SECRET = os.environ.get("ADMIN_CLIENT_SECRET", "dev-notify-secret-key")
ADMIN_CLIENT_SECRET = os.environ.get(
"ADMIN_CLIENT_SECRET", "dev-notify-secret-key")
ANTIVIRUS_API_HOST = "https://test-antivirus"
ANTIVIRUS_API_KEY = "test-antivirus-secret"
API_HOST_NAME = os.environ.get("API_HOST_NAME", "http://localhost:6011")
Expand Down Expand Up @@ -250,7 +268,6 @@ class ProductionFF(Config):
FF_BOUNCE_RATE_V15 = True
FF_BOUNCE_RATE_BACKEND = True
FF_ABTEST_SERVICE_ID = ""
FF_TOU = False


class Production(Config):
Expand All @@ -267,7 +284,6 @@ class Staging(Production):
NOTIFY_LOG_LEVEL = "INFO"
SYSTEM_STATUS_URL = "https://status.staging.notification.cdssandbox.xyz"
NO_BRANDING_ID = "0af93cf1-2c49-485f-878f-f3e662e651ef"
FF_TOU = True


class Scratch(Production):
Expand Down
7 changes: 3 additions & 4 deletions app/main/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from itertools import chain

import pytz
from flask import current_app, request
from flask import request
from flask_babel import lazy_gettext as _l
from flask_wtf import FlaskForm as Form
from flask_wtf.file import FileAllowed
Expand Down Expand Up @@ -382,9 +382,8 @@ class RegisterUserForm(StripWhitespaceForm):
tou_agreed = HiddenField("tou_agreed", validators=[])

def validate_tou_agreed(self, field):
if current_app.config["FF_TOU"]:
if field.data is not None and field.data.strip() == "":
raise ValidationError(_l("Read and agree to continue"))
if field.data is not None and field.data.strip() == "":
raise ValidationError(_l("Read and agree to continue"))


class RegisterUserFromInviteForm(RegisterUserForm):
Expand Down
18 changes: 5 additions & 13 deletions app/templates/views/register.html
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,8 @@ <h1 class="heading-large">{{ _('Create an account') }}</h1>
{% set txt = _('Must be at least 8 characters and hard to guess') %}
{{ textbox(form.password, hint=txt, width='w-full md:w-3/4', autocomplete='new-password') }}

{% if config['FF_TOU'] %}
{{ tou_dialog_trigger(button_text=_('Read and agree to the terms of use'), is_in_error_state=(form.errors.get('tou_agreed') != None)) }}
{{ form.tou_agreed }}
{% else %}
<p>
{{ _("By creating an account, you agree to the <a href='{}'>terms of use</a>.").format(gca_url_for('terms')) }}
</p>
{% endif %}
{{ tou_dialog_trigger(button_text=_('Read and agree to the terms of use'), is_in_error_state=(form.errors.get('tou_agreed') != None)) }}
{{ form.tou_agreed }}

{{ form.auth_type }}
{% set txt = _('Continue') %}
Expand All @@ -43,8 +37,6 @@ <h1 class="heading-large">{{ _('Create an account') }}</h1>
</div>
{% endblock %}

{% if config['FF_TOU'] %}
{% block body_end %}
{{ tou_dialog() }}
{% endblock %}
{% endif %}
{% block body_end %}
{{ tou_dialog() }}
{% endblock %}
6 changes: 1 addition & 5 deletions app/tou.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from flask import current_app, request, session
from flask import request, session
from flask_login import current_user

from app.articles.routing import GC_ARTICLES_ROUTES
Expand All @@ -12,10 +12,6 @@ def show_tou_prompt():
The TOU prompt should be displayed if the user is authenticated, has not already agreed to the terms, and is not on the contact page or a GCA route.
"""

if current_app.config["FF_TOU"] is False:
return False

is_gca_route = False

for route in GC_ARTICLES_ROUTES.values():
Expand Down
10 changes: 4 additions & 6 deletions tests/app/main/test_tou.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

from app.articles.routing import GC_ARTICLES_ROUTES
from app.tou import show_tou_prompt
from tests.conftest import set_config


class TestShowTouPrompt:
Expand Down Expand Up @@ -30,8 +29,7 @@ def setUp(self, app_, api_user_active):
)
def test_show_tou_prompt(self, route, login, agree_to_terms, expected, app_):
with self.app.test_request_context(), self.app.test_client() as client:
with set_config(app_, "FF_TOU", True): # remove this line when FF is removed
if login:
client.login(self.api_user_active, agree_to_terms=agree_to_terms)
client.get(route)
assert show_tou_prompt() == expected
if login:
client.login(self.api_user_active, agree_to_terms=agree_to_terms)
client.get(route)
assert show_tou_prompt() == expected
5 changes: 2 additions & 3 deletions tests/app/main/test_validation_summary.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import pytest
from bs4 import BeautifulSoup
from flask import current_app, url_for
from flask import url_for

register_field_names = ("name", "email_address", "mobile_number", "password")

Expand Down Expand Up @@ -35,8 +35,7 @@ def test_validation_summary(
data,
expected_errors,
):
if current_app.config["FF_TOU"]:
data["tou_agreed"] = "true"
data["tou_agreed"] = "true"

response = client.post(url_for("main.register"), data=data, follow_redirects=True)
assert response.status_code == 200
Expand Down
24 changes: 7 additions & 17 deletions tests/app/main/test_validators.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from unittest.mock import Mock

import pytest
from flask import current_app
from wtforms import ValidationError

from app.main.forms import RegisterUserForm, ServiceSmsSenderForm
Expand Down Expand Up @@ -35,22 +34,13 @@ def test_valid_email_not_in_valid_domains(


def test_valid_email_in_valid_domains(client):
if current_app.config["FF_TOU"]:
form = RegisterUserForm(
name="test",
email_address="[email protected]",
mobile_number="6502532222",
password="an uncommon password",
tou_agreed="true",
)
else:
form = RegisterUserForm(
name="test",
email_address="[email protected]",
mobile_number="6502532222",
password="an uncommon password",
)

form = RegisterUserForm(
name="test",
email_address="[email protected]",
mobile_number="6502532222",
password="an uncommon password",
tou_agreed="true",
)
form.validate()
assert form.errors == {}

Expand Down
9 changes: 3 additions & 6 deletions tests/app/main/views/test_accept_invite.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import pytest
from bs4 import BeautifulSoup
from flask import current_app, url_for
from flask import url_for
from notifications_python_client.errors import HTTPError

import app
Expand Down Expand Up @@ -405,8 +405,7 @@ def test_new_user_accept_invite_completes_new_registration_redirects_to_verify(
"auth_type": "email_auth",
}

if current_app.config["FF_TOU"]:
data["tou_agreed"] = "true"
data["tou_agreed"] = "true"

expected_redirect_location = "/verify"
response = client.post(url_for("main.register_from_invite"), data=data)
Expand Down Expand Up @@ -519,9 +518,7 @@ def test_new_invited_user_verifies_and_added_to_service(
"name": "Invited User",
"auth_type": "sms_auth",
}

if current_app.config["FF_TOU"]:
data["tou_agreed"] = "true"
data["tou_agreed"] = "true"

response = client.post(url_for("main.register_from_invite"), data=data)
assert response.status_code == 302
Expand Down
Loading

0 comments on commit 56654dd

Please sign in to comment.