From 4517b5a5010b19c257366bfc392b6db962a6890f Mon Sep 17 00:00:00 2001
From: Saurabh Kumar <theskumar@users.noreply.github.com>
Date: Fri, 22 Mar 2024 15:51:06 +0800
Subject: [PATCH] Move systemsettings out of public + remove duplicate 404/403
 template (#3804)

- Renamed the SystemSettings model class
- 404/403 templates specific to apply to is removed, use a single
  template for them.
- Add data migration for old SystemMessageSettings model class
- add/update the testing urls for error pages
Fixes #3768
---
 hypha/apply/funds/templates/funds/round.html  |   4 +-
 hypha/apply/utils/templates/apply/403.html    |  13 ---
 hypha/apply/utils/templates/apply/404.html    |  15 ---
 hypha/apply/utils/views.py                    |  13 ---
 hypha/core/migrations/0003_initial.py         | 110 ++++++++++++++++++
 .../0004_move_system_settings_data.py         |  42 +++++++
 hypha/core/models/__init__.py                 |   3 +
 .../models/system_settings.py}                |   5 +-
 .../templates/apply_home/apply_home_page.html |   4 +-
 .../0013_delete_systemmessagessettings.py     |  16 +++
 hypha/templates/403.html                      |   8 +-
 hypha/templates/404.html                      |   8 +-
 hypha/templates/base-apply.html               |  28 ++---
 hypha/templates/styleguide.html               |   8 +-
 hypha/urls.py                                 |  25 +++-
 15 files changed, 222 insertions(+), 80 deletions(-)
 delete mode 100644 hypha/apply/utils/templates/apply/403.html
 delete mode 100644 hypha/apply/utils/templates/apply/404.html
 create mode 100644 hypha/core/migrations/0003_initial.py
 create mode 100644 hypha/core/migrations/0004_move_system_settings_data.py
 create mode 100644 hypha/core/models/__init__.py
 rename hypha/{public/utils/models.py => core/models/system_settings.py} (96%)
 create mode 100644 hypha/public/utils/migrations/0013_delete_systemmessagessettings.py

diff --git a/hypha/apply/funds/templates/funds/round.html b/hypha/apply/funds/templates/funds/round.html
index c3b5e925c..7bb3cb704 100644
--- a/hypha/apply/funds/templates/funds/round.html
+++ b/hypha/apply/funds/templates/funds/round.html
@@ -6,8 +6,8 @@
 
 {% block header_menu %}
     <section class="header__menus header__menus--desktop">
-        {% if settings.utils.SystemMessagesSettings.nav_content %}
-            {{ settings.utils.SystemMessagesSettings.nav_content|safe }}
+        {% if settings.core.SystemSettings.nav_content %}
+            {{ settings.core.SystemSettings.nav_content|safe }}
         {% else %}
             {% include "core/navigation/primarynav-apply.html" %}
         {% endif %}
diff --git a/hypha/apply/utils/templates/apply/403.html b/hypha/apply/utils/templates/apply/403.html
deleted file mode 100644
index dc66c5815..000000000
--- a/hypha/apply/utils/templates/apply/403.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% extends "base-apply.html" %}
-{% load wagtailcore_tags wagtailsettings_tags %}
-
-{% block title %}{{ settings.utils.SystemMessagesSettings.title_403 }}{% endblock %}
-
-{% block body_class %}template-403{% endblock %}
-
-{% block content %}
-    <div class="wrapper wrapper--small wrapper--inner-space-large">
-        <h1>{{ settings.utils.SystemMessagesSettings.title_403 }}</h1>
-        <div class="rich-text">{{ settings.utils.SystemMessagesSettings.body_403|richtext }}</div>
-    </div>
-{% endblock %}
diff --git a/hypha/apply/utils/templates/apply/404.html b/hypha/apply/utils/templates/apply/404.html
deleted file mode 100644
index 52077dd82..000000000
--- a/hypha/apply/utils/templates/apply/404.html
+++ /dev/null
@@ -1,15 +0,0 @@
-{% extends "base-apply.html" %}
-{% load wagtailcore_tags wagtailsettings_tags %}
-
-{% block title %}{{ settings.utils.SystemMessagesSettings.title_404 }}{% endblock %}
-
-{% block body_class %}template-404{% endblock %}
-
-{% block content %}
-    <div class="wrapper wrapper--small wrapper--inner-space-large">
-        <h1>{{ settings.utils.SystemMessagesSettings.title_404 }}</h1>
-        <p>If you typed the web address, check it is correct.</p>
-        <p>If you pasted the web address, check you copied the entire address.</p>
-        <div class="rich-text">{{ settings.utils.SystemMessagesSettings.body_404|richtext }}</div>
-    </div>
-{% endblock %}
diff --git a/hypha/apply/utils/views.py b/hypha/apply/utils/views.py
index a3bc8f408..f04e933d3 100644
--- a/hypha/apply/utils/views.py
+++ b/hypha/apply/utils/views.py
@@ -5,7 +5,6 @@ from django.http import HttpResponseForbidden
 from django.shortcuts import get_object_or_404, redirect
 from django.utils.decorators import method_decorator
 from django.utils.translation import gettext as _
-from django.views import defaults
 from django.views.generic import View
 from django.views.generic.base import ContextMixin
 from django.views.generic.detail import SingleObjectTemplateResponseMixin
@@ -16,18 +15,6 @@ from wagtail.admin.views.pages.delete import delete
 from wagtail.models import Page
 
 
-def page_not_found(request, exception=None, template_name="apply/404.html"):
-    if not request.user.is_authenticated:
-        template_name = "404.html"
-    return defaults.page_not_found(request, exception, template_name)
-
-
-def permission_denied(request, exception=None, template_name="apply/403.html"):
-    if not request.user.is_authenticated:
-        template_name = "403.html"
-    return defaults.permission_denied(request, exception, template_name)
-
-
 @method_decorator(login_required, name="dispatch")
 class ViewDispatcher(View):
     admin_view: View = None
diff --git a/hypha/core/migrations/0003_initial.py b/hypha/core/migrations/0003_initial.py
new file mode 100644
index 000000000..ed0a721f0
--- /dev/null
+++ b/hypha/core/migrations/0003_initial.py
@@ -0,0 +1,110 @@
+# Generated by Django 4.2.11 on 2024-03-11 08:01
+
+from django.db import migrations, models
+import django.db.models.deletion
+import wagtail.fields
+
+
+class Migration(migrations.Migration):
+    initial = True
+
+    dependencies = [
+        ("images", "0006_alter_rendition_file"),
+        ("core", "0002_auto_20240215_remove_mailhimp"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="SystemSettings",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "site_logo_link",
+                    models.URLField(
+                        blank=True,
+                        default="",
+                        help_text='Link for the site logo, e.g. "https://www.example.org/". If not set, defaults to page with slug set to "home".',
+                    ),
+                ),
+                (
+                    "nav_content",
+                    models.TextField(
+                        blank=True,
+                        help_text="This will overwrite the default front page navigation bar, html tags is allowed.",
+                        verbose_name="Front page navigation content",
+                    ),
+                ),
+                (
+                    "footer_content",
+                    models.TextField(
+                        blank=True,
+                        default="<p>Configure this text in Wagtail admin -> Settings -> System settings.</p>",
+                        help_text="This will be added to the footer, html tags is allowed.",
+                        verbose_name="Footer content",
+                    ),
+                ),
+                (
+                    "title_404",
+                    models.CharField(
+                        default="Page not found", max_length=255, verbose_name="Title"
+                    ),
+                ),
+                (
+                    "body_404",
+                    wagtail.fields.RichTextField(
+                        default="<p>You may be trying to find a page that doesn&rsquo;t exist or has been moved.</p>",
+                        verbose_name="Text",
+                    ),
+                ),
+                (
+                    "title_403",
+                    models.CharField(
+                        default="Permission Denied",
+                        max_length=255,
+                        verbose_name="Title",
+                    ),
+                ),
+                (
+                    "body_403",
+                    wagtail.fields.RichTextField(
+                        default="<p>You might not have access to the requested resource.</p>",
+                        verbose_name="Text",
+                    ),
+                ),
+                (
+                    "site_logo_default",
+                    models.ForeignKey(
+                        blank=True,
+                        help_text="Default site logo",
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="images.customimage",
+                    ),
+                ),
+                (
+                    "site_logo_mobile",
+                    models.ForeignKey(
+                        blank=True,
+                        help_text="Mobil site logo (if not set default will be used)",
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="images.customimage",
+                    ),
+                ),
+            ],
+            options={
+                "verbose_name": "System settings",
+                "db_table": "system_settings",
+            },
+        ),
+    ]
diff --git a/hypha/core/migrations/0004_move_system_settings_data.py b/hypha/core/migrations/0004_move_system_settings_data.py
new file mode 100644
index 000000000..5331655c8
--- /dev/null
+++ b/hypha/core/migrations/0004_move_system_settings_data.py
@@ -0,0 +1,42 @@
+# Generated by Django 4.2.11 on 2024-03-11 08:02
+
+from django.db import migrations
+
+
+def copy_public_system_messages_settings(apps, schema_editor):
+    if not apps.is_installed("utils"):
+        return
+
+    SystemSettings = apps.get_model("core", "SystemSettings")
+    PublicSystemMessages = apps.get_model("utils", "SystemMessagesSettings")
+
+    for old_settings in PublicSystemMessages.objects.all():
+        SystemSettings.objects.create(
+            site_logo_default=old_settings.site_logo_default,
+            site_logo_mobile=old_settings.site_logo_mobile,
+            site_logo_link=old_settings.site_logo_link,
+            nav_content=old_settings.nav_content,
+            footer_content=old_settings.footer_content,
+            title_404=old_settings.title_404,
+            body_404=old_settings.body_404,
+            title_403=old_settings.title_403,
+            body_403=old_settings.body_403,
+        )
+
+
+def reverse_copy_public_system_messages_settings(apps, schema_editor):
+    SystemSettings = apps.get_model("core", "SystemSettings")
+    SystemSettings.objects.all().delete()
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("core", "0003_initial"),
+    ]
+
+    operations = [
+        migrations.RunPython(
+            copy_public_system_messages_settings,
+            reverse_copy_public_system_messages_settings,
+        ),
+    ]
diff --git a/hypha/core/models/__init__.py b/hypha/core/models/__init__.py
new file mode 100644
index 000000000..3cfea00fc
--- /dev/null
+++ b/hypha/core/models/__init__.py
@@ -0,0 +1,3 @@
+from .system_settings import SystemSettings
+
+__all__ = ["SystemSettings"]
diff --git a/hypha/public/utils/models.py b/hypha/core/models/system_settings.py
similarity index 96%
rename from hypha/public/utils/models.py
rename to hypha/core/models/system_settings.py
index 591759fec..f3307bc7b 100644
--- a/hypha/public/utils/models.py
+++ b/hypha/core/models/system_settings.py
@@ -12,11 +12,10 @@ from wagtail.fields import RichTextField
 
 
 @register_setting
-class SystemMessagesSettings(BaseGenericSetting):
-    wagtail_reference_index_ignore = True
-
+class SystemSettings(BaseGenericSetting):
     class Meta:
         verbose_name = "System settings"
+        db_table = "system_settings"
 
     site_logo_default = models.ForeignKey(
         "images.CustomImage",
diff --git a/hypha/home/templates/apply_home/apply_home_page.html b/hypha/home/templates/apply_home/apply_home_page.html
index 3b870184d..8fcf67bb8 100644
--- a/hypha/home/templates/apply_home/apply_home_page.html
+++ b/hypha/home/templates/apply_home/apply_home_page.html
@@ -3,8 +3,8 @@
 
 {% block header_menu %}
     <section class="header__menus header__menus--desktop">
-        {% if settings.utils.SystemMessagesSettings.nav_content %}
-            {{ settings.utils.SystemMessagesSettings.nav_content|safe }}
+        {% if settings.core.SystemSettings.nav_content %}
+            {{ settings.core.SystemSettings.nav_content|safe }}
         {% else %}
             {% include "core/navigation/primarynav-apply.html" %}
         {% endif %}
diff --git a/hypha/public/utils/migrations/0013_delete_systemmessagessettings.py b/hypha/public/utils/migrations/0013_delete_systemmessagessettings.py
new file mode 100644
index 000000000..7b15311ac
--- /dev/null
+++ b/hypha/public/utils/migrations/0013_delete_systemmessagessettings.py
@@ -0,0 +1,16 @@
+# Generated by Django 4.2.11 on 2024-03-11 16:36
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("utils", "0012_alter_systemmessagessettings_footer_content"),
+        ("core", "0004_move_system_settings_data"),
+    ]
+
+    operations = [
+        migrations.DeleteModel(
+            name="SystemMessagesSettings",
+        ),
+    ]
diff --git a/hypha/templates/403.html b/hypha/templates/403.html
index 6a457099a..eda2005db 100644
--- a/hypha/templates/403.html
+++ b/hypha/templates/403.html
@@ -1,13 +1,13 @@
-{% extends "base.html" %}
+{% extends "base-apply.html" %}
 {% load wagtailcore_tags wagtailsettings_tags %}
 
-{% block title %}{{ settings.utils.SystemMessagesSettings.title_403 }}{% endblock %}
+{% block title %}{{ settings.core.SystemSettings.title_403 }}{% endblock %}
 
 {% block body_class %}template-403{% endblock %}
 
 {% block content %}
     <div class="wrapper wrapper--small wrapper--inner-space-large">
-        <h1>{{ settings.utils.SystemMessagesSettings.title_403 }}</h1>
-        <div class="rich-text">{{ settings.utils.SystemMessagesSettings.body_403|richtext }}</div>
+        <h1>{{ settings.core.SystemSettings.title_403 }}</h1>
+        <div class="rich-text">{{ settings.core.SystemSettings.body_403|richtext }}</div>
     </div>
 {% endblock %}
diff --git a/hypha/templates/404.html b/hypha/templates/404.html
index 7807d6b1e..efd09bcee 100644
--- a/hypha/templates/404.html
+++ b/hypha/templates/404.html
@@ -1,13 +1,13 @@
-{% extends "base.html" %}
+{% extends "base-apply.html" %}
 {% load wagtailcore_tags wagtailsettings_tags %}
 
-{% block title %}{{ settings.utils.SystemMessagesSettings.title_404 }}{% endblock %}
+{% block title %}{{ settings.core.SystemSettings.title_404 }}{% endblock %}
 
 {% block body_class %}template-404{% endblock %}
 
 {% block content %}
     <div class="wrapper wrapper--small wrapper--inner-space-large">
-        <h1>{{ settings.utils.SystemMessagesSettings.title_404 }}</h1>
-        <div class="rich-text">{{ settings.utils.SystemMessagesSettings.body_404|richtext }}</div>
+        <h1>{{ settings.core.SystemSettings.title_404 }}</h1>
+        <div class="rich-text">{{ settings.core.SystemSettings.body_404|richtext }}</div>
     </div>
 {% endblock %}
diff --git a/hypha/templates/base-apply.html b/hypha/templates/base-apply.html
index 0c393448e..d10900a31 100644
--- a/hypha/templates/base-apply.html
+++ b/hypha/templates/base-apply.html
@@ -4,26 +4,26 @@
 {% block header %}
     <header class="header">
         <div class="header__inner wrapper wrapper--large">
-            <a href="{{ settings.utils.SystemMessagesSettings.site_logo_link|default:"/" }}" aria-label="{% trans "Home link" %}">
-                {% if settings.utils.SystemMessagesSettings.site_logo_default %}
-                    {% image settings.utils.SystemMessagesSettings.site_logo_default width-215 as logo_default %}
+            <a href="{{ settings.core.SystemSettings.site_logo_link|default:"/" }}" aria-label="{% trans "Home link" %}">
+                {% if settings.core.SystemSettings.site_logo_default %}
+                    {% image settings.core.SystemSettings.site_logo_default width-215 as logo_default %}
                     <img class="header__logo header__logo--desktop"
                          width="215"
                          src="{{ logo_default.url }}"
-                         alt="{{ settings.utils.SystemMessagesSettings.site_logo_default.alt }}"
+                         alt="{{ settings.core.SystemSettings.site_logo_default.alt }}"
                     >
-                    {% if settings.utils.SystemMessagesSettings.site_logo_mobile %}
-                        {% image settings.utils.SystemMessagesSettings.site_logo_mobile width-60 as logo_mobile %}
+                    {% if settings.core.SystemSettings.site_logo_mobile %}
+                        {% image settings.core.SystemSettings.site_logo_mobile width-60 as logo_mobile %}
                         <img class="header__logo header__logo--mobile"
                              width="60"
                              src="{{ logo_mobile.url }}"
-                             alt="{{ settings.utils.SystemMessagesSettings.site_logo_mobile.alt }}"
+                             alt="{{ settings.core.SystemSettings.site_logo_mobile.alt }}"
                         >
                     {% else %}
                         <img class="header__logo header__logo--mobile"
                              width="60"
                              src="{{ logo_default.url }}"
-                             alt="{{ settings.utils.SystemMessagesSettings.site_logo_default.alt }}"
+                             alt="{{ settings.core.SystemSettings.site_logo_default.alt }}"
                         >
                     {% endif %}
                 {% else %}
@@ -62,13 +62,13 @@
 
             <section class="header__menus header__menus--mobile">
                 <div class="header__inner header__inner--menu-open">
-                    <a href="{{ settings.utils.SystemMessagesSettings.site_logo_link|default:"/" }}" aria-label="Home link">
-                        {% if settings.utils.SystemMessagesSettings.site_logo_mobile %}
-                            {% image settings.utils.SystemMessagesSettings.site_logo_mobile width-60 as logo_mobile %}
+                    <a href="{{ settings.core.SystemSettings.site_logo_link|default:"/" }}" aria-label="Home link">
+                        {% if settings.core.SystemSettings.site_logo_mobile %}
+                            {% image settings.core.SystemSettings.site_logo_mobile width-60 as logo_mobile %}
                             <img class="header__logo header__logo--mobile"
                                  width="60"
                                  src="{{ logo_mobile.url }}"
-                                 alt="{{ settings.utils.SystemMessagesSettings.site_logo_mobile.alt }}"
+                                 alt="{{ settings.core.SystemSettings.site_logo_mobile.alt }}"
                             >
                         {% else %}
                             <img class="header__logo header__logo--mobile"
@@ -133,10 +133,10 @@
 {% endblock header %}
 
 {% block footer %}
-    {% if settings.utils.SystemMessagesSettings.footer_content %}
+    {% if settings.core.SystemSettings.footer_content %}
         <footer class="footer px-4 py-10 shrink-0  bg-dark-blue">
             <div class="wrapper wrapper--large prose prose-invert max-w-none text-white">
-                {{ settings.utils.SystemMessagesSettings.footer_content|safe }}
+                {{ settings.core.SystemSettings.footer_content|safe }}
             </div>
         </footer>
     {% endif %}
diff --git a/hypha/templates/styleguide.html b/hypha/templates/styleguide.html
index fa572c662..5cb8677df 100644
--- a/hypha/templates/styleguide.html
+++ b/hypha/templates/styleguide.html
@@ -38,11 +38,11 @@
 
             <div class="header__inner wrapper wrapper--large">
                 <a href="{% site_logo_link current_site %}" aria-label="Home link">
-                    {% if settings.utils.SystemMessagesSettings.site_logo_default %}
-                        {% image settings.utils.SystemMessagesSettings.site_logo_default width-215 as logo_default %}
+                    {% if settings.core.SystemSettings.site_logo_default %}
+                        {% image settings.core.SystemSettings.site_logo_default width-215 as logo_default %}
                         <img class="header__logo header__logo--desktop" src="{{ logo_default.url }}">
-                        {% if settings.utils.SystemMessagesSettings.site_logo_mobile %}
-                            {% image settings.utils.SystemMessagesSettings.site_logo_mobile width-60 as logo_mobile %}
+                        {% if settings.core.SystemSettings.site_logo_mobile %}
+                            {% image settings.core.SystemSettings.site_logo_mobile width-60 as logo_mobile %}
                             <img class="header__logo header__logo--mobile" src="{{ logo_mobile.url }}">
                         {% else %}
                             <img class="header__logo header__logo--mobile" src="{{ logo_default.url }}">
diff --git a/hypha/urls.py b/hypha/urls.py
index f7f50a6b1..b1e18c027 100644
--- a/hypha/urls.py
+++ b/hypha/urls.py
@@ -17,9 +17,6 @@ from hypha.apply.users.urls import urlpatterns as user_urls
 from hypha.apply.users.views import become
 from hypha.apply.utils.views import custom_wagtail_page_delete
 
-handler404 = "hypha.apply.utils.views.page_not_found"
-handler403 = "hypha.apply.utils.views.permission_denied"
-
 urlpatterns = [
     path("apply/", include("hypha.apply.funds.urls", "apply")),
     path("activity/", include("hypha.apply.activity.urls", "activity")),
@@ -54,15 +51,31 @@ if settings.HIJACK_ENABLE:
 if settings.DEBUG:
     from django.conf.urls.static import static
     from django.contrib.staticfiles.urls import staticfiles_urlpatterns
+    from django.urls import get_callable
+    from django.views import defaults as dj_default_views
 
     # Serve static and media files from development server
     urlpatterns += staticfiles_urlpatterns()
     urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
 
     urlpatterns += [
-        # Add views for testing 404 and 500 templates
-        path("test404/", TemplateView.as_view(template_name="404.html")),
-        path("test500/", TemplateView.as_view(template_name="500.html")),
+        path(
+            "test400/",
+            dj_default_views.bad_request,
+            kwargs={"exception": Exception("Bad Request!")},
+        ),
+        path(
+            "test403/",
+            dj_default_views.permission_denied,
+            kwargs={"exception": Exception("Permission Denied!")},
+        ),
+        path("test403_csrf/", get_callable(settings.CSRF_FAILURE_VIEW)),
+        path(
+            "test404/",
+            dj_default_views.page_not_found,
+            kwargs={"exception": Exception("Not Found!")},
+        ),
+        path("test500/", dj_default_views.server_error),
     ]
 
 if settings.DEBUG or settings.ENABLE_STYLEGUIDE:
-- 
GitLab