--- a/iro/controller/viewinterface.py Fri Jan 27 15:01:59 2012 +0100
+++ b/iro/controller/viewinterface.py Fri Jan 27 17:49:57 2012 +0100
@@ -1,13 +1,15 @@
# -*- coding: utf-8 -*-
-from ..model.user import with_user
-from ..validate import validate, boolean, validateHash
+from ..model.decorators import vUser, vRoute
+from ..model.utils import vTyp
+from ..validate import validate, vBool, vHash, vTel, vEmail
+
class Interface(object):
'''class for a xmlrpc user
'''
- @validate(kwd="detailed", func=boolean, need=False)
- @validate(kwd="id", func=validateHash, need=False)
- @with_user
+ @validate(kwd="detailed", func=vBool, need=False)
+ @validate(kwd="id", func=vHash, need=False, maxlength=40)
+ @vUser
def status(self, user, id=None, detailed=False):
'''Gibt den aktuellen Status eines Auftrages oder Mehreren zurück.
@@ -30,7 +32,8 @@
#return user.status(id,detailed)
return ""
- @with_user
+ @vUser
+ @validate(kwd="id", func=vHash,maxlength=40)
def stop(self, user, id):
'''Stoppt den angegeben Auftrag.
@@ -43,8 +46,10 @@
'''
return ""
- @with_user
- def sms(self, user, message, recipients, route="default"):
+ @validate(kwd="recipients",func=vTel)
+ @vUser
+ @vRoute(typ="sms")
+ def sms(self, user, message, recipients, route="default", info=""):
'''Versendet eine SMS.
Keywords:
@@ -60,8 +65,10 @@
'''
return ""
- @with_user
- def fax(self, user, subject, fax, recipients, route="default"):
+ @validate(kwd="recipients",func=vTel)
+ @vUser
+ @vRoute(typ="fax")
+ def fax(self, user, subject, fax, recipients, route="default", info=""):
'''Versendet ein FAX.
Keywords:
@@ -78,8 +85,10 @@
'''
return ""
- @with_user
- def mail(self, user, subject, body, recipients, frm, route="default"):
+ @validate(kwd="recipients",func=vEmail)
+ @vUser
+ @vRoute(typ="mail")
+ def mail(self, user, subject, body, recipients, frm, route="default", info=""):
'''Versendet eine Email.
Keywords:
@@ -97,7 +106,8 @@
'''
return ""
- @with_user
+ @validate(kwd="typ", func=vTyp)
+ @vUser
def routes(self, user, typ):
'''Gibt eine Liste aller verfügbaren Provider zurück.
@@ -112,7 +122,8 @@
'''
return ""
- @with_user
+ @validate(kwd="typ", func=vTyp)
+ @vUser
def defaultRoute(self, user, typ):
'''Gibt den Standardprovider zurück.
@@ -128,7 +139,7 @@
'''
return ""
- @with_user
+ @vUser
def statistic(self, user):
'''Gibt eine Statik zurück über die versendendeten Nachrichten und des Preises.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/model/decorators.py Fri Jan 27 17:49:57 2012 +0100
@@ -0,0 +1,10 @@
+from decorator import decorator
+
+from .utils import DBDefer
+from .user import vUser
+
+def vRoute(typ):
+ @decorator
+ def wrapper(f, *args, **kwargs):
+ return f(*args, **kwargs)
+ return wrapper
--- a/iro/model/user.py Fri Jan 27 15:01:59 2012 +0100
+++ b/iro/model/user.py Fri Jan 27 17:49:57 2012 +0100
@@ -1,9 +1,9 @@
from inspect import getcallargs
-from functools import wraps
+from decorator import decorator
from .schema import User
from .utils import DBDefer
-from ..validate import vuserhash, validate
+from ..validate import validate, vHash
from ..error import UserNotFound, InterfaceException
dbdefer=DBDefer(None)
@@ -12,8 +12,9 @@
dbdefer.engine = engine
dbdefer.autocommit = autocommit
+
@dbdefer
-@validate(kwd="apikey", func=vuserhash)
+@validate(kwd="apikey", func=vHash, minlength=15, maxlength=15)
def getuser(apikey, session):
user = session.query(User).filter_by(apikey=apikey).first()
if user is None:
@@ -21,25 +22,19 @@
else:
return user
-def with_user(f):
- @wraps(f)
- def wrapper(*args,**kargs):
- kp=getcallargs(wrapper.original,*args,**kargs)
- try:
- apikey = kp["user"]
- except KeyError:
- raise InterfaceException()
-
- def _gotResult(_user):
- kp["user"]=_user
- return f(**kp)
+@decorator
+def vUser(f,*args,**kargs):
+ kp=getcallargs(f,*args,**kargs)
+ try:
+ apikey = kp["user"]
+ except KeyError:
+ raise InterfaceException()
+
+ def _gotResult(_user):
+ kp["user"]=_user
+ return f(**kp)
- d=getuser(apikey=apikey)
- return d.addCallback(_gotResult)
- try:
- wrapper.original=f.original
- except AttributeError:
- wrapper.original=f
- return wrapper
+ d=getuser(apikey=apikey)
+ return d.addCallback(_gotResult)
--- a/iro/model/utils.py Fri Jan 27 15:01:59 2012 +0100
+++ b/iro/model/utils.py Fri Jan 27 17:49:57 2012 +0100
@@ -58,3 +58,6 @@
with WithSession(self.engine, self.autocommit) as session:
return func(*args, session=session, **kwargs)
return wrapper
+
+def vTyp(value,field):
+ return value
--- a/iro/validate.py Fri Jan 27 15:01:59 2012 +0100
+++ b/iro/validate.py Fri Jan 27 17:49:57 2012 +0100
@@ -1,12 +1,12 @@
import re
-from functools import wraps
+from decorator import decorator
from inspect import getcallargs
from .error import ValidateException
-def boolean(value, field):
- t=[True,"true",1]
- f=[False,"false",0]
+def vBool(value, field):
+ t=[True, 1, "true", "True", "TRUE"]
+ f=[False, 0, "false", "False", "FALSE"]
if value in t:
return True
elif value in f:
@@ -15,7 +15,7 @@
raise ValidateException(field=field, msg='%s is not boolean' % field)
-def validateHash(value,field,minlength=None,maxlength=None):
+def vHash(value,field,minlength=None,maxlength=None):
if not re.match(r'^[a-f0-9]*$', value.lower()):
raise ValidateException(field=field)
if minlength and len(value)<minlength:
@@ -24,9 +24,11 @@
raise ValidateException(field=field)
return value
-def vuserhash(value,field):
- '''vailidate function for userhash'''
- return validateHash(value,field,minlength=15,maxlength=15)
+def vTel(value,field):
+ return value
+
+def vEmail(value, field):
+ return value
def validate(kwd,func, need=True,*args,**kargs):
'''validate decorator
@@ -35,23 +37,17 @@
f(userhash)
that will validate usrhash with the function vuserhash.
Every validate function should raise an Exception, if the the value is not valid'''
- def v(f):
- @wraps(f)
- def new_f(*a,**k):
- kp=getcallargs(new_f.original,*a,**k)
- try:
- if need or kp[kwd] is not None:
- kp[kwd] = func(kp[kwd],kwd,*args,**kargs)
- else:
- kp[kwd] = None
- except KeyError:
- if need:
- raise ValidateException(field=kwd,msg="%s is nessasary"%kwd)
- return f(**kp)
+ @decorator
+ def v(f,*a,**k):
+ kp=getcallargs(f,*a,**k)
try:
- new_f.original=f.original
- except AttributeError:
- new_f.original=f
- return new_f
+ if need or kp[kwd] is not None:
+ kp[kwd] = func(kp[kwd],kwd,*args,**kargs)
+ else:
+ kp[kwd] = None
+ except KeyError:
+ if need:
+ raise ValidateException(field=kwd,msg="%s is nessasary"%kwd)
+ return f(**kp)
return v
--- a/setup.py Fri Jan 27 15:01:59 2012 +0100
+++ b/setup.py Fri Jan 27 17:49:57 2012 +0100
@@ -7,7 +7,7 @@
version=__version__,
packages=['iro','iro.controller','iro.view','iro.model'],
setup_requires = ['nose>=0.11',"ngmodules>=0.2"],
- install_requires=['twisted>=11.1.0',"xmlrpclib","ConfigParser","multiprocessing","sqlalchemy","MySQL-python","SOAPpy"],
+ install_requires=['twisted>=11.1.0',"xmlrpclib","ConfigParser","multiprocessing","sqlalchemy","MySQL-python","SOAPpy",'decorator'],
test_suite="nose.collector",
description='Non Blocking Interface for sending a bunsh of SMSes, FAXes and Mails',
author='Sandro Knauß',