From 6077ef3dd748bfbc9e90ade647e9c4cb185f0164 Mon Sep 17 00:00:00 2001 From: Felipe Vieira Date: Mon, 12 Dec 2011 14:35:28 +0000 Subject: [PATCH] script para migracao de servidores do sistema de rh --- .../servidores/management/commands/migra.py | 159 ++++++++++++++++++ sigi/apps/servidores/models.py | 18 +- 2 files changed, 169 insertions(+), 8 deletions(-) create mode 100644 sigi/apps/servidores/management/commands/migra.py diff --git a/sigi/apps/servidores/management/commands/migra.py b/sigi/apps/servidores/management/commands/migra.py new file mode 100644 index 0000000..e8427d1 --- /dev/null +++ b/sigi/apps/servidores/management/commands/migra.py @@ -0,0 +1,159 @@ +# coding= utf-8 +import sys +import csv +from datetime import datetime +from django.core.management.base import BaseCommand, CommandError +from django.contrib.auth.models import User +from sigi.apps.servidores.models import Servidor, Servico, Subsecretaria +from sigi.apps.contatos.models import Municipio + +#print 'removendo...' +#for u in User.objects.filter(date_joined__gte=datetime(2011, 12, 9, 10, 58, 49, 83734)).all(): +# u.servidor_set.all().delete() +# u.delete() + +print 'iniciando...' +class MigrationError(Exception): + pass + +class Command(BaseCommand): + help = 'Migra usuários do antigo Sistema de RH' + + def handle(self, *args, **options): + reader = csv.reader(open("/tmp/pessoal.csv"), delimiter=',', quotechar="\"") + + BRASILIA = Municipio.objects.get(codigo_ibge=5300108) + + # Read the column names from the first line of the file + fields = reader.next() + for row in reader: + # cria um dict com a primeira e a linha atual + pessoa = zip(fields, row) + p = {} + for (name, value) in pessoa: + p[name] = value.strip() + + # buscar usuário e servidor da linha atual + try: + # procuro o usuario por email se for interlegis + if not p['email'] or not ('@interlegis' in p['email']): + raise MigrationError + user = User.objects.get(email__startswith=p['email']) + servidor = user.servidor + except (MigrationError, User.DoesNotExist): + try: + # se nao encontrar procura por nome + if not p['nome_completo']: + raise MigrationError + servidor = Servidor.objects.get(nome_completo=p['nome_completo']) + except (MigrationError, Servidor.DoesNotExist): + try: + # Cria um usuario tratando os casos incompletos + # fulano@interlegis. + if not '@' in p['email']: + raise MigrationError + username = p['email'].split('@')[0].lower() + if '@interlegis' in p['email']: + # pode ser um antigo usuario do ad + email = username + '@interlegis.gov.br' + else: + # cria um username a partir do email sem + # colidir com os usuarios ldap + username = username + '__' + email = '' + if not username or username == '__': + raise MigrationError + names = p['nome_completo'].split(' ') + first_name = names[0] + last_name = " ".join(names[1:]) + user = User.objects.create( + username = username, + email = email, + first_name = first_name, + last_name = last_name, + is_active= False + ) + servidor = user.servidor + except Exception, e: + print ", ".join(row) + continue + + # mapeando dados simples + servidor.nome_completo = p['nome_completo'] + servidor.cpf = p['cpf'] + servidor.rg = p['identidade'] + servidor.apelido = p['username'] + servidor.matricula = p['matricula'] + servidor.ato_exoneracao = p['ato_exoneracao'] + servidor.ato_numero = p['ato_numero'] + servidor.ramal = p['ramal'] + + if p['email'] and not '@interlegis' in p['email']: + servidor.email_pessoal= p['email'] + + if p['inativo']=="-1": + servidor.user.is_active = False + else: + servidor.user.is_active = True + servidor.user.save() + + if p['de_fora']=="-1": + servidor.de_fora = True + else: + servidor.de_fora = False + + if p['sexo'].upper() == 'M': + servidor.sexo = 'M' + elif p['sexo'].upper() == 'F': + servidor.sexo = 'F' + + if p['turno']=="1": + servidor.turno = 'M' + elif p['turno']=="2": + servidor.turno = 'T' + elif p['turno']=="3": + servidor.turno = 'N' + + if p['aniversario']: + servidor.data_nascimento = datetime.strptime(p['aniversario'], "%Y-%m-%d 00:00:00") + + if p['data_nomeacao']: + servidor.data_nomeacao = datetime.strptime(p['data_nomeacao'], "%Y-%m-%d 00:00:00") + + if p['secretaria']: + secretaria = Subsecretaria.objects.get_or_create(sigla=p['secretaria'])[0] + servico = Servico.objects.get_or_create(sigla=(p['servico'] or 'desconhecido'))[0] + servico.subsecretaria = secretaria + servico.save() + servidor.servico = servico + + if p['telefone']: + try: + t = servidor.telefones.get(numero=p['telefone']) + except: + t = servidor.telefones.create(numero=p['telefone']) + t.tipo = 'F' + t.save() + + if p['celular']: + try: + t = servidor.telefones.get(numero=p['celular']) + except: + t = servidor.telefones.create(numero=p['celular']) + t.tipo = 'M' + t.save() + + if p['endereco']: + try: + e = servidor.endereco.get(logradouro=p['endereco']) + except: + e = servidor.endereco.create(logradouro=p['endereco']) + e.municipio = BRASILIA + e.bairro = p['cidade'] # bizarro mas é isso mesmo + e.cep = p['cep'] + e.save() + + servidor.apontamentos = p['apontamentos'] + servidor.obs = p['obs'] + servidor.save() + diff --git a/sigi/apps/servidores/models.py b/sigi/apps/servidores/models.py index a6af049..e0d9686 100644 --- a/sigi/apps/servidores/models.py +++ b/sigi/apps/servidores/models.py @@ -8,10 +8,10 @@ class Subsecretaria(models.Model): """ Modelo para representação das Subsecretarias do Interlegis """ - nome = models.CharField(max_length=50) - sigla = models.CharField(max_length=10) + nome = models.CharField(max_length=50, null=True) + sigla = models.CharField(max_length=10, null=True) # servidor responsavel por dirigir a Subsecretaria - responsavel = models.ForeignKey('servidores.Servidor', related_name='diretor') + responsavel = models.ForeignKey('servidores.Servidor', related_name='diretor', null=True) class Meta: ordering = ('nome',) @@ -23,11 +23,11 @@ class Servico(models.Model): """ Modelo para representação dos Serviços de uma Subsecretaria """ - nome = models.CharField(max_length=50) - sigla = models.CharField(max_length=10) - subsecretaria = models.ForeignKey(Subsecretaria) + nome = models.CharField(max_length=50, null=True) + sigla = models.CharField(max_length=10, null=True) + subsecretaria = models.ForeignKey(Subsecretaria, null=True) # servidor responsavel por chefiar o serviço - responsavel = models.ForeignKey('servidores.Servidor', related_name='chefe') + responsavel = models.ForeignKey('servidores.Servidor', related_name='chefe', null=True) class Meta: ordering = ('nome',) @@ -88,8 +88,10 @@ class Servidor(models.Model): blank=True, null=True, ) + de_fora = models.BooleanField(default=False) data_nomeacao = models.DateField(u'data de nomeação', blank=True, null=True) ato_exoneracao = models.CharField(u'ato de exoneração',max_length=150, blank=True, null=True) + ato_numero = models.CharField(u'ato de exoneração',max_length=150, blank=True, null=True) cpf = models.CharField('CPF', max_length=11, blank=True, null=True) rg = models.CharField('RG', max_length=25, blank=True, null=True) obs = models.TextField(u'observação', blank=True, null=True) @@ -99,7 +101,7 @@ class Servidor(models.Model): email_pessoal = models.EmailField('e-mail pessoal', blank=True, null=True) endereco = generic.GenericRelation('contatos.Endereco') telefones = generic.GenericRelation('contatos.Telefone') - ramal = models.IntegerField('ramal', blank=True, null=True) + ramal = models.CharField(max_length=25, blank=True, null=True) class Meta: ordering = ('nome_completo',)