-
Notifications
You must be signed in to change notification settings - Fork 0
/
import_areas.py
executable file
·117 lines (80 loc) · 3.18 KB
/
import_areas.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/python
# -*- coding: utf-8 -*-
import csv
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm.session import sessionmaker
from sqlalchemy.sql.expression import select
from sqlalchemy.sql.schema import MetaData
from sys import argv
#Parâmetros
if len(argv) < 5:
raise AssertionError("Parametros esperados: ipOuNome usuario senha caminhoArquivo loginUsuarioPontual limparTabelaAreaFiscalizacao")
ip_nome = argv[1]
usuario = argv[2]
senha = argv[3]
caminho_arquivo = argv[4]
if len(argv) > 5:
login_pontual = argv[5]
else:
login_pontual = 'admin%'
if (len(argv) > 6 and argv[6].upper() == 'TRUE'):
limpar_tabela = True
else:
limpar_tabela = False
#Mapeia a database do pontual
__m = MetaData(schema='pontual')
__m2 = MetaData(schema='seguranca')
# __m = MetaData()
url = "postgresql://%s:%s@%s/pontual" % (usuario, senha, ip_nome)
__engine = create_engine(url)
# __m.reflect(__engine, only=['linha', 'area_de_fiscalizacao', 'ponto_de_parada'])
__m2.reflect(__engine, only=['user'])
__Base = automap_base(bind=__engine, metadata=__m)
__Base.prepare(__engine, reflect=True)
__Base2 = automap_base(bind=__engine, metadata=__m2)
__Base2.prepare(__engine, reflect=True)
#Objeto ORMs do sqlalchmy do pontual
User = __Base2.classes.user
Linha = __Base.classes.linha
AreaDeFiscalizacao = __Base.classes.area_de_fiscalizacao
PontoDeParada = __Base.classes.ponto_de_parada
Sessao = sessionmaker(bind=__engine)
sessao = Sessao()
q = sessao.query(User).filter(User.login.ilike(login_pontual))
user = q.first()
if limpar_tabela:
conexao = __engine.connect()
area_fiscalizacao_table = __m.tables['pontual.area_de_fiscalizacao']
conexao.execute(area_fiscalizacao_table.delete())
conexao.close()
with open(caminho_arquivo) as csvfile:
spamreader = csv.reader(csvfile, delimiter=',', quotechar=' ')
# descarta a primeira linha
next(spamreader)
# spamreader.__next__()
terminal = None
linha = None
areas = {}
for nomeTerminal, nomeLinha, numArea in spamreader:
if not (terminal and terminal.codigo == nomeTerminal):
queryTerminal = sessao.query(PontoDeParada).filter(PontoDeParada.terminal == True, PontoDeParada.codigo == nomeTerminal)
terminal = queryTerminal.first()
areas[terminal] = {}
if not terminal:
print("Nao encontrado terminal com codigo: %s" % nomeTerminal)
if not (linha and linha.codigo == nomeLinha):
queryLinha = sessao.query(Linha).filter(Linha.codigo == nomeLinha)
linha = queryLinha.first()
if not linha:
print("Nao encontrada linha com codigo: %s" %nomeLinha)
if linha and terminal:
#(areas[terminal][linha]).append(linha.id)
if numArea not in areas[terminal]:
areas[terminal][numArea] = []
areas[terminal][numArea].append(linha.id)
for terminal, areaMap in areas.items():
for numArea, linhaIds in areaMap.items():
area = AreaDeFiscalizacao(nome=numArea, ponto_de_parada=terminal, linhas=linhaIds, usuario_atualizacao_id=user.oid)
sessao.add(area)
sessao.commit()