templates_people_DATA = \
src/templates/people/base.html \
+ src/templates/people/calls.html \
src/templates/people/index.html \
src/templates/people/registrations.html \
src/templates/people/search.html \
return sip_registrations
- def get_cdr(self, limit=None):
- return self.backend.talk.freeswitch.get_cdr_by_account(self, limit=limit)
+ def get_cdr(self, date=None, limit=None):
+ return self.backend.talk.freeswitch.get_cdr_by_account(self, date=date, limit=limit)
@property
def telephone_numbers(self):
return channels
- def get_cdr_by_account(self, account, limit=None):
+ def get_cdr_by_account(self, account, date=None, limit=None):
res = self.db.query("SELECT * FROM cdr \
- WHERE (caller_id_number = %s AND bleg_uuid IS NOT NULL) \
- OR (destination_number = %s AND bleg_uuid IS NULL) \
- ORDER BY end_stamp DESC LIMIT %s", account.sip_id, account.sip_id, limit)
+ WHERE ((caller_id_number = %s AND bleg_uuid IS NOT NULL) \
+ OR (destination_number = %s AND bleg_uuid IS NULL)) \
+ AND (%s IS NULL OR start_stamp::date = %s) \
+ ORDER BY end_stamp DESC LIMIT %s", account.sip_id,
+ account.sip_id, date, date, limit)
for row in res:
yield CDR(self, data=row)
{% if current_user %}
<ul class="navbar-nav ml-auto mr-3">
<li class="nav-item">
- <a class="nav-link {% if request.path.startswith("/users") %}active{% end %}" href="/users">
+ <a class="nav-link {% if request.path == "/users" %}active{% end %}" href="/users">
{{ _("Users") }}
</a>
</li>
+
+ <li class="nav-item">
+ <a class="nav-link {% if request.path.startswith("/users/%s/calls" % current_user.uid) %}active{% end %}" href="/users/{{ current_user.uid }}/calls">
+ {{ _("Calls") }}
+ </a>
+ </li>
</ul>
<form class="form-inline my-2 my-lg-0" action="/search" method="GET">
--- /dev/null
+{% extends "base.html" %}
+
+{% block title %}{{ _("Calls") }}{% end block %}
+
+{% block main %}
+ <div class="card">
+ <div class="card-body">
+ <h4>{{ _("Calls on %s") % locale.format_day(date) }}</h4>
+
+ {% module TalkCDR(account, date=date) %}
+ </div>
+ </div>
+{% end block %}
(r"/users", people.UsersHandler),
(r"/users/(\w+)", people.UserHandler),
(r"/users/(\w+)\.jpg", people.AvatarHandler),
+ (r"/users/(\w+)/calls(?:/(\d{4}-\d{2}-\d{2}))?", people.CallsHandler),
(r"/users/(\w+)/registrations", people.RegistrationsHandler),
] + authentication_handlers)
#!/usr/bin/python
+import datetime
import logging
import tornado.web
self.finish(avatar)
+class CallsHandler(base.BaseHandler):
+ @tornado.web.authenticated
+ def get(self, uid, date=None):
+ account = self.backend.accounts.get_by_uid(uid)
+ if not account:
+ raise tornado.web.HTTPError(404, "Could not find account %s" % uid)
+
+ if date:
+ date = datetime.datetime.strptime(date, "%Y-%m-%d").date()
+ else:
+ date = datetime.date.today()
+
+ self.render("people/calls.html", account=account, date=date)
+
+
class RegistrationsHandler(base.BaseHandler):
@tornado.web.authenticated
def get(self, uid):
class CDRModule(ui_modules.UIModule):
- def render(self, account, limit=None):
- cdr = account.get_cdr(limit=limit)
+ def render(self, account, date=None, limit=None):
+ cdr = account.get_cdr(date=date, limit=limit)
return self.render_string("people/modules/cdr.html", account=account, cdr=cdr)