Skip to content

Commit

Permalink
Maintenance Banner and Error Page System (#4472)
Browse files Browse the repository at this point in the history
* Maintenance banner implemenation

* Maintenance banner for 2024/12/12

* Comment update

* Linting! Yippee!

* Adjust time for 2024/12/10 maintenance, better display banner dates

* Remove comment from maintenance template

* December 12 -> 10

* December 5th start date, rather than 7th.
  • Loading branch information
jperson1 authored Nov 22, 2024
1 parent 6a1667a commit 84cb81e
Show file tree
Hide file tree
Showing 7 changed files with 100 additions and 0 deletions.
9 changes: 9 additions & 0 deletions backend/audit/views/home.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from datetime import datetime, timezone
from django.conf import settings
from django.shortcuts import render, redirect
from django.urls import reverse
Expand Down Expand Up @@ -32,4 +33,12 @@ class Maintenance(generic.View):

def get(self, request, *args, **kwargs):
template_name = "503.html"

current_time = datetime.now(timezone.utc)
for date_range in settings.MAINTENANCE_BANNER_DATES:
if current_time > date_range.get("start") and current_time < date_range.get(
"end"
):
template_name = date_range.get("template_name", "503.html")

return render(request, template_name)
36 changes: 36 additions & 0 deletions backend/config/context_processors.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from config import settings
from datetime import datetime, timezone


def static_site_url(request):
Expand All @@ -23,3 +24,38 @@ def current_environment(request):
Used in determining the display of the TEST SITE Banner.
"""
return {"ENVIRONMENT": settings.ENVIRONMENT}


def maintenance_banner(request):
"""
Returns maintenance banner template context.
MAINTENANCE_BANNER is True if the banner should be displaying and False if not, based on settings.MAINTENANCE_BANNER_DATES.
MAINTENANCE_BANNER_START_TIME and MAINTENANCE_BANNER_END_TIME are None if the banner does not display.
MAINTENANCE_BANNER_MESSAGE is included if it exists alongside the banner dates.
"""
current_time = datetime.now(timezone.utc)
context = {
"MAINTENANCE_BANNER": False,
}

# For every designated date range:
# If any start or end time is unavailable, something is misconfigured. So, disable the banner.
# If we are within the specified timeframes, enable the banner.
for date_range in settings.MAINTENANCE_BANNER_DATES:
start_time = date_range.get("start")
end_time = date_range.get("end")

if not start_time or not end_time:
return context

if current_time > start_time and current_time < end_time:
context["MAINTENANCE_BANNER"] = True
context = context | {
"MAINTENANCE_BANNER_START_TIME": start_time,
"MAINTENANCE_BANNER_END_TIME": end_time,
"MAINTENANCE_BANNER_MESSAGE": date_range.get("message", ""),
}
return context

# Base case - we are not within any of the given timeframes. Disable the banner.
return context
5 changes: 5 additions & 0 deletions backend/config/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ def __call__(self, request):
Check that maintenance mode is disabled before running request.
"""

# Let icons through
if request.path == "/icons/sprite.svg":
response = self.get_response(request)
return response

# redirect to maintenance page.
if is_maintenance_on():
if request.path != "/maintenance":
Expand Down
17 changes: 17 additions & 0 deletions backend/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"""

from base64 import b64decode
from datetime import datetime, timezone
import os
import sys
import logging
Expand Down Expand Up @@ -161,6 +162,7 @@
"config.context_processors.static_site_url",
"config.context_processors.omb_num_exp_date",
"config.context_processors.current_environment",
"config.context_processors.maintenance_banner",
"report_submission.context_processors.certifiers_emails_must_not_match",
],
"builtins": [
Expand Down Expand Up @@ -580,3 +582,18 @@
# Keep sessions alive if the user is active
# https://docs.djangoproject.com/en/dev/ref/settings/#session-save-every-request
SESSION_SAVE_EVERY_REQUEST = True

# Times for the maintenance banner to display.
# Requires a 'start' and an 'end'.
# 'template_name' is optional, and defines what will display if maintenance mode is enabled during this timeframe. If no name is given, the 503 error page is used.
# 'message' is optional, and overrides the default banner message.
# The default message states that maintenance will be ongoing for the duration of the banners uptime. This may be true in an emergency. Otherwise, be sure to set a custom message.
MAINTENANCE_BANNER_DATES = [
{
# December 5th to 10th, noon EST, uploading historical audits
"start": datetime(2024, 12, 5, 17, tzinfo=timezone.utc),
"end": datetime(2024, 12, 10, 17, tzinfo=timezone.utc),
"template_name": "maintenance_20241210.html",
"message": "FAC.gov will be doing a site upgrade on Tuesday, December 10, 2024 between 12:00 p.m. and 6:00 p.m ET. During this period, the entire website will be unavailable.",
},
]
5 changes: 5 additions & 0 deletions backend/templates/includes/header.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
</div>
</section>
{% endif %}

{% if MAINTENANCE_BANNER %}
{% include "includes/maintenance_banner.html" %}
{% endif %}

<section class="usa-banner" aria-label="Official government website">
<div class="usa-accordion">
<header class="usa-banner__header">
Expand Down
15 changes: 15 additions & 0 deletions backend/templates/includes/maintenance_banner.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<section class="usa-alert usa-alert--warning margin-top-0" aria-label="Site alert">
<div class="usa-alert__body">
<h4 class="usa-alert__heading">Scheduled system upgrade</h4>

{% comment %} If a message is given, use it. If not, display a generic message with the timeframe. {% endcomment %}
<p class="usa-alert__text">
{% if MAINTENANCE_BANNER_MESSAGE %}
{{ MAINTENANCE_BANNER_MESSAGE }}
{% else %}
FAC.gov will be doing a site upgrade from {{ MAINTENANCE_BANNER_START_TIME|date:"N j, Y, f A" }} to {{ MAINTENANCE_BANNER_END_TIME|date:"N j, Y, f A" }}.
During this period, the entire website will be unavailable.
{% endif %}
</p>
</div>
</section>
13 changes: 13 additions & 0 deletions backend/templates/maintenance_20241210.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{% extends "base.html" %}
{% load sprite_helper %}
{% block content %}
<div class="display-flex flex-column flex-align-center margin-y-15">
<svg class="usa-icon usa-icon--size-7 text-error" focusable="false" role="img">
{% uswds_sprite "error" %}
</svg>
<h1 class="font-sans-2xl">Temporarily Down for System Maintenance</h1>
<p class="font-sans-lg margin-y-0">We are in the process of uploading historical audits to fac.gov.</p>
<p class="font-sans-lg margin-y-0">We should be back after December 10, 2024 at 6:00 p.m. ET.</p>
<p class="margin-top-10">Thank you for your patience. If you have any questions, please contact us via email at <a class="usa-link" href="mailto:FAC@gsa.gov">FAC@gsa.gov</a>.</p>
</div>
{% endblock content %}

0 comments on commit 84cb81e

Please sign in to comment.