Example #1
0
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
Example #2
0
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
Example #3
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)
Example #4
0
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)
Example #5
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
Example #6
0
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)}))
Example #7
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
Example #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