diff --git a/sapl/legacy/timezonesbrasil.py b/sapl/legacy/timezonesbrasil.py new file mode 100644 index 000000000..39cec0894 --- /dev/null +++ b/sapl/legacy/timezonesbrasil.py @@ -0,0 +1,190 @@ +import unicodedata + +UF_PARA_TIMEZONE = ''' + AC America/Rio_Branco + AL America/Maceio + AP America/Belem + AM America/Manaus + BA America/Bahia + CE America/Fortaleza + DF America/Sao_Paulo + ES America/Sao_Paulo + GO America/Sao_Paulo + MA America/Fortaleza + MT America/Cuiaba + MS America/Campo_Grande + MG America/Sao_Paulo + PR America/Sao_Paulo + PB America/Fortaleza + PA America/Belem + PE America/Recife + PI America/Fortaleza + RJ America/Sao_Paulo + RN America/Fortaleza + RS America/Sao_Paulo + RO America/Porto_Velho + RR America/Boa_Vista + SC America/Sao_Paulo + SE America/Maceio + SP America/Sao_Paulo + TO America/Araguaina +''' +UF_PARA_TIMEZONE = dict(line.split() + for line in UF_PARA_TIMEZONE.strip().splitlines()) + + +def normalizar_texto(texto): + # baseado em https://gist.github.com/j4mie/557354 + norm = unicodedata.normalize('NFKD', texto.lower()) + return norm.encode('ASCII', 'ignore').decode('ascii') + +# Exceções (Anazonas e Pará): +# leste do Amazonas: America/Manaus +# oeste do Amazonas: America/Eirunepe +# leste do Pará: America/Belem +# oeste do Pará: America/Santarem +# fontes: +# https://en.wikipedia.org/wiki/Time_in_Brazil +# https://www.zeitverschiebung.net/en/timezone/america--belem +# https://www.zeitverschiebung.net/en/timezone/america--santarem +# https://www.zeitverschiebung.net/en/timezone/america--manaus +# https://www.zeitverschiebung.net/en/timezone/america--eirunepe + +TZ_CIDADES_AMAZONAS_E_PARA = [ + ('America/Manaus', ''' + Manaus + Itacoatiara + Parintins + Manacapuru + Coari + Tefé + Humaitá + Tabatinga + Rio Preto da Eva + Maués + Carauari + Fonte Boa + São Gabriel da Cachoeira + Boca do Acre + Manicoré + Nova Olinda do Norte + Borba + São Paulo de Olivença + Barreirinha + Codajás + Iranduba + Novo Aripuanã + Urucurituba + Manaquiri + Guajará + Autazes + Santo Antônio do Içá + Urucará + Anori + Pauini + Barcelos + Careiro da Várzea + Canutama + Jutaí + Alvarães +'''), + ('America/Eirunepe', ''' + Eirunepé + Benjamin Constant + Envira +'''), + ('America/Belem', ''' + Belém + Ananindeua + Macapá + Marabá + Castanhal + Santana + Abaetetuba + Tucuruí + Paragominas + Bragança + Benevides + Capanema + Breves + Cametá + Salinópolis + Tomé Açu + Capitão Poço + Barcarena + Vigia + São Miguel do Guamá + Conceição do Araguaia + Igarapé Miri + Igarapé Açu + Moju + Portel + Itupiranga + Viseu + Soure + Mocajuba + São Félix do Xingu + Augusto Corrêa + Tucumã + Santa Maria do Pará + Acará + Maracanã + Baião + Curuçá + Marapanim + Oeiras do Pará + São João de Pirabas + Santo Antônio do Tauá + São Caetano de Odivelas + Ourém + Muaná + Afuá + Mazagão + Gurupá + Bujaru + Senador José Porfírio + Irituia +'''), + ('America/Santarem', ''' + Santarém + Altamira + Itaituba + Oriximiná + Alenquer + Ábidos + Monte Alegre + Almeirim + Terra Santa + Juruti + Porto de Moz + Nhamundá + Prainha +'''), +] +TZ_CIDADES_AMAZONAS_E_PARA = {normalizar_texto(cidade.strip()): tz + for tz, linhas in TZ_CIDADES_AMAZONAS_E_PARA + for cidade in linhas.strip().splitlines()} + + +def get_timezone(cidade, uf): + tz = UF_PARA_TIMEZONE[uf] + if uf in ['PA', 'AM']: + cidade = normalizar_texto(cidade) + return TZ_CIDADES_AMAZONAS_E_PARA[cidade] + else: + return tz + + +def test_get_timezone(): + for cidade, uf, tz in [ + ('Fortaleza', 'CE', 'America/Fortaleza'), + ('Salvador', 'BA', 'America/Bahia'), + ('Belem', 'PA', 'America/Belem'), # sem acento + ('Belém', 'PA', 'America/Belem'), # com acento + ('Santarem', 'PA', 'America/Santarem'), # sem acento + ('Santarém', 'PA', 'America/Santarem'), # com acento + ('Manaus', 'AM', 'America/Manaus'), + ('Eirunepe', 'AM', 'America/Eirunepe'), # sem acento + ('Eirunepé', 'AM', 'America/Eirunepe'), # com acento + ]: + assert get_timezone(cidade, uf) == tz, (cidade, uf, tz)