iro/model/user.py
author Sandro Knauß <knauss@netzguerilla.net>
Mon, 23 Apr 2012 21:38:30 +0200
branchdevel
changeset 271 b218238e76b9
parent 263 52284710c0b4
child 282 50cc13814bfb
permissions -rw-r--r--
creadoc: switching to rst syntax doc/tmpl: switching to english

from twisted.internet import defer
from inspect import getcallargs
from decorator import decorator

from .schema import User
from .dbdefer import dbdefer

from ..validate import validate, vHash
from ..error import UserNotFound, InterfaceException


@validate(kwd="apikey", func=vHash, minlength=15, maxlength=15)
@dbdefer
def getuser(session, apikey):
    """Returns a valid user object.

    :param session: a valid session object (is created by decorator :func:`iro.model.dbdefer.dbdefer`)
    :param string apikey: a vaild apikey (only [0-9a-f] is allowed)
    :return: a :class:`iro.model.schema.User` object
    :raises: :exc:`iro.error.UserNotFound`
    """
    user = session.query(User).filter_by(apikey=apikey).first()
    if user is None:
        raise UserNotFound()
    else:
        return user

@decorator
def vUser(f,*args,**kargs):
    """A Decorator to verify the apikey and execute the function with a valid :class:`iro.model.schema.User` instead of the apikey.
    
    The decorator expect the apikey in the **user** parameter.

    :return: a defer
    """ 
    kp=getcallargs(f,*args,**kargs)
    try:
        apikey = kp["user"]
    except KeyError:
        raise InterfaceException() 
    
    def _gotResult(_user):
        kp["user"]=_user
        e =  defer.maybeDeferred(f,**kp)
        return e
    d = defer.maybeDeferred(getuser, apikey=apikey)
    return d.addCallback(_gotResult)