templates_voip_modules_DATA = \
src/templates/voip/modules/outbound-registrations.html \
+ src/templates/voip/modules/queues.html \
src/templates/voip/modules/registrations.html
templates_voip_modulesdir = $(templates_voipdir)/modules
return registrations
+ async def get_queues(self):
+ queues = {}
+
+ # Fetch all queues
+ for data in await self.manager.send_action({"Action" : "QueueSummary"}):
+ if not data.Event == "QueueSummary":
+ continue
+
+ queue = Queue(self.backend, data)
+ queues[queue.name] = queue
+
+ # Fetch all members
+ for data in await self.manager.send_action({"Action" : "QueueStatus"}):
+ print(data)
+
+ if not data.Event == "QueueMember":
+ continue
+
+ member = QueueMember(self.backend, data)
+
+ # Append to the matching queue
+ try:
+ queues[member.queue].members.append(member)
+ except KeyError:
+ pass
+
+ return queues.values()
+
class Channel(misc.Object):
def init(self, data):
@property
def status(self):
return self.data.Status
+
+
+class Queue(misc.Object):
+ def init(self, data):
+ self.data = data
+
+ self.members = []
+
+ def __str__(self):
+ return self.name
+
+ @property
+ def name(self):
+ return self.data.Queue
+
+ def is_available(self):
+ return self.data.Available == "1"
+
+ @property
+ def callers(self):
+ return int(self.data.Callers)
+
+
+class QueueMember(misc.Object):
+ def init(self, data):
+ self.data = data
+
+ def __str__(self):
+ return self.name
+
+ @property
+ def name(self):
+ return self.data.Name
+
+ @property
+ def queue(self):
+ return self.data.Queue
+
+ @property
+ def calls_taken(self):
+ return int(self.data.CallsTaken)
+
+ def is_in_call(self):
+ return self.data.InCall == "1"
+
+ @property
+ def last_call_at(self):
+ return datetime.datetime.fromtimestamp(int(self.data.LastCall))
+
+ @property
+ def logged_in_at(self):
+ return datetime.datetime.fromtimestamp(int(self.data.LoginTime))
+
+ # XXX status?
</section>
{% end %}
+ {% if queues %}
+ <section class="section">
+ <div class="container">
+ <h4 class="title is-4">
+ {{ _("Queues") }}
+ <span class="tag">{{ len(queues) }}</span>
+ </h4>
+
+ {% module VoIPQueues(queues) %}
+ </div>
+ </section>
+ {% end %}
+
{% if outbound_registrations %}
<section class="section">
<div class="container">
--- /dev/null
+{% for q in queues %}
+ <div class="notification">
+ <h5 class="title is-5">{{ _("Queue %s") % q }}</h5>
+
+ {% if q.members %}
+ <ul>
+ {% for m in q.members %}
+ <li>
+ {{ m }}
+
+ <small class="has-text-grey">
+ {{ _("Logged in %s") % locale.format_date(m.logged_in_at, shorter=True) }}
+ </small>
+ </li>
+ {% end %}
+ </ul>
+ {% else %}
+ <p class="has-text-grey">
+ {{ _("No Members") }}
+ </p>
+ {% end %}
+ </div>
+{% end %}
# VoIP
"VoIPOutboundRegistrations" :
voip.OutboundRegistrationsModule,
+ "VoIPQueues" : voip.QueuesModule,
"VoIPRegistrations" : voip.RegistrationsModule,
# Wiki
if not self.current_user.is_staff():
raise tornado.web.HTTPError(403)
- registrations, outbound_registrations, = await asyncio.gather(
+ registrations, outbound_registrations, queues, = await asyncio.gather(
self.backend.asterisk.get_registrations(),
self.backend.asterisk.get_outbound_registrations(),
+ self.backend.asterisk.get_queues(),
)
self.render("voip/index.html", registrations=registrations,
- outbound_registrations=outbound_registrations)
+ outbound_registrations=outbound_registrations, queues=queues)
class OutboundRegistrationsModule(ui_modules.UIModule):
def render(self, registrations):
return self.render_string("voip/modules/registrations.html",
registrations=registrations)
+
+
+class QueuesModule(ui_modules.UIModule):
+ def render(self, queues):
+ return self.render_string("voip/modules/queues.html", queues=queues)