def to_dict_simple(model, propio=None, puntos=False, ignorar=[]): temp = comun.to_dict(model, propio, puntos, ignorar) ans = {} for a in temp: try: ans[a['k']] = simplejson.loads(a['v']) except: ans[a['k']] = None return ans
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
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 opinarLocal(idPagina, usuario, peticion, maxContadores): #Busca la opinion y la modifica o la crea paginaKey = ndb.Key(Pagina, idPagina) temporal = ndb.gql('SELECT * FROM Opinion WHERE usr = :1 AND tip = :2 and ANCESTOR IS :3', usuario.uid, peticion['tip'], paginaKey) datos, next_cursor, more = temporal.fetch_page(1) miopinion = None lista = peticion['v'] valores = {} for indice in range(MAX_ATTRS_OPINION): llave = 'v'+str(indice) if (indice < len(lista)): valores[llave] = lista[indice] else: valores[llave] = None if (len(datos) > 0): miopinion = datos[0] vieja = comun.to_dict(miopinion) comun.llenarYpersistir(Opinion, miopinion, valores) #Si la opinion ha cambiado o es nueva haCambiado = False for indice in range(MAX_ATTRS_OPINION): llave = 'v'+str(indice) if (vieja[llave] != valores[llave]): haCambiado = True break if (haCambiado): #Debo disminuir el contador de esa opinion vieja contDec = escribirContador(idPagina, vieja, -1, peticion['tip'], maxContadores) #ans['dec'] = comun.to_dict(contDec) #Debo incrementar el contador de la nueva opinion valores contInc = escribirContador(idPagina, valores, 1, peticion['tip'], maxContadores) #ans['inc'] = comun.to_dict(contInc) else: #La debe crear miopinion = Opinion(usr=usuario.uid, tip=peticion['tip'], parent=paginaKey, **valores) miopinion.put() contInc = escribirContador(idPagina, valores, 1, peticion['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 MainHandler(request, data, usuario): try: #incluye los parametros del get no va a ignorar el lenguaje (solo se usa para memcache) var_full_path = request.get_full_path() llaveParaMemcache = var_full_path if users.is_current_user_admin(): llaveParaMemcache = PREFIJO_MEMCACHE_ADMIN+llaveParaMemcache #incluye hasta la ? o # y va a ignorar el lenguaje var_path = request.path if request.method == 'GET': leng = re.findall('^(\/leng-)([a-zA-Z]{3})(\/)', var_path) if (len(leng) > 0): leng = leng[0][1].lower() var_path = var_path[9:] data = data[9:] else: leng = LENGUAJE_PRED puntoExtension = data.rfind('.') extension = data[puntoExtension:] mime = 'text/html' esBinario = False for tipo in LISTA_PATRONES: if (tipo['patron'].match(extension)): mime = tipo['mime'] if tipo['bin']: esBinario = True break if not esBinario: mime = mime+'; charset=utf-8' if False:#Usar cache anterior = memcache.get(llaveParaMemcache) if (anterior): return HttpResponse(anterior, content_type=mime) #Se lee el template para saber cuales ids se deben buscar de la base de datos if (not esBinario): llavesEntidades = [] identificadores = [] module = __import__('models') #Buscar un template valido para la url ruta = data varRutaExiste = 0 #0. Primero se mira si tal vez existe la ruta exacta varRutaExiste = rutaExiste(ruta) if (varRutaExiste == 0): #1. Se le quita la extensión if (puntoExtension >= 0): ruta = ruta[:puntoExtension] #2. Se itera por los diferentes slash y se mira si existe template ultimoIndice = len(ruta) while True: rutaParcial = ruta[:ultimoIndice]+'.html' ultimoIndice = ruta.rfind('/', 0, ultimoIndice) varRutaExiste = rutaExiste(rutaParcial) if (not (varRutaExiste == 0) or ultimoIndice <= 0): break else: rutaParcial = ruta #Si no encontró se queda con el index if (varRutaExiste == 0 and ultimoIndice <= 0): data = 'index.html' else: data = rutaParcial todo = procesarTemplate(data, var_path) for parte in todo['nodos']: class_ = getattr(module, parte['tipo']) identificadores.append(ndb.Key(class_, parte['id'])) llavesEntidades = todo['busquedas'] #Se leen las entidades list_of_entities = ndb.get_multi(identificadores) dicci = {} for entidad in list_of_entities: if entidad is not None: nombreClase = entidad.__class__.__name__ if not dicci.has_key(nombreClase): dicci[nombreClase] = {} dicci[nombreClase][entidad.key.id()] = entidad.to_dict() entidades = {} cursores = {} data_q = request.GET.get('data-q', None) data_next = request.GET.get('data-next', None) id_pagina = request.GET.get('pg', None) for llaveEntidad in llavesEntidades: objeto_busqueda = simplejson.loads(llaveEntidad) if (data_q == llaveEntidad and not data_next == None): objeto_busqueda['next'] = data_next objeto = comun.buscarGQL(objeto_busqueda) entidades[llaveEntidad] = comun.to_dict(objeto['datos']) if (objeto.has_key('next')): cursores[llaveEntidad] = objeto['next'] if (id_pagina is not None): try: detalle = buscarPagina(request, usuario, True) try: detalle['tit'] = simplejson.loads(detalle['tit']) except: detalle['tit'] = 'pais.tv' try: detalle['desc'] = simplejson.loads(detalle['desc']) except: detalle['desc'] = 'pais.tv' try: detalle['q'] = simplejson.loads(detalle['q']) except: detalle['q'] = '' try: detalle['img'] = simplejson.loads(detalle['img']) except: detalle['img'] = 'pais.tv' except: detalle = {'tit': 'pais.tv','desc': 'pais.tv','img': 'pais.tv',} else: detalle = None context = { 'admin':users.is_current_user_admin(), 'path':var_path, 'detalle': detalle, 'raiz': StorageHandler.darRaizStorage(), 'qparams': request.GET,#Aca se propagan los query params para que esten disponibles en el template } respuesta = direct_to_template(request, data, context, mime) if (extension.startswith(".scss")): for llave in request.GET.keys(): valor = request.GET.get(llave) respuesta.content = comun.remplazar(respuesta.content, llave, valor) respuesta.content = Compiler().compile_string(respuesta.content) #Siempre se codifica utf-8 respuesta.content = comun.siempreUtf8(respuesta.content) else: respuesta = StorageHandler.read_file(data) if (respuesta.status_code == 204): #significa que no existe return respuesta memcache.set(llaveParaMemcache, respuesta.content) agregarRutaParaMemcache(request.path, llaveParaMemcache) if (not esBinario): respuesta.content = comun.remplazar(respuesta.content, '__USER__', generarVariablesUsuario(var_full_path, leng), True) return respuesta elif request.method == 'DELETE': #Borra rutas específicas de memcache response = HttpResponse("", content_type='application/json') borrarRutasDeMemcache(request.path, llaveParaMemcache) response.write(simplejson.dumps({'error':0})) except Exception, e: exc_type, exc_value, exc_traceback = sys.exc_info() response = HttpResponse("", content_type='application/json', status=500) response.write(simplejson.dumps({'error':1, 'msg': 'Error de servidor: '+repr(traceback.format_tb(exc_traceback))+'->'+str(e)}))
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
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