-
Notifications
You must be signed in to change notification settings - Fork 0
/
model.py
107 lines (90 loc) · 3.6 KB
/
model.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
# -*- coding: utf-8 -*-
from google.appengine.ext import ndb
from google.appengine.api import urlfetch
import logging
import datetime
from bs4 import BeautifulSoup as BS
from google.appengine.api import memcache
logger = logging.getLogger('models')
# latitude, longitude, icone, Nome, IdEstacao, StatusOnline,
# StatusOperacao, VagasOcupadas, numBicicletas, Endereco
class Estacao(ndb.Model):
local = ndb.GeoPtProperty()
nome = ndb.StringProperty()
endereco = ndb.StringProperty()
numero = ndb.IntegerProperty()
status = ndb.StringProperty()
funcionando = ndb.BooleanProperty()
bicicletas = ndb.IntegerProperty(default=0)
vagas = ndb.IntegerProperty(default=0)
interacoes = ndb.IntegerProperty(default=0)
data = ndb.DateProperty(auto_now_add=True)
@classmethod
def update_data(cls):
url = 'http://ww2.mobilicidade.com.br/bikesampa/mapaestacao.asp'
result = urlfetch.fetch(url)
logger = logging.getLogger('update_data')
if result.status_code != 200:
logger.error('Falha ao baixar pagina: {}'.format(result.status_code))
return
soup = BS(result.content)
funcoes = []
for script in soup.find_all('script'):
if 'src' in script or not script.string:
continue
if not 'exibirEstacaMapa' in script.string:
continue
linhas = script.string.splitlines()
for i, linha in enumerate(linhas):
if linha.startswith('exibirEstacaMapa'):
funcoes.append(linhas[i:i+10])
break
if not funcoes:
logger.error('Falha ao encontrar as chamadas de funcao')
return
hoje = datetime.date.today()
helper = lambda s, b, e: s.strip()[b:e]
estacoes = []
todas_estacoes = Estacao.query(Estacao.data==hoje).fetch(batch_size=200)
for funcao in funcoes:
lat = helper(funcao[0],18,-2)
lon = helper(funcao[1],1,-2)
nome = helper(funcao[3],1,-2)
numero = int(helper(funcao[4],1,-2))
online = helper(funcao[5], 1, -2)
operacao = helper(funcao[6], 1, -2)
bicicletas = int(helper(funcao[7], 1, -2))
vagas = int(helper(funcao[8], 1, -2))
endereco = helper(funcao[9], 1, -3)
estacao = None
for e in todas_estacoes:
if e.numero == numero:
estacao = e
break
if not estacao:
estacao = Estacao(numero=numero, data=hoje)
if estacao.bicicletas != bicicletas:
estacao.interacoes += abs(estacao.bicicletas-bicicletas)
estacao.bicicletas = bicicletas
estacao.local = ndb.GeoPt("{}, {}".format(lat, lon))
estacao.nome = nome
estacao.vagas = vagas
estacao.endereco = endereco
status = 'N/A'
operando = False
if operacao in ('EI', 'EM'):
status = u'Manutenção/Implantação'
else:
if online == 'A' and operacao == 'EO':
status = u'Operando'
operando = True
else:
status = u'Offline'
estacao.status = status
estacao.funcionando = operando
estacoes.append(estacao)
if len(estacoes) >= 100:
ndb.put_multi(estacoes)
estacoes = []
memcache.set('last-update', datetime.datetime.now())
memcache.delete('home-html')