]> git.ipfire.org Git - ipfire.org.git/commitdiff
voip: Show queues
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 28 Jun 2023 15:32:39 +0000 (15:32 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 28 Jun 2023 15:32:39 +0000 (15:32 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/backend/asterisk.py
src/templates/voip/index.html
src/templates/voip/modules/queues.html [new file with mode: 0644]
src/web/__init__.py
src/web/voip.py

index 36b0d6418bfca9935872126a5a54ffc9a9751bff..ca5382f18c0ee18dada97f0a845c51dc331d037c 100644 (file)
@@ -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
index 8b5fa04d09d47c7fe762030d43c8a9f4b40ebbd6..cbc118314f65bfe6ea5eed253358a193877fb8a9 100644 (file)
@@ -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?
index c8abf825269847876d274b30c45002e8fa8395a5..df15086f34bdde858de21ccacc1ddcbc528beacb 100644 (file)
                </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">
diff --git a/src/templates/voip/modules/queues.html b/src/templates/voip/modules/queues.html
new file mode 100644 (file)
index 0000000..9bce7b2
--- /dev/null
@@ -0,0 +1,23 @@
+{% 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 %}
index e509f2af79b8ca6f5060971699373111c240734c..0f89e4c5d17513be0dc8d618fe8557462c31f4c6 100644 (file)
@@ -96,6 +96,7 @@ class Application(tornado.web.Application):
                                # VoIP
                                "VoIPOutboundRegistrations" :
                                        voip.OutboundRegistrationsModule,
+                               "VoIPQueues"           : voip.QueuesModule,
                                "VoIPRegistrations"    : voip.RegistrationsModule,
 
                                # Wiki
index 2594a3dba748271666acd20b0fabfd9d2cc9376b..b5794b147a4e8e271d6b7b299237bf71379b47e8 100644 (file)
@@ -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)