예제 #1
0
 def post(self, request, *args, **kwargs):
     # TODO: Validar que el supervisor tiene permisos sobre la campaña
     campana_id = request.POST.get('campana_id')
     agente = request.user.get_agente_profile()
     if AgenteEnContacto.liberar_contacto(agente.id, campana_id):
         return JsonResponse({'status': 'OK'})
     else:
         return JsonResponse({'status': 'ERROR'})
 def test_nunca_se_reservan_contactos_asignados_a_otro_agente(self):
     # Al pedir un contacto nunca se entrega uno asignado a OTRO agente
     AgenteEnContacto.objects.filter(contacto_id=self.contacto_1.id).update(
         agente_id=self.agente_1.id, estado=AgenteEnContacto.ESTADO_ASIGNADO)
     # Al pedir un contacto para otro agente no debe entregar el contacto asignado
     entrega = AgenteEnContacto.entregar_contacto(self.agente_2,
                                                  self.campana_preview.id)
     self.assertEqual(entrega['result'], 'OK')
     self.assertEqual(entrega['code'], 'contacto-entregado')
     self.assertNotEqual(entrega['contacto_id'], self.contacto_1.id)
     # En particular, al ser 2 contactos nada más, solo puede entregar el otro
     self.assertEqual(entrega['contacto_id'], self.contacto_2.id)
    def _actualizar_relaciones_agente_contacto(self):
        """
        Procedimiento que libera los contactos reservados y asignados a los agentes de las campañas
        preview al sobrepasar el tiempo máximo definido para atenderlo.
        Los contactos liberados podrán ser asignados a nuevos agentes para la finalización de
        su gestión
        """
        liberados = AgenteEnContacto.liberar_contactos_por_tiempo()

        logger.info(
            _("Actualizando {0} asignaciones de contactos a agentes en campañas preview"
              .format(liberados)))
예제 #4
0
    def _actualizar_relacion_agente_contacto(self, campana_id, tiempo_desconexion):
        """
        Procedimiento que libera los contactos reservados y asignados a agentes en una campaña
        preview al sobrepasar el tiempo máximo definido para atenderlo.
        El contacto podrá ser asignado a un nuevo agente para la finalización de
        su gestión
        """
        liberados = AgenteEnContacto.liberar_contactos_por_tiempo(campana_id, tiempo_desconexion)

        logger.info(
            _("Actualizando {0} asignaciones de contactos a agentes en campaña {1}".format(
                liberados, campana_id)))
예제 #5
0
    def post(self, request, *args, **kwargs):
        # TODO: Validar que el supervisor tiene permisos sobre la campaña
        campana_id = request.POST.get('campana_id')
        agente_id = request.POST.get('agente_id')
        if AgenteEnContacto.liberar_contacto(agente_id, campana_id):
            message = _(u'El Contacto ha sido liberado.')
            messages.success(self.request, message)
        else:
            message = _(u'No se pudo liberar el contacto. Intente nuevamente.')
            messages.warning(self.request, message)

        return HttpResponseRedirect(
            reverse('contactos_preview_asignados', args=[campana_id]))
 def _generar_relaciones_agente_en_contacto(self):
     contactos = self.campana.bd_contacto.contactos.filter(
         id__gt=self.id_ultimo_contacto)
     agente_en_contacto_list = []
     campos_contacto = self.campana.bd_contacto.get_metadata(
     ).nombres_de_columnas_de_datos
     orden = AgenteEnContacto.ultimo_id() + 1
     for contacto in contactos:
         agente_en_contacto = self.campana._crear_agente_en_contacto(
             contacto,
             -1,
             campos_contacto,
             AgenteEnContacto.ESTADO_INICIAL,
             orden=orden)
         agente_en_contacto_list.append(agente_en_contacto)
         orden += 1
     # insertamos las instancias en la BD
     AgenteEnContacto.objects.bulk_create(agente_en_contacto_list)
예제 #7
0
 def post(self, request, *args, **kwargs):
     campana_id = kwargs.get('pk_campana', False)
     data_entrega = AgenteEnContacto.entregar_contacto(
         self.agente, campana_id)
     # adiciona informacion sobre si este contacto tiene una calificacion pendiente
     # para el agente en cuestión
     redis_connection = redis.Redis(
         host=settings.REDIS_HOSTNAME,
         port=settings.CONSTANCE_REDIS_CONNECTION['port'],
         decode_responses=True)
     calificacion_pendiente_agente = redis_connection.hgetall(
         'OML:CALIFICACION:LLAMADA:{0}'.format(self.agente.pk))
     if calificacion_pendiente_agente != {} and \
        calificacion_pendiente_agente.get('TELEFONO', '') == data_entrega.get(
            'telefono_contacto', False):
         data_entrega['calldata'] = calificacion_pendiente_agente[
             'CALLDATA']
     return JsonResponse(data_entrega)
예제 #8
0
    def post(self, request, *args, **kwargs):
        # TODO: Analizar bien el caso de que se este agregando un contacto
        agente = AgenteProfile.objects.get(pk=request.POST['pk_agente'])
        click2call_type = request.POST.get('click2call_type', 'false')
        tipo_campana = request.POST.get('tipo_campana')
        campana_id = request.POST.get('pk_campana')
        telefono = request.POST.get('telefono', '')

        # Si el pk es 0 es porque no se quiere identificar al contacto.
        # El tipo de click2call no será "preview".
        contacto_id = request.POST['pk_contacto']
        if not contacto_id == '-1':
            contacto = Contacto.objects.get(pk=contacto_id)

        if not telefono:
            telefono = contacto.telefono

        if campana_id == '':
            calificacion_cliente = CalificacionCliente.objects.filter(
                contacto=contacto, agente=agente).order_by('-fecha')
            if calificacion_cliente.exists():
                campana = calificacion_cliente[0].campana
                campana_id = str(campana.pk)
                tipo_campana = str(campana.type)

        elif click2call_type == 'preview':
            asignado = AgenteEnContacto.asignar_contacto(
                contacto.id, campana_id, agente)
            if not asignado:
                message = _(u'No es posible llamar al contacto.'
                            ' Para poder llamar un contacto debe obtenerlo'
                            ' desde el menu de Campañas Preview.'
                            ' Asegurese de no haber perdido la reserva')
                messages.warning(self.request, message)
                return HttpResponseRedirect(
                    reverse('campana_preview_activas_miembro'))

        originator = Click2CallOriginator()
        originator.call_originate(agente, campana_id, tipo_campana,
                                  contacto_id, telefono, click2call_type)
        return HttpResponseRedirect(reverse('view_blanco'))
 def post(self, request, *args, **kwargs):
     campana_id = kwargs.get('pk_campana', False)
     data_entrega = AgenteEnContacto.entregar_contacto(
         self.agente, campana_id)
     return JsonResponse(data_entrega)
예제 #10
0
    def post(self, request, *args, **kwargs):
        # TODO: Analizar bien el caso de que se este agregando un contacto
        # TODO: DEJAR DE MANDAR pk_agente
        # TODO: DEJAR DE MANDAR tipo_campana
        agente = self.request.user.get_agente_profile()
        click2call_type = request.POST.get('click2call_type', 'false')
        campana_id = request.POST.get('pk_campana')
        telefono = request.POST.get('telefono', '')

        # Patch: Para deectar que hubo un error cuando se le pega por AJAX...
        self.no_redirect = request.POST.get('404_on_error')

        # Si el pk es 0 es porque no se quiere identificar al contacto.
        # El tipo de click2call no será "preview".
        contacto_id = request.POST['pk_contacto']
        if not contacto_id == '-1':
            try:
                contacto = Contacto.objects.get(pk=contacto_id)
            except Contacto.DoesNotExist:
                message = _(
                    u'No es posible llamar al contacto. No se pudo identificar al contacto.'
                )
                return self.error_return_value('view_blanco', message)

        if not telefono:
            if not contacto:
                message = _(
                    u'No es posible llamar al contacto. No se pudo identificar un teléfono.'
                )
                return self.error_return_value('view_blanco', message)
            telefono = contacto.telefono

        if campana_id == '':
            calificacion_cliente = CalificacionCliente.objects.filter(
                contacto=contacto, agente=agente).order_by('-fecha')
            if calificacion_cliente.exists():
                campana = calificacion_cliente[0].campana
                campana_id = str(campana.pk)
                tipo_campana = str(campana.type)
        else:
            try:
                campana = Campana.objects.obtener_actuales().get(id=campana_id)
            except Campana.DoesNotExist:
                message = _(
                    u'No es posible llamar al contacto.'
                    ' La campaña no se encuentra activa o no existe en el sistema.'
                )
                return self.error_return_value('view_blanco', message)
            campana_id = str(campana.pk)
            tipo_campana = str(campana.type)

            if click2call_type == 'preview':
                asignado = AgenteEnContacto.asignar_contacto(
                    contacto.id, campana.pk, agente)
                if not asignado:
                    message = _(u'No es posible llamar al contacto.'
                                ' Para poder llamar un contacto debe obtenerlo'
                                ' desde el menu de Campañas Preview.'
                                ' Asegurese de no haber perdido la reserva')
                    return self.error_return_value(
                        'campana_preview_activas_miembro', message)

        originator = Click2CallOriginator()
        originator.call_originate(agente, campana_id, tipo_campana,
                                  contacto_id, telefono, click2call_type)
        return HttpResponseRedirect(reverse('view_blanco'))