mirror of
				https://github.com/django/django.git
				synced 2025-10-30 17:16:10 +00:00 
			
		
		
		
	[3.2.x] Refs #32365 -- Allowed use of non-pytz timezone implementations.
Backport of 10d1261984 from master
			
			
This commit is contained in:
		
				
					committed by
					
						 Carlton Gibson
						Carlton Gibson
					
				
			
			
				
	
			
			
			
						parent
						
							de4e854f07
						
					
				
				
					commit
					a5d70cca12
				
			| @@ -7,6 +7,14 @@ from urllib.parse import parse_qsl, urljoin, urlparse | ||||
|  | ||||
| import pytz | ||||
|  | ||||
| try: | ||||
|     import zoneinfo | ||||
| except ImportError: | ||||
|     try: | ||||
|         from backports import zoneinfo | ||||
|     except ImportError: | ||||
|         zoneinfo = None | ||||
|  | ||||
| from django.contrib import admin | ||||
| from django.contrib.admin import AdminSite, ModelAdmin | ||||
| from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME | ||||
| @@ -63,6 +71,14 @@ for a staff account. Note that both fields may be case-sensitive." | ||||
| MULTIPART_ENCTYPE = 'enctype="multipart/form-data"' | ||||
|  | ||||
|  | ||||
| def make_aware_datetimes(dt, iana_key): | ||||
|     """Makes one aware datetime for each supported time zone provider.""" | ||||
|     yield pytz.timezone(iana_key).localize(dt, is_dst=None) | ||||
|  | ||||
|     if zoneinfo is not None: | ||||
|         yield dt.replace(tzinfo=zoneinfo.ZoneInfo(iana_key)) | ||||
|  | ||||
|  | ||||
| class AdminFieldExtractionMixin: | ||||
|     """ | ||||
|     Helper methods for extracting data from AdminForm. | ||||
| @@ -995,24 +1011,26 @@ class AdminViewBasicTest(AdminViewBasicTestCase): | ||||
|     @override_settings(TIME_ZONE='America/Sao_Paulo', USE_TZ=True) | ||||
|     def test_date_hierarchy_timezone_dst(self): | ||||
|         # This datetime doesn't exist in this timezone due to DST. | ||||
|         date = pytz.timezone('America/Sao_Paulo').localize(datetime.datetime(2016, 10, 16, 15), is_dst=None) | ||||
|         q = Question.objects.create(question='Why?', expires=date) | ||||
|         Answer2.objects.create(question=q, answer='Because.') | ||||
|         response = self.client.get(reverse('admin:admin_views_answer2_changelist')) | ||||
|         self.assertContains(response, 'question__expires__day=16') | ||||
|         self.assertContains(response, 'question__expires__month=10') | ||||
|         self.assertContains(response, 'question__expires__year=2016') | ||||
|         for date in make_aware_datetimes(datetime.datetime(2016, 10, 16, 15), 'America/Sao_Paulo'): | ||||
|             with self.subTest(repr(date.tzinfo)): | ||||
|                 q = Question.objects.create(question='Why?', expires=date) | ||||
|                 Answer2.objects.create(question=q, answer='Because.') | ||||
|                 response = self.client.get(reverse('admin:admin_views_answer2_changelist')) | ||||
|                 self.assertContains(response, 'question__expires__day=16') | ||||
|                 self.assertContains(response, 'question__expires__month=10') | ||||
|                 self.assertContains(response, 'question__expires__year=2016') | ||||
|  | ||||
|     @override_settings(TIME_ZONE='America/Los_Angeles', USE_TZ=True) | ||||
|     def test_date_hierarchy_local_date_differ_from_utc(self): | ||||
|         # This datetime is 2017-01-01 in UTC. | ||||
|         date = pytz.timezone('America/Los_Angeles').localize(datetime.datetime(2016, 12, 31, 16)) | ||||
|         q = Question.objects.create(question='Why?', expires=date) | ||||
|         Answer2.objects.create(question=q, answer='Because.') | ||||
|         response = self.client.get(reverse('admin:admin_views_answer2_changelist')) | ||||
|         self.assertContains(response, 'question__expires__day=31') | ||||
|         self.assertContains(response, 'question__expires__month=12') | ||||
|         self.assertContains(response, 'question__expires__year=2016') | ||||
|         for date in make_aware_datetimes(datetime.datetime(2016, 12, 31, 16), 'America/Los_Angeles'): | ||||
|             with self.subTest(repr(date.tzinfo)): | ||||
|                 q = Question.objects.create(question='Why?', expires=date) | ||||
|                 Answer2.objects.create(question=q, answer='Because.') | ||||
|                 response = self.client.get(reverse('admin:admin_views_answer2_changelist')) | ||||
|                 self.assertContains(response, 'question__expires__day=31') | ||||
|                 self.assertContains(response, 'question__expires__month=12') | ||||
|                 self.assertContains(response, 'question__expires__year=2016') | ||||
|  | ||||
|     def test_sortable_by_columns_subset(self): | ||||
|         expected_sortable_fields = ('date', 'callable_year') | ||||
|   | ||||
		Reference in New Issue
	
	Block a user