Ejemplo n.º 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()
Ejemplo n.º 2
0
def AdminHandler(request, ident, usuario=None):
    if request.method == 'GET':
        if ident == 'identidad':
            if (usuario is not None):
                response = HttpResponse("",
                                        content_type='application/json',
                                        status=200)
                response.write(
                    simplejson.dumps({
                        'id': usuario.miId,
                        'roles': usuario.roles,
                        'proveedor': usuario.proveedor,
                        'sufijo': usuario.sufijo,
                        'uid': usuario.uid
                    }))
                return response
            else:
                return RespuestaNoAutorizado()
        else:
            #Zona de administradores
            if not enRolFun(usuario, ['admin']):
                raise NoAutorizadoException()
            if ident == 'clearmemcache':
                if not memcache.flush_all():
                    raise 'No se logro vaciar la memoria'
                else:
                    response.write(simplejson.dumps({'error': 0}))
                return response
Ejemplo n.º 3
0
def enRolFun(usuario, roles=[]):
    #logging.info('rutaStorage:')
    #logging.info(rutaStorage)
    if (len(roles) == 0):
        return True
    if (usuario is None):
        raise NoHayUsuarioException()
    else:
        if (usuario.enRol(['admin'])):
            #Lo deja pasar siempre al admin
            return True
        elif (not usuario.enRol(roles)):
            raise NoAutorizadoException()
    return True
Ejemplo n.º 4
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()
Ejemplo n.º 5
0
def borrarOpinion(idPagina, usuario, tip, maxContadores):
    if (usuario is None):
        raise NoHayUsuarioException()
    #Debo buscar la opinion asociada al id de la pagina actual
    paginaKey = ndb.Key(Pagina, idPagina)
    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):
        modelo = datos[0]
        if (modelo.usr != usuario.uid):
            raise NoAutorizadoException()
        else:
            vieja = comun.to_dict(modelo)
            modelo.key.delete()
            #Debo disminuir el contador de esa opinion vieja
            modificado = escribirContador(idPagina, vieja, -1, tip, maxContadores)
Ejemplo n.º 6
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
Ejemplo n.º 7
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
Ejemplo n.º 8
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