diff --git a/apps/search_page/__init__.py b/apps/search_page/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/search_page/apps.py b/apps/search_page/apps.py
new file mode 100644
index 000000000..548c4f279
--- /dev/null
+++ b/apps/search_page/apps.py
@@ -0,0 +1,10 @@
+from django.apps import AppConfig
+from django.conf import settings
+
+class SearchPageConfig(AppConfig):
+ name = 'apps.search_page'
+
+ def ready(self):
+ if settings.SEARCH_PAGE_AUTO_SETUP:
+ from .utils import create_page
+ create_page()
diff --git a/apps/search_page/cms_apps.py b/apps/search_page/cms_apps.py
new file mode 100644
index 000000000..236d4daa6
--- /dev/null
+++ b/apps/search_page/cms_apps.py
@@ -0,0 +1,11 @@
+from cms.app_base import CMSApp
+from cms.apphook_pool import apphook_pool
+
+
+@apphook_pool.register
+class SearchPageApphook(CMSApp):
+ app_name = 'apps.search_page'
+ name = 'SearchPage'
+
+ def get_urls(self, page=None, language=None, **kwargs):
+ return ['apps.search_page.urls']
diff --git a/apps/search_page/static/search_page/css/google-search.css b/apps/search_page/static/search_page/css/google-search.css
new file mode 100644
index 000000000..6b0715fda
--- /dev/null
+++ b/apps/search_page/static/search_page/css/google-search.css
@@ -0,0 +1 @@
+@import url("https://cdn.jsdelivr.net/gh/TACC/Core-CMS-Custom@f2ff5062/generic_assets/css/google-search.css");
diff --git a/apps/search_page/templates/search_page.html b/apps/search_page/templates/search_page.html
new file mode 100644
index 000000000..db55e320d
--- /dev/null
+++ b/apps/search_page/templates/search_page.html
@@ -0,0 +1,25 @@
+{% extends "base.html" %}
+{% load static cms_tags %}
+
+{% block css %}
+ {{ block.super }}
+
+{% endblock css %}
+
+{% block app_content %}
+
+
+
{% page_attribute "page_title" %}
+
+
+
+ {% if settings.GOOGLE_SEARCH_ENGINE_ID %}
+
+ {% else %}
+ Please inform your website administrator to verify a GOOGLE_SEARCH_ENGINE_ID is set for this website.
+ {% endif %}
+{% endblock app_content %}
diff --git a/apps/search_page/urls.py b/apps/search_page/urls.py
new file mode 100644
index 000000000..5a4056342
--- /dev/null
+++ b/apps/search_page/urls.py
@@ -0,0 +1,8 @@
+from django.urls import path
+from . import views
+
+app_name = 'apps.search_page'
+
+urlpatterns = [
+ path('', views.SearchPageView, name='search'),
+]
diff --git a/apps/search_page/utils.py b/apps/search_page/utils.py
new file mode 100644
index 000000000..5cca4f09e
--- /dev/null
+++ b/apps/search_page/utils.py
@@ -0,0 +1,64 @@
+import logging
+
+from django.conf import settings
+from django.urls import reverse, NoReverseMatch
+
+from cms.api import create_page as create_cms_page
+from cms.models.pagemodel import Page
+
+from .cms_apps import SearchPageApphook
+
+
+logger = logging.getLogger(f'portal.{__name__}')
+
+TITLE = 'Search'
+REVERSE_ID = 'search_page'
+DEFAULT_SLUG = settings.PORTAL_SEARCH_PATH.strip('/')
+
+def get_page():
+ try:
+ return Page.objects.filter(reverse_id=REVERSE_ID).first()
+ except Page.DoesNotExist:
+ return None
+
+def get_slug(page=None):
+ if page:
+ return page.get_slug()
+ else:
+ page = get_page()
+ return get_slug(page) if page else DEFAULT_SLUG
+
+def get_page_url():
+ page = get_page()
+ if page:
+ return page.get_absolute_url()
+ else:
+ try:
+ return reverse('apps.search_page:search')
+ except NoReverseMatch:
+ return None
+
+def create_page():
+ page = get_page()
+ slug = get_slug(page)
+
+ if not page:
+ page = create_cms_page(
+ title=f'{TITLE} (Auto-Generated)',
+ menu_title=TITLE,
+ page_title=TITLE,
+ reverse_id=REVERSE_ID,
+ # Use a template from CMS_TEMPLATES setting
+ template='standard.html',
+ language='en',
+ published=True,
+ slug=slug,
+ in_navigation=False,
+ apphook=SearchPageApphook,
+ apphook_namespace=SearchPageApphook.name,
+ )
+ logger.info(f'Created search page "{TITLE}" at "{slug}"')
+ else:
+ logger.info(f'Found existing search page at "{slug}"')
+
+ return page
diff --git a/apps/search_page/views.py b/apps/search_page/views.py
new file mode 100644
index 000000000..cf5486460
--- /dev/null
+++ b/apps/search_page/views.py
@@ -0,0 +1,4 @@
+from django.shortcuts import render
+
+def SearchPageView(request):
+ return render(request, 'search_page.html')
diff --git a/taccsite_cms/_settings/search.py b/taccsite_cms/_settings/search.py
index ce19ba3d4..b73151536 100644
--- a/taccsite_cms/_settings/search.py
+++ b/taccsite_cms/_settings/search.py
@@ -5,16 +5,19 @@
########################
# To support any search
-PORTAL_SEARCH_PATH = '/search'
+PORTAL_SEARCH_PATH = '/search/'
# To support Google search
# PORTAL_SEARCH_QUERY_PARAM_NAME = 'q'
# PORTAL_SEARCH_INDEX_IS_AUTOMATIC = False
+GOOGLE_SEARCH_ENGINE_ID = ''
# (DEPRECATED) To support Elasticsearch
PORTAL_SEARCH_QUERY_PARAM_NAME = 'query_string'
PORTAL_SEARCH_INDEX_IS_AUTOMATIC = True
+SEARCH_PAGE_AUTO_SETUP = True
+
ES_AUTH = 'username:password'
ES_HOSTS = 'http://elasticsearch:9200'
ES_INDEX_PREFIX = 'cms-dev-{}'
@@ -34,5 +37,6 @@
ALDRYN_SEARCH_REGISTER_APPHOOK = True
_INSTALLED_APPS = [
- 'haystack', # search index
+ 'haystack', # ElasticSearch
+# 'search_page' # Google Search
]
diff --git a/taccsite_cms/settings/settings.py b/taccsite_cms/settings/settings.py
index cc1eed190..7db5962e6 100644
--- a/taccsite_cms/settings/settings.py
+++ b/taccsite_cms/settings/settings.py
@@ -483,6 +483,7 @@ def gettext(s): return s
# core TACC CMS
# HELP: If this were top of list, would TACC/Core-CMS/pull/169 fix break?
'taccsite_cms',
+ 'apps.search_page',
'common_apps.email_management',
# django CMS Bootstrap
@@ -762,4 +763,5 @@ def get_subdirs_as_module_names(path):
'PORTAL_SOCIAL_SHARE_PLATFORMS',
'PORTAL_SEARCH_PATH',
'PORTAL_SEARCH_QUERY_PARAM_NAME',
+ 'GOOGLE_SEARCH_ENGINE_ID',
]
diff --git a/taccsite_cms/settings/settings_custom.example.py b/taccsite_cms/settings/settings_custom.example.py
index 2cb9f05ae..24c0ca696 100644
--- a/taccsite_cms/settings/settings_custom.example.py
+++ b/taccsite_cms/settings/settings_custom.example.py
@@ -100,10 +100,11 @@
########################
# To support Google search
+PORTAL_SEARCH_PATH = '/search/'
PORTAL_SEARCH_QUERY_PARAM_NAME = 'q'
-
-# To disable Elasticsearch
PORTAL_SEARCH_INDEX_IS_AUTOMATIC = False
+SEARCH_PAGE_AUTO_SETUP = True
+GOOGLE_SEARCH_ENGINE_ID = ''
########################
# DJANGOCMS_BLOG
diff --git a/taccsite_cms/templates/nav_search.raw.html b/taccsite_cms/templates/nav_search.raw.html
index c33f5fe68..73f896097 100644
--- a/taccsite_cms/templates/nav_search.raw.html
+++ b/taccsite_cms/templates/nav_search.raw.html
@@ -1,6 +1,6 @@
{# @var settings #}
-{% load static %}
+{% load static search_tags %}
@@ -10,7 +10,7 @@
-