iro/controller/user.py
author Sandro Knauß <knauss@netzguerilla.net>
Sun, 22 Jan 2012 02:36:12 +0100
branchdevel
changeset 102 85ac86f7ffc4
parent 96 883b25b0b760
permissions -rw-r--r--
reactor & sqlalchemy threadpools aufeinander abstimmen keine prints mehr

import re

from ..model import User

from ..error import UserNotFound, InterfaceException, ValidateException


def rehash(hash):
    if not re.match(r'^[a-f0-9]{15,}$', hash.lower()):
        raise ValidateException()
    return True

def validate(**kargs):
    def v(f):
        def new_f(*a,**k):
            for i in kargs:
                kargs[i](k[i])
            return f(*a,**k)
        new_f.__name__ = f.__name__
        return new_f
    return v
            

@validate(userhash=rehash)
def getuser(userhash, session):
    user = session.query(User).filter_by(apikey=userhash).first()
    if user is None:
        raise UserNotFound()
    else:
        return user

def with_user(f):
    def new_f(*args,**kargs):
        args=list(args)
        try:
            userhash = kargs["apikey"]
            del kargs["apikey"]
        except KeyError:
            try:
                userhash = args[1]
                del args[1]
            except IndexError:
                raise InterfaceException() 
        
        def _gotResult(_user):
            kargs["user"]=_user
            return f(*args,**kargs)
        return getuser(userhash=userhash).addCallback(_gotResult)

    new_f.__name__ = f.__name__
    return new_f