def darPassDePg(pg): idPagina = comun.leerNumero(pg) llave = ndb.Key('Pagina', idPagina) unapagina = llave.get() if (unapagina.pwd is None): unapagina.pwd = randomString(8) unapagina.put() return unapagina.pwd
def buscarPagina(request, usuario, usarPathLocal): idPagina = comun.leerNumero(request.GET.get('pg', None)) crear = request.GET.get('add', None) buscables = filtrarParametros(request, LIGTH_WEIGHT_KEYS) elpath = leerRefererPath(request, usarPathLocal) temp = None if (idPagina is None): if (usuario is not None): elUsuario = usuario.uid datos = [] if (crear is None): temporal = ndb.gql( 'SELECT * FROM Pagina WHERE usr = :1 and path = :2 ORDER BY date DESC', elUsuario, elpath) datos, next_cursor, more = temporal.fetch_page(1) unapagina = None if (len(datos) > 0): #Ya existe y no lo debo crear unapagina = datos[0] else: #Se debe crear unapagina = Pagina(usr=elUsuario, aut=usuario.miId, path=elpath, **buscables) unapagina.put() temp = comun.to_dict(unapagina, None, True) buscables = filtrarParametros(temp, LIGTH_WEIGHT_KEYS_ALL) DocHandler.autoCrearDoc(str(unapagina.key.id()), usuario, elpath, buscables) return temp else: #Por ahora no se sabe qué hacer cuando no hay usuario logeado raise NoHayUsuarioException() else: llave = ndb.Key('Pagina', idPagina) unapagina = llave.get() #Validar que exista el buscable DocHandler.autoCrearDoc(str(unapagina.key.id()), usuario, elpath, buscables) temp = comun.to_dict(unapagina, None, True) return temp
def PageHandler(request, ident, usuario=None): if request.method == 'GET': response = HttpResponse("", content_type='application/json', status=200) ans = {} ans['error'] = 0 if (ident == ''): ans['valor'] = buscarPagina(request, usuario, False) elif (ident == 'q'): ans = DocHandler.busquedaGeneral(request, usuario) todo = request.GET.get('todo', None) if (todo is not None): ids = [] for undoc in ans['valor']: ids.append(undoc['id']) laspaginas = ndb.get_multi( [ndb.Key('Pagina', comun.leerNumero(k)) for k in ids]) ans['valor'] = comun.to_dict(laspaginas, None, True) elif (ident == 'q2'): ans['next'] = None busqueda = {} busqueda['path'] = request.GET.get('path', None) busqueda['mio'] = request.GET.get('mio', '0') busqueda['n'] = comun.leerNumero(request.GET.get('n', 10)) busqueda['next'] = request.GET.get('next', None) #Para paginar #ans['q'] = busqueda parametros = [] sqltext = 'SELECT * FROM Pagina WHERE ' ixparam = 1 if (busqueda['path'] is not None): sqltext += 'path = :' + str(ixparam) parametros.append(busqueda['path']) ixparam = ixparam + 1 if (busqueda['mio'] == '1' and usuario is not None): sqltext += 'usr = :' + str(ixparam) parametros.append(usuario.uid) ixparam = ixparam + 1 if (ixparam == 1): sqltext = 'SELECT * FROM Pagina ' sqltext += ' ORDER BY date DESC' ans['sqltext'] = sqltext temporal = ndb.gql(sqltext, *parametros) if (busqueda['next'] is not None): datos, next_cursor, more = temporal.fetch_page( busqueda['n'], start_cursor=ndb.query.Cursor(urlsafe=busqueda['next'])) else: datos, next_cursor, more = temporal.fetch_page(busqueda['n']) ans['ans'] = comun.to_dict(datos, None, True) if (more): ans['next'] = next_cursor.urlsafe() response.write(simplejson.dumps(ans)) return response elif request.method == 'PUT': response = HttpResponse("", content_type='application/json', status=200) ans = {} ans['error'] = 0 peticion = simplejson.loads(request.raw_post_data) idPagina = comun.leerNumero(ident) if (idPagina is not None): llave = ndb.Key('Pagina', idPagina) modelo = llave.get() if (modelo is not None): if (usuario is None or modelo.usr != usuario.uid): raise NoAutorizadoException() else: otro = comun.llenarYpersistir( Pagina, modelo, peticion, ['usr', 'path', 'date', 'id', 'act'], True) elpath = leerRefererPath(request, False) buscables = filtrarParametros(otro, LIGTH_WEIGHT_KEYS_ALL) #Optimizar, si no ha cambiado, no recrear DocHandler.actualizar(str(idPagina), usuario, elpath, buscables) ans['valor'] = otro else: raise NoExisteException() else: raise ParametrosIncompletosException() response.write(simplejson.dumps(ans)) return response elif request.method == 'DELETE': response = HttpResponse("", content_type='application/json', status=200) ans = {} ans['error'] = 0 idPagina = comun.leerNumero(ident) if (idPagina is not None): llave = ndb.Key('Pagina', idPagina) modelo = llave.get() if (modelo is not None): if (modelo.usr is not None and (usuario is None or modelo.usr != usuario.uid)): raise NoAutorizadoException() else: modelo.key.delete() DocHandler.borrar(str(idPagina), usuario) else: raise NoExisteException() else: raise ParametrosIncompletosException() response.write(simplejson.dumps(ans)) return response
def TuplaHandler(request, ident, usuario=None): if request.method == 'GET': response = HttpResponse("", content_type='application/json', status=200) ans = {} ans['error'] = 0 if (ident == 'all'): idPagina = request.GET.get('pg', None) dom = request.GET.get('dom', None) sdom = request.GET.get('sdom', None) siguiente = request.GET.get('next', None) n = comun.leerNumero(request.GET.get('n', 100)) if (idPagina is None): raise ParametrosIncompletosException() paginaKey = ndb.Key(Pagina, idPagina) sqltext = 'SELECT * FROM Tupla WHERE i = :page and ANCESTOR IS :padre' parametros = {'page': idPagina, 'padre': paginaKey} if dom is not None: sqltext = sqltext + ' and d = :dom' parametros['dom'] = dom if sdom is not None: sqltext = sqltext + ' and sd = :sdom' parametros['sdom'] = sdom temporal = ndb.gql(sqltext, **parametros) if (siguiente is not None): datos, next_cursor, more = temporal.fetch_page(n, start_cursor=ndb.query.Cursor(urlsafe=siguiente)) else: datos, next_cursor, more = temporal.fetch_page(n) ans['ans'] = comun.to_dict(datos, None, True, ['id', 'i', 'd', 'sd']) if (more): ans['next'] = next_cursor.urlsafe() elif (ident == 'fecha'): ans['unixtime'] = int(1000*time.time()) elif (ident == 'next'): idPagina = request.GET.get('pg', None) dom = request.GET.get('dom', None) sdom = request.GET.get('sdom', None) if (idPagina is None or dom is None): raise ParametrosIncompletosException() paginaKey = ndb.Key(Pagina, idPagina) sqltext = 'SELECT * FROM Tupla WHERE i = :page and ANCESTOR IS :padre and d = :dom' parametros = {'page': idPagina, 'padre': paginaKey, 'dom': dom} if sdom is not None: sqltext = sqltext + ' and sd < :sdom' parametros['sdom'] = sdom sqltext = sqltext + ' ORDER BY sd DESC' temporal = ndb.gql(sqltext, **parametros) datos, next_cursor, more = temporal.fetch_page(1) ans['sql'] = sqltext if (len(datos) > 0): ans['ans'] = datos[0].sd else: ans['ans'] = None response.write(simplejson.dumps(ans)) return response elif request.method == 'POST': response = HttpResponse("", content_type='application/json', status=200) ans = {} ans['error'] = 0 peticion = simplejson.loads(request.raw_post_data) if (not 'dat' in peticion): raise ParametrosIncompletosException() if (peticion['acc'] == '+'): #Se asume una lista de tuplas [{"a.b.c.v": "ass"}] ans['n'] = crearTuplas(ident, peticion) elif (peticion['acc'] == '-'): llaves = peticion['dat'] ans['n'] = borrarTuplas(ident, llaves) response.write(simplejson.dumps(ans)) return response elif request.method == 'DELETE': response = HttpResponse("", content_type='application/json', status=200) ans = {} ans['error'] = 0 idPagina = comun.leerNumero(ident) n = comun.leerNumero(request.GET.get('n', 100)) if (idPagina is not None): ans['n'] = borrarTuplasTodas(ident, n) else: raise ParametrosIncompletosException() response.write(simplejson.dumps(ans)) return response
def VotaHandler(request, ident, usuario=None): response = HttpResponse("", content_type='application/json', status=200) ans = {} ans['error'] = 0 if request.method == 'GET': pg = request.GET.get('pg', None) enc = request.GET.get('enc', None) dec = request.GET.get('dec', None) if (pg is None): raise ParametrosIncompletosException() if (enc is not None): pas = darPassDePg(pg) ans['pas'] = pas motor = AESCipher(pas) ans['ans'] = motor.encrypt(enc); response.write(simplejson.dumps(ans)) return response elif (dec is not None): pas = darPassDePg(pg) ans['pas'] = pas motor = AESCipher(pas) ans['ans'] = motor.decrypt(dec); response.write(simplejson.dumps(ans)) return response usr = request.GET.get('u', None) vot = request.GET.get('v', None) if (usr is None or vot is None): raise ParametrosIncompletosException() consulta = [ 'per.'+usr+'.humId', 'per.'+usr+'.nom', 'global.votacion', ] datos = buscarTuplas(pg, consulta) datos = to_dict_simple(datos, None, True, ['id', 'i', 'd', 'sd']) if ((not ('global.votacion' in datos)) or datos['global.votacion'] is None): raise MalaPeticionException() rutaVotacion = datos['global.votacion'] consulta = [ rutaVotacion+'.pregunta', rutaVotacion+'.opciones.'+vot+'.txt', ] datos2 = buscarTuplas(pg, consulta) datos2 = to_dict_simple(datos2, None, True, ['id', 'i', 'd', 'sd']) payloadModificacion = {"dat":{ rutaVotacion+'.resultado.u.'+usr: simplejson.dumps(vot) },"acc":"+"} crearTuplas(pg, payloadModificacion) llave = ndb.Key('Pagina', comun.leerNumero(pg)) unapagina = llave.get() publicar(unapagina.usr, unapagina.path, pg, payloadModificacion) ans['msg'] = datos2[rutaVotacion+'.pregunta']+' '+datos['per.'+usr+'.humId']+' vota por "'+datos2[rutaVotacion+'.opciones.'+vot+'.txt']+'"' #ans['msg1'] = datos #ans['msg2'] = datos2 #ans['creacion'] = creacion response.write(simplejson.dumps(ans)) return response
def ContHandler(request, ident, usuario=None): if request.method == 'GET': response = HttpResponse("", content_type='application/json', status=200) ans = {} ans['error'] = 0 #Busco la opinion del usuario logeado y de la pagina actual idPagina = comun.leerNumero(request.GET.get('pg', None)) tip = request.GET.get('tip', None) paginaKey = ndb.Key(Pagina, idPagina) if (ident == 'per'): temporal = ndb.gql('SELECT * FROM Opinion WHERE usr = :1 AND tip = :2 and ANCESTOR IS :3', usuario.uid, tip, paginaKey) datos, next_cursor, more = temporal.fetch_page(1) if (len(datos) > 0): ans['ans'] = comun.to_dict(datos[0]) else: ans['ans'] = None elif (ident == 'pub'): #Paginar la consulta de todos los contadores de una pagina if (idPagina is None): raise ParametrosIncompletosException() sqltext = 'SELECT * FROM Contador WHERE tip = :tip and ANCESTOR IS :padre' temporal = ndb.gql(sqltext, **{'tip': tip, 'padre': paginaKey}) siguiente = request.GET.get('next', None) n = comun.leerNumero(request.GET.get('n', 100)) if (siguiente is not None): datos, next_cursor, more = temporal.fetch_page(n, start_cursor=ndb.query.Cursor(urlsafe=siguiente)) else: datos, next_cursor, more = temporal.fetch_page(n) ans['ans'] = comun.to_dict(datos) if (more): ans['next'] = next_cursor.urlsafe() response.write(simplejson.dumps(ans)) return response elif request.method == 'POST': response = HttpResponse("", content_type='application/json', status=200) ans = {} ans['error'] = 0 maxContadores = comun.leerNumero(request.GET.get('max', 5)) peticion = simplejson.loads(request.raw_post_data) idPagina = comun.leerNumero(ident) if (usuario is None): raise NoAutorizadoException() opinarLocal(idPagina, usuario, peticion, maxContadores) response.write(simplejson.dumps(ans)) return response elif request.method == 'DELETE': response = HttpResponse("", content_type='application/json', status=200) idPagina = comun.leerNumero(ident) tip = comun.leerNumero(request.GET.get('tip', None)) maxContadores = comun.leerNumero(request.GET.get('max', 5)) ans = {} ans['error'] = 0 if (idPagina is not None): ans['dec'] = borrarOpinion(idPagina, usuario, tip, maxContadores) else: raise ParametrosIncompletosException() response.write(simplejson.dumps(ans)) return response