Skip to content

entone/Humongolus

Repository files navigation

Persistence and Widget Framework for Python and MongoDB

Google Group: http://groups.google.com/group/humongolus

Features

  • Type Validation
  • Lazy Relationships
  • Full MongoDB Index Support
  • Dirty Updating (only send changes to db)
  • Full Test Suite (97% code coverage)
  • Documentation
  • Exposes default MongoDB cursors
  • Robust Widget System
  • Default HTML Widgets
    • Text
    • Password
    • Checkbox
    • Select
    • MultiSelect
    • TextArea
    • FieldSet
    • Form
  • List validation (len and multiple types)
  • Attribute aliases
  • Dynamic Field Validation
  • Large Collection of Default Field Types
    • Char
    • Integer
    • Float
    • Date
    • TimeStamp
    • DocumentID (pseudo DBRef)
    • AutoIncrement
    • DynamicDocument (pseudo DBRef)
    • Boolean
    • Regex
    • Geo
    • Email
    • Phone
    • Choice Fields (Model, Collection and List)
    • File
  • Endless EmbeddedDocuments
  • Default Created/Modified attributes
  • Easily integrates with Backbone.js or other client side frameworks
  • TODO
    • Tutorials
    • Plugins

Usage also see test.py and tests/test_field.py for more usage examples.

from pymongo.mongo_client import MongoClient
import logging
import humongolus as orm
import datetime
import humongolus.field as field

conn = MongoClient()
FORMAT = '%(asctime)-15s %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger("humongolus")

orm.settings(logger=logger, db_connection=conn)

class Location(orm.EmbeddedDocument):
  city = field.Char(required=True)
  state = field.Char()

class Job(orm.EmbeddedDocument):
  employer = field.Char()
  title = field.Char(required=True)
  locations = orm.List(type=Location)

class Human(orm.Document):
  _db = "test"
  _collection = "humans"
  human_id = field.AutoIncrement(collection="human")
  name = field.Char(required=True, min=2, max=25)
  age = field.Integer(min=0, max=3000)
  height = field.Float(min=1, max=100000)
  weight = field.Float(min=1, max=30000)
  jobs = orm.List(type=Job)
  genitalia = field.Char()

class Female(Human):
  genitalia = field.Char(default='inny')

class Male(Human):
  genitalia = field.Char(default='outy')

class Car(orm.Document):
  _db = "test"
  _collection = "cars"
  owner = field.DynamicDocument()
  make = field.Char()
  model = field.Char()
  year = field.Date()
  silly_date = field.TimeStamp()    

Human.cars = orm.Lazy(type=Car, key='owner._id')

chris = Male()
chris.name = "Chris"
chris.age = 31
chris.height = 100
chris.weight = 180

job = Job()
job.employer = "Entropealabs"
job.title = "President"

loc = Location()
loc.city = "Chicago"
loc.state = "IL"

job.locations.append(loc)
chris.jobs.append(job)

print chris._json()
  {'jobs': [
      {
          'employer': u'Entropealabs', 
          'locations': [
              {'city': u'Chicago', 'state': u'IL'}
          ], 
          'title': u'President'}
      ], 
      'name': u'Chris', 
      'weight': 180.0, 
      'age': 31, 
      'height': 100.0, 
      'genitalia': u'outy', 
      'human_id': 1328
  }

_id = chris.save()

print _id

  4f36dd48eac0742b92000000

for person in Human.find().sort({"name":-1}):
  print person.name
  print person.created
  print person.modifed
  for job in person.jobs:
      print job.title
      for loc in job.locations:
          print loc.city

car = Car()
car.owner = chris
car.make = "Isuzu"
car.model = "Rodeo"
car.year = datetime.datetime(1998, 1, 1)

print car
  <__main__.Car object at 0x7fe3c9375650>

c_id = car.save()

print car._get("owner")().name
  Chris