Exemple #1
0
def actualizar(idPagina, usuario, elpath, peticion):
    if (idPagina is not None or idPagina == ''):
        index = search.Index(LLAVE_INDICE)
        modelo = index.get(idPagina)
        if (modelo is not None):
            if (usuario is None or modelo.field('usr').value != usuario.uid):
                raise NoAutorizadoException()
            else:
                #Solo si ha cambiado la informacion se recrea
                viejo = docToJson(modelo)
                cambio = False
                for key, value in peticion.iteritems():
                    if key in viejo:
                        if (value != viejo[key]):
                            cambio = True
                            break
                    else:
                        cambio = True
                        break
                if (cambio):
                    nuevo = recrearDocumento(idPagina, usuario, elpath,
                                             peticion)
                    index.put(nuevo)
                    return docToJson(nuevo)
                else:
                    return docToJson(modelo)
        else:
            raise NoExisteException()
    else:
        raise ParametrosIncompletosException()
Exemple #2
0
def borrar(idPagina, usuario):
    if (idPagina is not None or idPagina == ''):
        index = search.Index(LLAVE_INDICE)
        modelo = index.get(idPagina)
        if (modelo is not None):
            if (usuario is None
                    or (len(modelo['usr']) > 0
                        and modelo.field('usr').value != usuario.uid)):
                raise NoAutorizadoException()
            else:
                index.delete(idPagina)
        else:
            raise NoExisteException()
    else:
        raise ParametrosIncompletosException()
Exemple #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
Exemple #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
Exemple #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
Exemple #6
0
def StorageHandler(request, ident, usuario=None):
    if not ident == 'read':
        response = HttpResponse("", content_type='application/json')
    if request.method == 'GET':
        if (ident == 'jstreelist'):
            if (usuario is None):
                raise NoHayUsuarioException()
            ruta = request.GET.get('id', '/')
            tamanio = int(request.GET.get('tamanio', None))
            ultimo = request.GET.get('ultimo', None)
            if (ruta == '#'):
                ans = list_bucket2('', tamanio, ultimo)
                nombreNodo = darNombreNodo(ruta)
                nodo = [{
                    'text': nombreNodo,
                    'id': ruta,
                    'children': nodosJsTree(ans)
                }]
                if (len(ans) > 0):
                    nodo[0]['type'] = 'folder'
                response.write(simplejson.dumps(nodo))
            elif (usuario_es_dueno(usuario, ruta)):
                ans = list_bucket2(ruta, tamanio, ultimo)
                response.write(simplejson.dumps(nodosJsTree(ans, ruta)))
            elif (ruta == '/usr/'):
                response.write(
                    simplejson.dumps([{
                        'text': usuario.proveedor,
                        'id': '/usr/' + usuario.proveedor + '/',
                        'children': True
                    }]))
            elif (ruta == '/usr/' + usuario.proveedor + '/'):
                response.write(
                    simplejson.dumps([{
                        'text': usuario.sufijo,
                        'id': '/usr/' + usuario.miId + '/',
                        'children': True
                    }]))
            else:
                response.write(simplejson.dumps([]))
        elif (ident == 'existe'):
            nombre = request.GET.get('name', None)
            metadatos = existe(nombre)
            if (metadatos is None):
                raise ParametrosIncompletosException()
            response.write(
                simplejson.dumps({
                    'error': 0,
                    'metadata': metadatos
                }))
        elif (ident == 'basic'):
            general(response)
        elif (ident == 'read'):
            nombre = request.GET.get('name', None)
            response = read_file(nombre)
        elif (ident == 'meta'):
            nombre = request.GET.get('name', None)
            response = get_metadata(nombre)
        elif (ident == 'miruta'):
            if (usuario is not None):
                response.write(
                    simplejson.dumps({
                        'error': 0,
                        'url': usuario.darURLStorage()
                    }))
            else:
                raise NoHayUsuarioException()
        elif (ident == 'renombrar'):
            viejo = request.GET.get('viejo', None)
            nuevo = request.GET.get('nuevo', None)
            if (viejo is None or nuevo is None):
                raise ParametrosIncompletosException()
            renombrar_archivo(response, viejo, nuevo)
        elif (ident == 'guid'):
            response.write(simplejson.dumps({'error': 0, 'uid': generarUID()}))
        elif (ident == 'voice'):

            nombre = generarRutaSimple(request.GET.get('name', None))
            # Add credentials
            credentials = GoogleCredentials.get_application_default()
            service = build('speech', 'v1', credentials=credentials)

            # Methods available in: https://developers.google.com/resources/api-libraries/documentation/speech/v1/python/latest/index.html
            collection = service.speech()

            # Build the data structure JSON-like
            data = {}
            data['audio'] = {}
            data['audio']['uri'] = "gs://" + darBucketName() + '/' + nombre
            data['config'] = {}
            #data['config']['encoding'] = '<ENCODING>'
            data['config']['languageCode'] = 'es-mx'
            data['config']['enableSeparateRecognitionPerChannel'] = True
            data['config']['audioChannelCount'] = 2
            #data['config']['sampleRateHertz'] = <SAMPLE_RATE>

            # Build the request and execute it
            request = collection.recognize(body=data)
            res = request.execute()
            response.write(simplejson.dumps(res))
        elif (ident == 'text'):

            nombre = generarRutaSimple(request.GET.get('name', None))
            # Add credentials
            credentials = GoogleCredentials.get_application_default()
            service = build('images', 'v1', credentials=credentials)

            # Methods available in: https://cloud.google.com/vision/docs/reference/rest/v1/images/annotate
            collection = service.images()

            # Build the data structure JSON-like
            data = {}
            data['image'] = {}
            data['image']['source'] = {}
            data['image']['source']['imageUri'] = "gs://" + darBucketName(
            ) + '/' + nombre

            data['features'] = []
            data['features'][0] = {}
            data['features'][0]['maxResults'] = 50
            data['features'][0]['type'] = 'DOCUMENT_TEXT_DETECTION'

            data['imageContext'] = {}
            data['imageContext']['cropHintsParams'] = {}
            data['imageContext']['cropHintsParams']['aspectRatios'] = [
                0.8, 1, 1.2
            ]

            # Build the request and execute it
            request = collection.annotate(body=data)
            res = request.execute()
            response.write(simplejson.dumps(res))
        else:
            response.write(simplejson.dumps({'error': 0}))
    elif request.method == 'DELETE':
        if (ident == 'borrar'):
            nombre = request.GET.get('name', None)
            if (not existe(nombre)):
                raise NoExisteException()
            if (not usuario_es_dueno(usuario, nombre)):
                raise NoAutorizadoException()
            delete_files(response, nombre)
    elif request.method == 'POST':
        nombreAnterior = request.POST.get('name', None)
        carpeta = request.POST.get('folder', '')
        auto = request.POST.get('auto', 'true')

        if (carpeta.endswith('/')):
            carpeta = carpeta[:-1]

        archivo = request.FILES['file-0']
        uploaded_file_filename = archivo.name
        uploaded_file_content = archivo.read()
        tamanio = len(uploaded_file_content)
        if (tamanio > MAX_TAMANIO_BYTES):
            raise MalaPeticionException()
        uploaded_file_type = archivo.content_type

        storage_client = darCliente()

        if (auto == 'true'):
            #Genera nombres automáticamente usando generarUID
            #Implica que cda versión tiene un nombre diferente
            #Puede que se borre siempre la versión anterior, depende de la bandera no-borrar
            if (nombreAnterior is not None
                    and request.POST.get('no-borrar', None) is None):
                if (usuario_es_dueno(usuario, nombreAnterior)):
                    try:
                        req2 = storage_client.objects().delete(
                            bucket=darBucketName(),
                            object=generarRutaSimple(nombreAnterior))
                        req2.execute()
                    except:
                        pass
                else:
                    #Debería en algún lugar registrarse que se debe borrar este archivo uerfano
                    pass
            if (not usuario_es_dueno(usuario, carpeta)):
                raise NoAutorizadoException()
            nombre = carpeta + '/' + generarUID(
            ) + '-' + uploaded_file_filename
        else:
            #Usa el nombre actual del archivo
            if (nombreAnterior is None):
                if (not usuario_es_dueno(usuario, carpeta)):
                    raise NoAutorizadoException()
                nombreAnterior = carpeta + '/' + uploaded_file_filename
            else:
                if (not usuario_es_dueno(usuario, nombreAnterior)):
                    raise NoAutorizadoException()
            nombre = nombreAnterior

        body = {
            'name': generarRutaSimple(nombre),
            'mimeType': uploaded_file_type,
            'metadata': {
                'mime': uploaded_file_type,
            }
        }
        fd = BytesIO(uploaded_file_content)

        req = storage_client.objects().insert(
            bucket=darBucketName(),
            body=body,
            media_body=googleapiclient.http.MediaIoBaseUpload(
                fd, uploaded_file_type),
            predefinedAcl='publicRead',
        )
        try:
            req.execute()
        except googleapiclient.errors.HttpError:
            raise InesperadoException()
        response.write(
            simplejson.dumps({
                'error': 0,
                'id': nombre,
                'tamanio': tamanio
            }))

    return response
Exemple #7
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