def render_user(self, user_ext, request): model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() creditlink = '' if peer: username = peer.name else: username = user_ext user = model.get_user_fromext(user_ext) logged = session.get_user(request) if user: credit = "%.3f" % (user.credit,) user_charges = charges.get_charges(user_ext) n_calls = len(user.calls) pager = self.render_pager(user_ext, n_calls) user_calls = calls.get_calls(user_ext, logged, 10) + "<p>%s</p>" % (pager,) creditlink = "" if user.credit > 0: if user.voip_id == logged.voip_id: creditlink += '<a href="/credit/transfer">Transferir</a>' else: creditlink += '<a href="/credit/transfer/%s">Transferir</a>' % (user.voip_id) if logged.admin: creditlink += ' <a href="/credit/add/%s">Crear</a>' % (user.voip_id) else: credit = 0.0 user_charges = "" user_calls = "" all_calls = self.render_user_calls(user_ext, request) args = {'ext': user_ext, 'username': username, 'credit': credit, 'credit_link':creditlink ,'calls': user_calls, 'charges': user_charges, 'all_calls': all_calls} return print_template('user-pbx-lorea', args)
def get_charges(user_ext): model = Model() user = model.get_user_fromext(user_ext) res = "" for charge in user.charges: date = charge.timestamp credit = charge.credit if charge.concept: concept = charge.concept else: concept = '' res += "<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n" % (date, credit,concept) return res
def add_charge(user_ext, amount, concept=""): model = Model() user = model.get_user_fromext(user_ext) if not user: user = User(user_ext) model.session.add(user) if concept: charge = Charge(user=user, timestamp=datetime.now(), credit=amount, concept=concept) else: charge = Charge(user=user, timestamp=datetime.now(), credit=amount) model.session.add(charge) model.session.commit()
def get_charges(user_ext): model = Model() user = model.get_user_fromext(user_ext) res = "" for charge in user.charges: date = charge.timestamp credit = charge.credit if charge.concept: concept = charge.concept else: concept = '' res += "<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n" % (date, credit, concept) return res
def add_charge(logged, user_ext, amount, concept=""): model = Model() user = model.get_user_fromext(user_ext) initiator_id = logged.id if not user: user = User(user_ext) model.session.add(user) if concept: charge = Charge(user=user, timestamp=datetime.now(), credit=amount, concept=concept, initiator_id=initiator_id, funded=True) else: charge = Charge(user=user, timestamp=datetime.now(), credit=amount, initiator_id=initiator_id, funded=True) model.session.add(charge) model.session.commit()
def add_charge(user_ext, amount, concept=""): model = Model() user = model.get_user_fromext(user_ext) if not user: user = User(user_ext) model.session.add(user) if concept: charge = Charge(user=user, timestamp=datetime.now(), credit=amount, concept=concept) else: charge = Charge(user=user, timestamp=datetime.now(), credit=amount) model.session.add(charge) model.session.commit()
def render_user(self, user_ext, request): model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() creditlink = '' if peer: username = peer.name else: username = user_ext user = model.get_user_fromext(user_ext) logged = session.get_user(request) if user: credit = "%.3f" % (user.credit, ) user_charges = charges.get_charges(user_ext) n_calls = len(user.calls) pager = self.render_pager(user_ext, n_calls) user_calls = calls.get_calls(user_ext, logged, 10) + "<p>%s</p>" % (pager, ) creditlink = "" if user.credit > 0: if user.voip_id == logged.voip_id: creditlink += '<a href="/credit/transfer">Transferir</a>' else: creditlink += '<a href="/credit/transfer/%s">Transferir</a>' % ( user.voip_id) if logged.admin: creditlink += ' <a href="/credit/add/%s">Crear</a>' % ( user.voip_id) else: credit = 0.0 user_charges = "" user_calls = "" all_calls = self.render_user_calls(user_ext, request) args = { 'ext': user_ext, 'username': username, 'credit': credit, 'credit_link': creditlink, 'calls': user_calls, 'charges': user_charges, 'all_calls': all_calls } return print_template('user-pbx-lorea', args)
def add_call(user_ext, destination, date, real_duration, duration, cost, rate, provider_name): model = Model() user = model.get_user_fromext(user_ext) provider = model.query(Provider).filter_by(name=provider_name).first() if not provider: provider = Provider(provider_name) model.session.add(provider) model.session.commit() call = Call(user=user, destination=destination, timestamp=datetime.fromtimestamp(float(date)), duration=real_duration, charged=duration, cost=cost, rate=rate, provider=provider) model.session.add(call) model.session.commit()
def add_call(user_ext, destination, date, real_duration, duration, cost, rate, provider_name): model = Model() user = model.get_user_fromext(user_ext) provider = model.query(Provider).filter_by(name=provider_name).first() if not provider: provider = Provider(provider_name) model.session.add(provider) model.session.commit() call = Call(user=user, destination=destination, timestamp=datetime.fromtimestamp(float(date)), duration=real_duration, charged=duration, cost=cost, rate=rate, provider=provider) model.session.add(call) model.session.commit()
def login(self, login, password, request, email=''): peer = self.check_password(login, password) if peer: user_ext = peer.regexten model = Model() user = model.get_user_fromext(user_ext) if not user: user = User(user_ext) if email: user.email = email model.session.add(user) model.session.commit() session_id = str(request.getSession().uid) web_session = model.query(WebSession).filter_by(session_id=session_id).first() if not web_session: web_session = WebSession(session_id=session_id, timestamp=datetime.now(), user=user) model.session.add(web_session) model.session.commit() return redirectTo("/user/"+user_ext, request) return redirectTo("/", request)
def get_calls(user_ext, logged, limit=0, offset=0, format='html'): model = Model() user = model.get_user_fromext(user_ext) if not user: return "" if format == 'html': res = "" else: res = [] all_calls = user.calls last = len(all_calls) if limit and len(user.calls) > limit + offset: all_calls = user.calls[last-offset-limit:last-offset] for call in all_calls: destination = call.destination date = call.timestamp duration = call.duration duration = "%sm %ss" % (duration/60, duration%60) cost = call.cost rate = call.rate if call.provider: provider = call.provider.name else: provider = 'unknown' pars = [date, destination, duration, cost, rate] if logged and logged.admin: pars.append(provider) if format == 'html': res = ("<tr><td>%s</td><td>%s</td><td>%s</td><td>%.3f</td><td>%.3f</td><td>%s</td></tr>\n" % tuple(pars)) + res else: if format == 'html': res = ("<tr><td>%s</td><td>%s</td><td>%s</td><td>%.3f</td><td>%.3f</td></tr>\n" % tuple(pars)) + res if format == 'json': pars[0] = str(pars[0]) pars[3] = float(pars[3]) pars[4] = float(pars[4]) res = [pars] + res return res
def get_calls(user_ext, logged): model = Model() user = model.get_user_fromext(user_ext) if not user: return "" res = "" for call in user.calls: destination = call.destination date = call.timestamp duration = call.duration duration = "%sm %ss" % (duration/60, duration%60) cost = call.cost rate = call.rate if call.provider: provider = call.provider.name else: provider = 'unknown' if logged and logged.admin: res = ("<tr><td>%s</td><td>%s</td><td>%s</td><td>%.3f</td><td>%.3f</td><td>%s</td></tr>\n" % (date, destination, duration, cost, rate, provider)) + res else: res = ("<tr><td>%s</td><td>%s</td><td>%s</td><td>%.3f</td><td>%.3f</td></tr>\n" % (date, destination, duration, cost, rate)) + res return res
def login(self, login, password, request, email=''): peer = self.check_password(login, password) if peer: user_ext = peer.regexten model = Model() user = model.get_user_fromext(user_ext) if not user: user = User(user_ext) if email: user.email = email model.session.add(user) model.session.commit() session_id = str(request.getSession().uid) web_session = model.query(WebSession).filter_by( session_id=session_id).first() if not web_session: web_session = WebSession(session_id=session_id, timestamp=datetime.now(), user=user) model.session.add(web_session) model.session.commit() return redirectTo("/user/" + user_ext, request) return redirectTo("/", request)
class Accounting(object): def __init__(self): self.model = Model() def get_data(self): data = {} users = self.model.query(User) for user in users: if user.credit: data[user.voip_id] = user.credit return data def get_credit(self, user_ext): user = self.model.get_user_fromext(user_ext) if user: return user.credit else: return Decimal() def reset_credit(self, user_ext): user = self.model.get_user_fromext(user_ext) user.credit = Decimal() self.model.session.commit() self.update_user_context(user) def update_user_context(self, user): peer = self.model.query(SipPeer).filter_by(regexten=user.voip_id).first() if not peer: # old user print "user unavailable to update context", user.voip_id return if user.credit > Decimal(0.0) and peer.context == "from-freeuser": peer.context = "from-payuser" self.model.session.commit() reload_peer(peer.name) elif user.credit <= Decimal(0.0) and peer.context == "from-payuser": peer.context = "from-freeuser" self.model.session.commit() reload_peer(peer.name) def get_user_for_credit(self, user_ext): user = self.model.get_user_fromext(user_ext) if not user: # check at least user exists as asterisk user peer = self.model.query(SipPeer).filter_by(regexten=user_ext).first() if not peer: # check by name peer = self.model.query(SipPeer).filter_by(name=user_ext).first() if not peer: return else: user = self.model.get_user_fromext(peer.regexten) if not user: user = User(peer.regexten) self.model.session.add(user) return user def transfer_credit(self, logged, user_ext, credit): from obelisk.resources import sse if not (credit > 0.0 and logged.credit >= credit): return user = self.get_user_for_credit(user_ext) if not user: return logged.credit -= Decimal(credit) user.credit += Decimal(credit) self.model.session.commit() self.update_user_context(user) self.update_user_context(logged) charges.add_charge(user.voip_id, credit, 'transferencia de ' + logged.voip_id) charges.add_charge(logged.voip_id, -credit, 'transferencia a ' + user.voip_id) sse.resource.notify({'credit': float(user.credit), 'user': user.voip_id}, "credit", user) sse.resource.notify({'credit': float(logged.credit), 'user': logged.voip_id}, "credit", logged) def add_credit(self, user_ext, credit, reason=""): from obelisk.resources import sse user = self.get_user_for_credit(user_ext) if not user: return user.credit += Decimal(credit) self.model.session.commit() self.update_user_context(user) charges.add_charge(user.voip_id, credit, reason) sse.resource.notify({'credit':float(user.credit), 'user':user.voip_id}, "credit", user) return user.voip_id def remove_credit(self, user_ext, credit): user = self.model.get_user_fromext(user_ext) if not user: return user.credit -= Decimal(credit) self.model.session.commit() self.update_user_context(user)
class Accounting(object): def __init__(self): self.model = Model() def get_data(self): data = {} users = self.model.query(User) for user in users: if user.credit: data[user.voip_id] = user.credit return data def get_credit(self, user_ext): user = self.model.get_user_fromext(user_ext) if user: return user.credit else: return Decimal() def reset_credit(self, user_ext): user = self.model.get_user_fromext(user_ext) user.credit = Decimal() self.model.session.commit() self.update_user_context(user) def update_user_context(self, user): peer = self.model.query(SipPeer).filter_by( regexten=user.voip_id).first() if not peer: # old user print "user unavailable to update context", user.voip_id return if user.credit > Decimal(0.0) and peer.context == "from-freeuser": peer.context = "from-payuser" self.model.session.commit() reload_peer(peer.name) elif user.credit <= Decimal(0.0) and peer.context == "from-payuser": peer.context = "from-freeuser" self.model.session.commit() reload_peer(peer.name) def get_user_for_credit(self, user_ext): user = self.model.get_user_fromext(user_ext) if not user: # check at least user exists as asterisk user peer = self.model.query(SipPeer).filter_by( regexten=user_ext).first() if not peer: # check by name peer = self.model.query(SipPeer).filter_by( name=user_ext).first() if not peer: return else: user = self.model.get_user_fromext(peer.regexten) if not user: user = User(peer.regexten) self.model.session.add(user) return user def transfer_credit(self, logged, user_ext, credit): from obelisk.resources import sse if not (credit > 0.0 and logged.credit >= credit): return user = self.get_user_for_credit(user_ext) if not user: return logged.credit -= Decimal(credit) user.credit += Decimal(credit) self.model.session.commit() self.update_user_context(user) self.update_user_context(logged) charges.add_charge(user.voip_id, credit, 'transferencia de ' + logged.voip_id) charges.add_charge(logged.voip_id, -credit, 'transferencia a ' + user.voip_id) sse.resource.notify( { 'credit': float(user.credit), 'user': user.voip_id }, "credit", user) sse.resource.notify( { 'credit': float(logged.credit), 'user': logged.voip_id }, "credit", logged) def add_credit(self, user_ext, credit, reason=""): from obelisk.resources import sse user = self.get_user_for_credit(user_ext) if not user: return user.credit += Decimal(credit) self.model.session.commit() self.update_user_context(user) charges.add_charge(user.voip_id, credit, reason) sse.resource.notify( { 'credit': float(user.credit), 'user': user.voip_id }, "credit", user) return user.voip_id def remove_credit(self, user_ext, credit): user = self.model.get_user_fromext(user_ext) if not user: return user.credit -= Decimal(credit) self.model.session.commit() self.update_user_context(user)