Exemple #1
0
def get_metadata(filename):
    respuesta = get_metadata_base(filename)
    if (respuesta is None):
        raise NoExisteException()
    response = HttpResponse("", content_type='application/json')
    response.write(simplejson.dumps({'error': 0, 'metadata': respuesta}))
    return response
Exemple #2
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 #3
0
def read_file(filename):
    temp = read_file_interno(filename)
    if (temp is None):
        raise NoExisteException()

    response = HttpResponse(temp['bin'],
                            content_type=temp['meta']['metadata']['mime'],
                            status=200)
    return response
Exemple #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()
Exemple #5
0
def delete_files(response, filename):

    storage_client = darCliente()

    metadata = get_metadata_base(filename)

    if (metadata is None):
        raise NoExisteException()

    req = storage_client.objects().delete(bucket=darBucketName(),
                                          object=generarRutaSimple(filename))
    try:
        req.execute()
    except googleapiclient.errors.HttpError:
        raise InesperadoException()
    response.write(simplejson.dumps({'error': 0}))
Exemple #6
0
def renombrar_archivo(response, viejo, nuevo):

    storage_client = darCliente()

    body = {}

    req1 = storage_client.objects().copy(
        sourceBucket=darBucketName(),
        destinationBucket=darBucketName(),
        sourceObject=generarRutaSimple(viejo),
        destinationObject=generarRutaSimple(nuevo),
        body=body,
        destinationPredefinedAcl='publicRead',
    )
    req2 = storage_client.objects().delete(bucket=darBucketName(),
                                           object=generarRutaSimple(viejo))
    try:
        req1.execute()
        req2.execute()
        response.write(simplejson.dumps({'error': 0}))
    except:
        #Aca puede ser otro error
        raise NoExisteException()
Exemple #7
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 #8
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