52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
import datetime
|
|
|
|
from django.urls.converters import StringConverter
|
|
from django.utils.safestring import mark_safe
|
|
|
|
__all__ = ("PagePathConverter", "WeekConverter", "DateConverter")
|
|
|
|
|
|
class PagePathConverter(StringConverter):
|
|
"""Match path for pages, including surrounding slashes."""
|
|
|
|
regex = r"/?|([-_a-zA-Z0-9]+/)*?"
|
|
|
|
def to_python(self, value):
|
|
if not value or value[0] != "/":
|
|
value = "/" + value
|
|
if len(value) > 1 and value[-1] != "/":
|
|
value = value + "/"
|
|
return value
|
|
|
|
def to_url(self, value):
|
|
if value[0] == "/":
|
|
value = value[1:]
|
|
if value[-1] != "/":
|
|
value = value + "/"
|
|
return mark_safe(value)
|
|
|
|
|
|
class WeekConverter:
|
|
"""Converter for date as YYYYY/WW."""
|
|
|
|
regex = r"[0-9]{4}/[0-9]{2}"
|
|
|
|
def to_python(self, value):
|
|
return datetime.datetime.strptime(value + "/1", "%G/%V/%u").date()
|
|
|
|
def to_url(self, value):
|
|
return value if isinstance(value, str) else "{:04d}/{:02d}".format(*value.isocalendar())
|
|
|
|
|
|
class DateConverter:
|
|
"""Converter for date as YYYY/MM/DD."""
|
|
|
|
regex = r"[0-9]{4}/[0-9]{2}/[0-9]{2}"
|
|
|
|
def to_python(self, value):
|
|
value = value.split("/")[:3]
|
|
return datetime.date(int(value[0]), int(value[1]), int(value[2]))
|
|
|
|
def to_url(self, value):
|
|
return value if isinstance(value, str) else "{:04d}/{:02d}/{:02d}".format(value.year, value.month, value.day)
|