diff --git a/apiserver/plane/app/views/timezone/base.py b/apiserver/plane/app/views/timezone/base.py index 77c877047..840fdbdbc 100644 --- a/apiserver/plane/app/views/timezone/base.py +++ b/apiserver/plane/app/views/timezone/base.py @@ -21,221 +21,161 @@ class TimezoneEndpoint(APIView): throttle_classes = [AuthenticationThrottle] - @method_decorator(cache_page(60 * 60 * 24)) + @method_decorator(cache_page(60 * 60 * 2)) def get(self, request): - timezone_mapping = { - "-1100": [ - ("Midway Island", "Pacific/Midway"), - ("American Samoa", "Pacific/Pago_Pago"), - ], - "-1000": [ - ("Hawaii", "Pacific/Honolulu"), - ("Aleutian Islands", "America/Adak"), - ], - "-0930": [("Marquesas Islands", "Pacific/Marquesas")], - "-0900": [ - ("Alaska", "America/Anchorage"), - ("Gambier Islands", "Pacific/Gambier"), - ], - "-0800": [ - ("Pacific Time (US and Canada)", "America/Los_Angeles"), - ("Baja California", "America/Tijuana"), - ], - "-0700": [ - ("Mountain Time (US and Canada)", "America/Denver"), - ("Arizona", "America/Phoenix"), - ("Chihuahua, Mazatlan", "America/Chihuahua"), - ], - "-0600": [ - ("Central Time (US and Canada)", "America/Chicago"), - ("Saskatchewan", "America/Regina"), - ("Guadalajara, Mexico City, Monterrey", "America/Mexico_City"), - ("Tegucigalpa, Honduras", "America/Tegucigalpa"), - ("Costa Rica", "America/Costa_Rica"), - ], - "-0500": [ - ("Eastern Time (US and Canada)", "America/New_York"), - ("Lima", "America/Lima"), - ("Bogota", "America/Bogota"), - ("Quito", "America/Guayaquil"), - ("Chetumal", "America/Cancun"), - ], - "-0430": [("Caracas (Old Venezuela Time)", "America/Caracas")], - "-0400": [ - ("Atlantic Time (Canada)", "America/Halifax"), - ("Caracas", "America/Caracas"), - ("Santiago", "America/Santiago"), - ("La Paz", "America/La_Paz"), - ("Manaus", "America/Manaus"), - ("Georgetown", "America/Guyana"), - ("Bermuda", "Atlantic/Bermuda"), - ], - "-0330": [("Newfoundland Time (Canada)", "America/St_Johns")], - "-0300": [ - ("Buenos Aires", "America/Argentina/Buenos_Aires"), - ("Brasilia", "America/Sao_Paulo"), - ("Greenland", "America/Godthab"), - ("Montevideo", "America/Montevideo"), - ("Falkland Islands", "Atlantic/Stanley"), - ], - "-0200": [ - ( - "South Georgia and the South Sandwich Islands", - "Atlantic/South_Georgia", - ) - ], - "-0100": [ - ("Azores", "Atlantic/Azores"), - ("Cape Verde Islands", "Atlantic/Cape_Verde"), - ], - "+0000": [ - ("Dublin", "Europe/Dublin"), - ("Reykjavik", "Atlantic/Reykjavik"), - ("Lisbon", "Europe/Lisbon"), - ("Monrovia", "Africa/Monrovia"), - ("Casablanca", "Africa/Casablanca"), - ], - "+0100": [ - ("Central European Time (Berlin, Rome, Paris)", "Europe/Paris"), - ("West Central Africa", "Africa/Lagos"), - ("Algiers", "Africa/Algiers"), - ("Lagos", "Africa/Lagos"), - ("Tunis", "Africa/Tunis"), - ], - "+0200": [ - ("Eastern European Time (Cairo, Helsinki, Kyiv)", "Europe/Kiev"), - ("Athens", "Europe/Athens"), - ("Jerusalem", "Asia/Jerusalem"), - ("Johannesburg", "Africa/Johannesburg"), - ("Harare, Pretoria", "Africa/Harare"), - ], - "+0300": [ - ("Moscow Time", "Europe/Moscow"), - ("Baghdad", "Asia/Baghdad"), - ("Nairobi", "Africa/Nairobi"), - ("Kuwait, Riyadh", "Asia/Riyadh"), - ], - "+0330": [("Tehran", "Asia/Tehran")], - "+0400": [ - ("Abu Dhabi", "Asia/Dubai"), - ("Baku", "Asia/Baku"), - ("Yerevan", "Asia/Yerevan"), - ("Astrakhan", "Europe/Astrakhan"), - ("Tbilisi", "Asia/Tbilisi"), - ("Mauritius", "Indian/Mauritius"), - ], - "+0500": [ - ("Islamabad", "Asia/Karachi"), - ("Karachi", "Asia/Karachi"), - ("Tashkent", "Asia/Tashkent"), - ("Yekaterinburg", "Asia/Yekaterinburg"), - ("Maldives", "Indian/Maldives"), - ("Chagos", "Indian/Chagos"), - ], - "+0530": [ - ("Chennai", "Asia/Kolkata"), - ("Kolkata", "Asia/Kolkata"), - ("Mumbai", "Asia/Kolkata"), - ("New Delhi", "Asia/Kolkata"), - ("Sri Jayawardenepura", "Asia/Colombo"), - ], - "+0545": [("Kathmandu", "Asia/Kathmandu")], - "+0600": [ - ("Dhaka", "Asia/Dhaka"), - ("Almaty", "Asia/Almaty"), - ("Bishkek", "Asia/Bishkek"), - ("Thimphu", "Asia/Thimphu"), - ], - "+0630": [ - ("Yangon (Rangoon)", "Asia/Yangon"), - ("Cocos Islands", "Indian/Cocos"), - ], - "+0700": [ - ("Bangkok", "Asia/Bangkok"), - ("Hanoi", "Asia/Ho_Chi_Minh"), - ("Jakarta", "Asia/Jakarta"), - ("Novosibirsk", "Asia/Novosibirsk"), - ("Krasnoyarsk", "Asia/Krasnoyarsk"), - ], - "+0800": [ - ("Beijing", "Asia/Shanghai"), - ("Singapore", "Asia/Singapore"), - ("Perth", "Australia/Perth"), - ("Hong Kong", "Asia/Hong_Kong"), - ("Ulaanbaatar", "Asia/Ulaanbaatar"), - ("Palau", "Pacific/Palau"), - ], - "+0845": [("Eucla", "Australia/Eucla")], - "+0900": [ - ("Tokyo", "Asia/Tokyo"), - ("Seoul", "Asia/Seoul"), - ("Yakutsk", "Asia/Yakutsk"), - ], - "+0930": [ - ("Adelaide", "Australia/Adelaide"), - ("Darwin", "Australia/Darwin"), - ], - "+1000": [ - ("Sydney", "Australia/Sydney"), - ("Brisbane", "Australia/Brisbane"), - ("Guam", "Pacific/Guam"), - ("Vladivostok", "Asia/Vladivostok"), - ("Tahiti", "Pacific/Tahiti"), - ], - "+1030": [("Lord Howe Island", "Australia/Lord_Howe")], - "+1100": [ - ("Solomon Islands", "Pacific/Guadalcanal"), - ("Magadan", "Asia/Magadan"), - ("Norfolk Island", "Pacific/Norfolk"), - ("Bougainville Island", "Pacific/Bougainville"), - ("Chokurdakh", "Asia/Srednekolymsk"), - ], - "+1200": [ - ("Auckland", "Pacific/Auckland"), - ("Wellington", "Pacific/Auckland"), - ("Fiji Islands", "Pacific/Fiji"), - ("Anadyr", "Asia/Anadyr"), - ], - "+1245": [("Chatham Islands", "Pacific/Chatham")], - "+1300": [("Nuku'alofa", "Pacific/Tongatapu"), ("Samoa", "Pacific/Apia")], - "+1400": [("Kiritimati Island", "Pacific/Kiritimati")], - } + timezone_locations = [ + ('Midway Island', 'Pacific/Midway'), # UTC-11:00 + ('American Samoa', 'Pacific/Pago_Pago'), # UTC-11:00 + ('Hawaii', 'Pacific/Honolulu'), # UTC-10:00 + ('Aleutian Islands', 'America/Adak'), # UTC-10:00 (DST: UTC-09:00) + ('Marquesas Islands', 'Pacific/Marquesas'), # UTC-09:30 + ('Alaska', 'America/Anchorage'), # UTC-09:00 (DST: UTC-08:00) + ('Gambier Islands', 'Pacific/Gambier'), # UTC-09:00 + ('Pacific Time (US and Canada)', 'America/Los_Angeles'), # UTC-08:00 (DST: UTC-07:00) + ('Baja California', 'America/Tijuana'), # UTC-08:00 (DST: UTC-07:00) + ('Mountain Time (US and Canada)', 'America/Denver'), # UTC-07:00 (DST: UTC-06:00) + ('Arizona', 'America/Phoenix'), # UTC-07:00 + ('Chihuahua, Mazatlan', 'America/Chihuahua'), # UTC-07:00 (DST: UTC-06:00) + ('Central Time (US and Canada)', 'America/Chicago'), # UTC-06:00 (DST: UTC-05:00) + ('Saskatchewan', 'America/Regina'), # UTC-06:00 + ('Guadalajara, Mexico City, Monterrey', 'America/Mexico_City'), # UTC-06:00 (DST: UTC-05:00) + ('Tegucigalpa, Honduras', 'America/Tegucigalpa'), # UTC-06:00 + ('Costa Rica', 'America/Costa_Rica'), # UTC-06:00 + ('Eastern Time (US and Canada)', 'America/New_York'), # UTC-05:00 (DST: UTC-04:00) + ('Lima', 'America/Lima'), # UTC-05:00 + ('Bogota', 'America/Bogota'), # UTC-05:00 + ('Quito', 'America/Guayaquil'), # UTC-05:00 + ('Chetumal', 'America/Cancun'), # UTC-05:00 (DST: UTC-04:00) + ('Caracas (Old Venezuela Time)', 'America/Caracas'), # UTC-04:30 + ('Atlantic Time (Canada)', 'America/Halifax'), # UTC-04:00 (DST: UTC-03:00) + ('Caracas', 'America/Caracas'), # UTC-04:00 + ('Santiago', 'America/Santiago'), # UTC-04:00 (DST: UTC-03:00) + ('La Paz', 'America/La_Paz'), # UTC-04:00 + ('Manaus', 'America/Manaus'), # UTC-04:00 + ('Georgetown', 'America/Guyana'), # UTC-04:00 + ('Bermuda', 'Atlantic/Bermuda'), # UTC-04:00 (DST: UTC-03:00) + ('Newfoundland Time (Canada)', 'America/St_Johns'), # UTC-03:30 (DST: UTC-02:30) + ('Buenos Aires', 'America/Argentina/Buenos_Aires'), # UTC-03:00 + ('Brasilia', 'America/Sao_Paulo'), # UTC-03:00 + ('Greenland', 'America/Godthab'), # UTC-03:00 (DST: UTC-02:00) + ('Montevideo', 'America/Montevideo'), # UTC-03:00 + ('Falkland Islands', 'Atlantic/Stanley'), # UTC-03:00 + ('South Georgia and the South Sandwich Islands', 'Atlantic/South_Georgia'), # UTC-02:00 + ('Azores', 'Atlantic/Azores'), # UTC-01:00 (DST: UTC+00:00) + ('Cape Verde Islands', 'Atlantic/Cape_Verde'), # UTC-01:00 + ('Dublin', 'Europe/Dublin'), # UTC+00:00 (DST: UTC+01:00) + ('Reykjavik', 'Atlantic/Reykjavik'), # UTC+00:00 + ('Lisbon', 'Europe/Lisbon'), # UTC+00:00 (DST: UTC+01:00) + ('Monrovia', 'Africa/Monrovia'), # UTC+00:00 + ('Casablanca', 'Africa/Casablanca'), # UTC+00:00 (DST: UTC+01:00) + ('Central European Time (Berlin, Rome, Paris)', 'Europe/Paris'), # UTC+01:00 (DST: UTC+02:00) + ('West Central Africa', 'Africa/Lagos'), # UTC+01:00 + ('Algiers', 'Africa/Algiers'), # UTC+01:00 + ('Lagos', 'Africa/Lagos'), # UTC+01:00 + ('Tunis', 'Africa/Tunis'), # UTC+01:00 + ('Eastern European Time (Cairo, Helsinki, Kyiv)', 'Europe/Kiev'), # UTC+02:00 (DST: UTC+03:00) + ('Athens', 'Europe/Athens'), # UTC+02:00 (DST: UTC+03:00) + ('Jerusalem', 'Asia/Jerusalem'), # UTC+02:00 (DST: UTC+03:00) + ('Johannesburg', 'Africa/Johannesburg'), # UTC+02:00 + ('Harare, Pretoria', 'Africa/Harare'), # UTC+02:00 + ('Moscow Time', 'Europe/Moscow'), # UTC+03:00 + ('Baghdad', 'Asia/Baghdad'), # UTC+03:00 + ('Nairobi', 'Africa/Nairobi'), # UTC+03:00 + ('Kuwait, Riyadh', 'Asia/Riyadh'), # UTC+03:00 + ('Tehran', 'Asia/Tehran'), # UTC+03:30 (DST: UTC+04:30) + ('Abu Dhabi', 'Asia/Dubai'), # UTC+04:00 + ('Baku', 'Asia/Baku'), # UTC+04:00 (DST: UTC+05:00) + ('Yerevan', 'Asia/Yerevan'), # UTC+04:00 (DST: UTC+05:00) + ('Astrakhan', 'Europe/Astrakhan'), # UTC+04:00 + ('Tbilisi', 'Asia/Tbilisi'), # UTC+04:00 + ('Mauritius', 'Indian/Mauritius'), # UTC+04:00 + ('Islamabad', 'Asia/Karachi'), # UTC+05:00 + ('Karachi', 'Asia/Karachi'), # UTC+05:00 + ('Tashkent', 'Asia/Tashkent'), # UTC+05:00 + ('Yekaterinburg', 'Asia/Yekaterinburg'), # UTC+05:00 + ('Maldives', 'Indian/Maldives'), # UTC+05:00 + ('Chagos', 'Indian/Chagos'), # UTC+05:00 + ('Chennai', 'Asia/Kolkata'), # UTC+05:30 + ('Kolkata', 'Asia/Kolkata'), # UTC+05:30 + ('Mumbai', 'Asia/Kolkata'), # UTC+05:30 + ('New Delhi', 'Asia/Kolkata'), # UTC+05:30 + ('Sri Jayawardenepura', 'Asia/Colombo'), # UTC+05:30 + ('Kathmandu', 'Asia/Kathmandu'), # UTC+05:45 + ('Dhaka', 'Asia/Dhaka'), # UTC+06:00 + ('Almaty', 'Asia/Almaty'), # UTC+06:00 + ('Bishkek', 'Asia/Bishkek'), # UTC+06:00 + ('Thimphu', 'Asia/Thimphu'), # UTC+06:00 + ('Yangon (Rangoon)', 'Asia/Yangon'), # UTC+06:30 + ('Cocos Islands', 'Indian/Cocos'), # UTC+06:30 + ('Bangkok', 'Asia/Bangkok'), # UTC+07:00 + ('Hanoi', 'Asia/Ho_Chi_Minh'), # UTC+07:00 + ('Jakarta', 'Asia/Jakarta'), # UTC+07:00 + ('Novosibirsk', 'Asia/Novosibirsk'), # UTC+07:00 + ('Krasnoyarsk', 'Asia/Krasnoyarsk'), # UTC+07:00 + ('Beijing', 'Asia/Shanghai'), # UTC+08:00 + ('Singapore', 'Asia/Singapore'), # UTC+08:00 + ('Perth', 'Australia/Perth'), # UTC+08:00 + ('Hong Kong', 'Asia/Hong_Kong'), # UTC+08:00 + ('Ulaanbaatar', 'Asia/Ulaanbaatar'), # UTC+08:00 + ('Palau', 'Pacific/Palau'), # UTC+08:00 + ('Eucla', 'Australia/Eucla'), # UTC+08:45 + ('Tokyo', 'Asia/Tokyo'), # UTC+09:00 + ('Seoul', 'Asia/Seoul'), # UTC+09:00 + ('Yakutsk', 'Asia/Yakutsk'), # UTC+09:00 + ('Adelaide', 'Australia/Adelaide'), # UTC+09:30 (DST: UTC+10:30) + ('Darwin', 'Australia/Darwin'), # UTC+09:30 + ('Sydney', 'Australia/Sydney'), # UTC+10:00 (DST: UTC+11:00) + ('Brisbane', 'Australia/Brisbane'), # UTC+10:00 + ('Guam', 'Pacific/Guam'), # UTC+10:00 + ('Vladivostok', 'Asia/Vladivostok'), # UTC+10:00 + ('Tahiti', 'Pacific/Tahiti'), # UTC+10:00 + ('Lord Howe Island', 'Australia/Lord_Howe'), # UTC+10:30 (DST: UTC+11:00) + ('Solomon Islands', 'Pacific/Guadalcanal'), # UTC+11:00 + ('Magadan', 'Asia/Magadan'), # UTC+11:00 + ('Norfolk Island', 'Pacific/Norfolk'), # UTC+11:00 + ('Bougainville Island', 'Pacific/Bougainville'), # UTC+11:00 + ('Chokurdakh', 'Asia/Srednekolymsk'), # UTC+11:00 + ('Auckland', 'Pacific/Auckland'), # UTC+12:00 (DST: UTC+13:00) + ('Wellington', 'Pacific/Auckland'), # UTC+12:00 (DST: UTC+13:00) + ('Fiji Islands', 'Pacific/Fiji'), # UTC+12:00 (DST: UTC+13:00) + ('Anadyr', 'Asia/Anadyr'), # UTC+12:00 + ('Chatham Islands', 'Pacific/Chatham'), # UTC+12:45 (DST: UTC+13:45) + ("Nuku'alofa", 'Pacific/Tongatapu'), # UTC+13:00 + ('Samoa', 'Pacific/Apia'), # UTC+13:00 (DST: UTC+14:00) + ('Kiritimati Island', 'Pacific/Kiritimati') # UTC+14:00 + ] timezone_list = [] now = datetime.now() # Process timezone mapping - for offset, locations in timezone_mapping.items(): - sign = "-" if offset.startswith("-") else "+" - hours = offset[1:3] - minutes = offset[3:] if len(offset) > 3 else "00" + for friendly_name, tz_identifier in timezone_locations: - for friendly_name, tz_identifier in locations: - try: - tz = pytz.timezone(tz_identifier) - current_offset = now.astimezone(tz).strftime("%z") + try: + tz = pytz.timezone(tz_identifier) + current_offset = now.astimezone(tz).strftime("%z") - # converting and formatting UTC offset to GMT offset - current_utc_offset = now.astimezone(tz).utcoffset() - total_seconds = int(current_utc_offset.total_seconds()) - hours_offset = total_seconds // 3600 - minutes_offset = abs(total_seconds % 3600) // 60 - gmt_offset = ( - f"GMT{'+' if hours_offset >= 0 else '-'}" - f"{abs(hours_offset):02}:{minutes_offset:02}" - ) + # converting and formatting UTC offset to GMT offset + current_utc_offset = now.astimezone(tz).utcoffset() + total_seconds = int(current_utc_offset.total_seconds()) + hours_offset = total_seconds // 3600 + minutes_offset = abs(total_seconds % 3600) // 60 + offset = ( + f"{'+' if hours_offset >= 0 else '-'}" + f"{abs(hours_offset):02}:{minutes_offset:02}" + ) - timezone_value = { - "offset": int(current_offset), - "utc_offset": f"UTC{sign}{hours}:{minutes}", - "gmt_offset": gmt_offset, - "value": tz_identifier, - "label": f"{friendly_name}", - } + timezone_value = { + "offset": int(current_offset), + "utc_offset": f"UTC{offset}", + "gmt_offset": f"GMT{offset}", + "value": tz_identifier, + "label": f"{friendly_name}", + } - timezone_list.append(timezone_value) - except pytz.exceptions.UnknownTimeZoneError: - continue + timezone_list.append(timezone_value) + except pytz.exceptions.UnknownTimeZoneError: + continue # Sort by offset and then by label timezone_list.sort(key=lambda x: (x["offset"], x["label"]))