示例#1
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)
示例#2
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])
示例#3
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
示例#4
0
def test_carga_sin_permiso(fiscal_client, admin_user, mocker):
    fiscal = admin_user.fiscal
    capture = mocker.patch('fiscales.views.capture_message')
    mc = MesaCategoriaFactory(coeficiente_para_orden_de_carga=1)
    response = fiscal_client.get(reverse('carga-total', args=[mc.id]))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse(
        'siguiente-accion')  # Manda a asignar una nueva.
    mc.asignar_a_fiscal()
    fiscal.asignar_mesa_categoria(mc)
    response = fiscal_client.get(reverse('carga-total', args=[mc.id]))
    assert response.status_code == HTTPStatus.OK
示例#5
0
def test_choice_home_validador_o_nada(db, admin_user, fiscal_client):
    # admin es validador
    response = fiscal_client.get('')
    assert response.status_code == 302
    assert response.url == reverse('siguiente-accion')

    # admin no es ni validador ni staff
    g = Group.objects.get(name='validadores')
    admin_user.groups.remove(g)
    admin_user.is_staff = False
    admin_user.save()
    response = fiscal_client.get('')
    assert response.status_code == 302
    assert response.url == reverse('bienvenido')
示例#6
0
def test_detalle_mesa_categoria(db, fiscal_client):
    opcs = OpcionFactory.create_batch(3)
    e1 = CategoriaFactory(opciones=opcs)
    e2 = CategoriaFactory(opciones=opcs)
    mesa = MesaFactory(categorias=[e1, e2])
    c1 = CargaFactory(mesa_categoria__mesa=mesa,
                      mesa_categoria__categoria=e1,
                      tipo=Carga.TIPOS.parcial,
                      origen=Carga.SOURCES.csv)
    mc = c1.mesa_categoria
    votos1 = VotoMesaReportadoFactory(
        opcion=opcs[0],
        votos=1,
        carga=c1,
    )
    votos2 = VotoMesaReportadoFactory(
        opcion=opcs[1],
        votos=2,
        carga=c1,
    )
    votos3 = VotoMesaReportadoFactory(
        opcion=opcs[2],
        votos=1,
        carga=c1,
    )

    # a otra carga
    VotoMesaReportadoFactory(opcion=opcs[2], votos=1)
    c1.actualizar_firma()
    consumir_novedades_y_actualizar_objetos([mc])
    assert mc.carga_testigo == c1
    url = reverse('detalle-mesa-categoria', args=[e1.id, mesa.numero])
    response = fiscal_client.get(url)

    assert list(response.context['reportados']) == [votos1, votos2, votos3]
示例#7
0
def test_preidentificacion_con_datos_de_fiscal(fiscal_client):
    mesa = MesaFactory()
    seccion = mesa.circuito.seccion

    form_response = fiscal_client.get(reverse('agregar-adjuntos'))
    fiscal = form_response.wsgi_request.user.fiscal
    fiscal.seccion = seccion
    fiscal.save()
    fiscal.refresh_from_db()
    distrito_preset = f'<input id="id_distrito" name="distrito" type="hidden" tabindex="-1" value="{seccion.distrito.id}" />'
    seccion_preset = f'<input id="id_seccion" name="seccion" type="hidden" tabindex="-1" value="{seccion.id}" />'

    response = fiscal_client.get(reverse('agregar-adjuntos'))
    content = response.content.decode('utf8')

    assert distrito_preset in content
    assert seccion_preset in content
示例#8
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')
示例#9
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')
示例#10
0
def test_carga_envia_datos_previos_al_formset(db, fiscal_client, admin_user,
                                              mocker):
    sentinela = mocker.MagicMock()
    mocker.patch('elecciones.models.MesaCategoria.datos_previos',
                 return_value=sentinela)
    mc = MesaCategoriaFactory()
    mc.asignar_a_fiscal()
    admin_user.fiscal.asignar_mesa_categoria(mc)
    response = fiscal_client.get(reverse('carga-total', args=[mc.id]))
    assert response.context['formset'].datos_previos is sentinela
示例#11
0
def test_mesa_de_circuito__url_mesa_con_resultados(carta_marina, fiscal_client):
    # resultados para mesa 1
    mesa1, *otras_mesas = carta_marina
    categoria = mesa1.categorias.get()  # sólo default
  
    # Esto no debería ser necesario si configuramos correctamente las opciones prioritarias en carta_marina
    CategoriaOpcion.objects.filter(categoria=categoria).update(prioritaria=True)

    # opciones a partido
    o1, o2, o3, o4 = categoria.opciones.filter(partido__isnull=False)
    # la opción 4 pasa a ser del mismo partido que la 1
    o4.partido = o1.partido
    o4.save()

    blanco = Opcion.blancos()
    total = Opcion.total_votos()

    mc1 = MesaCategoria.objects.get(mesa=mesa1, categoria=categoria)
    carga = CargaFactory(mesa_categoria=mc1, tipo=Carga.TIPOS.parcial)

    consumir_novedades_y_actualizar_objetos([mesa1])

    VotoMesaReportadoFactory(carga=carga, opcion=o1, votos=20)
    VotoMesaReportadoFactory(carga=carga, opcion=o2, votos=30)
    VotoMesaReportadoFactory(carga=carga, opcion=o3, votos=40)
    VotoMesaReportadoFactory(carga=carga, opcion=o4, votos=5)

    # votaron 95/100 personas
    VotoMesaReportadoFactory(carga=carga, opcion=blanco, votos=5)
    VotoMesaReportadoFactory(carga=carga, opcion=total, votos=100)

    carga.actualizar_firma()

    assert carga.es_testigo.exists()

    query_string_mesa_1 = (
        f'?mesa={mesa1.id}&circuito={mesa1.circuito.id}'
        '&tipoDeAgregacion=todas_las_cargas'
        f'&opcionaConsiderar={OPCIONES_A_CONSIDERAR.prioritarias}'
        )
    url_mesa_1 = reverse('mesas-circuito', args=[categoria.id]) + query_string_mesa_1
    response = fiscal_client.get(url_mesa_1)

    assert response.status_code == 200

    content = response.content.decode('utf8')
    assert response.context['mensaje_no_hay_info'] not in content

    resultados = response.context['resultados']
    assert len(resultados) == 6  # 4 opciones + blanco + total

    for voto_mesa_reportado in resultados:
        assert f'<th>{voto_mesa_reportado.opcion}</th>' in content
        assert f'<td>{voto_mesa_reportado.votos}</td>' in content
示例#12
0
def test_cargar_resultados_redirige_a_identificar(db, fiscal_client, status,
                                                  parcial):
    mesa = MesaFactory()
    a = AttachmentFactory(mesa=mesa)
    c1 = CategoriaFactory(requiere_cargas_parciales=True)
    m1c1 = MesaCategoriaFactory(categoria=c1,
                                coeficiente_para_orden_de_carga=0.1,
                                status=status,
                                mesa=mesa)
    response = fiscal_client.get(reverse('siguiente-accion'))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url.startswith('/clasificar-actas/')
示例#13
0
def test_formset_en_carga_total_reusa_parcial_confirmada(
        db, fiscal_client, admin_user, settings):
    # Solo una carga, para simplificar el setup
    settings.MIN_COINCIDENCIAS_CARGAS = 1

    c = CategoriaFactory(id=25000, opciones=[])

    # Notar que el orden no coincide con el id
    o1 = CategoriaOpcionFactory(categoria=c, orden=3, prioritaria=True).opcion
    o2 = CategoriaOpcionFactory(categoria=c, orden=1, prioritaria=False).opcion
    o3 = CategoriaOpcionFactory(categoria=c, orden=2, prioritaria=False).opcion
    o4 = CategoriaOpcionFactory(categoria=c, orden=4, prioritaria=True).opcion

    mc = MesaCategoriaFactory(categoria=c)
    mc.asignar_a_fiscal()
    admin_user.fiscal.asignar_mesa_categoria(mc)

    # Se carga parcialente, la opcion prioritaira "o"
    carga = CargaFactory(mesa_categoria=mc, tipo='parcial')
    VotoMesaReportadoFactory(carga=carga, opcion=o1, votos=10)
    VotoMesaReportadoFactory(carga=carga, opcion=o4, votos=3)

    # Consolidamos.
    consumir_novedades_carga()
    mc.refresh_from_db()
    assert mc.status == MesaCategoria.STATUS.parcial_consolidada_dc
    assert mc.carga_testigo == carga
    assert set(carga.opcion_votos()) == {(o1.id, 10), (o4.id, 3)}

    # Ahora pedimos la carga total
    totales = reverse('carga-total', args=[mc.id])
    response = fiscal_client.get(totales)

    # Tenemos las tres opciones en orden
    assert len(response.context['formset']) == 4 + len(
        Opcion.opciones_no_partidarias_obligatorias())
    assert response.context['formset'][0].initial['opcion'] == o2
    assert response.context['formset'][1].initial['opcion'] == o3
    assert response.context['formset'][2].initial['opcion'] == o1
    assert response.context['formset'][3].initial['opcion'] == o4

    # y los valores de los votos
    assert response.context['formset'][0].initial['votos'] is None
    assert response.context['formset'][1].initial['votos'] is None
    assert response.context['formset'][2].initial['votos'] == 10
    assert response.context['formset'][3].initial['votos'] == 3

    # el valor previo es readonly
    assert response.context['formset'][2].fields['votos'].widget.attrs[
        'readonly'] is True
    assert response.context['formset'][3].fields['votos'].widget.attrs[
        'readonly'] is True
示例#14
0
def test_cargar_resultados_redirige_a_parcial_si_es_necesario(
        db, fiscal_client, status, parcial):
    mesa = MesaFactory()
    a = AttachmentFactory(mesa=mesa)
    c1 = CategoriaFactory(requiere_cargas_parciales=True, sensible=True)
    m1c1 = MesaCategoriaFactory(categoria=c1,
                                coeficiente_para_orden_de_carga=0.1,
                                status=status,
                                mesa=mesa)
    response = fiscal_client.get(reverse('siguiente-accion'))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse(
        'carga-parcial' if parcial else 'carga-total', args=[m1c1.id])
示例#15
0
def test_resultados__generacion_url_ver_mesas_circuito(fiscal_client):
    categoria = CategoriaFactory(nombre='default')
    mesa1 = IdentificacionFactory(status='identificada', source=Identificacion.SOURCES.csv).mesa
    consumir_novedades_identificacion()

    url = reverse('resultados-categoria', args=[categoria.id])

    response = fiscal_client.get(url)
    
    assert response.status_code == 200

    texto_mesas_link = "Ver mesas del circuito"

    assert texto_mesas_link not in response.content.decode('utf8')
    
    response = fiscal_client.get(url, {"circuito": mesa1.circuito.id})
    
    # como ahora en la URL hay especificado un circuito, debería aparecer el link de "Ver las mesas..."
    assert response.status_code == 200
    assert texto_mesas_link in response.content.decode('utf8')
    url_mesa_distrito = reverse('mesas-circuito', args=[categoria.id])
    assert url_mesa_distrito in response.content.decode('utf8')
示例#16
0
def test_mesa_de_circuito__dispatch_primera_mesa_numero(carta_marina, fiscal_client):
    mesa1, mesa2, *otras_mesas = carta_marina
    categoria = mesa1.categorias.get()
    query_string_circuito = (
        f'?circuito={mesa1.circuito.id}'
        '&tipoDeAgregacion=todas_las_cargas&opcionaConsiderar=todas'
        )
    url_circuito = reverse('mesas-circuito', args=[categoria.id]) + query_string_circuito
    response = fiscal_client.get(url_circuito)

    assert response.status_code == 302
    assert url_circuito in response.url
    assert f"mesa={mesa1.id}" in response.url
示例#17
0
def test_mesa_de_circuito__url_mesa_sin_resultados(fiscal_client):
    categoria = CategoriaFactory(nombre='default')
    mesa1 = IdentificacionFactory(status='identificada', source=Identificacion.SOURCES.csv).mesa
    consumir_novedades_identificacion()
    query_string_mesa_1 = (
        f'?mesa={mesa1.id}&circuito={mesa1.circuito.id}'
        '&tipoDeAgregacion=todas_las_cargas&opcionaConsiderar=todas'
        )
    url_mesa_1 = reverse('mesas-circuito', args=[categoria.id]) + query_string_mesa_1
    response = fiscal_client.get(url_mesa_1)

    assert response.status_code == 200
    assert response.context['mensaje_no_hay_info'] in response.content.decode('utf-8')
    assert not response.context['resultados'].exists()
示例#18
0
def test_siguiente_manda_a_parcial_si_es_requerido_con_scheduler(
        db, fiscal_client, 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)
    scheduler()
    response = fiscal_client.get(reverse('siguiente-accion'))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse('carga-total', args=[mc1.id])

    # mc1 fue asignada, ahora da mc2

    response = fiscal_client.get(reverse('siguiente-accion'))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse('carga-parcial', args=[mc2.id])
示例#19
0
def test_cargar_resultados_redirige_a_parcial_si_es_necesario_con_scheduler(
        db, fiscal_client, status, parcial):
    mesa = MesaFactory()
    a = AttachmentFactory(mesa=mesa)
    c1 = CategoriaFactory(requiere_cargas_parciales=True, sensible=True)
    with override_config(ASIGNAR_MESA_EN_EL_MOMENTO_SI_NO_HAY_COLA=False):
        m1c1 = MesaCategoriaFactory(categoria=c1,
                                    coeficiente_para_orden_de_carga=0.1,
                                    status=status,
                                    mesa=mesa)
        scheduler()
        response = fiscal_client.get(reverse('siguiente-accion'))
        assert response.status_code == HTTPStatus.FOUND
        assert response.url == reverse(
            'carga-parcial' if parcial else 'carga-total', args=[m1c1.id])
示例#20
0
def test_formset_en_carga_total_muestra_todos(db, fiscal_client, admin_user):
    c = CategoriaFactory(id=100, opciones=[])
    o = CategoriaOpcionFactory(categoria=c, orden=3, prioritaria=True).opcion
    o2 = CategoriaOpcionFactory(categoria=c, orden=1, prioritaria=False).opcion
    mc = MesaCategoriaFactory(categoria=c)
    mc.asignar_a_fiscal()
    admin_user.fiscal.asignar_mesa_categoria(
        mc)  # Para que no lo mande a otra por falta de permisos.
    totales = reverse('carga-total', args=[mc.id])
    response = fiscal_client.get(totales)
    assert len(response.context['formset']) == 2 + len(
        Opcion.opciones_no_partidarias_obligatorias())
    assert response.context['formset'][0].fields['opcion'].choices == [(o2.id,
                                                                        o2)]
    assert response.context['formset'][1].fields['opcion'].choices == [(o.id,
                                                                        o)]
示例#21
0
def test_enviar_email_get(fiscal_client, admin_user):
    fiscales_ids = ','.join(str(f.id) for f in FiscalFactory.create_batch(2))
    url = f"{reverse('enviar-email')}?ids={fiscales_ids}"
    session = fiscal_client.session
    session.update({
        'enviar_email_asunto': 'foo',
        'enviar_email_template': '{{ foo }}',
    })
    session.save()

    response = fiscal_client.get(url)
    assert response.status_code == 200
    form = response.context['form']
    assert isinstance(form, EnviarEmailForm)
    assert 'Enviar Email a 2 fiscales' in response.content.decode('utf8')
    assert form.initial['asunto'] == 'foo'
    assert form.initial['template'] == '{{ foo }}'
示例#22
0
def test_formset_en_carga_parcial_solo_muestra_prioritarias(
        db, fiscal_client, admin_user):
    c = CategoriaFactory()
    o = CategoriaOpcionFactory(categoria=c, prioritaria=True).opcion

    # La opción 2 no se muestra
    CategoriaOpcionFactory(categoria=c, prioritaria=False).opcion
    mc = MesaCategoriaFactory(categoria=c)
    mc.asignar_a_fiscal()
    admin_user.fiscal.asignar_mesa_categoria(
        mc)  # Para que no lo mande a otra por falta de permisos.

    parciales = reverse('carga-parcial', args=[mc.id])
    response = fiscal_client.get(parciales)

    # Sólo hay un formulario (e de o)
    assert len(response.context['formset']) == 1
    assert response.context['formset'][0].fields['opcion'].choices == [(o.id,
                                                                        o)]
示例#23
0
def test_mesa_de_circuito__sidebar_mesas(carta_marina, fiscal_client):
    # el sidebar debería tener dos links a cada mesa si entro con el id del circuito
    mesa1, mesa2, *otras_mesas = carta_marina
    categoria = mesa1.categorias.get()

    query_string_circuito = (
        f'?circuito={mesa1.circuito.id}&mesa={mesa1.id}'
        '&tipoDeAgregacion=todas_las_cargas&opcionaConsiderar=todas'
        )
    url_circuito = reverse('mesas-circuito', args=[categoria.id]) + query_string_circuito
    response = fiscal_client.get(url_circuito)

    assert response.status_code == 200

    content = response.content.decode('utf8')
    # sabemos que no hay resultados para las mesas, pero los links deben estar en el costado
    assert response.context['mensaje_no_hay_info'] in content

    assert f'<li id="mesa-{mesa1.id}" class="active">' in content
    assert f'<li id="mesa-{mesa2.id}" >' in content
示例#24
0
def test_siguiente_accion_balancea_sin_scheduler(fiscal_client,
                                                 cant_attachments, cant_mcs,
                                                 coeficiente, expect):
    attachments = AttachmentFactory.create_batch(cant_attachments,
                                                 status='sin_identificar')
    mesas = MesaFactory.create_batch(cant_mcs)
    for i in range(cant_mcs):
        attachment_identificado = AttachmentFactory(mesa=mesas[i],
                                                    status='identificada')
        MesaCategoriaFactory(mesa=mesas[i],
                             coeficiente_para_orden_de_carga=1,
                             categoria__sensible=True)

    # Como la URL de identificación pasa un id no predictible
    # y no nos importa acá saber exactamente a que instancia se relaciona la acción
    # lo que evalúo es que redirija a una url que empiece así.
    beginning = reverse(expect, args=[0])[:10]

    with override_config(COEFICIENTE_IDENTIFICACION_VS_CARGA=coeficiente):
        response = fiscal_client.get(reverse('siguiente-accion'))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url.startswith(beginning)
示例#25
0
def test_mesa_de_circuito__navegacion_categorias(fiscal_client):
    categoria1 = CategoriaFactory(nombre='cat1')
    categoria2 = CategoriaFactory(nombre='cat2')

    mesa1 = MesaFactory(categorias=[categoria1, categoria2])

    query_string_mesa_1 = (
        f'?mesa={mesa1.id}&circuito={mesa1.circuito.id}'
        '&tipoDeAgregacion=todas_las_cargas&opcionaConsiderar=todas'
        )

    url_mesa_1 = reverse('mesas-circuito', args=[categoria1.id]) + query_string_mesa_1
    response = fiscal_client.get(url_mesa_1)

    assert response.status_code == 200
    content = html.unescape(response.content.decode('utf-8'))
    assert response.context['mensaje_no_hay_info'] in content

    link_categoria_1 = f"   href=\"/elecciones/resultados/mesas_circuito/{categoria1.id}{query_string_mesa_1}\""
    link_categoria_2 = f"   href=\"/elecciones/resultados/mesas_circuito/{categoria2.id}{query_string_mesa_1}\""

    assert link_categoria_1 in content
    assert link_categoria_2 in content
示例#26
0
def test_referidos_muestra_link_y_referidos(fiscal_client, admin_user):
    fiscal = admin_user.fiscal
    referidos_ids = {
        f.id
        for f in FiscalFactory.create_batch(2, referente=fiscal)
    }

    # otros fiscales no afectan
    FiscalFactory(referente=FiscalFactory())

    assert set(fiscal.referidos.values_list('id', flat=True)) == referidos_ids

    response = fiscal_client.get(reverse('referidos'))
    assert response.status_code == 200
    content = response.content.decode('utf8')
    form = response.context['form']

    assert isinstance(form, ReferidoForm)
    assert form.initial['url'] == fiscal.ultimo_codigo_url()
    assert set(response.context['referidos'].values_list(
        'id', flat=True)) == referidos_ids
    assert str(response.context['referidos'][0]) in content
    assert str(response.context['referidos'][1]) in content
示例#27
0
def test_formset_reusa_metadata(db, fiscal_client, admin_user):
    # Hay una categoria con una opcion metadata ya consolidada.
    o1 = OpcionFactory(tipo=Opcion.TIPOS.metadata)
    cat1 = CategoriaFactory(opciones=[o1])
    from elecciones.models import CategoriaOpcion
    # Me aseguro de que no estuviese asociada con otro orden.
    CategoriaOpcion.objects.filter(categoria=cat1, opcion=o1).delete()
    cat1op1 = CategoriaOpcionFactory(categoria=cat1, opcion=o1, orden=1)
    mc = MesaCategoriaFactory(categoria=cat1,
                              status=MesaCategoria.STATUS.total_consolidada_dc)
    carga = CargaFactory(mesa_categoria=mc, tipo='total')
    VotoMesaReportadoFactory(carga=carga, opcion=o1, votos=10)

    # Otra categoría incluye la misma metadata.
    o2 = OpcionFactory()
    cat2 = CategoriaFactory(opciones=[o1, o2])
    # Me aseguro de que no estuviesen asociadas con otro orden.
    CategoriaOpcion.objects.filter(categoria=cat2, opcion=o1).delete()
    CategoriaOpcion.objects.filter(categoria=cat2, opcion=o2).delete()
    cat2op1 = CategoriaOpcionFactory(categoria=cat2, opcion=o1, orden=1)
    cat2op1 = CategoriaOpcionFactory(categoria=cat2, opcion=o2, orden=2)
    mc2 = MesaCategoriaFactory(categoria=cat2, mesa=mc.mesa)

    mc2.asignar_a_fiscal()
    admin_user.fiscal.asignar_mesa_categoria(mc2)
    response = fiscal_client.get(reverse('carga-total', args=[mc2.id]))
    assert len(response.context['formset']) == 2 + len(
        Opcion.opciones_no_partidarias_obligatorias())
    assert response.context['formset'][0].initial['opcion'] == o1
    assert response.context['formset'][1].initial['opcion'] == o2

    # y los valores de los votos
    assert response.context['formset'][0].initial['votos'] == 10
    assert response.context['formset'][0].fields['votos'].widget.attrs[
        'readonly'] is True

    assert response.context['formset'][1].initial['votos'] is None
示例#28
0
def test_siguiente_accion_redirige_a_cargar_resultados_sin_scheduler(
        db, settings, client, setup_groups):
    c1 = CategoriaFactory()
    c2 = CategoriaFactory()
    m1 = MesaFactory(categorias=[c1])
    IdentificacionFactory(
        mesa=m1,
        status='identificada',
        source=Identificacion.SOURCES.csv,
    )
    m2 = MesaFactory(categorias=[c1, c2])
    assert MesaCategoria.objects.count() == 3
    IdentificacionFactory(
        mesa=m2,
        status='identificada',
        source=Identificacion.SOURCES.csv,
    )
    # Ambas consolidadas vía csv.
    consumir_novedades_identificacion()

    # Los fiscales que voy a usar.
    fiscales = FiscalFactory.create_batch(20)
    indice_fiscal = 0

    m1c1 = MesaCategoria.objects.get(mesa=m1, categoria=c1)
    for i in range(settings.MIN_COINCIDENCIAS_CARGAS):
        fiscal_client = fiscal_client_from_fiscal(client,
                                                  fiscales[indice_fiscal])
        indice_fiscal += 1
        response = fiscal_client.get(reverse('siguiente-accion'))
        assert response.status_code == HTTPStatus.FOUND
        assert response.url == reverse('carga-total', args=[m1c1.id])
        # Cerramos la sesión para que el client pueda reutilizarse sin que nos diga
        # que ya estamos logueados.
        fiscal_client.logout()

    # Como m1c1 ya fue pedida por suficientes fiscales,
    # se pasa a la siguiente mesacategoría.
    m2c1 = MesaCategoria.objects.get(mesa=m2, categoria=c1)
    for i in range(settings.MIN_COINCIDENCIAS_CARGAS):
        fiscal_client = fiscal_client_from_fiscal(client,
                                                  fiscales[indice_fiscal])
        indice_fiscal += 1
        response = fiscal_client.get(reverse('siguiente-accion'))
        assert response.status_code == HTTPStatus.FOUND
        assert response.url == reverse('carga-total', args=[m2c1.id])
        fiscal_client.logout()

    # Ahora la tercera.
    m2c2 = MesaCategoria.objects.get(mesa=m2, categoria=c2)
    for i in range(settings.MIN_COINCIDENCIAS_CARGAS):
        fiscal_client = fiscal_client_from_fiscal(client,
                                                  fiscales[indice_fiscal])
        indice_fiscal += 1
        response = fiscal_client.get(reverse('siguiente-accion'))
        assert response.status_code == HTTPStatus.FOUND
        assert response.url == reverse('carga-total', args=[m2c2.id])
        fiscal_client.logout()

    # Ya no hay actas nuevas, vuelta a empezar.
    fiscal_client = fiscal_client_from_fiscal(client, fiscales[indice_fiscal])
    indice_fiscal += 1
    response = fiscal_client.get(reverse('siguiente-accion'))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse('carga-total', args=[m1c1.id])
    fiscal_client.logout()

    # Se libera una.
    m2c2.desasignar_a_fiscal()
    fiscal_client = fiscal_client_from_fiscal(client, fiscales[indice_fiscal])
    indice_fiscal += 1
    response = fiscal_client.get(reverse('siguiente-accion'))
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse('carga-total', args=[m2c2.id])
示例#29
0
def test_siguiente_happy_path_parcial_y_total_con_modo_ub(
        db, fiscal_client, admin_user, settings):
    # Este test no es del todo realista porque se lo ejecuta con la cantidad de cargas/identificaciones
    # necesarias para consolidar en 1, pero al menos prueba que se siga el circuito con modo_ub=True.
    settings.MIN_COINCIDENCIAS_CARGAS = 1
    settings.MIN_COINCIDENCIAS_IDENTIFICACION = 1
    modo_ub_querry_string = '?modo_ub=True'
    mesa = MesaFactory()
    from adjuntos.models import PreIdentificacion
    from scheduling.models import ColaCargasPendientes
    p = PreIdentificacion(fiscal=admin_user.fiscal,
                          distrito=mesa.circuito.seccion.distrito)
    p.save()
    a = AttachmentFactory(status='sin_identificar', pre_identificacion=p)
    scheduler()
    assert ColaCargasPendientes.largo_cola() == 1
    response = fiscal_client.get(
        reverse('siguiente-accion') + modo_ub_querry_string)

    assert response.status_code == HTTPStatus.FOUND
    # Me manda a idenficarlas con modo_ub
    assert response.url == reverse('asignar-mesa',
                                   args=[a.id]) + modo_ub_querry_string

    assert ColaCargasPendientes.largo_cola() == 0

    # La identifico.
    a.mesa = mesa
    a.status = 'identificada'
    a.save()
    mc1 = MesaCategoriaFactory(categoria__requiere_cargas_parciales=True,
                               coeficiente_para_orden_de_carga=1,
                               mesa=mesa)
    scheduler()

    assert ColaCargasPendientes.largo_cola() == 1

    response = fiscal_client.get(
        reverse('siguiente-accion') + modo_ub_querry_string)
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse('carga-parcial',
                                   args=[mc1.id]) + modo_ub_querry_string

    carga = CargaFactory(mesa_categoria=mc1, tipo='parcial', origen='csv')
    consumir_novedades_carga()
    scheduler()
    mc1.refresh_from_db()
    assert mc1.status == MesaCategoria.STATUS.parcial_consolidada_dc  # Porque la cant de cargas está en 1.
    assert mc1.carga_testigo == carga
    mc1.desasignar_a_fiscal()
    response = fiscal_client.get(
        reverse('siguiente-accion') + modo_ub_querry_string)
    assert response.url == reverse('carga-total',
                                   args=[mc1.id]) + modo_ub_querry_string

    carga = CargaFactory(mesa_categoria=mc1, tipo='total', origen='csv')
    consumir_novedades_carga()
    scheduler()
    mc1.refresh_from_db()
    assert mc1.status == MesaCategoria.STATUS.total_consolidada_dc  # Porque la cant de cargas está en 1.
    assert mc1.carga_testigo == carga
    response = fiscal_client.get(
        reverse('siguiente-accion') + modo_ub_querry_string)
    # No hay actas para cargar, vuelta a empezar.
    assert response.status_code == HTTPStatus.OK
    assert 'No hay actas para cargar' in str(response.content)
示例#30
0
def test_elegir_acta_mesas_con_id_inexistente_de_mesa_desde_ub(fiscal_client):
    mesa_id_inexistente = 673162312
    url = reverse('cargar-desde-ub', kwargs={'mesa_id': mesa_id_inexistente})
    response = fiscal_client.get(url)
    assert response.status_code == HTTPStatus.NOT_FOUND