Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion readthedocs/projects/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,6 @@ class Meta:

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

self.had_search_disabled = not self.instance.search_indexing_enabled

# Remove empty choice from options.
Expand Down Expand Up @@ -1285,3 +1284,16 @@ def clean_name(self):
_("Only letters, numbers and underscore are allowed"),
)
return name


class AddonsConfigSearchSettingsForm(forms.ModelForm):
"""Form to configure addons search settings."""

class Meta:
model = AddonsConfig
fields = ["search_enabled", "search_show_subprojects_filter"]

def __init__(self, *args, **kwargs):
self.project = kwargs.pop("project", None)
kwargs["instance"] = self.project.addons
super().__init__(*args, **kwargs)
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 5.2.11 on 2026-03-12 23:39

from django.db import migrations
from django.db import models
from django_safemigrate import Safe


class Migration(migrations.Migration):
safe = Safe.before_deploy()
dependencies = [
("projects", "0158_add_search_subproject_filter_option"),
]

operations = [
migrations.AlterField(
model_name="addonsconfig",
name="search_enabled",
field=models.BooleanField(default=True, verbose_name="Enable search modal"),
),
migrations.AlterField(
model_name="historicaladdonsconfig",
name="search_enabled",
field=models.BooleanField(default=True, verbose_name="Enable search modal"),
),
]
2 changes: 1 addition & 1 deletion readthedocs/projects/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ class AddonsConfig(TimeStampedModel):
hotkeys_enabled = models.BooleanField(default=True)

# Search
search_enabled = models.BooleanField(default=True)
search_enabled = models.BooleanField(_("Enable search modal"), default=True)
search_default_filter = models.CharField(null=True, blank=True, max_length=128)
search_show_subprojects_filter = models.BooleanField(
"Show subprojects filter in search modal",
Expand Down
6 changes: 6 additions & 0 deletions readthedocs/projects/urls/private.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
from readthedocs.projects.views.private import ProjectRedirectsInsert
from readthedocs.projects.views.private import ProjectRedirectsList
from readthedocs.projects.views.private import ProjectRedirectsUpdate
from readthedocs.projects.views.private import ProjectSearchSettingsUpdate
from readthedocs.projects.views.private import ProjectTranslationsCreate
from readthedocs.projects.views.private import ProjectTranslationsDelete
from readthedocs.projects.views.private import ProjectTranslationsList
Expand Down Expand Up @@ -189,6 +190,11 @@
ProjectPullRequestsUpdate.as_view(),
name="projects_pull_requests",
),
re_path(
r"^(?P<project_slug>[-\w]+)/search-settings/$",
ProjectSearchSettingsUpdate.as_view(),
name="projects_search_settings",
),
re_path(
r"^(?P<project_slug>[-\w]+)/search-analytics/$",
SearchAnalytics.as_view(),
Expand Down
16 changes: 16 additions & 0 deletions readthedocs/projects/views/private.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
from readthedocs.oauth.utils import update_webhook
from readthedocs.projects.filters import ProjectListFilterSet
from readthedocs.projects.forms import AddonsConfigForm
from readthedocs.projects.forms import AddonsConfigSearchSettingsForm
from readthedocs.projects.forms import DomainForm
from readthedocs.projects.forms import EmailHookForm
from readthedocs.projects.forms import EnvironmentVariableForm
Expand Down Expand Up @@ -1336,3 +1337,18 @@ def get_queryset(self):

def get_success_url(self):
return reverse("projects_pull_requests", args=[self.object.slug])


class ProjectSearchSettingsUpdate(PrivateViewMixin, ProjectAdminMixin, UpdateView):
model = Project
success_message = _("Search settings have been updated")
template_name = "projects/search_settings_form.html"
lookup_url_kwarg = "project_slug"
lookup_field = "slug"
form_class = AddonsConfigSearchSettingsForm

def get_queryset(self):
return self.model.objects.for_admin_user(self.request.user)

def get_success_url(self):
return reverse("projects_search_settings", args=[self.object.slug])
Loading