Greetings Elixir users! A little treat for your weekend: I just committed two new elixir extensions!
The first, elixir.ext.encrypted, provides automatic encryption using blowfish encryption for any unicode field in your elixir entities. It requires the excellent PyCrypto (http://www.amk.ca/python/code/crypto). The second, elixir.ext.versioned, provides a fairly complete implementation of versioning for your entities - as you update instances, the history of that instance is tracked, with version numbers and timestamps, including the ability to look at old versions, compare versions, and revert to previous versions. Here is a short example of both extensions in use, along with an example of the new event code that we integrated into Elixir earlier in the week: from elixir import * from elixir.events import before_update from elixir.ext.versioned import acts_as_versioned, after_revert from elixir.ext.encrypted import acts_as_encrypted class Person(Entity): has_field('name', Unicode) has_field('email', Unicode) has_field('password', Unicode) has_many('articles', of_kind='Article', inverse='author') acts_as_encrypted(for_fields=['password'], with_secret='s3cr1t') class Article(Entity): has_field('title', Unicode, primary_key=True) has_field('description', Unicode) has_field('content', Unicode) belongs_to('author', of_kind='Person', inverse='articles') acts_as_versioned() @after_update def article_updated(self): ''' Called after update, where you can access the new version number through self.version, and the timestamp through self.timestamp. ''' print '-' * 80 print 'Article updated at', self.timestamp print ' new version is ->', self.version @after_revert def article_reverted(self): ''' Called after the instance is reverted ''' print '-' * 80 print 'Article reverted!' print '-' * 80 if __name__ == '__main__': metadata.bind = 'sqlite:///' metadata.create_all() jonathan = Person( name='Jonathan', email='[EMAIL PROTECTED]' ) blog_post = Article( title='Some Blog Post', description='A blog post on some subject', content='Draft content for blog post', author=jonathan ) objectstore.flush(); objectstore.clear() blog_post = Article.get('Some Blog Post') blog_post.content = 'Updated content for blog post' objectstore.flush(); objectstore.clear() blog_post = Article.get('Some Blog Post') blog_post.content = 'Even more updated post' objectstore.flush(); objectstore.clear() blog_post = Article.get('Some Blog Post') for previous_version in blog_post.versions: print '-' * 80 print previous_version.version print previous_version.timestamp print blog_post.compare_with(previous_version) print '-' * 80 assert blog_post.version == 3 blog_post.revert() objectstore.flush(); objectstore.clear() blog_post = Article.get('Some Blog Post') assert blog_post.version == 2 assert blog_post.content == 'Updated content for blog post' I would love to get some feedback on these extensions, along with any suggestions on how I might make them better. Have a great weekend! -- Jonathan LaCour http://cleverdevil.org --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "SQLElixir" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlelixir?hl=en -~----------~----~----~----~------~----~------~--~---
