From: Michael Tremer Date: Thu, 11 Oct 2018 13:40:40 +0000 (+0100) Subject: talk: Add CDR X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=525c01f75924ed56421531b6f1ed8e57cd441580;p=ipfire.org.git talk: Add CDR Signed-off-by: Michael Tremer --- diff --git a/Makefile.am b/Makefile.am index 9454dca3..afc86076 100644 --- a/Makefile.am +++ b/Makefile.am @@ -171,6 +171,7 @@ templates_talkdir = $(templatesdir)/talk templates_talk_modules_DATA = \ src/templates/talk/modules/accounts-list.html \ + src/templates/talk/modules/cdr.html \ src/templates/talk/modules/channels.html \ src/templates/talk/modules/registrations.html diff --git a/src/backend/accounts.py b/src/backend/accounts.py index 4d217123..20a3b6df 100644 --- a/src/backend/accounts.py +++ b/src/backend/accounts.py @@ -98,6 +98,11 @@ class Accounts(Object): return self._search_one("(|(&(objectClass=sipUser)(sipAuthenticationUser=%s)) \ (&(objectClass=sipRoutingObject)(sipLocalAddress=%s)))" % (sip_id, sip_id)) + def get_by_phone_number(self, number): + return self._search_one("(&(objectClass=posixAccount) \ + (|(sipAuthenticationUser=%s)(telephoneNumber=%s)(homePhone=%s)(mobile=%s)))" \ + % (number, number, number, number)) + # Session stuff def _cleanup_expired_sessions(self): @@ -308,6 +313,9 @@ class Account(Object): return sip_registrations + def get_cdr(self, limit=None): + return self.backend.talk.freeswitch.get_cdr_by_account(self, limit=limit) + @property def telephone_numbers(self): return self._telephone_numbers + self.mobile_telephone_numbers \ diff --git a/src/backend/talk.py b/src/backend/talk.py index 7fec3afb..cc923dbf 100644 --- a/src/backend/talk.py +++ b/src/backend/talk.py @@ -48,6 +48,14 @@ class Freeswitch(Object): return channels + def get_cdr_by_account(self, account, limit=None): + res = self.db.query("SELECT * FROM cdr \ + WHERE caller_id_number = %s OR destination_number = %s \ + ORDER BY end_stamp DESC LIMIT %s", account.sip_id, account.sip_id, limit) + + for row in res: + yield CDR(self, data=row) + class SIPRegistration(object): def __init__(self, freeswitch, data): @@ -169,6 +177,59 @@ class Channel(object): return "%s: %s" % (key_negotiation.upper(), cipher_suite.replace("_", "-")) +class CDR(object): + def __init__(self, freeswitch, data): + self.freeswitch = freeswitch + self.data = data + + @property + def backend(self): + return self.freeswitch.backend + + @property + def direction(self): + if self.data.bleg_uuid: + return "inbound" + + return "outbound" + + @lazy_property + def caller(self): + return self.backend.accounts.get_by_phone_number(self.data.caller_id_number) + + @property + def caller_number(self): + return self.data.caller_id_number + + @lazy_property + def callee(self): + return self.backend.accounts.get_by_phone_number(self.data.destination_number) + + @property + def callee_number(self): + return self.data.destination_number + + @property + def time_start(self): + return self.data.start_stamp + + @property + def time_answered(self): + return self.data.answer_stamp + + @property + def duration(self): + return self.data.duration + + @property + def codec(self): + return self.data.write_codec + + @property + def user_agent(self): + return self.data.user_agent + + class Talk(Object): def init(self): # Connect to FreeSWITCH diff --git a/src/templates/talk/index.html b/src/templates/talk/index.html index 268f9c7a..f692ae6e 100644 --- a/src/templates/talk/index.html +++ b/src/templates/talk/index.html @@ -4,4 +4,12 @@ {% block main %} {% module TalkChannels(current_user) %} + +
+
+

{{ _("Your Recent Calls") }}

+ + {% module TalkCDR(current_user, limit=5) %} +
+
{% end block %} diff --git a/src/templates/talk/modules/cdr.html b/src/templates/talk/modules/cdr.html new file mode 100644 index 00000000..ce7b8547 --- /dev/null +++ b/src/templates/talk/modules/cdr.html @@ -0,0 +1,50 @@ + + + + + + + + + + {% for c in cdr %} + + + + + + {% end %} + +
{{ _("Duration") }}
+ {% if c.direction == "inbound" %} + + + {% if c.callee %} + {{ c.callee }} + {% else %} + {{ c.callee_number }} + {% end %} + {% elif c.direction == "outbound" %} + + + {% if c.caller %} + {{ c.caller }} + {% else %} + {{ c.caller_number }} + {% end %} + {% end %} + +
+ + + {{ " - ".join((e for e in (c.codec, c.user_agent) if e)) }} + +
+ {{ locale.format_date(c.time_start, relative=False) }}
+ + {% if c.time_answered %} + {{ format_time(c.duration) }} + {% else %} + {{ _("Not Answered") }} + {% end %} +
diff --git a/src/web/__init__.py b/src/web/__init__.py index 97a50dec..f897e822 100644 --- a/src/web/__init__.py +++ b/src/web/__init__.py @@ -57,6 +57,7 @@ class Application(tornado.web.Application): # Talk "TalkAccountsList" : talk.AccountsListModule, + "TalkCDR" : talk.CDRModule, "TalkChannels" : talk.ChannelsModule, "TalkRegistrations" : talk.RegistrationsModule, diff --git a/src/web/talk.py b/src/web/talk.py index fb9f3d87..8ce8e6c4 100644 --- a/src/web/talk.py +++ b/src/web/talk.py @@ -71,6 +71,13 @@ class AccountsListModule(ui_modules.UIModule): return self.render_string("talk/modules/accounts-list.html", accounts=accounts) +class CDRModule(ui_modules.UIModule): + def render(self, account, limit=None): + cdr = account.get_cdr(limit=limit) + + return self.render_string("talk/modules/cdr.html", account=account, cdr=cdr) + + class ChannelsModule(ui_modules.UIModule): def render(self, account): channels = self.backend.talk.freeswitch.get_sip_channels(account)