Ejemplo n.º 1
0
    def _call_filtering(self):
        caller = self._caller
        called = self._user

        if called.bsfilter != 'boss':
            return False

        if caller is not None and caller.bsfilter == 'secretary':
            secretary_can_call_boss = callfilter_dao.does_secretary_filter_boss(called.id, caller.id)
            if secretary_can_call_boss:
                return False

        try:
            boss_callfiltermember, callfilter = callfilter_dao.get_by_boss_id(called.id)
        except TypeError:
            return False

        callfilter_active = callfilter_dao.is_activated_by_callfilter_id(boss_callfiltermember.callfilterid)

        if callfilter_active == 0:
            return False

        in_zone = self._callfilter_check_in_zone(callfilter.callfrom)
        if not in_zone is True:
            return False

        secretaries = callfilter_dao.get_secretaries_by_callfiltermember_id(boss_callfiltermember.callfilterid)

        boss_line = self._line
        boss_interface = '%s/%s' % (boss_line.protocol.upper(), boss_line.name)

        if callfilter.bosssecretary in ("bossfirst-simult", "bossfirst-serial", "all"):
            self._agi.set_variable('XIVO_CALLFILTER_BOSS_INTERFACE', boss_interface)
            self._set_callfilter_ringseconds('BOSS_TIMEOUT', boss_callfiltermember.ringseconds)

        index = 0
        ifaces = []
        for secretary in secretaries:
            secretary_callfiltermember, ringseconds = secretary
            if secretary_callfiltermember.active:
                iface = user_line_dao.get_line_identity_by_user_id(secretary_callfiltermember.typeval)
                ifaces.append(iface)

                if callfilter.bosssecretary in ("bossfirst-serial", "secretary-serial"):
                    self._agi.set_variable('XIVO_CALLFILTER_SECRETARY%d_INTERFACE' % index, iface)
                    self._set_callfilter_ringseconds('SECRETARY%d_TIMEOUT' % index, ringseconds)
                    index += 1

        if callfilter.bosssecretary in ("bossfirst-simult", "secretary-simult", "all"):
            self._agi.set_variable('XIVO_CALLFILTER_INTERFACE', '&'.join(ifaces))
            self._set_callfilter_ringseconds('TIMEOUT', callfilter.ringseconds)

        DialAction(self._agi, self._cursor, "noanswer", "callfilter", callfilter.id).set_variables()
        CallerID(self._agi, self._cursor, "callfilter", callfilter.id).rewrite(force_rewrite=True)
        self._agi.set_variable('XIVO_CALLFILTER', '1')
        self._agi.set_variable('XIVO_CALLFILTER_MODE', callfilter.bosssecretary)

        return True
Ejemplo n.º 2
0
 def _get_user_state_interface(self, user_id):
     user_line = user_line_dao.get_line_identity_by_user_id(user_id)
     connected_agent_id = user_dao.agent_id(user_id)
     if connected_agent_id is None:
         return user_line
     loggedon_state_interface = self._get_agent_state_interface(connected_agent_id)
     if loggedon_state_interface is None:
         loggedon_state_interface = user_line
     return loggedon_state_interface
Ejemplo n.º 3
0
 def _get_ongoing_calls(self, user_id):
     try:
         line = user_line_dao.get_line_identity_by_user_id(user_id).lower()
     except LookupError:
         raise LookupError('User %s has no line' % user_id)
     else:
         calls = self._calls_per_line.get(line, [])
         ongoing_calls = [call for call in calls if call[ON_HOLD] is False]
         return ongoing_calls
Ejemplo n.º 4
0
 def _get_ongoing_calls(self, user_id):
     try:
         line = user_line_dao.get_line_identity_by_user_id(user_id).lower()
     except LookupError:
         raise LookupError('User %s has no line' % user_id)
     else:
         calls = self._calls_per_line.get(line, [])
         ongoing_calls = [call for call in calls if call[ON_HOLD] is False]
         return ongoing_calls
Ejemplo n.º 5
0
    def test_get_line_identity(self):
        self.add_user_line_with_exten(exten='445')
        self.add_user_line_with_exten(exten='221')
        expected = 'sip/a1b2c3'
        user_line = self.add_user_line_with_exten(protocol='sip',
                                                  name_line='a1b2c3')

        result = user_line_dao.get_line_identity_by_user_id(user_line.user.id)

        self.assertEqual(result, expected)
Ejemplo n.º 6
0
    def test_get_line_identity(self):
        self.add_user_line_with_exten(exten='445')
        self.add_user_line_with_exten(exten='221')
        expected = 'sip/a1b2c3'
        user_line = self.add_user_line_with_exten(protocol='sip',
                                                  name_line='a1b2c3')

        result = user_line_dao.get_line_identity_by_user_id(user_line.user.id)

        self.assertEqual(result, expected)
Ejemplo n.º 7
0
 def subscribe(self, client_connection):
     try:
         user_id = client_connection.user_id()
         line_identity = user_line_dao.get_line_identity_by_user_id(user_id).lower()
     except LookupError:
         logging.warning('User %s tried to subscribe to current_calls with no line' % user_id)
     else:
         self._subscriptions[line_identity] = client_connection
         logger.info('User %s is now registered to current_calls on line %s', user_id, line_identity)
         self._report_current_call(line_identity)
Ejemplo n.º 8
0
    def test_get_line_identity(self):
        sip1 = self.add_endpoint_sip()
        sip2 = self.add_endpoint_sip()
        sip3 = self.add_endpoint_sip()
        self.add_user_line_with_exten(exten='445', endpoint_sip_uuid=sip1.uuid)
        self.add_user_line_with_exten(exten='221', endpoint_sip_uuid=sip2.uuid)
        user_line = self.add_user_line_with_exten(name_line='a1b2c3',
                                                  endpoint_sip_uuid=sip3.uuid)

        result = user_line_dao.get_line_identity_by_user_id(user_line.user.id)

        self.assertEqual(result, 'pjsip/a1b2c3')
Ejemplo n.º 9
0
def add_user_to_queue(session, user_id, queue):
    next_position = _get_next_position_for_queue(session, queue)
    queue_member = QueueMember()
    queue_member.queue_name = queue
    queue_member.interface = user_line_dao.get_line_identity_by_user_id(user_id)
    queue_member.usertype = 'user'
    queue_member.userid = user_id
    queue_member.channel = queue_member.interface.split('/', 1)[0]
    queue_member.category = 'queue'
    queue_member.position = next_position

    with flush_session(session):
        session.add(queue_member)
Ejemplo n.º 10
0
    def _get_user_state_interface(self, user_id):
        with session_scope():
            user_line = user_line_dao.get_line_identity_by_user_id(user_id)
            user = user_dao.find(user_id)
            connected_agent_id = user.agentid if user else None

        if connected_agent_id is None:
            return user_line

        loggedon_state_interface = self._get_agent_state_interface(connected_agent_id)
        if loggedon_state_interface is None:
            loggedon_state_interface = user_line
        return loggedon_state_interface
Ejemplo n.º 11
0
 def subscribe(self, client_connection):
     try:
         user_id = client_connection.user_id()
         channel_pattern = user_line_dao.get_line_identity_by_user_id(user_id)
     except LookupError:
         logger.warning('Meetme subscription failed')
     else:
         self._subscriptions[client_connection] = {'channel_start': channel_pattern,
                                                   'membership': []}
         try:
             self._push_to_client(client_connection)
             self._send_meetme_membership()
         except ClientConnection.CloseException:
             self._subscriptions.pop(client_connection, None)
Ejemplo n.º 12
0
 def subscribe(self, client_connection):
     try:
         user_id = client_connection.user_id()
         line_identity = user_line_dao.get_line_identity_by_user_id(
             user_id).lower()
     except LookupError:
         logging.warning(
             'User %s tried to subscribe to current_calls with no line' %
             user_id)
     else:
         self._subscriptions[line_identity] = client_connection
         logger.info(
             'User %s is now registered to current_calls on line %s',
             user_id, line_identity)
         self._report_current_call(line_identity)
Ejemplo n.º 13
0
 def subscribe(self, client_connection):
     try:
         user_id = client_connection.user_id()
         reachable_contexts = user_dao.get_reachable_contexts(user_id)
         channel_pattern = user_line_dao.get_line_identity_by_user_id(user_id)
     except LookupError:
         logger.warning('Meetme subscription failed')
     else:
         self._subscriptions[client_connection] = {'client_connection': client_connection,
                                                   'contexts': reachable_contexts,
                                                   'channel_start': channel_pattern,
                                                   'membership': []}
         try:
             self._push_to_client(client_connection)
             self._send_meetme_membership()
         except ClientConnection.CloseException:
             self._subscriptions.pop(client_connection, None)
Ejemplo n.º 14
0
def add_user_to_queue(session, user_id, queue):
    next_position = _get_next_position_for_queue(session, queue)
    queue_member = QueueMember()
    queue_member.queue_name = queue
    queue_member.interface = user_line_dao.get_line_identity_by_user_id(user_id)
    queue_member.usertype = 'user'
    queue_member.userid = user_id
    queue_member.channel = queue_member.interface.split('/', 1)[0]
    queue_member.category = 'queue'
    queue_member.position = next_position

    try:
        session.begin()
        session.add(queue_member)
        session.commit()
    except Exception:
        session.rollback()
        raise
Ejemplo n.º 15
0
def add_user_to_queue(session, user_id, queue):
    next_position = _get_next_position_for_queue(session, queue)
    queue_member = QueueMember()
    queue_member.queue_name = queue
    queue_member.interface = user_line_dao.get_line_identity_by_user_id(
        user_id)
    queue_member.usertype = 'user'
    queue_member.userid = user_id
    queue_member.channel = queue_member.interface.split('/', 1)[0]
    queue_member.category = 'queue'
    queue_member.position = next_position

    try:
        session.begin()
        session.add(queue_member)
        session.commit()
    except Exception:
        session.rollback()
        raise