mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Refs #32738 -- Removed django.utils.datetime_safe module per deprecation timeline.
This commit is contained in:
		| @@ -1,118 +0,0 @@ | |||||||
| # These classes override date and datetime to ensure that strftime('%Y') |  | ||||||
| # returns four digits (with leading zeros) on years < 1000. |  | ||||||
| # https://bugs.python.org/issue13305 |  | ||||||
| # |  | ||||||
| # Based on code submitted to comp.lang.python by Andrew Dalke |  | ||||||
| # |  | ||||||
| # >>> datetime_safe.date(10, 8, 2).strftime("%Y/%m/%d was a %A") |  | ||||||
| # '0010/08/02 was a Monday' |  | ||||||
|  |  | ||||||
| import time |  | ||||||
| import warnings |  | ||||||
| from datetime import date as real_date |  | ||||||
| from datetime import datetime as real_datetime |  | ||||||
|  |  | ||||||
| from django.utils.deprecation import RemovedInDjango50Warning |  | ||||||
| from django.utils.regex_helper import _lazy_re_compile |  | ||||||
|  |  | ||||||
| warnings.warn( |  | ||||||
|     "The django.utils.datetime_safe module is deprecated.", |  | ||||||
|     category=RemovedInDjango50Warning, |  | ||||||
|     stacklevel=2, |  | ||||||
| ) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class date(real_date): |  | ||||||
|     def strftime(self, fmt): |  | ||||||
|         return strftime(self, fmt) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class datetime(real_datetime): |  | ||||||
|     def strftime(self, fmt): |  | ||||||
|         return strftime(self, fmt) |  | ||||||
|  |  | ||||||
|     @classmethod |  | ||||||
|     def combine(cls, date, time): |  | ||||||
|         return cls( |  | ||||||
|             date.year, |  | ||||||
|             date.month, |  | ||||||
|             date.day, |  | ||||||
|             time.hour, |  | ||||||
|             time.minute, |  | ||||||
|             time.second, |  | ||||||
|             time.microsecond, |  | ||||||
|             time.tzinfo, |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|     def date(self): |  | ||||||
|         return date(self.year, self.month, self.day) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def new_date(d): |  | ||||||
|     "Generate a safe date from a datetime.date object." |  | ||||||
|     return date(d.year, d.month, d.day) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def new_datetime(d): |  | ||||||
|     """ |  | ||||||
|     Generate a safe datetime from a datetime.date or datetime.datetime object. |  | ||||||
|     """ |  | ||||||
|     kw = [d.year, d.month, d.day] |  | ||||||
|     if isinstance(d, real_datetime): |  | ||||||
|         kw.extend([d.hour, d.minute, d.second, d.microsecond, d.tzinfo]) |  | ||||||
|     return datetime(*kw) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # This library does not support strftime's "%s" or "%y" format strings. |  | ||||||
| # Allowed if there's an even number of "%"s because they are escaped. |  | ||||||
| _illegal_formatting = _lazy_re_compile(r"((^|[^%])(%%)*%[sy])") |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def _findall(text, substr): |  | ||||||
|     # Also finds overlaps |  | ||||||
|     sites = [] |  | ||||||
|     i = 0 |  | ||||||
|     while True: |  | ||||||
|         i = text.find(substr, i) |  | ||||||
|         if i == -1: |  | ||||||
|             break |  | ||||||
|         sites.append(i) |  | ||||||
|         i += 1 |  | ||||||
|     return sites |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def strftime(dt, fmt): |  | ||||||
|     if dt.year >= 1000: |  | ||||||
|         return super(type(dt), dt).strftime(fmt) |  | ||||||
|     illegal_formatting = _illegal_formatting.search(fmt) |  | ||||||
|     if illegal_formatting: |  | ||||||
|         raise TypeError( |  | ||||||
|             "strftime of dates before 1000 does not handle " + illegal_formatting[0] |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|     year = dt.year |  | ||||||
|     # For every non-leap year century, advance by |  | ||||||
|     # 6 years to get into the 28-year repeat cycle |  | ||||||
|     delta = 2000 - year |  | ||||||
|     off = 6 * (delta // 100 + delta // 400) |  | ||||||
|     year += off |  | ||||||
|  |  | ||||||
|     # Move to around the year 2000 |  | ||||||
|     year += ((2000 - year) // 28) * 28 |  | ||||||
|     timetuple = dt.timetuple() |  | ||||||
|     s1 = time.strftime(fmt, (year,) + timetuple[1:]) |  | ||||||
|     sites1 = _findall(s1, str(year)) |  | ||||||
|  |  | ||||||
|     s2 = time.strftime(fmt, (year + 28,) + timetuple[1:]) |  | ||||||
|     sites2 = _findall(s2, str(year + 28)) |  | ||||||
|  |  | ||||||
|     sites = [] |  | ||||||
|     for site in sites1: |  | ||||||
|         if site in sites2: |  | ||||||
|             sites.append(site) |  | ||||||
|  |  | ||||||
|     s = s1 |  | ||||||
|     syear = "%04d" % dt.year |  | ||||||
|     for site in sites: |  | ||||||
|         s = s[:site] + syear + s[site + 4 :] |  | ||||||
|     return s |  | ||||||
| @@ -259,6 +259,8 @@ to remove usage of these features. | |||||||
|  |  | ||||||
| * The undocumented ``django.utils.baseconv`` module is removed. | * The undocumented ``django.utils.baseconv`` module is removed. | ||||||
|  |  | ||||||
|  | * The undocumented ``django.utils.datetime_safe`` module is removed. | ||||||
|  |  | ||||||
| See :ref:`deprecated-features-4.1` for details on these changes, including how | See :ref:`deprecated-features-4.1` for details on these changes, including how | ||||||
| to remove usage of these features. | to remove usage of these features. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,77 +0,0 @@ | |||||||
| from datetime import date as original_date |  | ||||||
| from datetime import datetime as original_datetime |  | ||||||
|  |  | ||||||
| from django.test import SimpleTestCase, ignore_warnings |  | ||||||
| from django.utils.deprecation import RemovedInDjango50Warning |  | ||||||
|  |  | ||||||
| with ignore_warnings(category=RemovedInDjango50Warning): |  | ||||||
|     from django.utils.datetime_safe import date, datetime |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class DatetimeTests(SimpleTestCase): |  | ||||||
|     def setUp(self): |  | ||||||
|         self.percent_y_safe = (1900, 1, 1)  # >= 1900 required on Windows. |  | ||||||
|         self.just_safe = (1000, 1, 1) |  | ||||||
|         self.just_unsafe = (999, 12, 31, 23, 59, 59) |  | ||||||
|         self.really_old = (20, 1, 1) |  | ||||||
|         self.more_recent = (2006, 1, 1) |  | ||||||
|  |  | ||||||
|     def test_compare_datetimes(self): |  | ||||||
|         self.assertEqual( |  | ||||||
|             original_datetime(*self.more_recent), datetime(*self.more_recent) |  | ||||||
|         ) |  | ||||||
|         self.assertEqual( |  | ||||||
|             original_datetime(*self.really_old), datetime(*self.really_old) |  | ||||||
|         ) |  | ||||||
|         self.assertEqual(original_date(*self.more_recent), date(*self.more_recent)) |  | ||||||
|         self.assertEqual(original_date(*self.really_old), date(*self.really_old)) |  | ||||||
|  |  | ||||||
|         self.assertEqual( |  | ||||||
|             original_date(*self.just_safe).strftime("%Y-%m-%d"), |  | ||||||
|             date(*self.just_safe).strftime("%Y-%m-%d"), |  | ||||||
|         ) |  | ||||||
|         self.assertEqual( |  | ||||||
|             original_datetime(*self.just_safe).strftime("%Y-%m-%d"), |  | ||||||
|             datetime(*self.just_safe).strftime("%Y-%m-%d"), |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|     def test_safe_strftime(self): |  | ||||||
|         self.assertEqual( |  | ||||||
|             date(*self.just_unsafe[:3]).strftime("%Y-%m-%d (weekday %w)"), |  | ||||||
|             "0999-12-31 (weekday 2)", |  | ||||||
|         ) |  | ||||||
|         self.assertEqual( |  | ||||||
|             date(*self.just_safe).strftime("%Y-%m-%d (weekday %w)"), |  | ||||||
|             "1000-01-01 (weekday 3)", |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|         self.assertEqual( |  | ||||||
|             datetime(*self.just_unsafe).strftime("%Y-%m-%d %H:%M:%S (weekday %w)"), |  | ||||||
|             "0999-12-31 23:59:59 (weekday 2)", |  | ||||||
|         ) |  | ||||||
|         self.assertEqual( |  | ||||||
|             datetime(*self.just_safe).strftime("%Y-%m-%d %H:%M:%S (weekday %w)"), |  | ||||||
|             "1000-01-01 00:00:00 (weekday 3)", |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|         # %y will error before this date |  | ||||||
|         self.assertEqual(date(*self.percent_y_safe).strftime("%y"), "00") |  | ||||||
|         self.assertEqual(datetime(*self.percent_y_safe).strftime("%y"), "00") |  | ||||||
|         with self.assertRaisesMessage( |  | ||||||
|             TypeError, "strftime of dates before 1000 does not handle %y" |  | ||||||
|         ): |  | ||||||
|             datetime(*self.just_unsafe).strftime("%y") |  | ||||||
|  |  | ||||||
|         self.assertEqual( |  | ||||||
|             date(1850, 8, 2).strftime("%Y/%m/%d was a %A"), "1850/08/02 was a Friday" |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|     def test_zero_padding(self): |  | ||||||
|         """ |  | ||||||
|         Regression for #12524 |  | ||||||
|  |  | ||||||
|         Pre-1000AD dates are padded with zeros if necessary |  | ||||||
|         """ |  | ||||||
|         self.assertEqual( |  | ||||||
|             date(1, 1, 1).strftime("%Y/%m/%d was a %A"), "0001/01/01 was a Monday" |  | ||||||
|         ) |  | ||||||
		Reference in New Issue
	
	Block a user