示例#1
0
def test_siguiente_manda_a_parcial_si_es_requerido_sin_scheduler(
        db, client, setup_groups, settings):
    settings.MIN_COINCIDENCIAS_CARGAS = 1
    m1 = MesaFactory()
    a1 = AttachmentFactory(mesa=m1, status=Identificacion.STATUS.identificada)
    m2 = MesaFactory()
    a2 = AttachmentFactory(mesa=m2, status=Identificacion.STATUS.identificada)
    mc1 = MesaCategoriaFactory(categoria__requiere_cargas_parciales=False,
                               coeficiente_para_orden_de_carga=1,
                               mesa=m1)
    mc2 = MesaCategoriaFactory(categoria__requiere_cargas_parciales=True,
                               coeficiente_para_orden_de_carga=2,
                               mesa=m2)

    fiscales = FiscalFactory.create_batch(2)

    # Da mc1 porque es más prioritaria.
    fiscal_client = fiscal_client_from_fiscal(client, fiscales[0])
    response = fiscal_client.get(reverse('siguiente-accion'))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse('carga-total', args=[mc1.id])
    # Cerramos la sesión para que el client pueda reutilizarse sin que nos diga
    # que ya estamos logueados.
    fiscal_client.logout()

    # mc1 fue asignada, ahora da mc2
    fiscal_client = fiscal_client_from_fiscal(client, fiscales[1])
    response = fiscal_client.get(reverse('siguiente-accion'))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse('carga-parcial', args=[mc2.id])
示例#2
0
def test_siguiente_prioriza_categoria(db, settings):
    f = FiscalFactory()
    c = CategoriaFactory(prioridad=2)
    c2 = CategoriaFactory(prioridad=1)
    m1 = MesaFactory()
    AttachmentFactory(mesa=m1)
    mc1 = MesaCategoriaFactory(
        status=MesaCategoria.STATUS.parcial_sin_consolidar,
        categoria=c,
        mesa=m1,
    )
    mc1.actualizar_coeficiente_para_orden_de_carga()
    m2 = MesaFactory()
    AttachmentFactory(mesa=m2)
    mc2 = MesaCategoriaFactory(
        categoria=c2,
        status=MesaCategoria.STATUS.parcial_sin_consolidar,
        mesa=m2,
    )
    mc2.actualizar_coeficiente_para_orden_de_carga()
    # Se recibe la mc con categoria más prioritaria.
    assert MesaCategoria.objects.siguiente() == mc2
    for i in range(settings.MIN_COINCIDENCIAS_CARGAS):
        mc2.asignar_a_fiscal()
    # Luego la de la categoría menos prioritaria.
    assert MesaCategoria.objects.siguiente() == mc1
示例#3
0
def test_aumentar_scrolling(db, settings):
    """
    Se comprueba que al disparar eventos de aumento de scoring, el efecto sea el esperado
    """
    with override_config(
            SCORING_MINIMO_PARA_CONSIDERAR_QUE_FISCAL_ES_TROLL=400):
        fiscal1 = nuevo_fiscal()
        fiscal2 = nuevo_fiscal()
        assert fiscal1.scoring_troll() == 0
        assert fiscal2.scoring_troll() == 0

        mesa1 = MesaFactory()
        attach1 = AttachmentFactory()
        attach2 = AttachmentFactory()
        identi1 = identificar(attach1, mesa1, fiscal1)
        identi2 = identificar(attach1, mesa1, fiscal2)
        identi3 = identificar(attach2, mesa1, fiscal1)
        aumentar_scoring_troll_identificacion(100, identi1)
        aumentar_scoring_troll_identificacion(150, identi2)
        aumentar_scoring_troll_identificacion(250, identi3)
        assert fiscal1.scoring_troll() == 350
        assert fiscal2.scoring_troll() == 150
        assert not fiscal1.troll
        assert not fiscal2.troll

        attach3 = AttachmentFactory()
        identi4 = reportar_problema_attachment(attach3, fiscal1)
        aumentar_scoring_troll_identificacion(80, identi4)
        assert fiscal1.scoring_troll() == 430
        assert fiscal2.scoring_troll() == 150
        assert fiscal1.troll
        assert not fiscal2.troll
示例#4
0
def test_priorizadas_ordena_por_cant_asignaciones_realizadas(db, settings):
    a1 = AttachmentFactory()
    a2 = AttachmentFactory()
    a3 = AttachmentFactory()
    assert a1.id < a2.id
    assert a2.id < a3.id
    assert set(Attachment.objects.sin_identificar()) == {a1, a2, a3}
    for i in range(settings.MIN_COINCIDENCIAS_IDENTIFICACION):
        a1.asignar_a_fiscal()
        a2.asignar_a_fiscal()
        a3.asignar_a_fiscal()

    # Prima el orden por id.
    assert list(
        Attachment.objects.sin_identificar().priorizadas()) == [a1, a2, a3]

    # Ahora a2 es devuelto.
    for i in range(settings.MIN_COINCIDENCIAS_IDENTIFICACION):
        a2.desasignar_a_fiscal()

    assert list(
        Attachment.objects.sin_identificar().priorizadas()) == [a2, a1, a3]

    # a2 es asignado nuevamente.
    for i in range(settings.MIN_COINCIDENCIAS_IDENTIFICACION):
        a2.asignar_a_fiscal()

    # Si bien a3 y a2 tienen la misma cantidad de asignaciones
    # vigentes, a2 fue asignado más veces. a1 y a3 empatan, salvo por id.
    assert list(
        Attachment.objects.sin_identificar().priorizadas()) == [a1, a3, a2]
    assert a1.cant_fiscales_asignados == a3.cant_fiscales_asignados
    assert a3.cant_fiscales_asignados == a2.cant_fiscales_asignados
    assert a3.cant_asignaciones_realizadas < a2.cant_asignaciones_realizadas
示例#5
0
def test_registro_cambio_estado_troll(db, settings):
    """
    Se comprueba que un CambioEstadoTroll se genere con los valores correctos.
    """

    with override_config(
            SCORING_MINIMO_PARA_CONSIDERAR_QUE_FISCAL_ES_TROLL=320):
        fiscal = nuevo_fiscal()
        attach1 = AttachmentFactory()
        attach2 = AttachmentFactory()
        identi1 = reportar_problema_attachment(attach1, fiscal)
        identi2 = reportar_problema_attachment(attach2, fiscal)

        cantidad_cambios_estado_antes = CambioEstadoTroll.objects.count()
        aumentar_scoring_troll_identificacion(200, identi1)
        assert CambioEstadoTroll.objects.count(
        ) == cantidad_cambios_estado_antes
        assert CambioEstadoTroll.objects.filter(
            fiscal_afectado=fiscal).count() == 0
        aumentar_scoring_troll_identificacion(200, identi2)
        assert CambioEstadoTroll.objects.count(
        ) == cantidad_cambios_estado_antes + 1
        cambioEstado = CambioEstadoTroll.objects.filter(
            fiscal_afectado=fiscal).first()
        assert cambioEstado.automatico
        assert cambioEstado.actor is None
        assert cambioEstado.evento_disparador == fiscal.eventos_scoring_troll.order_by(
            'created').last()
        assert cambioEstado.troll
def test_elegir_acta_prioriza_por_tamaño_circuito(db, fiscal_client):
    e1 = EleccionFactory()

    m1 = AttachmentFactory(mesa__eleccion=[e1]).mesa
    m2 = AttachmentFactory(mesa__eleccion=[e1]).mesa
    m3 = AttachmentFactory(mesa__eleccion=[e1]).mesa
    # creo otras mesas asociadas a los circuitos
    c1 = m1.lugar_votacion.circuito
    c2 = m2.lugar_votacion.circuito
    c3 = m3.lugar_votacion.circuito

    MesaFactory.create_batch(3, eleccion=[e1], lugar_votacion__circuito=c1)
    MesaFactory.create_batch(10, eleccion=[e1], lugar_votacion__circuito=c2)
    MesaFactory.create_batch(5, eleccion=[e1], lugar_votacion__circuito=c3)
    assert c1.electores == 400
    assert c2.electores == 1100
    assert c3.electores == 600
    assert m1.orden_de_carga == m2.orden_de_carga == m3.orden_de_carga == 1
    response = fiscal_client.get(reverse('elegir-acta-a-cargar'))
    assert response.status_code == 302
    assert response.url == reverse('mesa-cargar-resultados',
                                   args=[e1.id, m2.numero])
    response = fiscal_client.get(reverse('elegir-acta-a-cargar'))
    assert response.status_code == 302
    assert response.url == reverse('mesa-cargar-resultados',
                                   args=[e1.id, m3.numero])
    response = fiscal_client.get(reverse('elegir-acta-a-cargar'))
    assert response.status_code == 302
    assert response.url == reverse('mesa-cargar-resultados',
                                   args=[e1.id, m1.numero])
示例#7
0
def test_identificacion_consolidada_tres_ok_dos_error(db):
    # En esta variable se almacena el comportamiento que tendrá  cada llamado a
    # la función consolidar_identificaciones para cada identicacion de un attachment
    # a procesar.
    # Los attachments a, c y e se procesarán con normalidad y su identificación
    # quedará maracada como procesadas=True.
    # Para los attachments b y d se lanzará una Exception y su identicación
    # quedará como procesada=False.
    side_effects = [
        mock.DEFAULT,  #comportamiento para a
        Exception('error'),  #comportamiento para b
        mock.DEFAULT,  #comportamiento para c
        Exception('error'),  #comportamiento para d
        mock.DEFAULT  #comportamiento para e
    ]
    with mock.patch('adjuntos.consolidacion.consolidar_identificaciones',
                    side_effect=side_effects):
        m1 = MesaFactory()
        a = AttachmentFactory()
        b = AttachmentFactory()
        c = AttachmentFactory()
        d = AttachmentFactory()
        e = AttachmentFactory()
        i1 = IdentificacionFactory(attachment=a,
                                   status='identificada',
                                   mesa=m1)
        i2 = IdentificacionFactory(attachment=b,
                                   status='identificada',
                                   mesa=m1)
        i3 = IdentificacionFactory(attachment=c,
                                   status='identificada',
                                   mesa=m1)
        i4 = IdentificacionFactory(attachment=d,
                                   status='identificada',
                                   mesa=m1)
        i5 = IdentificacionFactory(attachment=e,
                                   status='identificada',
                                   mesa=m1)

        cant_novedades = Identificacion.objects.filter(procesada=False).count()
        assert cant_novedades == 5
        consumir_novedades_identificacion()

        # Chequeamos que las no procesadas son 2
        no_procesadas = Identificacion.objects.filter(procesada=False)
        assert no_procesadas.count() == 2

        # Chequeamos que las no procesadas son i2 e i4
        no_procesadas_ids = map(lambda x: x.id, no_procesadas)
        assert set([i2.id, i4.id]) == set(no_procesadas_ids)

        # Chequeamos que las procesadas son 3
        procesadas = Identificacion.objects.filter(procesada=True)
        assert procesadas.count() == 3

        # Chequeamos que las procesadas son i1, i3 e i5
        procesadas_ids = map(lambda x: x.id, procesadas)
        assert set([i1.id, i3.id, i5.id]) == set(procesadas_ids)
示例#8
0
def test_identificadas_excluye_sin_orden(db):
    m1 = MesaFactory()
    AttachmentFactory(mesa=m1)
    mc1 = MesaCategoriaFactory(mesa=m1)
    m2 = MesaFactory()
    AttachmentFactory(mesa=m2)
    mc2 = MesaCategoriaFactory(coeficiente_para_orden_de_carga=0.1, mesa=m2)
    assert mc1.coeficiente_para_orden_de_carga is None
    assert mc1 not in MesaCategoria.objects.identificadas()
    assert mc2 in MesaCategoria.objects.identificadas()
示例#9
0
def test_siguiente_prioriza_estado_y_luego_coeficiente(db, settings, setup_constance, django_assert_num_queries):

    f = FiscalFactory()
    c = CategoriaFactory(prioridad=1)
    m1 = MesaFactory()
    AttachmentFactory(mesa=m1)
    mc1 = MesaCategoriaFactory(
        status=MesaCategoria.STATUS.parcial_sin_consolidar,
        categoria=c,
        coeficiente_para_orden_de_carga=1.0,
        mesa=m1
    )
    m2 = MesaFactory()
    AttachmentFactory(mesa=m2)
    mc2 = MesaCategoriaFactory(
        categoria=c,
        status=MesaCategoria.STATUS.total_en_conflicto,
        coeficiente_para_orden_de_carga=99.0,
        mesa=m2
    )
    m3 = MesaFactory()
    AttachmentFactory(mesa=m3)
    mc3 = MesaCategoriaFactory(
        categoria=c,
        status=MesaCategoria.STATUS.total_en_conflicto,
        coeficiente_para_orden_de_carga=2.0,
        mesa=m3
    )
    with django_assert_num_queries(17):
        assert MesaCategoria.objects.siguiente() == mc1

    for i in range(settings.MIN_COINCIDENCIAS_CARGAS):
        mc1.asignar_a_fiscal()
    assert MesaCategoria.objects.siguiente() == mc3
    for i in range(settings.MIN_COINCIDENCIAS_CARGAS):
        mc3.asignar_a_fiscal()
    assert MesaCategoria.objects.siguiente() == mc2
    for i in range(settings.MIN_COINCIDENCIAS_CARGAS):
        mc2.asignar_a_fiscal()

    # A igualdad de asignaciones, se vuelven a repetir.
    assert MesaCategoria.objects.siguiente() == mc1
    for i in range(settings.MIN_COINCIDENCIAS_CARGAS):
        mc1.asignar_a_fiscal()
    assert MesaCategoria.objects.siguiente() == mc3
    for i in range(settings.MIN_COINCIDENCIAS_CARGAS):
        mc3.asignar_a_fiscal()
    assert MesaCategoria.objects.siguiente() == mc2
示例#10
0
def test_troll_parcial_dc_a_sin_consolidar(db, settings):
    with override_config(
            SCORING_MINIMO_PARA_CONSIDERAR_QUE_FISCAL_ES_TROLL=20):
        fiscal_1 = nuevo_fiscal()
        fiscal_2 = nuevo_fiscal()
        presi = CategoriaFactory()
        mesa_1 = MesaFactory(categorias=[presi])
        mesa_categoria_1 = MesaCategoria.objects.filter(
            mesa=mesa_1, categoria=presi).first()
        attach_1 = AttachmentFactory()
        identificar(attach_1, mesa_1, fiscal_1)
        identificar(attach_1, mesa_1, fiscal_2)

        refrescar_data(
            [presi, fiscal_1, fiscal_2, mesa_1, mesa_categoria_1, attach_1])

        assert not fiscal_1.troll
        assert not fiscal_2.troll

        nueva_carga(mesa_categoria_1, fiscal_1, [20, 35], Carga.TIPOS.parcial)
        nueva_carga(mesa_categoria_1, fiscal_2, [20, 35], Carga.TIPOS.parcial)

        consumir_novedades_carga()
        refrescar_data([mesa_categoria_1])

        assert mesa_categoria_1.status == MesaCategoria.STATUS.parcial_consolidada_dc
        assert Carga.objects.filter(invalidada=True).count() == 0

        aplicar_marca_troll(fiscal_2)
        consumir_novedades_carga()
        refrescar_data([mesa_categoria_1, fiscal_2])

        assert mesa_categoria_1.status == MesaCategoria.STATUS.parcial_sin_consolidar
        assert Carga.objects.filter(invalidada=True).count() == 1
示例#11
0
def test_datos_fotos_distrital(db, settings):
    settings.MIN_COINCIDENCIAS_IDENTIFICACION = 2
    settings.DISTRITO_PBA = '2'

    # 50 mesas: 20 pba, 15 caba, 15 catamarca
    data = DataTresDistritos(settings.DISTRITO_PBA)

    # 40 fotos:
    # - 14 / 5 / 2 identificadas a mesas pba / caba / catamarca
    # - 3 con problemas
    # - 6 en proceso de identificación
    # - 10 sin acciones
    for ix in range(40):
        foto = AttachmentFactory()
        if (ix < 14):
            identificar(foto, data.mesas_pba[ix], data.fiscales[0])
            identificar(foto, data.mesas_pba[ix], data.fiscales[1])
        elif (ix < 19):
            identificar(foto, data.mesas_caba[ix-14], data.fiscales[2])
            identificar(foto, data.mesas_caba[ix-14], data.fiscales[3])
        elif (ix < 21):
            identificar(foto, data.mesas_cat[ix-19], data.fiscales[4])
            identificar(foto, data.mesas_cat[ix-19], data.fiscales[5])
        elif (ix < 24):
            reportar_problema_attachment(foto, data.fiscales[6])
            reportar_problema_attachment(foto, data.fiscales[7])
        elif (ix < 30):
            identificar(foto, data.mesas_pba[ix-10], data.fiscales[8])

    consumir_novedades()
    generador = GeneradorDatosFotosDistrital(settings.DISTRITO_PBA)
    generador.calcular()

    assert generador.cantidad_mesas == 20
    assert generador.mesas_con_foto_identificada == 14
def test_carga_mesa_redirige_a_siguiente(db, fiscal_client):
    o = OpcionFactory(es_contable=True)
    e1 = EleccionFactory(opciones=[o])
    e2 = EleccionFactory(opciones=[o])
    m1 = AttachmentFactory(mesa__eleccion=[e1, e2]).mesa

    response = fiscal_client.get(reverse('elegir-acta-a-cargar'))
    assert response.url == reverse('mesa-cargar-resultados',
                                   args=[e1.id, m1.numero])
    # response = fiscal_client.get(url)
    response = fiscal_client.post(
        response.url, {
            'form-0-opcion': str(o.id),
            'form-0-votos': str(m1.electores),
            'form-TOTAL_FORMS': '1',
            'form-INITIAL_FORMS': '0',
            'form-MIN_NUM_FORMS': '1',
            'form-MAX_NUM_FORMS': '1000',
        })
    assert response.status_code == 302
    assert response.url == reverse('mesa-cargar-resultados',
                                   args=[e2.id, m1.numero])

    response = fiscal_client.post(
        response.url, {
            'form-0-opcion': str(o.id),
            'form-0-votos': str(m1.electores),
            'form-TOTAL_FORMS': '1',
            'form-INITIAL_FORMS': '0',
            'form-MIN_NUM_FORMS': '1',
            'form-MAX_NUM_FORMS': '1000',
        })
    assert response.status_code == 302
    assert response.url == reverse('elegir-acta-a-cargar')
示例#13
0
def test_troll_total_consolidada_dc_a_parcial_sin_consolidar(db, settings):
    fiscal_1 = nuevo_fiscal()
    fiscal_2 = nuevo_fiscal()
    presi = CategoriaFactory()
    mesa_1 = MesaFactory(categorias=[presi])
    mesa_categoria_1 = MesaCategoria.objects.filter(mesa=mesa_1,
                                                    categoria=presi).first()
    attach_1 = AttachmentFactory()
    identificar(attach_1, mesa_1, fiscal_1)
    identificar(attach_1, mesa_1, fiscal_2)

    refrescar_data(
        [presi, fiscal_1, fiscal_2, mesa_1, mesa_categoria_1, attach_1])

    nueva_carga(mesa_categoria_1, fiscal_1, [20, 35], Carga.TIPOS.parcial)
    nueva_carga(mesa_categoria_1, fiscal_2, [20, 35], Carga.TIPOS.parcial)

    consumir_novedades_carga()
    refrescar_data([mesa_categoria_1])

    nueva_carga(mesa_categoria_1, fiscal_2, [20, 35], Carga.TIPOS.total)
    nueva_carga(mesa_categoria_1, fiscal_1, [20, 35], Carga.TIPOS.total)

    consumir_novedades_carga()
    refrescar_data([mesa_categoria_1])

    assert mesa_categoria_1.status == MesaCategoria.STATUS.total_consolidada_dc
    assert Carga.objects.filter(invalidada=True).count() == 0

    aplicar_marca_troll(fiscal_2)
    consumir_novedades_carga()
    refrescar_data([mesa_categoria_1, fiscal_2])

    assert mesa_categoria_1.status == MesaCategoria.STATUS.parcial_sin_consolidar
    assert Carga.objects.filter(invalidada=True).count() == 3
示例#14
0
def test_identificacion_problema_create_view_post_ajax(fiscal_client,
                                                       admin_user):
    a = AttachmentFactory()
    data = {
        'status': 'problema',
        'tipo_de_problema': 'falta_lista',
        'descripcion': 'Un problema'
    }
    # ajax post
    url = reverse('asignar-problema', args=[a.id])
    response = fiscal_client.post(url,
                                  data,
                                  HTTP_X_REQUESTED_WITH='XMLHttpRequest')
    assert response.status_code == 200
    # hack
    assert response.json() == {'status': 'hack'}

    assert a.identificaciones.count() == 1
    i = a.identificaciones.first()
    assert i.status == 'problema'
    assert i.fiscal == admin_user.fiscal
    assert i.mesa is None
    # mesa no tiene attach aun
    a.refresh_from_db()
    assert a.identificacion_testigo is None

    # hay un problema asociado al attach con un reporte asociado
    problema = a.problemas.get()  # demuestra que es 1 solo
    assert problema.estado == 'potencial'
    reporte = problema.reportes.get()  # idem, es 1 solo
    assert reporte.tipo_de_problema == 'falta_lista'
    assert reporte.reportado_por == admin_user.fiscal
    assert reporte.descripcion == 'Un problema'
示例#15
0
def test_identificacion_create_view_post__desde_unidad_basica(
        fiscal_client, admin_user):
    mesa_1 = MesaFactory()
    attachment = AttachmentFactory()
    admin_user.fiscal.asignar_attachment(attachment)
    attachment.asignar_a_fiscal()
    data = {
        'mesa': mesa_1.numero,
        'circuito': mesa_1.circuito.numero,
        'seccion': mesa_1.circuito.seccion.numero,
        'distrito': mesa_1.circuito.seccion.distrito.id,
    }
    response = fiscal_client.post(
        reverse('asignar-mesa-ub', args=[attachment.id]), data)
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse('cargar-desde-ub',
                                   kwargs={'mesa_id': mesa_1.id})

    # Refrescamos el attachment desde la base.
    attachment.refresh_from_db()

    assert attachment.identificaciones.count() == 1
    assert attachment.status == Attachment.STATUS.identificada

    identificacion = attachment.identificaciones.first()
    assert attachment.identificacion_testigo == identificacion
    assert identificacion.status == Identificacion.STATUS.identificada
    assert identificacion.source == Identificacion.SOURCES.csv
    assert identificacion.mesa == mesa_1
    # La identificación está consolidada, por lo tanto ya existe en la mesa
    assert mesa_1.attachments.exists()
示例#16
0
def test_consolidador_honra_timeout(db, settings):
    settings.MIN_COINCIDENCIAS_IDENTIFICACION = 1
    a = AttachmentFactory()
    m1 = MesaFactory()
    i1 = IdentificacionFactory(
        attachment=a,
        status='identificada',
        mesa=m1,
        tomada_por_consolidador=timezone.now() -
        timedelta(minutes=settings.TIMEOUT_CONSOLIDACION - 1))
    consumir_novedades_identificacion()
    a.refresh_from_db()
    i1.refresh_from_db()
    # No la tomó aún.
    assert i1.procesada is False

    assert a.status == Attachment.STATUS.sin_identificar
    i1.tomada_por_consolidador = timezone.now() - timedelta(
        minutes=settings.TIMEOUT_CONSOLIDACION + 1)
    i1.save()
    consumir_novedades_identificacion()
    a.refresh_from_db()
    i1.refresh_from_db()

    # Ahora sí
    assert i1.procesada is True
    assert a.identificacion_testigo == i1
    assert a.mesa == m1
    assert a.status == Attachment.STATUS.identificada
示例#17
0
def test_siguiente_happy_path_parcial_y_total_con_scheduler(
        db, fiscal_client, settings):
    settings.MIN_COINCIDENCIAS_CARGAS = 1
    mesa = MesaFactory()
    a = AttachmentFactory(mesa=mesa, status='identificada')
    mc1 = MesaCategoriaFactory(categoria__requiere_cargas_parciales=True,
                               coeficiente_para_orden_de_carga=1,
                               mesa=mesa)
    scheduler()
    response = fiscal_client.get(reverse('siguiente-accion'))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse('carga-parcial', args=[mc1.id])

    carga = CargaFactory(mesa_categoria=mc1, tipo='parcial')
    consumir_novedades_carga()
    scheduler()
    mc1.refresh_from_db()
    assert mc1.status == MesaCategoria.STATUS.parcial_consolidada_dc
    assert mc1.carga_testigo == carga
    mc1.desasignar_a_fiscal()
    response = fiscal_client.get(reverse('siguiente-accion'))
    assert response.url == reverse('carga-total', args=[mc1.id])

    carga = CargaFactory(mesa_categoria=mc1, tipo='total')
    consumir_novedades_carga()
    scheduler()
    mc1.refresh_from_db()
    assert mc1.status == MesaCategoria.STATUS.total_consolidada_dc
    assert mc1.carga_testigo == carga
    response = fiscal_client.get(reverse('siguiente-accion'))
    # No hay actas para cargar, vuelta a empezar.
    assert response.status_code == HTTPStatus.OK
    assert 'No hay actas para cargar' in str(response.content)
示例#18
0
def test_identificacion_consolidada_alguna(db):
    a = AttachmentFactory()
    m1 = MesaFactory()
    i1 = IdentificacionFactory(attachment=a, status='identificada', mesa=m1)
    IdentificacionFactory(attachment=a, status='problema', mesa=None)
    i2 = IdentificacionFactory(attachment=a, status='problema', mesa=None)
    Problema.reportar_problema(FiscalFactory(),
                               'reporte 1',
                               ReporteDeProblema.TIPOS_DE_PROBLEMA.ilegible,
                               identificacion=i2)
    IdentificacionFactory(attachment=a, status='identificada', mesa=m1)

    assert a.identificacion_testigo is None

    cant_novedades = Identificacion.objects.filter(procesada=False).count()
    assert cant_novedades == 4
    consumir_novedades_identificacion()

    # No se consolidó el problema.
    assert i2.problemas.first().problema.estado == Problema.ESTADOS.potencial

    cant_novedades = Identificacion.objects.filter(procesada=False).count()
    assert cant_novedades == 0

    a.refresh_from_db()
    assert a.identificacion_testigo == i1
    assert a.mesa == m1
    assert a.status == Attachment.STATUS.identificada
示例#19
0
def test_identificacion_consolidada_ninguno(db):
    a = AttachmentFactory()
    m1 = MesaFactory()
    IdentificacionFactory(attachment=a, status='identificada', mesa=m1)

    i1 = IdentificacionFactory(attachment=a, status='problema', mesa=None)
    f = FiscalFactory()
    Problema.reportar_problema(f,
                               'reporte 1',
                               ReporteDeProblema.TIPOS_DE_PROBLEMA.spam,
                               identificacion=i1)
    assert i1.problemas.first().problema.estado == Problema.ESTADOS.potencial

    i2 = IdentificacionFactory(attachment=a, status='problema', mesa=None)
    Problema.reportar_problema(f,
                               'reporte 2',
                               ReporteDeProblema.TIPOS_DE_PROBLEMA.ilegible,
                               identificacion=i2)

    assert a.identificacion_testigo is None

    cant_novedades = Identificacion.objects.filter(procesada=False).count()
    assert cant_novedades == 3
    consumir_novedades_identificacion()

    # Se consolidó un problema.
    assert i1.problemas.first().problema.estado == Problema.ESTADOS.pendiente

    cant_novedades = Identificacion.objects.filter(procesada=False).count()
    assert cant_novedades == 0

    assert a.identificacion_testigo is None
示例#20
0
def test_datos_fotos_nacional(db, settings):
    settings.MIN_COINCIDENCIAS_IDENTIFICACION = 2

    fiscales = [nuevo_fiscal() for ix in range(10)]
    mesas = [MesaFactory() for ix in range(30)]

    # 25 fotos:
    # - 9 identificadas
    # - 1 con problemas
    # - 8 en proceso de identificación
    # - 7 sin acciones
    for ix in range(25):
        foto = AttachmentFactory()
        if (ix < 9):
            identificar(foto, mesas[ix], fiscales[0])
            identificar(foto, mesas[ix], fiscales[1])
        elif (ix < 10):
            reportar_problema_attachment(foto, fiscales[2])
            reportar_problema_attachment(foto, fiscales[3])
        elif (ix < 18):
            identificar(foto, mesas[ix], fiscales[4])

    consumir_novedades()
    generador = GeneradorDatosFotosNacional()
    generador.calcular()

    assert generador.cantidad_mesas == 30
    assert generador.mesas_con_foto_identificada == 9
    assert generador.fotos_con_problema_confirmado == 1
    assert generador.fotos_en_proceso == 8
    assert generador.fotos_sin_acciones == 7
    assert generador.mesas_sin_foto == 5
示例#21
0
def test_identificacion_problema_troll(db):
    fiscal_troll = nuevo_fiscal()
    fiscal_troll.troll = True
    fiscal_troll.save(update_fields=['troll'])
    fiscal_ok = nuevo_fiscal()

    attach = AttachmentFactory()
    ident_troll = reportar_problema_attachment(attach, fiscal_troll)
    Problema.reportar_problema(fiscal_troll,
                               "foto fea",
                               ReporteDeProblema.TIPOS_DE_PROBLEMA.ilegible,
                               identificacion=ident_troll)
    ident_ok = reportar_problema_attachment(attach, fiscal_ok)
    Problema.reportar_problema(fiscal_ok,
                               "no me gusta",
                               ReporteDeProblema.TIPOS_DE_PROBLEMA.falta_lista,
                               identificacion=ident_ok)

    assert 2 == Problema.objects.count()
    assert 1 == ReporteDeProblema.objects.filter(
        reportado_por=fiscal_troll).count()
    assert 1 == ReporteDeProblema.objects.filter(
        reportado_por=fiscal_ok).count()

    problema_troll = ReporteDeProblema.objects.filter(
        reportado_por=fiscal_troll).first().problema
    assert Problema.ESTADOS.descartado == problema_troll.estado
    problema_ok = ReporteDeProblema.objects.filter(
        reportado_por=fiscal_ok).first().problema
    assert Problema.ESTADOS.potencial == problema_ok.estado
def test_elegir_acta_mesas_redirige(db, fiscal_client):

    assert Mesa.objects.count() == 0
    assert VotoMesaReportado.objects.count() == 0
    c = CircuitoFactory()
    e1 = EleccionFactory()
    e2 = EleccionFactory()

    m1 = AttachmentFactory(mesa__eleccion=[e1],
                           mesa__lugar_votacion__circuito=c).mesa
    e2 = EleccionFactory()
    m2 = AttachmentFactory(mesa__eleccion=[e1, e2],
                           mesa__lugar_votacion__circuito=c).mesa

    assert m1.orden_de_carga == 1
    assert m2.orden_de_carga == 2

    response = fiscal_client.get(reverse('elegir-acta-a-cargar'))
    assert response.status_code == 302
    assert response.url == reverse('mesa-cargar-resultados',
                                   args=[e1.id, m1.numero])

    # como m1 queda en periodo de "taken" (aunque no se haya ocupado aun)
    # se pasa a la siguiente mesa
    response = fiscal_client.get(reverse('elegir-acta-a-cargar'))
    assert response.status_code == 302
    assert response.url == reverse('mesa-cargar-resultados',
                                   args=[e1.id, m2.numero])

    # se carga esa eleccion
    VotoMesaReportadoFactory(mesa=m2,
                             eleccion=e1,
                             opcion=e1.opciones.first(),
                             votos=1)

    # FIX ME . El periodo de taken deberia ser *por eleccion*.
    # en este escenario donde esta lockeado la mesa para la eleccion 1, pero no se está
    # cargando la mesa 2, un dataentry queda idle
    response = fiscal_client.get(reverse('elegir-acta-a-cargar'))
    assert response.status_code == 200  # no hay actas

    m2.taken = None
    m2.save()
    response = fiscal_client.get(reverse('elegir-acta-a-cargar'))
    assert response.status_code == 302
    assert response.url == reverse('mesa-cargar-resultados',
                                   args=[e2.id, m2.numero])
示例#23
0
def test_desmarca_masiva(db, settings):
    fiscal_1 = nuevo_fiscal()
    fiscal_2 = nuevo_fiscal()
    fiscal_3 = nuevo_fiscal()
    fiscal_4 = nuevo_fiscal()
    fiscal_5 = nuevo_fiscal()
    fiscal_6 = nuevo_fiscal()
    fiscal_7 = nuevo_fiscal()

    attach = AttachmentFactory()
    mesa_1 = MesaFactory()
    mesa_2 = MesaFactory()
    mesa_3 = MesaFactory()
    mesa_4 = MesaFactory()
    mesa_5 = MesaFactory()

    with override_config(
            SCORING_MINIMO_PARA_CONSIDERAR_QUE_FISCAL_ES_TROLL=200):
        identi_1 = reportar_problema_attachment(attach, fiscal_1)
        identi_2 = identificar(attach, mesa_1, fiscal_2)
        identi_3 = identificar(attach, mesa_2, fiscal_3)
        identi_4 = identificar(attach, mesa_3, fiscal_4)
        identi_5 = identificar(attach, mesa_4, fiscal_5)
        identi_6 = identificar(attach, mesa_5, fiscal_6)

        aumentar_scoring_troll_identificacion(300, identi_1)
        aumentar_scoring_troll_identificacion(400, identi_2)
        aumentar_scoring_troll_identificacion(500, identi_3)
        aumentar_scoring_troll_identificacion(100, identi_4)
        aumentar_scoring_troll_identificacion(50, identi_5)

        assert fiscal_1.troll
        assert fiscal_2.troll
        assert fiscal_3.troll
        assert not fiscal_4.troll
        assert not fiscal_5.troll
        assert not fiscal_6.troll

        Fiscal.destrolleo_masivo(fiscal_7, 450, 80)
        for fiscal in [
                fiscal_1, fiscal_2, fiscal_3, fiscal_4, fiscal_5, fiscal_6
        ]:
            fiscal.refresh_from_db()

        assert not fiscal_1.troll
        assert fiscal_1.scoring_troll() == 80
        assert not fiscal_2.troll
        assert fiscal_2.scoring_troll() == 80
        eventos = list(
            fiscal_2.eventos_scoring_troll.order_by('created').all())
        assert len(eventos) == 2
        assert eventos[1].variacion == -320
        assert fiscal_3.troll
        assert not fiscal_4.troll
        assert fiscal_4.scoring_troll() == 100
        assert not fiscal_5.troll
        assert fiscal_5.scoring_troll() == 50
        assert not fiscal_6.troll
示例#24
0
def test_consolidador_desmarca_timeout(db, settings):
    a = AttachmentFactory()
    m1 = MesaFactory()
    i1 = IdentificacionFactory(attachment=a, status='identificada', mesa=m1)
    assert i1.tomada_por_consolidador is None
    consumir_novedades_identificacion()
    i1.refresh_from_db()
    assert i1.tomada_por_consolidador is None
    assert i1.procesada is True
示例#25
0
def test_identificacion_create_view_get(fiscal_client, admin_user):
    a = AttachmentFactory()
    # Se la asigno al fiscal
    admin_user.fiscal.asignar_attachment(a)

    response = fiscal_client.get(reverse('asignar-mesa', args=[a.id]))
    foto_url = a.foto.thumbnail['960x'].url
    assert response.status_code == HTTPStatus.OK
    assert foto_url in response.content.decode('utf8')
示例#26
0
def test_identificacion_consolidada_con_minimo_1(db, settings):
    settings.MIN_COINCIDENCIAS_IDENTIFICACION = 1
    a = AttachmentFactory()
    m1 = MesaFactory()
    i1 = IdentificacionFactory(attachment=a, status='identificada', mesa=m1)
    consumir_novedades_identificacion()
    a.refresh_from_db()
    assert a.identificacion_testigo == i1
    assert a.mesa == m1
    assert a.status == Attachment.STATUS.identificada
示例#27
0
def test_identificacion_create_view_get__desde_unidad_basica(
        fiscal_client, admin_user):
    a = AttachmentFactory()
    admin_user.fiscal.asignar_attachment(a)
    a.asignar_a_fiscal()
    response = fiscal_client.get(reverse('asignar-mesa-ub', args=[a.id]))
    assert response.status_code == HTTPStatus.OK

    foto_url = a.foto.thumbnail['960x'].url
    assert foto_url in response.content.decode('utf8')
示例#28
0
def test_ciclo_de_vida_problemas_resolver(db):
    a = AttachmentFactory()
    m1 = MesaFactory()
    IdentificacionFactory(attachment=a, status='identificada', mesa=m1)

    # Está pendiente.
    assert a in Attachment.objects.sin_identificar()

    i1 = IdentificacionFactory(attachment=a, status='problema', mesa=None)
    f = FiscalFactory()
    Problema.reportar_problema(f,
                               'reporte 1',
                               ReporteDeProblema.TIPOS_DE_PROBLEMA.spam,
                               identificacion=i1)
    assert i1.problemas.first().problema.estado == Problema.ESTADOS.potencial

    i2 = IdentificacionFactory(attachment=a, status='problema', mesa=None)
    Problema.reportar_problema(f,
                               'reporte 2',
                               ReporteDeProblema.TIPOS_DE_PROBLEMA.ilegible,
                               identificacion=i2)

    assert i1.invalidada == False
    assert i2.invalidada == False

    consumir_novedades_identificacion()

    # Se consolidó un problema.
    a.refresh_from_db()
    assert a.status == Attachment.STATUS.problema
    problema = i1.problemas.first().problema
    assert problema.estado == Problema.ESTADOS.pendiente

    # El attach no está entre los pendientes.
    assert a not in Attachment.objects.sin_identificar()

    problema.resolver(FiscalFactory().user)

    assert problema.estado == Problema.ESTADOS.resuelto

    i1.refresh_from_db()
    i2.refresh_from_db()
    # Las identificaciones están invalidadas.
    assert i1.invalidada == True
    assert i2.invalidada == True

    consumir_novedades_identificacion()

    # Se agrega una nueva identificación y se consolida.
    IdentificacionFactory(attachment=a, status='identificada', mesa=m1)
    consumir_novedades_identificacion()
    a.refresh_from_db()
    assert a.status == Attachment.STATUS.identificada
    assert a.mesa == m1
示例#29
0
def test_identificacion_sin_permiso(fiscal_client, admin_user, mocker):
    fiscal = admin_user.fiscal
    capture = mocker.patch(
        'adjuntos.views.identificacion_create.capture_message')
    a = AttachmentFactory()
    response = fiscal_client.get(reverse('asignar-mesa', args=[a.id]))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse('siguiente-accion')
    fiscal.asignar_attachment(a)
    response = fiscal_client.get(reverse('asignar-mesa', args=[a.id]))
    assert response.status_code == 200
示例#30
0
def test_efecto_de_ser_troll(db):
    """
    Se comprueba que las cargas e identificaciones que realiza un fiscal
    luego de ser detectado como troll, nacen invalidadas y procesadas.
    """
    # escenario
    fiscal_1 = nuevo_fiscal()
    fiscal_2 = nuevo_fiscal()
    categoria = nueva_categoria(["o1", "o2", "o3"])
    mesa = MesaFactory(categorias=[categoria])
    mesa_categoria = MesaCategoria.objects.filter(mesa=mesa).first()
    attach_1 = AttachmentFactory()
    attach_2 = AttachmentFactory()

    # marco al fiscal_1 como troll
    fiscal_1.marcar_como_troll(fiscal_2)

    # despues, una carga, una identificacion y un reporte de problema cada uno
    ident_1 = identificar(attach_1, mesa, fiscal_1)
    ident_2 = identificar(attach_1, mesa, fiscal_2)
    problema_1 = reportar_problema_attachment(attach_2, fiscal_1)
    problema_2 = reportar_problema_attachment(attach_2, fiscal_2)
    carga_1 = nueva_carga(mesa_categoria, fiscal_1, [30, 20, 10])
    carga_2 = nueva_carga(mesa_categoria, fiscal_2, [30, 20, 10])

    # las cargas e identificaciones que hizo el fiscal 1 estan invalidadas y procesadas,
    # las que hizo el fiscal 2 no
    for accion in [ident_1, problema_1, carga_1]:
        assert accion.invalidada
        assert accion.procesada
    for accion in [ident_2, problema_2, carga_2]:
        assert not accion.invalidada
        assert not accion.procesada

    # consolido cargas e identificaciones. Ni el attachment ni la mesa_categoria deberian estar consolidados.
    consumir_novedades()
    for db_object in [mesa_categoria, attach_1, attach_2]:
        db_object.refresh_from_db()
    assert mesa_categoria.status == MesaCategoria.STATUS.total_sin_consolidar
    assert attach_1.status == Attachment.STATUS.sin_identificar
    assert attach_2.status == Attachment.STATUS.sin_identificar