Coverage for adhoc-cicd-odoo-odoo / odoo / _monkeypatches / pytz.py: 82%
9 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 18:05 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 18:05 +0000
1# Part of Odoo. See LICENSE file for full copyright and licensing details.
2"""
3In ubuntu noble, some timezone where removed leading to errors when trying to assign/access them.
5This was partially fixed in the code by removing all references to old timezones but one issue remains:
6if a database contains timezones that are not defined in the os, the resolution will fail and break
7at runtime.
9This patches proposes to alter timezone to fallback on the new canonical timezone if the timezone was removed.
11This list was generated by checking all symlink in /usr/share/zoneinfo in ubuntu 22.04 that disapeared in ubuntu 24.04
13This solutions will work when moving a database from one server to another, even without migration.
14This list could be improved for other purposes.
16"""
18import pytz
20_tz_mapping = {
21 "Africa/Asmera": "Africa/Nairobi",
22 "America/Argentina/ComodRivadavia": "America/Argentina/Catamarca",
23 "America/Buenos_Aires": "America/Argentina/Buenos_Aires",
24 "America/Cordoba": "America/Argentina/Cordoba",
25 "America/Fort_Wayne": "America/Indiana/Indianapolis",
26 "America/Indianapolis": "America/Indiana/Indianapolis",
27 "America/Jujuy": "America/Argentina/Jujuy",
28 "America/Knox_IN": "America/Indiana/Knox",
29 "America/Louisville": "America/Kentucky/Louisville",
30 "America/Mendoza": "America/Argentina/Mendoza",
31 "America/Rosario": "America/Argentina/Cordoba",
32 "Antarctica/South_Pole": "Pacific/Auckland",
33 "Asia/Ashkhabad": "Asia/Ashgabat",
34 "Asia/Calcutta": "Asia/Kolkata",
35 "Asia/Chungking": "Asia/Shanghai",
36 "Asia/Dacca": "Asia/Dhaka",
37 "Asia/Katmandu": "Asia/Kathmandu",
38 "Asia/Macao": "Asia/Macau",
39 "Asia/Rangoon": "Asia/Yangon",
40 "Asia/Saigon": "Asia/Ho_Chi_Minh",
41 "Asia/Thimbu": "Asia/Thimphu",
42 "Asia/Ujung_Pandang": "Asia/Makassar",
43 "Asia/Ulan_Bator": "Asia/Ulaanbaatar",
44 "Atlantic/Faeroe": "Atlantic/Faroe",
45 "Australia/ACT": "Australia/Sydney",
46 "Australia/LHI": "Australia/Lord_Howe",
47 "Australia/North": "Australia/Darwin",
48 "Australia/NSW": "Australia/Sydney",
49 "Australia/Queensland": "Australia/Brisbane",
50 "Australia/South": "Australia/Adelaide",
51 "Australia/Tasmania": "Australia/Hobart",
52 "Australia/Victoria": "Australia/Melbourne",
53 "Australia/West": "Australia/Perth",
54 "Brazil/Acre": "America/Rio_Branco",
55 "Brazil/DeNoronha": "America/Noronha",
56 "Brazil/East": "America/Sao_Paulo",
57 "Brazil/West": "America/Manaus",
58 "Canada/Atlantic": "America/Halifax",
59 "Canada/Central": "America/Winnipeg",
60 "Canada/Eastern": "America/Toronto",
61 "Canada/Mountain": "America/Edmonton",
62 "Canada/Newfoundland": "America/St_Johns",
63 "Canada/Pacific": "America/Vancouver",
64 "Canada/Saskatchewan": "America/Regina",
65 "Canada/Yukon": "America/Whitehorse",
66 "Chile/Continental": "America/Santiago",
67 "Chile/EasterIsland": "Pacific/Easter",
68 "Cuba": "America/Havana",
69 "Egypt": "Africa/Cairo",
70 "Eire": "Europe/Dublin",
71 "Europe/Kiev": "Europe/Kyiv",
72 "Europe/Uzhgorod": "Europe/Kyiv",
73 "Europe/Zaporozhye": "Europe/Kyiv",
74 "GB": "Europe/London",
75 "GB-Eire": "Europe/London",
76 "GMT+0": "Etc/GMT",
77 "GMT-0": "Etc/GMT",
78 "GMT0": "Etc/GMT",
79 "Greenwich": "Etc/GMT",
80 "Hongkong": "Asia/Hong_Kong",
81 "Iceland": "Africa/Abidjan",
82 "Iran": "Asia/Tehran",
83 "Israel": "Asia/Jerusalem",
84 "Jamaica": "America/Jamaica",
85 "Japan": "Asia/Tokyo",
86 "Kwajalein": "Pacific/Kwajalein",
87 "Libya": "Africa/Tripoli",
88 "Mexico/BajaNorte": "America/Tijuana",
89 "Mexico/BajaSur": "America/Mazatlan",
90 "Mexico/General": "America/Mexico_City",
91 "Navajo": "America/Denver",
92 "NZ": "Pacific/Auckland",
93 "NZ-CHAT": "Pacific/Chatham",
94 "Pacific/Enderbury": "Pacific/Kanton",
95 "Pacific/Ponape": "Pacific/Guadalcanal",
96 "Pacific/Truk": "Pacific/Port_Moresby",
97 "Poland": "Europe/Warsaw",
98 "Portugal": "Europe/Lisbon",
99 "PRC": "Asia/Shanghai",
100 "ROC": "Asia/Taipei",
101 "ROK": "Asia/Seoul",
102 "Singapore": "Asia/Singapore",
103 "Türkiye": "Europe/Istanbul",
104 "UCT": "Etc/UTC",
105 "Universal": "Etc/UTC",
106 "US/Alaska": "America/Anchorage",
107 "US/Aleutian": "America/Adak",
108 "US/Arizona": "America/Phoenix",
109 "US/Central": "America/Chicago",
110 "US/Eastern": "America/New_York",
111 "US/East-Indiana": "America/Indiana/Indianapolis",
112 "US/Hawaii": "Pacific/Honolulu",
113 "US/Indiana-Starke": "America/Indiana/Knox",
114 "US/Michigan": "America/Detroit",
115 "US/Mountain": "America/Denver",
116 "US/Pacific": "America/Los_Angeles",
117 "US/Samoa": "Pacific/Pago_Pago",
118 "W-SU": "Europe/Moscow",
119 "Zulu": "Etc/UTC",
120}
122original_pytz_timezone = pytz.timezone
125def patch_module():
126 def timezone(name):
127 if name not in pytz.all_timezones_set and name in _tz_mapping: 127 ↛ 128line 127 didn't jump to line 128 because the condition on line 127 was never true
128 name = _tz_mapping[name]
129 return original_pytz_timezone(name)
131 pytz.timezone = timezone