Archivos Mensuales: abril 2012

Clone a MongoEngine object (Python MongoDB layer)

Now, imagine you have something like:

class Company(Document):
    name            = StringField(required=True)
    company_id      = StringField(required=True)
    phone           = StringField()

For some reason, you want to clone this object on the DB. That’s is, you want to create another exact object in the DB without the need to create another object manually an copy all it’s attributes. You can do it if you add the following method (a real hack, because MongoEngine doesn’t support cloning objects):

def clone(self):
        del self.__dict__['_id']
        del self.__dict__['_created']
        del self.__dict__['_changed_fields']
        self.id = ObjectId()

Note: If you have a SequenceField() you will need to delete it too so it can step up when you save the new object.

Don’t forget to:

from bson import ObjectId

So you can do:

obj = Company.objects(name='MyCompany')
obj.clone()
obj.name = 'MyOtherCompany'
obj.save()

Really useful, specially if your object has 8+ fields and one of more of it’s fields is a EmbeddedDocument.

Kind regards

Anuncios
Etiquetado , ,

Ordenar una lista de diccionarios basado en un criterio variable ordenado

Que que? xD

Ok, se tiene una lista de diccionarios Python, se quiere ordenar según un criterio ordenado de valores que puede tomar un determinada llave de un diccionario. Ash, no se como decirlo más fácil. Mejor un ejemplo:

Se tiene la siguiente lista de diccionarios:

[{'foo': FOO1}, {'foo': FOO2}, {'foo': FOO10}]

Y se tiene la siguiente lista de criterio de ordenación:

[FOO10, FOO2, FOO1]

Se espera que la lista resultante esté ordenada de la siguiente manera:

[{'foo': FOO10}, {'foo': FOO2}, {'foo': FOO1}]

Python es el mejor. Acá cómo hacerlo:

>>> to_sort = [{'foo': FOO1}, {'foo': FOO2}, {'foo': FOO10}]
>>> criteria = [FOO10, FOO2, FOO1]
>>> to_sort.sort(key=lambda x: criteria.index(x['foo']))
>>> to_sort
[{'foo': FOO10}, {'foo': FOO2}, {'foo': FOO1}]
Etiquetado , ,

Perdí mi llave privada :(

Bueno, historia larga corta:

– El disco duro de mi laptop murió de la noche a la mañana.
– No encuentro el backup de la llave por ningún lado.
– El certificado de revocación que tenía en mi KeePassX era de la llave pasada, ash! se me había olvidado actualizarlo :S

Entonces me pasa lo peor que le puede pasar a alguien, que mi llave firmada por varia gente esté perdida y eternamente presente en los keyserver de Ubuntu :S

Si alguien tiene mi llave por favor borrenla:
gpg –delete-key 9EE171C8

😦

Etiquetado