コード例 #1
0
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
コード例 #2
0
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
コード例 #3
0
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
コード例 #4
0
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
コード例 #5
0
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
コード例 #6
0
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