# -*- 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
@vUser
@validate(kwd="id", func=vInteger, minv=0)
def stop(self, user, id):
'''Stoppt den angegeben Auftrag.
Keywords:
apikey[string]: Der API Key
id[hash]: Eine Auftragsnummer
Return:
'''
return ""
@validate(kwd="recipients",func=vTel)
@vUser
@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
@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
@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, isDefault=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