Remove python-dateutil dependency (#1265)

This commit is contained in:
Sascha Ißbrücker
2026-01-04 13:16:33 +01:00
committed by GitHub
parent 5da450ce96
commit 7dfb8126c4
5 changed files with 37 additions and 42 deletions

View File

@@ -1,6 +1,5 @@
import datetime
from dateutil.relativedelta import relativedelta
from django.contrib.auth.models import AnonymousUser
from django.http import HttpResponse
from django.template import RequestContext, Template
@@ -285,7 +284,7 @@ class BookmarkListTemplateTest(TestCase, BookmarkFactoryMixin, HtmlTestMixin):
self, date_display_setting: str, web_archive_url: str = ""
):
bookmark = self.setup_bookmark()
bookmark.date_added = timezone.now() - relativedelta(days=8)
bookmark.date_added = timezone.now() - datetime.timedelta(days=8)
bookmark.web_archive_snapshot_url = web_archive_url
bookmark.save()
user = self.get_or_create_test_user()
@@ -554,7 +553,7 @@ class BookmarkListTemplateTest(TestCase, BookmarkFactoryMixin, HtmlTestMixin):
def test_web_archive_link_target_should_be_blank_by_default(self):
bookmark = self.setup_bookmark()
bookmark.date_added = timezone.now() - relativedelta(days=8)
bookmark.date_added = timezone.now() - datetime.timedelta(days=8)
bookmark.web_archive_snapshot_url = "https://example.com"
bookmark.save()
@@ -570,7 +569,7 @@ class BookmarkListTemplateTest(TestCase, BookmarkFactoryMixin, HtmlTestMixin):
profile.save()
bookmark = self.setup_bookmark()
bookmark.date_added = timezone.now() - relativedelta(days=8)
bookmark.date_added = timezone.now() - datetime.timedelta(days=8)
bookmark.web_archive_snapshot_url = "https://example.com"
bookmark.save()
@@ -998,7 +997,7 @@ class BookmarkListTemplateTest(TestCase, BookmarkFactoryMixin, HtmlTestMixin):
profile.save()
bookmark = self.setup_bookmark()
bookmark.date_added = timezone.now() - relativedelta(days=8)
bookmark.date_added = timezone.now() - datetime.timedelta(days=8)
bookmark.web_archive_snapshot_url = (
"https://web.archive.org/web/20230531200136/https://example.com"
)
@@ -1099,7 +1098,7 @@ class BookmarkListTemplateTest(TestCase, BookmarkFactoryMixin, HtmlTestMixin):
def test_no_actions_rendered_when_is_preview(self):
bookmark = self.setup_bookmark()
bookmark.date_added = timezone.now() - relativedelta(days=8)
bookmark.date_added = timezone.now() - datetime.timedelta(days=8)
bookmark.web_archive_snapshot_url = "https://example.com"
bookmark.save()

View File

@@ -1,6 +1,5 @@
from unittest.mock import patch
from dateutil.relativedelta import relativedelta
from django.test import TestCase
from django.utils import timezone
@@ -152,30 +151,15 @@ class UtilsTestCase(TestCase):
def test_parse_timestamp_parses_millisecond_timestamps(self):
now = timezone.now().replace(microsecond=0)
fifty_years_ago = now - relativedelta(year=50)
fifty_years_from_now = now + relativedelta(year=50)
self.verify_timestamp(now)
self.verify_timestamp(fifty_years_ago)
self.verify_timestamp(fifty_years_from_now)
def test_parse_timestamp_parses_microsecond_timestamps(self):
now = timezone.now().replace(microsecond=0)
fifty_years_ago = now - relativedelta(year=50)
fifty_years_from_now = now + relativedelta(year=50)
self.verify_timestamp(now, 1000)
self.verify_timestamp(fifty_years_ago, 1000)
self.verify_timestamp(fifty_years_from_now, 1000)
def test_parse_timestamp_parses_nanosecond_timestamps(self):
now = timezone.now().replace(microsecond=0)
fifty_years_ago = now - relativedelta(year=50)
fifty_years_from_now = now + relativedelta(year=50)
self.verify_timestamp(now, 1000000)
self.verify_timestamp(fifty_years_ago, 1000000)
self.verify_timestamp(fifty_years_from_now, 1000000)
def test_parse_timestamp_fails_for_out_of_range_timestamp(self):
now = timezone.now().replace(microsecond=0)

View File

@@ -3,8 +3,8 @@ import logging
import re
import unicodedata
import urllib.parse
from dataclasses import dataclass
from dateutil.relativedelta import relativedelta
from django.conf import settings
from django.http import HttpResponseRedirect
from django.template.defaultfilters import pluralize
@@ -33,13 +33,40 @@ weekday_names = {
}
@dataclass
class DateDelta:
years: int
months: int
weeks: int
def _calculate_date_delta(
now: datetime.datetime, value: datetime.datetime
) -> DateDelta:
"""Calculate the difference between two datetimes in years, months, and weeks."""
# Full calendar years
years = now.year - value.year
if (now.month, now.day) < (value.month, value.day):
years -= 1
# Full calendar months
months = (now.year - value.year) * 12 + (now.month - value.month)
if now.day < value.day:
months -= 1
# Weeks from total days
weeks = (now - value).days // 7
return DateDelta(years=max(0, years), months=max(0, months), weeks=max(0, weeks))
def humanize_absolute_date(
value: datetime.datetime, now: datetime.datetime | None = None
):
if not now:
now = timezone.now()
delta = relativedelta(now, value)
yesterday = now - relativedelta(days=1)
delta = _calculate_date_delta(now, value)
yesterday = now - datetime.timedelta(days=1)
is_older_than_a_week = delta.years > 0 or delta.months > 0 or delta.weeks > 0
@@ -58,7 +85,7 @@ def humanize_relative_date(
):
if not now:
now = timezone.now()
delta = relativedelta(now, value)
delta = _calculate_date_delta(now, value)
if delta.years > 0:
return f"{delta.years} year{pluralize(delta.years)} ago"
@@ -67,7 +94,7 @@ def humanize_relative_date(
elif delta.weeks > 0:
return f"{delta.weeks} week{pluralize(delta.weeks)} ago"
else:
yesterday = now - relativedelta(days=1)
yesterday = now - datetime.timedelta(days=1)
if value.day == now.day:
return "Today"
elif value.day == yesterday.day: