Skip to content

Commit 565fe9b

Browse files
committed
installations and journals can now set a base theme. #2992
1 parent b6b9294 commit 565fe9b

6 files changed

Lines changed: 186 additions & 62 deletions

File tree

src/core/janeway_global_settings.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@
116116
'django.middleware.security.SecurityMiddleware',
117117
'core.middleware.TimezoneMiddleware',
118118
'core.middleware.SiteSettingsMiddleware',
119-
'utils.template_override_middleware.ThemeEngineMiddleware',
120119
'core.middleware.MaintenanceModeMiddleware',
121120
'cron.middleware.CronMiddleware',
122121
'core.middleware.CounterCookieMiddleware',
@@ -548,3 +547,11 @@ def __len__(self):
548547
CORE_FILETEXT_MODEL = "core.PGFileText"
549548

550549
ENABLE_FULL_TEXT_SEARCH = False
550+
551+
# A core theme must include ALL templates.
552+
CORE_THEMES = [
553+
'OLH',
554+
'material',
555+
'clean',
556+
]
557+
INSTALLATION_BASE_THEME = 'OLH'

src/core/logic.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ def get_settings_to_edit(display_group, journal):
222222
review_form_choices.append([form.pk, form])
223223

224224
if display_group == 'submission':
225-
settings = [
225+
group_of_settings = [
226226
{'name': 'disable_journal_submission',
227227
'object': setting_handler.get_setting('general', 'disable_journal_submission', journal)
228228
},
@@ -320,7 +320,7 @@ def get_settings_to_edit(display_group, journal):
320320
setting_group = 'general'
321321

322322
elif display_group == 'review':
323-
settings = [
323+
group_of_settings = [
324324
{
325325
'name': 'reviewer_guidelines',
326326
'object': setting_handler.get_setting('general', 'reviewer_guidelines', journal),
@@ -401,15 +401,15 @@ def get_settings_to_edit(display_group, journal):
401401
'doi_pattern', 'doi_manager_action_maximum_size', 'title_doi', 'issue_doi_pattern', 'register_issue_dois'
402402
]
403403

404-
settings = process_setting_list(xref_settings, 'Identifiers', journal)
404+
group_of_settings = process_setting_list(xref_settings, 'Identifiers', journal)
405405
setting_group = 'Identifiers'
406406

407407
elif display_group == 'crosscheck':
408408
xref_settings = [
409409
'enable', 'username', 'password'
410410
]
411411

412-
settings = process_setting_list(xref_settings, 'crosscheck', journal)
412+
group_of_settings = process_setting_list(xref_settings, 'crosscheck', journal)
413413
setting_group = 'crosscheck'
414414

415415
elif display_group == 'journal':
@@ -421,23 +421,29 @@ def get_settings_to_edit(display_group, journal):
421421
'switch_language', 'enable_language_text', 'google_analytics_code',
422422
'use_ga_four', 'display_login_page_notice', 'login_page_notice',
423423
'display_register_page_notice', 'register_page_notice',
424-
'support_email', 'support_contact_message_for_staff',
425-
'replyto_address',
424+
'from_address', 'replyto_address',
426425
]
427426

428-
settings = process_setting_list(journal_settings, 'general', journal)
429-
settings[3]['choices'] = get_theme_list()
427+
group_of_settings = process_setting_list(journal_settings, 'general', journal)
428+
group_of_settings[3]['choices'] = get_theme_list()
430429
setting_group = 'general'
431-
settings.append({
432-
'name': 'from_address',
433-
'object': setting_handler.get_setting('general', 'from_address', journal),
434-
})
430+
431+
if group_of_settings[3].get('object').value not in settings.CORE_THEMES:
432+
group_of_settings.append(
433+
{
434+
'name': 'journal_base_theme',
435+
'object': setting_handler.get_setting('general', 'journal_base_theme', journal),
436+
'choices': [
437+
[theme, theme]
438+
for theme in settings.CORE_THEMES]
439+
},
440+
)
435441

436442
elif display_group == 'proofing':
437443
proofing_settings = [
438444
'max_proofreaders'
439445
]
440-
settings = process_setting_list(proofing_settings, 'general', journal)
446+
group_of_settings = process_setting_list(proofing_settings, 'general', journal)
441447
setting_group = 'general'
442448
elif display_group == 'article':
443449
article_settings = [
@@ -450,10 +456,10 @@ def get_settings_to_edit(display_group, journal):
450456
'altmetric_badge_type',
451457
'hide_author_email_links',
452458
]
453-
settings = process_setting_list(article_settings, 'article', journal)
459+
group_of_settings = process_setting_list(article_settings, 'article', journal)
454460
setting_group = 'article'
455461
elif display_group == 'styling':
456-
settings = [
462+
group_of_settings = [
457463
{
458464
'name': 'enable_editorial_images',
459465
'object': setting_handler.get_setting('styling',
@@ -475,18 +481,18 @@ def get_settings_to_edit(display_group, journal):
475481
]
476482
setting_group = 'styling'
477483
elif display_group == 'news':
478-
settings = [
484+
group_of_settings = [
479485
{
480486
'name': 'news_title',
481487
'object': setting_handler.get_setting('news', 'news_title', journal),
482488
},
483489
]
484490
setting_group = 'news'
485491
else:
486-
settings = []
492+
group_of_settings = []
487493
setting_group = None
488494

489-
return settings, setting_group
495+
return group_of_settings, setting_group
490496

491497

492498
def get_theme_list():

src/templates/admin/elements/forms/group_journal.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ <h2>General Journal Settings</h2>
77
{% include "admin/elements/forms/field.html" with field=edit_form.journal_issn %}
88
{% include "admin/elements/forms/field.html" with field=edit_form.print_issn %}
99
{% include "admin/elements/forms/field.html" with field=edit_form.journal_theme %}
10+
{% if edit_form.journal_base_theme %}
11+
{% include "admin/elements/forms/field.html" with field=edit_form.journal_base_theme %}
12+
{% endif %}
1013
{% include "admin/elements/forms/field.html" with field=edit_form.publisher_name %}
1114
{% include "admin/elements/forms/field.html" with field=edit_form.publisher_url %}
1215
{% include "admin/elements/forms/field.html" with field=edit_form.main_contact %}

src/utils/install/journal_defaults.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,21 @@
719719
"default": "OLH"
720720
}
721721
},
722+
{
723+
"group": {
724+
"name": "general"
725+
},
726+
"setting": {
727+
"description": "When using a custom theme you can set the base theme, when a template from a custom theme is missing templates from the base theme will be used as a backup.",
728+
"is_translatable": false,
729+
"name": "journal_base_theme",
730+
"pretty_name": "Journal Base Theme",
731+
"type": "select"
732+
},
733+
"value": {
734+
"default": "OLH"
735+
}
736+
},
722737
{
723738
"group": {
724739
"name": "general"

src/utils/template_override_middleware.py

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import errno
77
import io
88
import os
9-
import threading
109
import warnings
1110

1211
from django.conf import settings
@@ -16,60 +15,70 @@
1615
from django.utils._os import safe_join
1716
from django.utils.deprecation import RemovedInDjango20Warning
1817

19-
from utils import setting_handler, function_cache
20-
21-
_local = threading.local()
22-
23-
24-
class ThemeEngineMiddleware(object):
25-
""" Handles theming through middleware
26-
"""
27-
28-
def process_request(self, request):
29-
_local.request = request
30-
31-
def process_response(self, request, response):
32-
if hasattr(_local, 'request'):
33-
del _local.request
34-
return response
18+
from utils import setting_handler, function_cache, logic as utils_logic
3519

3620

3721
class Loader(BaseLoader):
3822

23+
@staticmethod
3924
@function_cache.cache(120)
40-
def query_theme_dirs(self, journal):
25+
def journal_theme(journal):
4126
return setting_handler.get_setting('general', 'journal_theme', journal).value
4227

43-
def get_theme_dirs(self):
28+
@staticmethod
29+
@function_cache.cache(120)
30+
def base_theme(journal):
31+
return setting_handler.get_setting('general', 'journal_base_theme', journal).value
4432

45-
if hasattr(_local, 'request'):
33+
def get_theme_dirs(self):
34+
from core import models as core_models
35+
request = utils_logic.get_current_request()
36+
base_theme, theme_setting = None, None
4637

47-
if _local.request.journal:
38+
if request:
39+
if request.journal:
4840
# this is a journal and we should attempt to retrieve any theme settings
4941
try:
50-
theme_setting = self.query_theme_dirs(_local.request.journal)
51-
except Exception:
52-
theme_setting = 'clean'
42+
theme_setting = self.journal_theme(request.journal)
43+
except core_models.Setting.DoesNotExist:
44+
pass
5345

54-
elif _local.request.repository:
46+
try:
47+
base_theme = self.base_theme(request.journal)
48+
except core_models.Setting.DoesNotExist:
49+
pass
50+
51+
elif request.repository:
52+
# only the material theme supports repositories at the moment.
5553
theme_setting = 'material'
5654
else:
5755
# this is the press site
58-
theme_setting = _local.request.press.theme
59-
else:
60-
# for some reason the request has not been pulled into the local thread.
61-
# we shouldn't really ever arrive here during a request that requires a template
62-
theme_setting = 'clean'
56+
theme_setting = request.press.theme
6357

64-
# this is a backup for a missed setting get above.
65-
if not theme_setting:
66-
theme_setting = 'clean'
58+
# allows servers in debug mode to override the theme with ?theme=name in the URL
59+
if settings.DEBUG and request and request.GET.get('theme'):
60+
theme_setting = request.GET.get('theme')
6761

68-
if settings.DEBUG and hasattr(_local, 'request') and _local.request.GET.get('theme'):
69-
theme_setting = _local.request.GET.get('theme')
62+
# order up the themes and return them with engine dirs
63+
themes_in_order = list()
64+
65+
if theme_setting:
66+
themes_in_order.append(
67+
os.path.join(settings.BASE_DIR, 'themes', theme_setting, 'templates')
68+
)
69+
if base_theme:
70+
themes_in_order.append(
71+
os.path.join(settings.BASE_DIR, 'themes', base_theme, 'templates')
72+
)
73+
74+
# if the base_theme and INSTALLATION_BASE_THEME are different,
75+
# # append the INSTALLATION_BASE_THEME.
76+
if not base_theme == settings.INSTALLATION_BASE_THEME:
77+
themes_in_order.append(
78+
os.path.join(settings.BASE_DIR, 'themes', settings.INSTALLATION_BASE_THEME, 'templates')
79+
)
7080

71-
return [os.path.join(settings.BASE_DIR, 'themes', theme_setting, 'templates'),
72-
os.path.join(settings.BASE_DIR, 'themes', 'clean', 'templates')] + self.engine.dirs
81+
return themes_in_order + self.engine.dirs
7382

7483
def get_dirs(self):
7584
return self.get_theme_dirs()

0 commit comments

Comments
 (0)