iro/controller/viewinterface.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 23 Mar 2012 16:18:12 +0100
branchdevel
changeset 242 745d829d1e02
parent 210 3763babd5e10
child 250 91890ea7ed81
permissions -rw-r--r--
tests for iro.install.getAllRoutes added

# -*- coding: utf-8 -*-
from ..model.decorators import vUser, vRoute, dbdefer, vTyp
from ..model.message import SMS, Fax, Mail

from ..validate import validate, vBool, vTel, vEmail, vInteger

from .task import createJob

class Interface(object):
    '''class for a xmlrpc user
    '''
    
    @validate(kwd="detailed", func=vBool, need=False)
    @validate(kwd="id", func=vInteger, minv=0, need=False, none_allowed=True)
    @vUser
    @dbdefer
    def status(self, session, user, id=None, detailed=False):
        '''Gibt den aktuellen Status eines Auftrages oder Mehreren zurück.

        Keywords:
        apikey[string]: Der API Key
        id[hash]: Eine Auftragsnummer
        detailed[boolean]: Details ausgeben

        Return:
        jobs[list]: Eine Liste der Aufträge.
        job.name[string]: Angebener Name
        job.status[string]: Status des Auftrages


        '''
        user = session.merge(user)
        ret={}
        if not id:
            for job in  user.jobs:
                ret[str(job.id)]={"status":job.status}
        else:
            ret[str(id)]={"status":user.job(id).status}
        
        return ret
   
    @validate(kwd="recipients",func=vTel)
    @vUser
    @validate(kwd="route", func=vRoute, typ="sms")
    def sms(self, user, message, recipients, route="default", info=""):
        '''Versendet eine SMS.

        Keywords:
        apikey[string]: Der API Key
        message[string]: Nachricht
        recipients[list]: eine Liste von Emfänger-Nummern (gemäß ITU-T E.123)
        route[string|list]: Route über den geschickt werden soll, 
                            oder eine Liste von Routen, um Fallbacks anzugeben

        Return:
        id[hash]: Die ID des Auftrages

        '''
        d = createJob(user, recipients, SMS(message), route, info)
        def ret(job):
            return job.dbjob
        d.addCallback(ret)
        return d
   
    @validate(kwd="recipients",func=vTel)
    @vUser
    @validate(kwd="route",func=vRoute, typ="fax")
    def fax(self, user, subject, fax, recipients, route="default", info=""):
        '''Versendet ein FAX.

        Keywords:
        apikey[string]: Der API Key
        subject[string]: Der Betreff
        fax[string]: Der base64 kodierte content
        recipients[list]: Eine Liste von Emfänger-Nummern (gemäß ITU-T E.123)
        route[string|list]: Route über den geschickt werden soll, 
                            oder eine Liste von Routen, um Fallbacks anzugeben

        Return:
        id[hash]: Die ID des Auftrages

        '''
        d = createJob(user, recipients, Fax(subject, fax), route, info)
        def ret(job):
            return job.dbjob
        d.addCallback(ret)
        return d

    @validate(kwd="recipients",func=vEmail, allowString=False)
    @validate(kwd="frm",func=vEmail, need=False, allowList=False)
    @vUser
    @validate(kwd="route",func=vRoute, typ="mail")
    def mail(self, user, subject, body, recipients, frm=None, route="default", info=""):
        '''Versendet eine Email.

        Keywords:
        apikey[string]: Der API Key
        subject[string]: Der Betreff
        body[string]: Der Email Body
        recipients[list]: Eine Liste von Emailadressen
        frm[string]: Die Absender Emailadresse
        route[string|list]: Route über den geschickt werden soll, 
                            oder eine Liste von Routen, um Fallbacks anzugeben

        Return:
        id[hash]: Die ID des Auftrages

        '''

        d = createJob(user, recipients, Mail(subject, body, frm), route, info)
        def ret(job):
            return job.dbjob
        d.addCallback(ret)
        return d
       
    @validate(kwd="typ", func=vTyp)
    @vUser
    @dbdefer
    def routes(self, session, user, typ):
        '''Gibt eine Liste aller verfügbaren Provider zurück.

        Keywords:
        apikey[string]: Der API Key
        typ[string]: Der Typ zu dem die Providerloste ausgeben werden soll
                     Einer der Liste ["sms","fax","mail"]

        Return:
        providerlist[list]: Eine Liste aller möglichen Provider

        '''
        user = session.merge(user)
        offers = user.routes(typ)
        return [u[0] for u in offers]
        
    @validate(kwd="typ", func=vTyp)
    @vUser
    @dbdefer
    def defaultRoute(self, session, user, typ):
        '''Gibt den Standardprovider zurück.
 
        Keywords:
        apikey[string]: Der API Key
        typ[string]: Der Typ zu dem die Providerliste ausgeben werden soll
                     Einer der Liste ["sms","fax","mail"]

        Return:
        provider[string]: Der Standardprovider für den angeben Typ


        '''
        user = session.merge(user)
        offers = user.routes(typ, default=True)
        return [u[0] for u in offers]

    @vUser
    @dbdefer
    def bill(self, session, user):
        '''Gibt eine Rechnung zurück über die noch nicht abgerechneten Nachrichten und des Preises.

        Keywords:
        apikey[string]: Der API Key

        Return:
        bills[dict]: Eine Liste nach Nachrichtentypen
        bill[route][info].anz: Anzahl der verschickten Nachrichten pro "Infoklasse"
        bill[route][info].price: Preis pro "Infoklasse"
        bill[route].anz: Anzahl der verschickten Nachrichten pro Route 
        bill[route].price: Preis für eine Route
        total.price: der Gesammtpreis
        total.anz: die Gesammtanzahl
        '''
        ret={'total':{'price':0, 'anz':0}}
        user=session.merge(user)
        for route in user.rights:
            n=route.offer_name
            ret[n]={'price':0, 'anz':0, 'info':{}}
            for bill in route.bill:
                ret[n]['info'][bill.info]={'price':float(bill.price),'anz':bill.anz}
                ret[n]['price'] += bill.price
                ret[n]['anz'] += bill.anz
            ret['total']['price'] += ret[n]['price'] 
            ret['total']['anz'] += ret[n]['anz'] 
            ret[n]['price'] = float(ret[n]['price'])

        ret['total']['price'] = float(ret['total']['price'])
        return ret

    @validate(kwd="recipients",func=vTel)
    def telnumber(self,recipients):
        '''Gibt True zurück, falls alle übergebene Telefonnummern valide sind.
        
        Keywords:
        recipients[list]: Eine Liste von Emfänger-Nummern (gemäß ITU-T E.123)

        Return:
        True: alle übergebene Nummern sind valide
        '''
        return True

    @validate(kwd="recipients",func=vEmail)
    def email(self,recipients):
        '''Gibt True zurück, falls alle übergebene Emailadressen valide sind.
        
        Keywords:
        recipients[list]: Eine Liste von Emailadressen

        Return:
        True: alle übergebene Nummern sind valide
        '''
        return True