5
from storm.locals import *
7
# FIXME: tengo que hacer más consistentes los nombres
11
'''Representa una relación slug <=> URL
15
id = Único, creciente, entero (primary key)
17
test = un test de validez de la URL
18
user = el dueño del atajo
19
activo = Si este atajo está activo o no.
20
Nunca hay que borrarlos, sino el ID puede volver
21
atrás y se "recicla" una URL. ¡Malo, malo, malo!
22
status = Resultado del último test (bien/mal)
23
ultimo = Fecha/hora del último test
26
# Hacer que los datos se guarden via Storm
27
__storm_table__ = "atajo"
28
id = Int(primary=True)
36
def __init__(self, url, user, test=''):
37
'''Exigimos la URL y el usuario, test es opcional,
40
# Hace falta crear esto?
41
r = self.store.find(Atajo, user = user, url = url)
45
# Test por default, verifica que la página exista.
46
self.test = u'code 200'
48
# FIXME: esto creo que es una race condition
49
# Existe la misma URL para el mismo usuario,
50
# reciclamos el id y el test, pero activa.
52
Atajo.store.remove(viejo)
54
self.test = viejo.test
56
# Autosave/flush/commit a la base de datos
60
'''Método de conveniencia'''
66
# Creamos una base SQLite
67
if not os.path.exists('pyurl.sqlite'):
68
cls.database = create_database("sqlite:///pyurl.sqlite")
69
cls.store = Store (cls.database)
72
cls.store.execute ('''
74
id INTEGER PRIMARY KEY,
87
cls.database = create_database("sqlite:///pyurl.sqlite")
88
cls.store = Store (cls.database)
89
# Caracteres válidos en un atajo de URL
90
#validos = string.letters + string.digits
93
'''Devuelve el slug correspondiente al
96
Básicamente un slug es un número en base 62,
97
representado usando a-zA-Z0-9 como "dígitos",
100
Más significativo a la derecha.
111
# s += self.validos[n%62]
113
return "estoesunslug"
116
# FIXME: no estoy feliz con esta API
117
def get(cls, slug = None, user = None, url = None):
118
''' Dado un slug, devuelve el atajo correspondiente.
120
Si url es None, devuelve la lista de sus atajos
121
Si url no es None , devuelve *ese* atajo
126
for p,l in enumerate(slug):
127
i += 62 ** p * cls.validos.index(l)
128
return cls.store.find(cls, id = i, activo = True).one()
132
return cls.store.find(cls, user = user, activo = True)
134
return cls.store.find(cls, user = user, url = url, activo = True).one()
137
'''Eliminar este objeto de la base de datos'''
142
'''Correr el test con minitwill y almacenar
144
self.status = minitwill(self.url, self.test)
145
self.ultimo = datetime.datetime.now()
149
a1 = Atajo(u'http://nomuerde.netmanagers.com.ar', u'unnombredeusuario')
151
a1 = Atajo(u'http://www.python.org', u'unnombredeusuario')
153
print Atajo.get(slug='b').url
154
#$[print x.url for x in Atajo.get(user=u'unnombredeusuario')]