diff --git a/src/servala/frontend/templates/403.html b/src/servala/frontend/templates/403.html new file mode 100644 index 0000000..74200cf --- /dev/null +++ b/src/servala/frontend/templates/403.html @@ -0,0 +1,9 @@ +{% extends "error_base.html" %} + +{% block title %}403 - Access Forbidden{% endblock title %} + +{% block error_alt %}Access Forbidden{% endblock error_alt %} + +{% block error_title %}Access Forbidden{% endblock error_title %} + +{% block error_message %}You are not authorized to access this page.{% endblock error_message %} \ No newline at end of file diff --git a/src/servala/frontend/templates/404.html b/src/servala/frontend/templates/404.html new file mode 100644 index 0000000..6de2a23 --- /dev/null +++ b/src/servala/frontend/templates/404.html @@ -0,0 +1,9 @@ +{% extends "error_base.html" %} + +{% block title %}404 - Page Not Found{% endblock title %} + +{% block error_alt %}Not Found{% endblock error_alt %} + +{% block error_title %}Page Not Found{% endblock error_title %} + +{% block error_message %}The page you are looking for could not be found.{% endblock error_message %} \ No newline at end of file diff --git a/src/servala/frontend/templates/500.html b/src/servala/frontend/templates/500.html new file mode 100644 index 0000000..7e42311 --- /dev/null +++ b/src/servala/frontend/templates/500.html @@ -0,0 +1,9 @@ +{% extends "error_base.html" %} + +{% block title %}500 - Server Error{% endblock title %} + +{% block error_alt %}Server Error{% endblock error_alt %} + +{% block error_title %}Server Error{% endblock error_title %} + +{% block error_message %}The website is currently unavailable. Please try again later or contact support.{% endblock error_message %} \ No newline at end of file diff --git a/src/servala/frontend/templates/error_base.html b/src/servala/frontend/templates/error_base.html new file mode 100644 index 0000000..1f05b3e --- /dev/null +++ b/src/servala/frontend/templates/error_base.html @@ -0,0 +1,33 @@ +{% load static %} + + + + + + {% block title %}Error{% endblock title %} - Servala + + + + + + +
+
+
+
+ Sir Vala - {% block error_alt %}Error{% endblock error_alt %} +

{% block error_title %}Error{% endblock error_title %}

+

{% block error_message %}An error occurred.{% endblock error_message %}

+ Go Home +
+
+
+
+ + \ No newline at end of file diff --git a/src/servala/frontend/urls.py b/src/servala/frontend/urls.py index 6ab6949..490c9ce 100644 --- a/src/servala/frontend/urls.py +++ b/src/servala/frontend/urls.py @@ -1,3 +1,4 @@ +from django.conf import settings from django.urls import include, path from django.views.generic import RedirectView @@ -64,4 +65,18 @@ urlpatterns = [ ), ), path("", RedirectView.as_view(pattern_name="frontend:profile"), name="index"), + # Error page URLs available in all environments + path( + "error404/", + views.custom_404, + {"exception": Exception("Test 404")}, + name="error_404", + ), + path( + "error403/", + views.custom_403, + {"exception": Exception("Test 403")}, + name="error_403", + ), + path("error500/", views.custom_500, name="error_500"), ] diff --git a/src/servala/frontend/views/__init__.py b/src/servala/frontend/views/__init__.py index cc43552..98b23a3 100644 --- a/src/servala/frontend/views/__init__.py +++ b/src/servala/frontend/views/__init__.py @@ -1,5 +1,5 @@ from .auth import LogoutView -from .generic import IndexView, ProfileView +from .generic import IndexView, ProfileView, custom_403, custom_404, custom_500 from .organization import ( OrganizationCreateView, OrganizationDashboardView, @@ -29,4 +29,7 @@ __all__ = [ "ServiceListView", "ServiceOfferingDetailView", "ProfileView", + "custom_404", + "custom_403", + "custom_500", ] diff --git a/src/servala/frontend/views/generic.py b/src/servala/frontend/views/generic.py index a315851..7d1a3a0 100644 --- a/src/servala/frontend/views/generic.py +++ b/src/servala/frontend/views/generic.py @@ -1,4 +1,5 @@ from django.conf import settings +from django.shortcuts import render from django.urls import reverse_lazy from django.utils.functional import cached_property from django.views.generic import TemplateView @@ -42,3 +43,15 @@ class ProfileView(HtmxUpdateView): def form_valid(self, form): form.save() return super().form_valid(form) + + +def custom_404(request, exception): + return render(request, "404.html", status=404) + + +def custom_403(request, exception): + return render(request, "403.html", status=403) + + +def custom_500(request): + return render(request, "500.html", status=500) diff --git a/src/servala/static/img/sir-vala-notext.png b/src/servala/static/img/sir-vala-notext.png new file mode 100644 index 0000000..ba510c5 Binary files /dev/null and b/src/servala/static/img/sir-vala-notext.png differ diff --git a/src/servala/urls.py b/src/servala/urls.py index c37e288..ef23afb 100644 --- a/src/servala/urls.py +++ b/src/servala/urls.py @@ -26,3 +26,8 @@ urlpatterns = [ if settings.DEBUG: urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + +# Custom error handlers +handler404 = "servala.frontend.views.custom_404" +handler403 = "servala.frontend.views.custom_403" +handler500 = "servala.frontend.views.custom_500"