• Stars
    star
    103
  • Rank 333,046 (Top 7 %)
  • Language
    HTML
  • Created almost 13 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Persistence and Widget Framework for Python and MongoDB

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