restructering validate devel
authorSandro Knauß <knauss@netzguerilla.net>
Fri, 27 Jan 2012 17:49:57 +0100
branchdevel
changeset 115 323d06431100
parent 114 1ed072cc6793
child 116 48c70425bf6c
restructering validate
iro/controller/viewinterface.py
iro/model/decorators.py
iro/model/user.py
iro/model/utils.py
iro/validate.py
setup.py
--- 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ß',