cel.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #!/usr/bin/env python3
  2. import json
  3. import re
  4. from datetime import datetime
  5. fieldsFilter = ('id', 'linkedid', 'appdata', 'lastdata')
  6. class CdrChannel:
  7. def __init__(self, chanData):
  8. self._str = chanData
  9. (self.tech,
  10. self.peer,
  11. self.context,
  12. self.id,
  13. self.leg) = re.match(r'(\w+)/(\w+)(?:@([\w-]+))?-([0-9a-f]{8})(?:;([0-9]+))?', chanData).groups()
  14. def __repr__(self):
  15. return self._str
  16. class CdrEvent:
  17. def __init__(self, eventData):
  18. for key, value in eventData.items():
  19. if ((key not in fieldsFilter) and (value is not None) and (str(value) != '')):
  20. if key == 'extra':
  21. setattr(self, key, json.loads(value))
  22. elif key == 'channame':
  23. setattr(self, key, CdrChannel(value))
  24. else:
  25. setattr(self, key, value)
  26. class CdrEvents:
  27. def __init__(self):
  28. self._events = []
  29. def add(self, event):
  30. if isinstance(event, CdrEvent):
  31. self._events.append(event)
  32. else:
  33. self._events.append(CdrEvent(event))
  34. @property
  35. def all(self):
  36. return self._events
  37. @property
  38. def first(self):
  39. return self._events[0] if len(self._events) > 0 else None
  40. @property
  41. def second(self):
  42. return self._events[1] if len(self._events) > 1 else None
  43. @property
  44. def last(self):
  45. return self._events[-1] if len(self._events) > 0 else None
  46. def filter(self, key, value, func='__eq__'):
  47. result = CdrEvents()
  48. for event in self._events:
  49. if getattr(str(getattr(event, key)), func)(value):
  50. result.add(event)
  51. return result
  52. def has(self, value, key='disposition'):
  53. for event in self._events:
  54. if getattr(event, key) == value:
  55. return True
  56. return False
  57. def __len__(self):
  58. return len(self._events)
  59. class CelEvents(CdrEvents):
  60. def has(self, value, key='eventtype'):
  61. return super().has(value, key)
  62. class CdrCall:
  63. def __init__(self, event=None):
  64. self.events = CdrEvents()
  65. if event is not None:
  66. self.events.add(event)
  67. self.linkedid = event['linkedid']
  68. else:
  69. self.linkedid = None
  70. @property
  71. def start(self):
  72. return self.events.first.calldate
  73. @property
  74. def isAnswered(self):
  75. return self.events.first.disposition == 'ANSWERED';
  76. class CelCall:
  77. def __init__(self, event=None):
  78. self.events = CelEvents()
  79. if event is not None:
  80. self.events.add(event)
  81. self.linkedid = event['linkedid']
  82. else:
  83. self.linkedid = None
  84. @property
  85. def start(self):
  86. return self.events.first.eventtime