2015-02-18

Otro truquito para web2py

A veces, uno quiere generar un archivo en el sever ejecutando un comando, stremearlo al cliente y borrarlo. Acá les muestro un pequeño hack que hice para hacer eso. Asumiendo que el archivo que generó se llama fname, hay que poner esto al final del método de su controller:

        class StreamAndCleanUp(object):
            def __init__(self):
                stream = file(fname, "rb")
                self.stream = stream
                self.name =  self.stream.name
                self.read = stream.read
               
            def close(self):
                self.stream.close()
                os.remove(fname)
                # You can also put here other actions you need to make after streaming the file

        return response.stream(StreamAndCleanUp())


Happy hacking,
Aureliano.

2015-02-05

PostGIS, RDS y web2py

En RDS hay soporte para postGIS. El setup normal para una base de datos está documentado y es bastante complicado. A eso se suma que el DAL de web2py es bastante molesto a la hora de hacer operaciones en SQL que setupean la base, necesitando que todas las operaciones de setup sean idempotentes. El ejemplo que dan en la documentación es cómo crear índices.
Uniendo todo esto, hice un módulo de python que puse en la carpeta models de mi aplicación y ahí ejecuto lo que dice en la documentación de AWS, modificado para que sea idempotente.
Acá les regalo mi scriptcito (que nombré postgis.py).

for extension in "postgis fuzzystrmatch postgis_tiger_geocoder postgis_topology".split():
    db.executesql("CREATE EXTENSION IF NOT EXISTS %s ;" % extension)

# Change ownership, required for RDS   
if settings.rds:
    for schema in "tiger topology".split():
        db.executesql("alter schema %s owner to rds_superuser;" % schema)

    db.executesql("CREATE OR REPLACE FUNCTION setup_postgis_exec(text) returns text language plpgsql volatile AS $f$ BEGIN EXECUTE $1; RETURN $1; END; $f$;")
    db.executesql("""\
SELECT setup_postgis_exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO rds_superuser')
  FROM (
    SELECT nspname, relname
    FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid)
    WHERE nspname in ('tiger','topology') AND
    relkind IN ('r','S','v') ORDER BY relkind = 'S')
s;
""")


Éxitos,
Aureliano.

2015-02-02

mercurial 2 git

Encontré esta página donde traducen comandos de mercurial a git. Si sos como yo y sabés mucho más de mercurial que de git (o al revés), es posible que te sirva como referencia. Yo sé que a mi ya me salvó las papas del fuego.

Happy hacking,
Aureliano.