1
0
Fork 0
forked from github/pelican

Replace pytz dependency with zoneinfo. Fix #2958 (#3161)

This commit is contained in:
Will Thong 2023-07-26 16:29:43 +01:00 committed by GitHub
commit 1d2bf8e96e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 33 additions and 23 deletions

View file

@ -4,10 +4,15 @@ import locale
import logging
import os
import re
from datetime import timezone
from html import unescape
from urllib.parse import unquote, urljoin, urlparse, urlunparse
import pytz
try:
import zoneinfo
except ModuleNotFoundError:
from backports import zoneinfo
from pelican.plugins import signals
from pelican.settings import DEFAULT_CONFIG
@ -120,9 +125,9 @@ class Content:
self.date_format = self.date_format[1]
# manage timezone
default_timezone = settings.get('TIMEZONE', 'UTC')
timezone = getattr(self, 'timezone', default_timezone)
self.timezone = pytz.timezone(timezone)
default_timezone = settings.get("TIMEZONE", "UTC")
timezone = getattr(self, "timezone", default_timezone)
self.timezone = zoneinfo.ZoneInfo(timezone)
if hasattr(self, 'date'):
self.date = set_date_tzinfo(self.date, timezone)
@ -525,7 +530,7 @@ class Article(Content):
if self.date.tzinfo is None:
now = datetime.datetime.now()
else:
now = datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
now = datetime.datetime.utcnow().replace(tzinfo=timezone.utc)
if self.date > now:
self.status = 'draft'

View file

@ -7,7 +7,10 @@ from typing import Mapping
from jinja2 import Environment, FileSystemLoader
import pytz
try:
import zoneinfo
except ModuleNotFoundError:
from backports import zoneinfo
try:
import readline # NOQA
@ -17,8 +20,8 @@ except ImportError:
try:
import tzlocal
_DEFAULT_TIMEZONE = tzlocal.get_localzone().zone
except ImportError:
_DEFAULT_TIMEZONE = 'Europe/Rome'
except ModuleNotFoundError:
_DEFAULT_TIMEZONE = "Europe/Rome"
from pelican import __version__
@ -158,16 +161,15 @@ def ask(question, answer=str, default=None, length=None):
def ask_timezone(question, default, tzurl):
"""Prompt for time zone and validate input"""
lower_tz = [tz.lower() for tz in pytz.all_timezones]
tz_dict = {tz.lower(): tz for tz in zoneinfo.available_timezones()}
while True:
r = ask(question, str, default)
r = r.strip().replace(' ', '_').lower()
if r in lower_tz:
r = pytz.all_timezones[lower_tz.index(r)]
r = r.strip().replace(" ", "_").lower()
if r in tz_dict.keys():
r = tz_dict[r]
break
else:
print('Please enter a valid time zone:\n'
' (check [{}])'.format(tzurl))
print("Please enter a valid time zone:\n" " (check [{}])".format(tzurl))
return r

View file

@ -18,10 +18,12 @@ from operator import attrgetter
import dateutil.parser
try:
import zoneinfo
except ModuleNotFoundError:
from backports import zoneinfo
from markupsafe import Markup
import pytz
logger = logging.getLogger(__name__)
@ -919,10 +921,11 @@ class FileSystemWatcher:
def set_date_tzinfo(d, tz_name=None):
"""Set the timezone for dates that don't have tzinfo"""
if tz_name and not d.tzinfo:
tz = pytz.timezone(tz_name)
d = tz.localize(d)
return SafeDatetime(d.year, d.month, d.day, d.hour, d.minute, d.second,
d.microsecond, d.tzinfo)
timezone = zoneinfo.ZoneInfo(tz_name)
d = d.replace(tzinfo=timezone)
return SafeDatetime(
d.year, d.month, d.day, d.hour, d.minute, d.second, d.microsecond, d.tzinfo
)
return d