Skip to content

Commit 5d5f64d

Browse files
committed
Addons: allow users to show/hide notifications on latest/non-stable
We currently allow users to disable the latest and non-stable notifications with only one checkbox. This PR split this checkbox into two, so users can decide to show a notification on latest and/or on non-stable versions individually. Note this PR also changes the addons API response: `non_latest_version_warning` and `external_version_warning` are combined into `notifications`. I think nobody is using this yet, so I'm not expecting issues with it. Let me know if you think differently here. Required by readthedocs/addons#133
1 parent 727da6e commit 5d5f64d

File tree

7 files changed

+142
-29
lines changed

7 files changed

+142
-29
lines changed

readthedocs/projects/forms.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -654,23 +654,26 @@ class Meta:
654654
"analytics_enabled",
655655
"doc_diff_enabled",
656656
"doc_diff_root_selector",
657-
"external_version_warning_enabled",
658657
"flyout_enabled",
659658
"flyout_sorting",
660659
"flyout_sorting_latest_stable_at_beginning",
661660
"flyout_sorting_custom_pattern",
662661
"hotkeys_enabled",
663662
"search_enabled",
664-
"stable_latest_version_warning_enabled",
663+
"notifications_enabled",
664+
"notifications_show_on_latest",
665+
"notifications_show_on_non_stable",
666+
"notifications_show_on_external",
665667
)
666668
labels = {
667669
"enabled": _("Enable Addons"),
668-
"external_version_warning_enabled": _(
670+
"notifications_show_on_external": _(
669671
"Show a notification on builds from pull requests"
670672
),
671-
"stable_latest_version_warning_enabled": _(
672-
"Show a notification on non-stable and latest versions"
673+
"notifications_show_on_non_stable": _(
674+
"Show a notification on non-stable versions"
673675
),
676+
"notifications_show_on_latest": _("Show a notification on latest versions"),
674677
}
675678
widgets = {
676679
"doc_diff_root_selector": forms.TextInput(
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Generated by Django 4.2.16 on 2024-10-29 14:05
2+
3+
from django.db import migrations, models
4+
from django_safemigrate import Safe
5+
6+
7+
def forward_add_fields(apps, schema_editor):
8+
AddonsConfig = apps.get_model("projects", "AddonsConfig")
9+
for addons in AddonsConfig.objects.filter(project__isnull=False):
10+
addons.notifications_show_on_latest = addons.stable_latest_version_warning_enabled
11+
addons.notifications_show_on_non_stable = addons.stable_latest_version_warning_enabled
12+
addons.notifications_show_on_external = addons.external_version_warning_enabled
13+
addons.save()
14+
15+
16+
def reverse_remove_fields(apps, schema_editor):
17+
AddonsConfig = apps.get_model("projects", "AddonsConfig")
18+
for addons in AddonsConfig.objects.filter(project__isnull=False):
19+
addons.stable_latest_version_warning_enabled = addons.notifications_show_on_latest or addons.notifications_show_on_non_stable
20+
addons.external_version_warning_enabled = addons.notifications_show_on_external
21+
addons.save()
22+
23+
24+
class Migration(migrations.Migration):
25+
safe = Safe.before_deploy
26+
27+
dependencies = [
28+
('projects', '0127_default_to_semver'),
29+
]
30+
31+
operations = [
32+
migrations.AddField(
33+
model_name='addonsconfig',
34+
name='notifications_enabled',
35+
field=models.BooleanField(default=True),
36+
),
37+
migrations.AddField(
38+
model_name='addonsconfig',
39+
name='notifications_show_on_external',
40+
field=models.BooleanField(default=True),
41+
),
42+
migrations.AddField(
43+
model_name='addonsconfig',
44+
name='notifications_show_on_latest',
45+
field=models.BooleanField(default=True),
46+
),
47+
migrations.AddField(
48+
model_name='addonsconfig',
49+
name='notifications_show_on_non_stable',
50+
field=models.BooleanField(default=True),
51+
),
52+
migrations.AddField(
53+
model_name='historicaladdonsconfig',
54+
name='notifications_enabled',
55+
field=models.BooleanField(default=True),
56+
),
57+
migrations.AddField(
58+
model_name='historicaladdonsconfig',
59+
name='notifications_show_on_external',
60+
field=models.BooleanField(default=True),
61+
),
62+
migrations.AddField(
63+
model_name='historicaladdonsconfig',
64+
name='notifications_show_on_latest',
65+
field=models.BooleanField(default=True),
66+
),
67+
migrations.AddField(
68+
model_name='historicaladdonsconfig',
69+
name='notifications_show_on_non_stable',
70+
field=models.BooleanField(default=True),
71+
),
72+
migrations.RunPython(forward_add_fields, reverse_remove_fields),
73+
]
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Generated by Django 4.2.16 on 2024-10-29 14:09
2+
3+
from django.db import migrations
4+
from django_safemigrate import Safe
5+
6+
7+
class Migration(migrations.Migration):
8+
safe = Safe.after_deploy
9+
10+
dependencies = [
11+
('projects', '0128_addons_notifications'),
12+
]
13+
14+
operations = [
15+
migrations.RemoveField(
16+
model_name='addonsconfig',
17+
name='external_version_warning_enabled',
18+
),
19+
migrations.RemoveField(
20+
model_name='addonsconfig',
21+
name='stable_latest_version_warning_enabled',
22+
),
23+
migrations.RemoveField(
24+
model_name='historicaladdonsconfig',
25+
name='external_version_warning_enabled',
26+
),
27+
migrations.RemoveField(
28+
model_name='historicaladdonsconfig',
29+
name='stable_latest_version_warning_enabled',
30+
),
31+
]

readthedocs/projects/models.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,6 @@ class AddonsConfig(TimeStampedModel):
178178
help_text="CSS selector for the main content of the page",
179179
)
180180

181-
# External version warning
182-
external_version_warning_enabled = models.BooleanField(default=True)
183-
184181
# EthicalAds
185182
ethicalads_enabled = models.BooleanField(default=True)
186183

@@ -215,8 +212,11 @@ class AddonsConfig(TimeStampedModel):
215212
search_enabled = models.BooleanField(default=True)
216213
search_default_filter = models.CharField(null=True, blank=True, max_length=128)
217214

218-
# Stable/Latest version warning
219-
stable_latest_version_warning_enabled = models.BooleanField(default=True)
215+
# Notifications
216+
notifications_enabled = models.BooleanField(default=True)
217+
notifications_show_on_latest = models.BooleanField(default=True)
218+
notifications_show_on_non_stable = models.BooleanField(default=True)
219+
notifications_show_on_external = models.BooleanField(default=True)
220220

221221

222222
class AddonSearchFilter(TimeStampedModel):

readthedocs/proxito/tests/test_hosting.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,10 @@ def test_disabled_addons_via_addons_config(self):
149149
addons.flyout_enabled = False
150150
addons.hotkeys_enabled = False
151151
addons.search_enabled = False
152-
addons.stable_latest_version_warning_enabled = False
152+
addons.notifications_enabled = False
153+
addons.notifications_show_on_latest = False
154+
addons.notifications_show_on_non_stable = False
155+
addons.notifications_show_on_external = False
153156
addons.save()
154157

155158
r = self.client.get(
@@ -166,8 +169,10 @@ def test_disabled_addons_via_addons_config(self):
166169
)
167170
assert r.status_code == 200
168171
assert r.json()["addons"]["analytics"]["enabled"] is False
169-
assert r.json()["addons"]["external_version_warning"]["enabled"] is False
170-
assert r.json()["addons"]["non_latest_version_warning"]["enabled"] is False
172+
assert r.json()["addons"]["notifications"]["enabled"] is False
173+
assert r.json()["addons"]["notifications"]["show_on_latest"] is False
174+
assert r.json()["addons"]["notifications"]["show_on_non_stable"] is False
175+
assert r.json()["addons"]["notifications"]["show_on_external"] is False
171176
assert r.json()["addons"]["doc_diff"]["enabled"] is False
172177
assert r.json()["addons"]["flyout"]["enabled"] is False
173178
assert r.json()["addons"]["search"]["enabled"] is False

readthedocs/proxito/views/hosting.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -455,17 +455,11 @@ def _v1(self, project, version, build, filename, url, request):
455455
# https://github.com/readthedocs/readthedocs.org/issues/9530
456456
"code": project.analytics_code,
457457
},
458-
"external_version_warning": {
459-
"enabled": project.addons.external_version_warning_enabled,
460-
# NOTE: I think we are moving away from these selectors
461-
# since we are doing floating noticications now.
462-
# "query_selector": "[role=main]",
463-
},
464-
"non_latest_version_warning": {
465-
"enabled": project.addons.stable_latest_version_warning_enabled,
466-
# NOTE: I think we are moving away from these selectors
467-
# since we are doing floating noticications now.
468-
# "query_selector": "[role=main]",
458+
"notifications": {
459+
"enabled": project.addons.notifications_enabled,
460+
"show_on_latest": project.addons.notifications_show_on_latest,
461+
"show_on_non_stable": project.addons.notifications_show_on_non_stable,
462+
"show_on_external": project.addons.notifications_show_on_external,
469463
},
470464
"flyout": {
471465
"enabled": project.addons.flyout_enabled,

readthedocs/rtd_tests/tests/test_project_forms.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,14 +1133,16 @@ def test_addonsconfig_form(self):
11331133
"enabled": True,
11341134
"analytics_enabled": False,
11351135
"doc_diff_enabled": False,
1136-
"external_version_warning_enabled": True,
11371136
"flyout_enabled": True,
11381137
"flyout_sorting": ADDONS_FLYOUT_SORTING_CALVER,
11391138
"flyout_sorting_latest_stable_at_beginning": True,
11401139
"flyout_sorting_custom_pattern": None,
11411140
"hotkeys_enabled": False,
11421141
"search_enabled": False,
1143-
"stable_latest_version_warning_enabled": True,
1142+
"notifications_enabled": True,
1143+
"notifications_show_on_latest": True,
1144+
"notifications_show_on_non_stable": True,
1145+
"notifications_show_on_external": True,
11441146
}
11451147
form = AddonsConfigForm(data=data, project=self.project)
11461148
self.assertTrue(form.is_valid())
@@ -1149,7 +1151,10 @@ def test_addonsconfig_form(self):
11491151
self.assertEqual(self.project.addons.enabled, True)
11501152
self.assertEqual(self.project.addons.analytics_enabled, False)
11511153
self.assertEqual(self.project.addons.doc_diff_enabled, False)
1152-
self.assertEqual(self.project.addons.external_version_warning_enabled, True)
1154+
self.assertEqual(self.project.addons.notifications_enabled, True)
1155+
self.assertEqual(self.project.addons.notifications_show_on_latest, True)
1156+
self.assertEqual(self.project.addons.notifications_show_on_non_stable, True)
1157+
self.assertEqual(self.project.addons.notifications_show_on_external, True)
11531158
self.assertEqual(self.project.addons.flyout_enabled, True)
11541159
self.assertEqual(
11551160
self.project.addons.flyout_sorting,
@@ -1172,14 +1177,16 @@ def test_addonsconfig_form_invalid_sorting_custom_pattern(self):
11721177
"enabled": True,
11731178
"analytics_enabled": False,
11741179
"doc_diff_enabled": False,
1175-
"external_version_warning_enabled": True,
11761180
"flyout_enabled": True,
11771181
"flyout_sorting": ADDONS_FLYOUT_SORTING_CUSTOM_PATTERN,
11781182
"flyout_sorting_latest_stable_at_beginning": True,
11791183
"flyout_sorting_custom_pattern": None,
11801184
"hotkeys_enabled": False,
11811185
"search_enabled": False,
1182-
"stable_latest_version_warning_enabled": True,
1186+
"notifications_enabled": True,
1187+
"notifications_show_on_latest": True,
1188+
"notifications_show_on_non_stable": True,
1189+
"notifications_show_on_external": True,
11831190
}
11841191
form = AddonsConfigForm(data=data, project=self.project)
11851192
self.assertFalse(form.is_valid())

0 commit comments

Comments
 (0)