Skip to content

Commit e4d23c3

Browse files
authored
Addons: make default root CSS selector a shared option (#11767)
Add a "global" shared CSS root selector that is used all across our features: link previews, docdiff, search, embed API, etc. Also, put the "documentation tool name" as a top level config as well. With that information we can define better defaults for CSS selectors and other stuffs in the future if needed. Example: if documentation tool is set as Sphinx by the user, we will be able to use `[role=main] a.internal` for the Link Preview CSS selector. Related readthedocs/addons#433
1 parent e0f17cc commit e4d23c3

File tree

7 files changed

+88
-60
lines changed

7 files changed

+88
-60
lines changed

readthedocs/projects/forms.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -653,19 +653,16 @@ class Meta:
653653
fields = (
654654
"enabled",
655655
"project",
656+
"options_root_selector",
656657
"analytics_enabled",
657658
"doc_diff_enabled",
658-
"doc_diff_root_selector",
659659
"flyout_enabled",
660660
"flyout_sorting",
661661
"flyout_sorting_latest_stable_at_beginning",
662662
"flyout_sorting_custom_pattern",
663663
"hotkeys_enabled",
664664
"search_enabled",
665665
"linkpreviews_enabled",
666-
"linkpreviews_root_selector",
667-
"linkpreviews_doctool_name",
668-
"linkpreviews_doctool_version",
669666
"notifications_enabled",
670667
"notifications_show_on_latest",
671668
"notifications_show_on_non_stable",
@@ -681,16 +678,12 @@ class Meta:
681678
),
682679
"notifications_show_on_latest": _("Show a notification on latest version"),
683680
"linkpreviews_enabled": _("Enabled"),
684-
"linkpreviews_root_selector": _("Root selector"),
685-
"linkpreviews_doctool_name": _("Documentation tool name"),
686-
"linkpreviews_doctool_version": _("Documentation tool version"),
681+
"options_root_selector": _("CSS main content selector"),
687682
}
683+
688684
widgets = {
689-
"doc_diff_root_selector": forms.TextInput(
690-
attrs={"placeholder": AddonsConfig.DOC_DIFF_DEFAULT_ROOT_SELECTOR}
691-
),
692-
"linkpreviews_root_selector": forms.TextInput(
693-
attrs={"placeholder": AddonsConfig.LINKPREVIEWS_DEFAULT_ROOT_SELECTOR}
685+
"options_root_selector": forms.TextInput(
686+
attrs={"placeholder": "[role=main]"}
694687
),
695688
}
696689

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Generated by Django 4.2.16 on 2024-11-20 12:35
2+
3+
from django.db import migrations, models
4+
from django_safemigrate import Safe
5+
6+
7+
class Migration(migrations.Migration):
8+
safe = Safe.before_deploy
9+
10+
dependencies = [
11+
('projects', '0136_addons_customscript_notnull'),
12+
]
13+
14+
operations = [
15+
migrations.AddField(
16+
model_name='addonsconfig',
17+
name='options_root_selector',
18+
field=models.CharField(blank=True, help_text='CSS selector for the main content of the page. Leave it blank for auto-detect.', max_length=128, null=True),
19+
),
20+
migrations.AddField(
21+
model_name='historicaladdonsconfig',
22+
name='options_root_selector',
23+
field=models.CharField(blank=True, help_text='CSS selector for the main content of the page. Leave it blank for auto-detect.', max_length=128, null=True),
24+
),
25+
]
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Generated by Django 4.2.16 on 2024-11-20 12:35
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', '0137_use_generic_root_selector'),
12+
]
13+
14+
operations = [
15+
migrations.RemoveField(
16+
model_name='addonsconfig',
17+
name='doc_diff_root_selector',
18+
),
19+
migrations.RemoveField(
20+
model_name='addonsconfig',
21+
name='linkpreviews_doctool_name',
22+
),
23+
migrations.RemoveField(
24+
model_name='addonsconfig',
25+
name='linkpreviews_doctool_version',
26+
),
27+
migrations.RemoveField(
28+
model_name='addonsconfig',
29+
name='linkpreviews_root_selector',
30+
),
31+
migrations.RemoveField(
32+
model_name='historicaladdonsconfig',
33+
name='doc_diff_root_selector',
34+
),
35+
migrations.RemoveField(
36+
model_name='historicaladdonsconfig',
37+
name='linkpreviews_doctool_name',
38+
),
39+
migrations.RemoveField(
40+
model_name='historicaladdonsconfig',
41+
name='linkpreviews_doctool_version',
42+
),
43+
migrations.RemoveField(
44+
model_name='historicaladdonsconfig',
45+
name='linkpreviews_root_selector',
46+
),
47+
]

readthedocs/projects/models.py

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -144,13 +144,6 @@ class AddonsConfig(TimeStampedModel):
144144
Everything is enabled by default.
145145
"""
146146

147-
DOC_DIFF_DEFAULT_ROOT_SELECTOR = "[role=main]"
148-
LINKPREVIEWS_DEFAULT_ROOT_SELECTOR = "[role=main] a.internal"
149-
LINKPREVIEWS_DOCTOOL_NAME_CHOICES = (
150-
("sphinx", "Sphinx"),
151-
("other", "Other"),
152-
)
153-
154147
# Model history
155148
history = ExtraHistoricalRecords()
156149

@@ -167,6 +160,13 @@ class AddonsConfig(TimeStampedModel):
167160
help_text="Enable/Disable all the addons on this project",
168161
)
169162

163+
options_root_selector = models.CharField(
164+
null=True,
165+
blank=True,
166+
max_length=128,
167+
help_text="CSS selector for the main content of the page. Leave it blank for auto-detect.",
168+
)
169+
170170
# Whether or not load addons library when the requested page is embedded (e.g. inside an iframe)
171171
# https://github.com/readthedocs/addons/pull/415
172172
options_load_when_embedded = models.BooleanField(default=False)
@@ -181,12 +181,6 @@ class AddonsConfig(TimeStampedModel):
181181
doc_diff_enabled = models.BooleanField(default=True)
182182
doc_diff_show_additions = models.BooleanField(default=True)
183183
doc_diff_show_deletions = models.BooleanField(default=True)
184-
doc_diff_root_selector = models.CharField(
185-
null=True,
186-
blank=True,
187-
max_length=128,
188-
help_text="CSS selector for the main content of the page",
189-
)
190184

191185
# EthicalAds
192186
ethicalads_enabled = models.BooleanField(default=True)
@@ -242,18 +236,6 @@ class AddonsConfig(TimeStampedModel):
242236

243237
# Link Previews
244238
linkpreviews_enabled = models.BooleanField(default=False)
245-
linkpreviews_root_selector = models.CharField(null=True, blank=True, max_length=128)
246-
linkpreviews_doctool_name = models.CharField(
247-
choices=LINKPREVIEWS_DOCTOOL_NAME_CHOICES,
248-
null=True,
249-
blank=True,
250-
max_length=128,
251-
)
252-
linkpreviews_doctool_version = models.CharField(
253-
null=True,
254-
blank=True,
255-
max_length=128,
256-
)
257239

258240

259241
class AddonSearchFilter(TimeStampedModel):

readthedocs/proxito/tests/responses/v1.json

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@
122122
},
123123
"addons": {
124124
"options": {
125-
"load_when_embedded": false
125+
"load_when_embedded": false,
126+
"root_selector": null
126127
},
127128
"analytics": {
128129
"enabled": false,
@@ -148,7 +149,6 @@
148149
"doc_diff": {
149150
"enabled": true,
150151
"base_url": "https://project.dev.readthedocs.io/en/latest/index.html",
151-
"root_selector": null,
152152
"inject_styles": true,
153153
"base_host": "",
154154
"base_page": ""
@@ -169,12 +169,7 @@
169169
"src": null
170170
},
171171
"linkpreviews": {
172-
"enabled": false,
173-
"root_selector": "[role=main] a.internal",
174-
"doctool": {
175-
"name": null,
176-
"version": null
177-
}
172+
"enabled": false
178173
}
179174
}
180175
}

readthedocs/proxito/tests/test_hosting.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -729,9 +729,6 @@ def test_linkpreviews(self):
729729
)
730730

731731
addons.linkpreviews_enabled = True
732-
addons.linkpreviews_root_selector = "[role=main] a"
733-
addons.linkpreviews_doctool_name = "sphinx"
734-
addons.linkpreviews_doctool_version = "8.0.1"
735732
addons.save()
736733

737734
r = self.client.get(
@@ -748,11 +745,6 @@ def test_linkpreviews(self):
748745
)
749746
expected = {
750747
"enabled": True,
751-
"root_selector": "[role=main] a",
752-
"doctool": {
753-
"name": "sphinx",
754-
"version": "8.0.1",
755-
},
756748
}
757749

758750
assert r.status_code == 200

readthedocs/proxito/views/hosting.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,7 @@ def _v1(self, project, version, build, filename, url, request):
456456
"addons": {
457457
"options": {
458458
"load_when_embedded": project.addons.options_load_when_embedded,
459+
"root_selector": project.addons.options_root_selector,
459460
},
460461
"analytics": {
461462
"enabled": project.addons.analytics_enabled,
@@ -519,12 +520,6 @@ def _v1(self, project, version, build, filename, url, request):
519520
},
520521
"linkpreviews": {
521522
"enabled": project.addons.linkpreviews_enabled,
522-
"root_selector": project.addons.linkpreviews_root_selector
523-
or project.addons.LINKPREVIEWS_DEFAULT_ROOT_SELECTOR,
524-
"doctool": {
525-
"name": project.addons.linkpreviews_doctool_name,
526-
"version": project.addons.linkpreviews_doctool_version,
527-
},
528523
},
529524
"hotkeys": {
530525
"enabled": project.addons.hotkeys_enabled,
@@ -594,7 +589,6 @@ def _v1(self, project, version, build, filename, url, request):
594589
)
595590
if filename
596591
else None,
597-
"root_selector": project.addons.doc_diff_root_selector,
598592
"inject_styles": True,
599593
# NOTE: `base_host` and `base_page` are not required, since
600594
# we are constructing the `base_url` in the backend instead

0 commit comments

Comments
 (0)