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
-~----------~----~----~----~------~----~------~--~---

Reply via email to