예제 #1
0
def definir_prioridades_seccion_categoria(settings):
    asignar_prioridades_standard(settings)
    seccion_cuatro_prioridades = SeccionFactory(nombre="Cuatro prioridades")
    seccion_dos_cantidades = SeccionFactory(nombre="Dos cantidades")
    seccion_prioritaria = SeccionFactory(nombre="Prioritaria")
    seccion_standard = SeccionFactory(nombre="Standard")
    PrioridadSchedulingFactory(seccion=seccion_cuatro_prioridades, desde_proporcion=50, hasta_proporcion=100, prioridad=250)
    PrioridadSchedulingFactory(seccion=seccion_cuatro_prioridades, desde_proporcion=30, hasta_proporcion=50, prioridad=120)
    PrioridadSchedulingFactory(seccion=seccion_cuatro_prioridades, desde_proporcion=10, hasta_proporcion=30, prioridad=80)
    PrioridadSchedulingFactory(seccion=seccion_cuatro_prioridades, desde_proporcion=0,
                               hasta_proporcion=10, hasta_cantidad=12, prioridad=20)
    PrioridadSchedulingFactory(seccion=seccion_dos_cantidades, desde_proporcion=0,
                               hasta_proporcion=2, hasta_cantidad=7, prioridad=5)
    PrioridadSchedulingFactory(seccion=seccion_dos_cantidades, desde_proporcion=2,
                               hasta_proporcion=10, hasta_cantidad=20, prioridad=25)
    PrioridadSchedulingFactory(seccion=seccion_dos_cantidades, desde_proporcion=10, hasta_proporcion=100, prioridad=110)
    PrioridadSchedulingFactory(seccion=seccion_prioritaria, desde_proporcion=0,
                               hasta_proporcion=2, hasta_cantidad=7, prioridad=10)
    PrioridadSchedulingFactory(seccion=seccion_prioritaria, desde_proporcion=2, hasta_proporcion=10, prioridad=50)
    PrioridadSchedulingFactory(seccion=seccion_prioritaria, desde_proporcion=10, hasta_proporcion=100, prioridad=80)

    pv = CategoriaFactory(nombre="PV")
    gv = CategoriaFactory(nombre="GV")
    categoria_standard = CategoriaFactory(nombre="Standard")
    PrioridadSchedulingFactory(categoria=pv, desde_proporcion=0, hasta_proporcion=100, prioridad=5)
    PrioridadSchedulingFactory(categoria=gv, desde_proporcion=0, hasta_proporcion=100, prioridad=30)

    # tambien hay que definir una mesa en cada seccion, para lo cual tengo que definir
    # circuitos y lugares de votacion
    crear_mesa(seccion_cuatro_prioridades)
    crear_mesa(seccion_dos_cantidades)
    crear_mesa(seccion_prioritaria)
    crear_mesa(seccion_standard)
예제 #2
0
def test_autocomplete_seccion__dos_distritos(db, client):
    distrito1, distrito2 = DistritoFactory.create_batch(2)
    SeccionFactory(distrito=distrito1)
    SeccionFactory(distrito=distrito1)
    SeccionFactory(distrito=distrito1)
    SeccionFactory(distrito=distrito2)
    SeccionFactory(distrito=distrito2)

    query = "Sección"

    response = _hacer_call_seccion_autocomplete(client, q=query)
    response_data = json.loads(response.content)
    resultados = response_data["results"]

    # sin distrito, me trae todo
    assert len(resultados) == 5

    for resultado in resultados:
        assert query in resultado["text"]

    response = _hacer_call_seccion_autocomplete(client,
                                                q=query,
                                                distrito=distrito1)
    response_data = json.loads(response.content)
    resultados = response_data["results"]

    # trae solo las 3 del distrito 1
    assert len(resultados) == 3

    for resultado in resultados:
        assert query in resultado["text"]
예제 #3
0
def test_autocomplete_seccion__sin_seccion_especifica(db, client):
    SeccionFactory.create_batch(20)

    url = reverse("autocomplete-seccion-simple")

    response = client.get(url)
    response_data = json.loads(response.content)
    resultados = response_data["results"]

    # nos devuelve los 10 resultados
    assert len(resultados) == 10
    assert response_data["pagination"]["more"]
예제 #4
0
def test_configuracion_seccion_set_hasta_cantidad_no_prioridad(db, settings):
    asignar_prioridades_standard(settings)
    seccion = SeccionFactory(cantidad_minima_prioridad_hasta_2=9)
    prioridades = PrioridadScheduling.objects.filter(seccion=seccion)
    assert prioridades.count() == 1
    assert prioridades.filter(desde_proporcion=0).first().prioridad is None
    assert prioridades.filter(desde_proporcion=0).first().hasta_cantidad == 9
예제 #5
0
def test_quiero_ser_fiscal_form__limpieza_de_ceros_telefono_area(db):
    seccion = SeccionFactory()
    request_data = construir_request_data(seccion)
    request_data["telefono_area"] = "011"
    form = QuieroSerFiscalForm(data=request_data)
    assert form.is_valid()
    assert form.cleaned_data.get("telefono_area") == "11"
예제 #6
0
def test_quiero_ser_fiscal_form__codigo_referido_erroneo(db):
    seccion = SeccionFactory()
    request_data = construir_request_data(seccion)
    request_data["referido_por_codigo"] = "1233245"

    form = QuieroSerFiscalForm(data=request_data)
    assert not form.is_valid()
    assert form.errors['referido_por_codigo'][
        0] == QuieroSerFiscalForm.MENSAJE_ERROR_CODIGO_REF
예제 #7
0
def test_quiero_ser_fiscal_form__password_no_iguales(db):
    seccion = SeccionFactory()
    request_data = construir_request_data(seccion)
    request_data["password_confirmacion"] = "cualquier_otro_password"
    form = QuieroSerFiscalForm(data=request_data)
    assert not form.is_valid()

    assert form.errors['password_confirmacion'][
        0] == QuieroSerFiscalForm.MENSAJE_ERROR_PASSWORD_NO_IGUALES
예제 #8
0
def test_quiero_ser_fiscal_form__dni_repetido(db):
    seccion = SeccionFactory()
    request_data = construir_request_data(seccion)

    FiscalFactory(dni=request_data['dni'])

    form = QuieroSerFiscalForm(data=request_data)
    assert not form.is_valid()

    assert form.errors['dni'][
        0] == QuieroSerFiscalForm.MENSAJE_ERROR_DNI_REPETIDO
예제 #9
0
def test_quiero_ser_fiscal_form__email_repetido_en_la_base(db):
    fiscal = FiscalFactory()
    seccion = SeccionFactory()
    request_data = construir_request_data(seccion)
    request_data["email"] = fiscal.user.email
    request_data["email_confirmacion"] = fiscal.user.email

    form = QuieroSerFiscalForm(data=request_data)
    assert not form.is_valid()
    assert form.errors['email'][
        0] == QuieroSerFiscalForm.MENSAJE_ERROR_EMAIL_REPETIDO
예제 #10
0
 def __init__(self, distrito_pba):
     self.distrito_caba = DistritoFactory(numero='1')
     self.seccion_caba = SeccionFactory(distrito=self.distrito_caba)
     self.circuito_caba = CircuitoFactory(seccion=self.seccion_caba)
     self.lugar_votacion_caba = LugarVotacionFactory(circuito=self.circuito_caba)
     self.distrito_pba = DistritoFactory(numero=distrito_pba)
     self.seccion_pba = SeccionFactory(distrito=self.distrito_pba)
     self.circuito_pba = CircuitoFactory(seccion=self.seccion_pba)
     self.lugar_votacion_pba = LugarVotacionFactory(circuito=self.circuito_pba)
     self.distrito_cat = DistritoFactory(numero='3')
     self.seccion_cat = SeccionFactory(distrito=self.distrito_cat)
     self.circuito_cat = CircuitoFactory(seccion=self.seccion_cat)
     self.lugar_votacion_cat = LugarVotacionFactory(circuito=self.circuito_cat)
     self.fiscales = [nuevo_fiscal() for ix in range(10)]
     self.mesas_caba = [MesaFactory(lugar_votacion=self.lugar_votacion_caba, circuito=self.circuito_caba)
                 for ix in range(15)]
     self.mesas_cat = [MesaFactory(lugar_votacion=self.lugar_votacion_cat, 
                                   circuito=self.circuito_cat) for ix in range(15)]
     self.mesas_pba = [MesaFactory(lugar_votacion=self.lugar_votacion_pba,
                                   circuito=self.circuito_pba) for ix in range(20)]
예제 #11
0
def test_prioridades_mesacat_seccion_con_definicion_parcial_1(db, settings, proporcion, orden_de_llegada, prioridad):
    """
    Prioridades para una MesaCategoria de una seccion que define prioridades distintas de las standard sólo para un rango de proporciones.
    """
    definir_prioridades_seccion_categoria(settings)
    seccion_parcial = SeccionFactory(nombre="Definición parcial de prioridades no standard")
    PrioridadSchedulingFactory(seccion=seccion_parcial, desde_proporcion=2, hasta_proporcion=5, prioridad=4)

    mesa_categoria = MesaCategoriaFactory(
        categoria=categoria_standard(), mesa=crear_mesa(seccion_parcial))
    prioridades = mapa_prioridades_para_mesa_categoria(mesa_categoria)

    assert(prioridades.valor_para(proporcion, orden_de_llegada)) == prioridad
예제 #12
0
def carga_inicial(db):
    d1 = DistritoFactory(numero=1)
    s1 = SeccionFactory(numero=50, distrito=d1)
    circ = CircuitoFactory(numero='2', seccion=s1)

    # Creamos los partidos.
    fdt = OpcionFactory(codigo='FdT', nombre='FdT', partido__nombre='FpT')
    jpc = OpcionFactory(codigo='JpC', nombre='JpC', partido__nombre='JpC')
    c2019 = OpcionFactory(codigo='C2019',
                          nombre='C2019',
                          partido__nombre='C2019')

    categorias = []
    for categoria, prioritaria in CATEGORIAS:
        categoria_general = CategoriaGeneralFactory(nombre=categoria)
        # La categoría en sí tiene un nombre arbitrario para testear que
        # el matching sea en base a la categoría general.
        categoria_bd = CategoriaFactory(nombre=f'Categoría {categoria}',
                                        categoria_general=categoria_general)

        # La factory las crea con unas opciones que hacen ruido en estos tests.
        for nombre in ['opc1', 'opc2', 'opc3', 'opc4']:
            opcion = Opcion.objects.get(nombre=nombre)
            opcion.delete()

        categorias.append(categoria_bd)
        CategoriaOpcionFactory(categoria=categoria_bd,
                               prioritaria=prioritaria,
                               opcion=fdt)
        CategoriaOpcionFactory(categoria=categoria_bd,
                               prioritaria=prioritaria,
                               opcion=jpc)
        if categoria == 'Presidente y vice':
            CategoriaOpcionFactory(categoria=categoria_bd,
                                   prioritaria=False,
                                   opcion=c2019)
        if prioritaria:
            # Adecuamos las opciones prioritarias.
            hacer_prioritaria_en_cat(categoria_bd, Opcion.total_votos())
            hacer_prioritaria_en_cat(categoria_bd, Opcion.blancos())
            hacer_prioritaria_en_cat(categoria_bd, Opcion.nulos())
            hacer_prioritaria_en_cat(categoria_bd, Opcion.sobres())
            hacer_prioritaria_en_cat(categoria_bd, Opcion.recurridos())
            hacer_prioritaria_en_cat(categoria_bd, Opcion.id_impugnada())
            hacer_prioritaria_en_cat(categoria_bd, Opcion.comando_electoral())

    MesaFactory(numero='4012',
                lugar_votacion__circuito=circ,
                electores=100,
                circuito=circ,
                categorias=categorias)
예제 #13
0
def test_quiero_ser_fiscal_form__telefono_no_correcto_formato_nacional(db):
    seccion = SeccionFactory()
    request_data = construir_request_data(seccion)
    request_data["telefono_local"] = "1233245"
    request_data["telefono_area"] = "1234"

    form = QuieroSerFiscalForm(data=request_data)
    assert not form.is_valid()
    error_formato_nacional = "Revisá el código de área y teléfono.Entre ambos deben ser 10 números"
    assert form.errors['telefono_local'][0] == error_formato_nacional
    assert form.errors['telefono_local'][
        1] == QuieroSerFiscalForm.MENSAJE_ERROR_TELEFONO_INVALIDO
    assert form.errors['telefono_area'][0] == error_formato_nacional
    assert form.errors['telefono_area'][
        1] == QuieroSerFiscalForm.MENSAJE_ERROR_TELEFONO_INVALIDO
예제 #14
0
def test_autocomplete_seccion__camino_feliz(db, client):
    tam_batch = 10
    secciones = SeccionFactory.create_batch(tam_batch)
    distrito = secciones[0].distrito

    # pedimos el nombre completo de una seccion, el match debiese ser único
    # (a menos que pidamos "Seccion 7" y existan cosas como "Seccion 7x",  "Sección 7xx", etc)
    query = secciones[tam_batch - 1].nombre

    response = _hacer_call_seccion_autocomplete(client,
                                                q=query,
                                                distrito=distrito)
    response_data = json.loads(response.content)
    resultados = response_data["results"]

    assert len(resultados) == 1
    assert query in resultados[0]['text']
예제 #15
0
def test_quiero_validar__error_validacion(db, client):
    # hacemos un test que muestre que al validar nos quedamos en la misma página y no se crea un fiscal
    # la lógica de validación más fina del form la hacemos en el test_forms_fiscales
    url_quiero_validar = reverse('quiero-validar')
    response = client.get(url_quiero_validar)
    assert response.status_code == HTTPStatus.OK

    assert not Fiscal.objects.exists()

    seccion = SeccionFactory()
    request_data = construir_request_data(seccion)
    del (request_data["dni"])
    response = client.post(url_quiero_validar, request_data)

    assert response.status_code == HTTPStatus.OK
    assert response.context['form'].errors

    assert not Fiscal.objects.exists()
예제 #16
0
def test_quiero_validar__camino_feliz(db, client):
    url_quiero_validar = reverse('quiero-validar')
    response = client.get(url_quiero_validar)
    assert response.status_code == HTTPStatus.OK

    assert not Fiscal.objects.exists()

    seccion = SeccionFactory()
    request_data = construir_request_data(seccion)
    response = client.post(url_quiero_validar, request_data)

    assert Fiscal.objects.count() == 1
    _assert_fiscal_cargado_correctamente(seccion)

    fiscal = _get_fiscal()
    # se setea el fiscal
    assert client.session['fiscal_id'] == fiscal.id
    assert response.status_code == HTTPStatus.FOUND
    assert response.url == reverse('quiero-validar-gracias')
예제 #17
0
def test_procesar_csv_categorias_faltantes_en_archivo(db, usr_unidad_basica):
    CategoriaGeneralFactory()
    d1 = DistritoFactory(numero=1)
    s1 = SeccionFactory(numero=50, distrito=d1)
    c1 = CircuitoFactory(numero='2', seccion=s1)
    m = MesaFactory(numero='4012',
                    lugar_votacion__circuito=c1,
                    electores=100,
                    circuito=c1)
    o2 = OpcionFactory(codigo='Todes')
    o3 = OpcionFactory(codigo='Juntos')
    c = CategoriaFactory(opciones=[o2, o3], nombre='Otra categoria')
    MesaCategoriaFactory(mesa=m, categoria=c)

    cant_mesas_ok, cant_mesas_parcialmente_ok, errores = CSVImporter(
        PATH_ARCHIVOS_TEST + 'info_resultados_negativos.csv',
        usr_unidad_basica).procesar()
    assert cant_mesas_ok == 0
    assert cant_mesas_parcialmente_ok == 0
    assert 'Faltan datos en el archivo de la siguiente categoría' in errores
    assert Carga.objects.count() == 0
예제 #18
0
def test_subir_acta_preidentifica_seccion(admin_user, admin_client, datadir):
    """
    Prueba de subir una imagen y que quede la PreIdentificación de seccion
    """
    url = reverse('actas')
    seccion = SeccionFactory()
    admin_user.fiscal.seccion = seccion
    admin_user.fiscal.save()

    foto = (datadir / 'acta.jpeg')
    response = admin_client.post(url, {'foto': foto.open('rb')})

    assert response.status_code == status.HTTP_201_CREATED

    response = admin_client.post(url, {'foto': foto.open('rb')})

    foto_digest = response.data['foto_digest']

    attachment = Attachment.objects.get(foto_digest=foto_digest)

    assert attachment.pre_identificacion is not None
    assert attachment.pre_identificacion.seccion == admin_user.fiscal.seccion
    assert attachment.pre_identificacion.distrito == admin_user.fiscal.seccion.distrito
예제 #19
0
def test_identificacion_busqueda_de_mesa(db):
    c1 = CircuitoFactory()

    # se crea la mesa 123 para chequear que no debe devolver nunca esta mesa
    # si se buscan alternativas de la 23
    m0 = MesaFactory(numero='123', circuito=c1)
    m1 = MesaFactory(numero='23', circuito=c1)

    # el usuario ingresa 023, le devuelve la mesa 23
    form = IdentificacionForm({
        'mesa': '023',
        'circuito': c1.numero,
        'seccion': c1.seccion.numero,
        'distrito': c1.seccion.distrito.id,
    })
    assert form.is_valid()
    assert form.cleaned_data['mesa'] == m1

    # el usuario ingresa 23/8, como no existe le devuelve la mesa 2
    form = IdentificacionForm({
        'mesa': '23/8',
        'circuito': c1.numero,
        'seccion': c1.seccion.numero,
        'distrito': c1.seccion.distrito.id,
    })
    assert form.is_valid()
    assert form.cleaned_data['mesa'] == m1

    # el usuario ingresa 23 como no existe le devuelve la mesa 23
    form = IdentificacionForm({
        'mesa': '23',
        'circuito': c1.numero,
        'seccion': c1.seccion.numero,
        'distrito': c1.seccion.distrito.id,
    })
    assert form.is_valid()
    assert form.cleaned_data['mesa'] == m1

    # se crea la mesa 23/8
    m2 = MesaFactory(numero='23/8', circuito=c1)

    # el usuario ingresa 00023/8, existe 23/8 le devuelve la mesa 23/8
    form = IdentificacionForm({
        'mesa': '00023/8',
        'circuito': c1.numero,
        'seccion': c1.seccion.numero,
        'distrito': c1.seccion.distrito.id,
    })
    assert form.is_valid()
    assert form.cleaned_data['mesa'] == m2

    # el usuario ingresa 23/8, existe 23/8 le devuelve la mesa 23/8
    form = IdentificacionForm({
        'mesa': '23/8',
        'circuito': c1.numero,
        'seccion': c1.seccion.numero,
        'distrito': c1.seccion.distrito.id,
    })
    assert form.is_valid()
    assert form.cleaned_data['mesa'] == m2

    # el usuario ingresa 00023/4, como no existe le devuelve la mesa 23
    form = IdentificacionForm({
        'mesa': '00023/4',
        'circuito': c1.numero,
        'seccion': c1.seccion.numero,
        'distrito': c1.seccion.distrito.id,
    })
    assert form.is_valid()
    assert form.cleaned_data['mesa'] == m1

    # el usuario ingresa '  0023/8 ', le devuelve la mesa 23/8
    form = IdentificacionForm({
        'mesa': '  0023/8 ',
        'circuito': c1.numero,
        'seccion': c1.seccion.numero,
        'distrito': c1.seccion.distrito.id,
    })
    assert form.is_valid()
    assert form.cleaned_data['mesa'] == m2

    # el usuario ingresa 5, como no existe le devuelve error
    form = IdentificacionForm({
        'mesa': '5',
        'circuito': c1.numero,
        'seccion': c1.seccion.numero,
        'distrito': c1.seccion.distrito.id,
    })
    assert not form.is_valid()
    assert form.errors['mesa'] == ['Esta mesa no pertenece al circuito']

    # buscar mesa en distrito 2 sin pasar circuito en el form
    d2 = DistritoFactory(numero='2')
    s2 = SeccionFactory(numero='2', distrito=d2)
    c2 = CircuitoFactory(numero='2', seccion=s2)
    m3 = MesaFactory(numero='24/8', circuito=c2)
    form = IdentificacionForm({
        'mesa': '0024/8',
        'seccion': s2.numero,
        'distrito': d2.id,
        'circuito': ''
    })
    assert form.is_valid()
    assert form.cleaned_data['mesa'] == m3

    # buscar mesa en distrito 2 sin pasar sección en el form
    form = IdentificacionForm({
        'mesa': '0024/8',
        'seccion': '',
        'distrito': d2.id,
        'circuito': c2.numero
    })
    assert form.is_valid()
    assert form.cleaned_data['mesa'] == m3

    # buscar mesa en distrito 2 sin pasar cricuito ni sección en el form
    form = IdentificacionForm({
        'mesa': '0024/8',
        'seccion': '',
        'distrito': d2.id,
        'circuito': ''
    })
    assert not form.is_valid()
    assert form.errors['seccion'] == [
        'Sección y/o circuito deben estar completos'
    ]
    assert form.errors['circuito'] == [
        'Sección y/o circuito deben estar completos'
    ]
예제 #20
0
def test_quiero_ser_fiscal_form__data_ok(db):
    seccion = SeccionFactory()
    request_data = construir_request_data(seccion)
    form = QuieroSerFiscalForm(data=request_data)
    assert form.is_valid()
예제 #21
0
def crear_seccion(nombre):
    seccion = SeccionFactory(nombre=nombre)
    circuito = CircuitoFactory(seccion=seccion)
    lugar_votacion = LugarVotacionFactory(circuito=circuito)
    return [seccion, circuito, lugar_votacion]
예제 #22
0
def test_configuracion_seccion(db):
    seccion = SeccionFactory(prioridad_hasta_2=1, prioridad_2_a_10=12)
    seccion_2 = SeccionFactory()
    prioridades = PrioridadScheduling.objects.filter(seccion=seccion)
    assert prioridades.count() == 2
    assert prioridades.filter(desde_proporcion=0).first().prioridad == 1
    assert prioridades.filter(
        desde_proporcion=0).first().hasta_cantidad is None
    assert prioridades.filter(desde_proporcion=2).first().prioridad == 12
    assert prioridades.filter(
        desde_proporcion=2).first().hasta_proporcion == 10
    prioridades = PrioridadScheduling.objects.filter(seccion=seccion_2)
    assert prioridades.count() == 0

    seccion.prioridad_hasta_2 = None
    seccion.prioridad_2_a_10 = 15
    seccion.prioridad_10_a_100 = 45
    seccion.save(update_fields=[
        'prioridad_hasta_2', 'prioridad_2_a_10', 'prioridad_10_a_100'
    ])
    prioridades = PrioridadScheduling.objects.filter(seccion=seccion)
    assert prioridades.count() == 2
    assert prioridades.filter(desde_proporcion=2).first().prioridad == 15
    assert prioridades.filter(desde_proporcion=10).first().prioridad == 45
    assert prioridades.filter(
        desde_proporcion=10).first().hasta_proporcion == 100

    seccion.prioridad_hasta_2 = 3
    seccion.cantidad_minima_prioridad_hasta_2 = 7
    seccion.save(update_fields=[
        'prioridad_hasta_2', 'cantidad_minima_prioridad_hasta_2'
    ])
    prioridades = PrioridadScheduling.objects.filter(seccion=seccion)
    assert prioridades.count() == 3
    assert prioridades.filter(desde_proporcion=0).first().prioridad == 3
    assert prioridades.filter(desde_proporcion=0).first().hasta_cantidad == 7
    assert prioridades.filter(desde_proporcion=2).first().prioridad == 15
    assert prioridades.filter(desde_proporcion=2).first().categoria is None
    assert prioridades.filter(desde_proporcion=10).first().prioridad == 45
    assert prioridades.filter(
        desde_proporcion=10).first().hasta_proporcion == 100