示例#1
0
    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)
示例#2
0
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
示例#3
0
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()
示例#4
0
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
示例#5
0
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()
示例#6
0
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()
示例#7
0
    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)
示例#8
0
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()
示例#9
0
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()
示例#10
0
    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)
示例#11
0
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
示例#12
0
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
示例#13
0
    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)
示例#14
0
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)
示例#15
0
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)