Browse Source

Adiciona timezone a campos com tempo

pull/1704/head
Marcio Mazza 7 years ago
parent
commit
360eb289c0
  1. 25
      sapl/legacy/migration.py
  2. 13
      sapl/legacy/timezonesbrasil.py

25
sapl/legacy/migration.py

@ -1,3 +1,4 @@
import os
import re import re
from datetime import date from datetime import date
from functools import lru_cache, partial from functools import lru_cache, partial
@ -5,8 +6,9 @@ from itertools import groupby
from subprocess import PIPE, call from subprocess import PIPE, call
import pkg_resources import pkg_resources
import reversion
import yaml import yaml
import reversion
from django.apps import apps from django.apps import apps
from django.apps.config import AppConfig from django.apps.config import AppConfig
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
@ -16,7 +18,6 @@ from django.core.exceptions import ObjectDoesNotExist
from django.db import connections, transaction from django.db import connections, transaction
from django.db.models import Count, Max from django.db.models import Count, Max
from django.db.models.base import ModelBase from django.db.models.base import ModelBase
from sapl.base.models import AppConfig as AppConf from sapl.base.models import AppConfig as AppConf
from sapl.base.models import (Autor, ProblemaMigracao, TipoAutor, from sapl.base.models import (Autor, ProblemaMigracao, TipoAutor,
cria_models_tipo_autor) cria_models_tipo_autor)
@ -33,9 +34,11 @@ from sapl.parlamentares.models import (Legislatura, Mandato, Parlamentar,
from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo,
StatusTramitacaoAdministrativo) StatusTramitacaoAdministrativo)
from sapl.sessao.models import ExpedienteMateria, OrdemDia, RegistroVotacao from sapl.sessao.models import ExpedienteMateria, OrdemDia, RegistroVotacao
from sapl.settings import PROJECT_DIR from sapl.settings import DATABASES, PROJECT_DIR
from sapl.utils import normalize from sapl.utils import normalize
from .timezonesbrasil import get_timezone
# BASE ###################################################################### # BASE ######################################################################
# apps to be migrated, in app dependency order (very important) # apps to be migrated, in app dependency order (very important)
appconfs = [apps.get_app_config(n) for n in [ appconfs = [apps.get_app_config(n) for n in [
@ -563,6 +566,15 @@ class DataMigrator:
self.data_mudada = {} self.data_mudada = {}
self.choice_valida = {} self.choice_valida = {}
# configura timezone de migração
nome_legado = DATABASES['legacy']['NAME']
match = re.match('sapl_cm_(.*)', nome_legado)
sigla_casa = match.group(1)
with open(os.path.expanduser('~/sapl_dumps/tabela_timezones.yaml'), 'r') as arq:
tabela_timezones = yaml.load(arq)
municipio, uf = tabela_timezones[sigla_casa]
self.timezone = get_timezone(municipio, uf)
def populate_renamed_fields(self, new, old): def populate_renamed_fields(self, new, old):
renames = self.field_renames[type(new)] renames = self.field_renames[type(new)]
@ -603,6 +615,13 @@ class DataMigrator:
if (field_type in ['CharField', 'TextField'] if (field_type in ['CharField', 'TextField']
and value in [None, 'None']): and value in [None, 'None']):
value = '' value = ''
# adiciona timezone faltante aos campos com tempo
# os campos TIMESTAMP do mysql são gravados em UTC
# os DATETIME e TIME não têm timezone
if (field_type in ['DateTimeField', 'TimeField']
and value and not value.tzinfo):
value = self.timezone.localize(value)
setattr(new, field.name, value) setattr(new, field.name, value)
def migrate(self, obj=appconfs, interativo=True): def migrate(self, obj=appconfs, interativo=True):

13
sapl/legacy/timezonesbrasil.py

@ -1,5 +1,7 @@
import unicodedata import unicodedata
from pytz import timezone
UF_PARA_TIMEZONE = ''' UF_PARA_TIMEZONE = '''
AC America/Rio_Branco AC America/Rio_Branco
AL America/Maceio AL America/Maceio
@ -50,6 +52,7 @@ def normalizar_texto(texto):
# https://www.zeitverschiebung.net/en/timezone/america--manaus # https://www.zeitverschiebung.net/en/timezone/america--manaus
# https://www.zeitverschiebung.net/en/timezone/america--eirunepe # https://www.zeitverschiebung.net/en/timezone/america--eirunepe
TZ_CIDADES_AMAZONAS_E_PARA = [ TZ_CIDADES_AMAZONAS_E_PARA = [
('America/Manaus', ''' ('America/Manaus', '''
Manaus Manaus
@ -166,7 +169,7 @@ TZ_CIDADES_AMAZONAS_E_PARA = {normalizar_texto(cidade.strip()): tz
for cidade in linhas.strip().splitlines()} for cidade in linhas.strip().splitlines()}
def get_timezone(cidade, uf): def get_nome_timezone(cidade, uf):
tz = UF_PARA_TIMEZONE[uf] tz = UF_PARA_TIMEZONE[uf]
if uf in ['PA', 'AM']: if uf in ['PA', 'AM']:
cidade = normalizar_texto(cidade) cidade = normalizar_texto(cidade)
@ -175,7 +178,11 @@ def get_timezone(cidade, uf):
return tz return tz
def test_get_timezone(): def get_timezone(cidade, uf):
return timezone(get_nome_timezone(cidade, uf))
def test_get_nome_timezone():
for cidade, uf, tz in [ for cidade, uf, tz in [
('Fortaleza', 'CE', 'America/Fortaleza'), ('Fortaleza', 'CE', 'America/Fortaleza'),
('Salvador', 'BA', 'America/Bahia'), ('Salvador', 'BA', 'America/Bahia'),
@ -187,4 +194,4 @@ def test_get_timezone():
('Eirunepe', 'AM', 'America/Eirunepe'), # sem acento ('Eirunepe', 'AM', 'America/Eirunepe'), # sem acento
('Eirunepé', 'AM', 'America/Eirunepe'), # com acento ('Eirunepé', 'AM', 'America/Eirunepe'), # com acento
]: ]:
assert get_timezone(cidade, uf) == tz, (cidade, uf, tz) assert get_nome_timezone(cidade, uf) == tz, (cidade, uf, tz)

Loading…
Cancel
Save