azube/core/util.py

69 lines
2 KiB
Python
Raw Normal View History

2024-12-03 11:38:13 +01:00
import datetime
2024-12-05 17:03:42 +01:00
from django.template.loader import render_to_string
from django.shortcuts import render
from django.http import HttpResponse
2024-12-03 11:38:13 +01:00
def next_date(year: int, week: int) -> (int, int):
if week >= 52:
return (year + 1, 1)
else:
return (year, week + 1)
def first_day_of_iso_week(year, week):
# Create a date object for January 4th of the given year
# This date is always in the first week of the year according to ISO 8601
jan4 = datetime.datetime(year, 1, 4)
# Get the ISO week number and the weekday of January 4th
start_iso_week, start_iso_day = jan4.isocalendar()[1:3]
# Calculate the difference in weeks, then adjust for the start of the week
weeks_diff = week - start_iso_week
days_to_monday = datetime.timedelta(days=(1 - start_iso_day))
# Calculate the first day of the given ISO week
return jan4 + days_to_monday + datetime.timedelta(weeks=weeks_diff)
def get_week_range(p_year, p_week):
firstdayofweek = datetime.datetime.strptime(
f"{p_year}-W{int(p_week)}-1", "%Y-W%W-%w"
).date()
lastdayofweek = firstdayofweek + datetime.timedelta(days=6.9)
return firstdayofweek, lastdayofweek
2024-12-05 17:03:42 +01:00
def is_htmx_request(request) -> bool:
return request.headers.get("HX-Request") is not None
def title(t):
return f"""
<script>
document.getElementById('page_title').innerHTML = '{t}';
document.getElementById('page_banner_title').innerHTML = '{t}';
</script>
"""
def htmx_request(request, content_template, vars, page_title):
vars["title"] = title(page_title)
vars["htmx"] = is_htmx_request(request)
main_content = render_to_string(content_template, vars, request=request)
if is_htmx_request(request):
return HttpResponse(main_content, content_type="text/html")
else:
return render(
request,
"shell.html",
{
"title": page_title,
"main_content": main_content,
},
)