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()
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
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
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()
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)
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 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
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