For anyone who is interested attached is a standalone class using DAL. It
using a singleton for the database connection not sure if this is good or
bad for all applications. However I am working on classes that will remain
in memory.

As long as gluon is in your python path you can test this file with: python
body.py
PS: Make sure to edit the database connection string
-- 
-- 
Regards,
Bruce Wade
http://ca.linkedin.com/in/brucelwade
http://www.wadecybertech.com
http://www.warplydesigned.com
http://www.fitnessfriendsfinder.com
# Author: Bruce Wade
# 2012-03-10

import datetime

from gluon import DAL, Field

class Body:
    
    db = None
    
    def __init__(self, db):
        if not Body.db:
            Body.db = db
            self.define_tables(Body.db)
            
    def add_weight(self, member, weight):
        now = datetime.datetime.now()
        new_entry = Body.db.body_weight.insert(
            member = member,
            weight = weight,
            updated_at = now
        )
        self.db.commit()
        
    def delete_weight(self, member, weight_id):
        weight = Body.db((Body.db.body_weight.member == member) & (Body.db.body_weight.id == weight_id)).select().first()
        if weight:
            weight.delete()
    
    def get_body_weights(self, member):
        return Body.db(Body.db.body_weight.member == member).select()
    
    def get_last_weight(self, member):
        return Body.db(Body.db.body_weight.member == member).select(orderby=~Body.db.body_weight.id).first()
    
    def get_weight_loss(self, member):
        first, last = self._get_max_last(member)
        
        if not first and not last:
            return None, "Not enough data!"
        
        if first > last:
            loss = first - last
            return True, loss
        else:
            gained = last - first
            return False, gained
            
    def get_weight_gain(self, member):
        first, last = self._get_max_last(member)
        
        if not first and not last:
            return None, "Not enough data!"
        
        if first > last:
            loss = first - last
            return False, loss
        else:
            gained = last - first
            return True, gained
    
    def get_max_weight(self, member):
        body_max = Body.db.body_weight.weight.max()
        return Body.db(Body.db.body_weight.member == member).select(body_max).first()['MAX(body_weight.weight)']
    
    def get_min_weight(self, member):
        body_min = Body.db.body_weight.weight.min()
        return Body.db(Body.db.body_weight.member == member).select(body_min).first()['MIN(body_weight.weight)']
    
    def get_last_x_weights(self, member, weights_to_get = 5):
        return Body.db(Body.db.body_weight.member == member).select(orderby=~Body.db.body_weight.id, limitby=(0, weights_to_get))
    
    def _get_max_last(self, member):
        max = self.get_max_weight(member)
        last  = Body.db(Body.db.body_weight.member == member).select(orderby=~Body.db.body_weight.id).first()
        count = Body.db(Body.db.body_weight.member == member).count()
        
        if count >= 2:
            return max, last.weight
        else:
            return None, None
        
    def define_tables(self, db):
        print "Trying to define tables"
        if 'body_weight' not in self.db.tables:
            now = datetime.datetime.now()
            Body.db.define_table('body_weight',
                Field('member', 'integer'),
                Field('weight', 'double'),
                Field('record_date', 'date', default=now),
                Field('updated_at', 'datetime', update=now)
            )
            self.db.commit()
            
if __name__ == "__main__":
    db = DAL('postgres:psycopg2://user_name:password@localhost/database')
    body = Body(db)
    member = 1
    weight = 155
    print "Adding body weight"
    #body.add_weight(member, weight)
    
    print "Getting body weights"
    print body.get_body_weights(member)
    
    print "Get last entry"
    print body.get_last_weight(member)
    
    lost, amount = body.get_weight_loss(member)
    if lost:
        print "You lost %slbs" % amount
    else:
        print "Sorry you gained %slbs" % amount
        
    gain, amount = body.get_weight_gain(member)
    if gain:
        print "You gained %slbs" % amount
    else:
        print "Sorry you lost %slbs" % amount
        
    print "Max weight", body.get_max_weight(member)
    print "Min weight", body.get_min_weight(member)
    
    print "Last weights\n", body.get_last_x_weights(member)
    
    import random, datetime
    random.seed(datetime.datetime.now())
    newbody = Body(db)
    member = 2
    for weight in xrange(100):
        weight = random.randint(0, 500)
        newbody.add_weight(member, weight)
    print "Get last entry"
    print newbody.get_last_weight(member)
    lost, amount = newbody.get_weight_loss(member)
    if lost:
        print "You lost %slbs" % amount
    else:
        print "Sorry you gained %slbs" % amount
        
    gain, amount = body.get_weight_gain(member)
    if gain:
        print "You gained %slbs" % amount
    else:
        print "Sorry you lost %slbs" % amount
    print "Max weight", newbody.get_max_weight(member)
    print "Min weight", newbody.get_min_weight(member)
    print "Last weights\n", newbody.get_last_x_weights(member)
    

Reply via email to