From 8e93325b78673564e487ea6ad1047191c977a7bc Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Wed, 28 Jun 2023 15:32:39 +0000 Subject: [PATCH] voip: Show queues Signed-off-by: Michael Tremer --- Makefile.am | 1 + src/backend/asterisk.py | 82 ++++++++++++++++++++++++++ src/templates/voip/index.html | 13 ++++ src/templates/voip/modules/queues.html | 23 ++++++++ src/web/__init__.py | 1 + src/web/voip.py | 10 +++- 6 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 src/templates/voip/modules/queues.html diff --git a/Makefile.am b/Makefile.am index 36b0d641..ca5382f1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -336,6 +336,7 @@ templates_voipdir = $(templatesdir)/voip 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 diff --git a/src/backend/asterisk.py b/src/backend/asterisk.py index 8b5fa04d..cbc11831 100644 --- a/src/backend/asterisk.py +++ b/src/backend/asterisk.py @@ -108,6 +108,34 @@ class Asterisk(misc.Object): 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): @@ -243,3 +271,57 @@ class OutboundRegistration(misc.Object): @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? diff --git a/src/templates/voip/index.html b/src/templates/voip/index.html index c8abf825..df15086f 100644 --- a/src/templates/voip/index.html +++ b/src/templates/voip/index.html @@ -37,6 +37,19 @@ {% end %} + {% if queues %} +
+
+

+ {{ _("Queues") }} + {{ len(queues) }} +

+ + {% module VoIPQueues(queues) %} +
+
+ {% end %} + {% if outbound_registrations %}
diff --git a/src/templates/voip/modules/queues.html b/src/templates/voip/modules/queues.html new file mode 100644 index 00000000..9bce7b2f --- /dev/null +++ b/src/templates/voip/modules/queues.html @@ -0,0 +1,23 @@ +{% for q in queues %} +
+
{{ _("Queue %s") % q }}
+ + {% if q.members %} +
    + {% for m in q.members %} +
  • + {{ m }} + + + {{ _("Logged in %s") % locale.format_date(m.logged_in_at, shorter=True) }} + +
  • + {% end %} +
+ {% else %} +

+ {{ _("No Members") }} +

+ {% end %} +
+{% end %} diff --git a/src/web/__init__.py b/src/web/__init__.py index e509f2af..0f89e4c5 100644 --- a/src/web/__init__.py +++ b/src/web/__init__.py @@ -96,6 +96,7 @@ class Application(tornado.web.Application): # VoIP "VoIPOutboundRegistrations" : voip.OutboundRegistrationsModule, + "VoIPQueues" : voip.QueuesModule, "VoIPRegistrations" : voip.RegistrationsModule, # Wiki diff --git a/src/web/voip.py b/src/web/voip.py index 2594a3db..b5794b14 100644 --- a/src/web/voip.py +++ b/src/web/voip.py @@ -13,13 +13,14 @@ class IndexHandler(base.BaseHandler): 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): @@ -32,3 +33,8 @@ class RegistrationsModule(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) -- 2.39.5