svetlana 3 жил өмнө
parent
commit
55ce66625c
2 өөрчлөгдсөн 60 нэмэгдсэн , 8 устгасан
  1. 18 3
      app0/cdr_test.py
  2. 42 5
      app0/cel.py

+ 18 - 3
app0/cdr_test.py

@@ -27,13 +27,28 @@ linkedid = sys.argv[1]
 async def main():
   await _db.connect()
   _q = '''SELECT *
-          FROM cdr
-          WHERE linkedid=:linkedid
+          FROM cel 
+          WHERE linkedid=:linkedid and eventtype = :eventtype
           ORDER BY sequence;'''
-  _v = {'linkedid': linkedid}
+  _v = {'linkedid': linkedid, 'eventtype': 'ATTENDEDTRANSFER'}
   _f = True
+  unique_ids = set()
   async for row in _db.iterate(query=_q, values=_v):
     print('\t'.join([str(k) for k in row]))
+    extra  = json.loads(row['extra'])
+    unique_ids.add(extra['channel2_uniqueid'])
+    
+  _q = '''SELECT *
+          FROM cdr 
+          WHERE linkedid=:linkedid or linkedid in (select distinct linkedid from cdr where uniqueid in :uniqueids)
+          ORDER BY sequence;'''
+  _v = {'linkedid': linkedid, 'uniqueids': uniqueids}
+  _f = True
+  unique_ids = set()
+  events = CdrEvents()
+  async for row in _db.iterate(query=_q, values=_v):
+    events.addEvent(row)
+  print(events.simple())
   await _db.disconnect()
 
 if __name__ ==  '__main__':

+ 42 - 5
app0/cel.py

@@ -37,11 +37,34 @@ class CdrEvent:
 class CdrEvents:
   def __init__(self):
     self._events = []
+    self._channels = []
+    self._dstchannels = []
+    self.start = 0
+    
   def add(self, event):
-    if isinstance(event, CdrEvent):
-      self._events.append(event)
-    else:
-      self._events.append(CdrEvent(event))
+    if not isinstance(event, CdrEvent):
+      event = CdrEvent(event)
+    if not self.start:
+        self.start = event.calldate
+    if event.channel not in self._channels:
+        self._channels[event.channel] = event
+    if event.dstchannel not in self._dstchannels:
+        self._dstchannels[event.dstchannel] = event.dst
+    if (event.lastapp == 'Queue'):
+      for e in self._events:
+        if (e.lastapp == 'Queue') and (e.uniqueid == event.uniqueid):
+          if (event.disposition == 'ANSWERED'):
+            e.disposition = 'ANSWERED'
+            if event.dstchannel in self._channels:
+              dialevent = self._channels[event.dstchannel]
+              e.duration = e.start-dialevent.start +  dialevent.duration 
+              e.billsec = dialevent.billsec
+          return # if it not fiars queue event - miss it
+    if (event.lastapp == 'Dial' and event.dstchannel in self._dstchannels):
+        event.dst = self._dstchannels[event.dstchannel]
+    self.end = event.calldate + td(seconds=event.duration)
+    self._events.append(event)
+
   @property
   def all(self):
     return self._events
@@ -67,6 +90,20 @@ class CdrEvents:
     return False
   def __len__(self):
     return len(self._events)
+  def simple(self):
+    res = []
+    for event in self._events:
+        simple_event = {'start': event.calldate,
+            'answered': event.disposition=='ANSWERED',
+            'duration': event.billsec,
+            'waiting': event.duration = event.billsec,
+            'application': event.lastapp,
+            'src': event.src,
+            'dst': event.dst,
+            'uniqueid': event.uniqueid,
+            'file': event.recordingfile}
+        res.append(simple_event)
+    return res
 
 class CdrUserEvents(CdrEvents):
   def __init__(self, user):
@@ -241,7 +278,7 @@ class CdrUserCall(CdrCall):
             'did': self.did,
             'linkedid': self.linkedid,
             'file': self.file,
-            'events': self.events.simple()}
+            }#'events': self.events.simple()}
 
 class CelCall:
   def __init__(self, event=None):