Skip to content

Commit

Permalink
Merge pull request democraciaconcodigos#27 from OpenDataCordoba/fix_c…
Browse files Browse the repository at this point in the history
…hequear

Fix de chequear mesa
  • Loading branch information
mgaitan authored May 11, 2019
2 parents 59eb837 + d9c47fd commit 86f56c3
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 81 deletions.
71 changes: 21 additions & 50 deletions elecciones/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,8 @@ def lookups(self, request, model_admin):
def queryset(self, request, queryset):
value = self.value()
if value is not None:
mesas_anotadas = Mesa.objects.annotate(num_votos=Count('votomesareportado'))
if value == "no":
queryset = mesas_anotadas.filter(num_votos__lte=0)
else:
queryset = mesas_anotadas.filter(num_votos__gt=0)

isnull = value == 'no'
queryset = Mesa.objects.filter(votomesareportado__isnull=isnull)
return queryset


Expand All @@ -69,28 +65,15 @@ def mostrar_resultados_escuelas(modeladmin, request, queryset):
mostrar_resultados_escuelas.short_description = "Mostrar resultados de Escuelas seleccionadas"




def resultados_proyectados(modeladmin, request, queryset):

selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
name = modeladmin.model.__name__.lower()
url = reverse('proyecciones', args=(3,))
ids = "&".join(f'{name}={s}' for s in selected)
return HttpResponseRedirect(f'{url}?{ids}')

resultados_proyectados.short_description = "Ver Resultados Proyectados"


def resultados_reportados(modeladmin, request, queryset):

selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
name = modeladmin.model.__name__.lower()
ids = "&".join(f'{name}={s}' for s in selected)
res_url = reverse('resultados-eleccion')
res_url = reverse('resultados-eleccion', args=[1])
return HttpResponseRedirect(f'{res_url}?{ids}')

resultados_reportados.short_description = "Ver Resultados Reportados"
resultados_reportados.short_description = "Ver Resultados"


class LugarVotacionAdmin(AdminRowActionsMixin, LeafletGeoAdmin):
Expand Down Expand Up @@ -130,34 +113,29 @@ def mostrar_resultados_mesas(modeladmin, request, queryset):

class MesaAdmin(AdminRowActionsMixin, admin.ModelAdmin):
actions = [resultados_reportados]
list_display = ('numero', 'lugar_votacion', 'carga_confirmada')
list_filter = ('carga_confirmada', TieneResultados, 'lugar_votacion__circuito__seccion', 'lugar_votacion__circuito')
list_display = ('numero', 'lugar_votacion')
list_filter = (TieneResultados, 'lugar_votacion__circuito__seccion', 'lugar_votacion__circuito')
search_fields = (
'numero', 'lugar_votacion__nombre', 'lugar_votacion__direccion',
'lugar_votacion__ciudad', 'lugar_votacion__barrio',
)

def get_row_actions(self, obj):

if obj.eleccion.count() == 0:
url = 'NO HAY ELECCION DEFINIDA PARA ESTA MESA'
extra_label = 'No hay eleccion definida'
else:
url = reverse('resultados-eleccion', args=(obj.eleccion.first().id,)) + f'?mesa={obj.id}',
extra_label = ''

row_actions = [
row_actions = []
for e in obj.eleccion.all():
row_actions.append({
'label': f'Ver resultados {e}',
'url': reverse('resultados-eleccion', args=(e.id,)) + f'?mesa={obj.id}',
'enabled': True
})

row_actions.append(
{
'label': 'Escuela',
'url': reverse('admin:elecciones_lugarvotacion_changelist') + f'?id={obj.lugar_votacion.id}',
'enabled': True,
},
{
'label': f'Resultados Reportados {extra_label}',
'url': url,
'enabled': obj.tiene_reporte,
},
]
}
)
row_actions += super().get_row_actions(obj)
return row_actions

Expand All @@ -175,27 +153,20 @@ class CircuitoAdmin(admin.ModelAdmin):
search_fields = (
'nombre', 'numero',
)
actions = ['asignar', resultados_proyectados]

def asignar(self, request, queryset):
selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
ids = ",".join(selected)
url = reverse('asignar-referentes')
return HttpResponseRedirect(f'{url}?ids={ids}')

asignar.short_description = "Asignar referentes"

class SeccionAdmin(admin.ModelAdmin):
search_fields = (
'nombre', 'numero',
)

class VotoMesaReportadoAdmin(admin.ModelAdmin):
list_display = ['mesa', 'opcion', 'votos']
list_display = ['mesa', 'eleccion', 'opcion', 'votos', 'fiscal']
list_display_links = list_display

#list_filter = ('eleccion', TieneFiscal)
search_fields = ['mesa__numero', 'mesa__lugar_votacion__nombre', 'mesa__lugar_votacion__ciudad']
list_filter = ('eleccion', 'opcion')
search_fields = ['fiscal__nombre', 'mesa__numero', 'mesa__lugar_votacion__nombre']


class OpcionAdmin(admin.ModelAdmin):
list_display = ['nombre_corto', 'partido', 'nombre']
Expand Down
6 changes: 2 additions & 4 deletions elecciones/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,13 +206,11 @@ class Mesa(models.Model):
def eleccion_add(self, eleccion):
MesaEleccion.objects.get_or_create(mesa=self, eleccion=eleccion)


def siguiente_eleccion_sin_carga(self):
for eleccion in self.eleccion.order_by('id'):
if not VotoMesaReportado.objects.filter(mesa=self, eleccion=eleccion).exists():
return eleccion


@classmethod
def con_carga_pendiente(cls, wait=2):
"""
Expand Down Expand Up @@ -413,7 +411,7 @@ def actualizar_elecciones_confirmadas_para_mesa(sender, instance=None, created=F

@receiver(post_save, sender=Mesa)
def actualizar_electores_seccion(sender, instance=None, created=False, **kwargs):

if instance.lugar_votacion is not None and instance.lugar_votacion.circuito is not None:
seccion = instance.lugar_votacion.circuito.seccion
if seccion is not None:
Expand All @@ -423,6 +421,6 @@ def actualizar_electores_seccion(sender, instance=None, created=False, **kwargs)

if electores is None:
electores = 0

seccion.electores = electores
seccion.save(update_fields=['electores'])
5 changes: 2 additions & 3 deletions fiscales/templates/fiscales/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,12 @@

{% if request.user.is_superuser %}
<li>
<a href="{% url "resultados-eleccion" %}?proyectado=" class="collapsible-header" data-turbolinks="false">Proyección<i class="material-icons">pie_chart</i></a>
<a href="{% url "resultados-eleccion" 1 %}?proyectado=" target="_blank" class="collapsible-header" data-turbolinks="false">Proyección<i class="material-icons">pie_chart</i></a>
</li>
{% endif %}


<li>
<a href="https://docs.google.com/document/d/1NpIIwJIoqli--0ZihaEo4a126GMRVgHrWLJ-qVO9QYc/edit#heading=h.nobg9kju7uol" target="_blank" class="collapsible-header" data-turbolinks="false">Ayuda<i class="material-icons">help_outline</i></a>
<a href="https://docs.google.com/document/d/19qFhQ6_bd1mvfOLmwSzj07nDtc4Q0WKJo75dhMPIhVg/edit?usp=sharing" target="_blank" class="collapsible-header" data-turbolinks="false">Ayuda<i class="material-icons">help_outline</i></a>
</li>


Expand Down
19 changes: 14 additions & 5 deletions fiscales/templates/fiscales/chequeo_mesa.html
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@


{% block card-content %}
<div class="card-title"> Mesa {{ object.numero }}</div>
<div class="card-title"> Mesa {{ object.numero }}
<b style='background-color: {{ eleccion.back_color }}; color: {{ eleccion.color }}'>{{ eleccion }}</b>
</div>


<table class="highlight bordered {% if responsive %}responsive-table{% endif %}">
Expand All @@ -43,18 +45,25 @@
<div class="row">

<div class="col s12">
<div class="right-align">
<form>
<form>

<div class="center-align">
{% csrf_token %}
<button name="confirmar" class="btn waves-effect waves-light btn white-text" type="submit" tabindex="30">
Confirmar
</button>
</form>

<a href="{% url 'mesa-cargar-resultados' eleccion.id object.numero %}" class="btn waves-effect waves-light btn white-text">
Editar
</a>

<a href="{% url 'reportar-problema' object.numero %}" class="btn waves-effect waves-light btn white-text">
Reportar problema
Problema
</a>

</div>
</form>

</div>

</div>
Expand Down
49 changes: 44 additions & 5 deletions fiscales/tests/test_carga_datos.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@
MesaFactory,
OpcionFactory,
CircuitoFactory,
ProblemaFactory
)
from elecciones.models import Mesa, VotoMesaReportado
from elecciones.models import Mesa, VotoMesaReportado, MesaEleccion
from elecciones.tests.test_resultados import fiscal_client # noqa


Expand Down Expand Up @@ -36,7 +35,8 @@ def test_elegir_acta_mesas_redirige(db, fiscal_client):
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
# 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])
Expand Down Expand Up @@ -130,6 +130,45 @@ def test_carga_mesa_redirige_a_siguiente(db, fiscal_client):
assert response.url == reverse('elegir-acta-a-cargar')


def test_chequear_resultado(db, fiscal_client):
o = OpcionFactory(es_contable=True)
e1 = EleccionFactory(opciones=[o])
mesa = MesaFactory(eleccion=[e1])
me = MesaEleccion.objects.get(eleccion=e1, mesa=mesa)
assert me.confirmada is False



VotoMesaReportadoFactory(opcion=o, mesa=mesa, eleccion=e1, votos=1)
response = fiscal_client.get(reverse('chequear-resultado'))
assert response.status_code == 302
assert response.url == reverse('chequear-resultado-mesa', args=[e1.id, mesa.numero])
me.confirmada = True
me.save()
response = fiscal_client.get(reverse('chequear-resultado'))
assert response.status_code == 200
assert 'No hay actas cargadas para verificar por el momento' in response.content.decode('utf8')


def test_chequear_resultado_mesa(db, fiscal_client):
opcs = OpcionFactory.create_batch(3, es_contable=True)
e1 = EleccionFactory(opciones=opcs)
e2 = EleccionFactory(opciones=opcs)
mesa = MesaFactory(eleccion=[e1, e2])
me = MesaEleccion.objects.get(eleccion=e1, mesa=mesa)
assert me.confirmada is False
votos1 = VotoMesaReportadoFactory(opcion=opcs[0], mesa=mesa, eleccion=e1, votos=1)
votos2 = VotoMesaReportadoFactory(opcion=opcs[1], mesa=mesa, eleccion=e1, votos=2)
votos3 = VotoMesaReportadoFactory(opcion=opcs[2], mesa=mesa, eleccion=e1, votos=1)

# a otra eleccion
VotoMesaReportadoFactory(opcion=opcs[2], mesa=mesa, eleccion=e2, votos=1)

url = reverse('chequear-resultado-mesa', args=[e1.id, mesa.numero])
response = fiscal_client.get(url)

assert list(response.context['reportados']) == [votos1, votos2, votos3]

response = fiscal_client.post(url, {'confirmar': 'confirmar'})
assert response.status_code == 302
assert response.url == reverse('chequear-resultado')
me.refresh_from_db()
assert me.confirmada is True
23 changes: 15 additions & 8 deletions fiscales/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
from contacto.forms import MinimoContactoInlineFormset
from .models import Fiscal
from elecciones.models import (
Mesa, Eleccion, VotoMesaReportado, Circuito, LugarVotacion, Seccion
Mesa, Eleccion, MesaEleccion, VotoMesaReportado, Circuito, LugarVotacion, Seccion
)
from datetime import timedelta
from django.utils import timezone
Expand Down Expand Up @@ -351,31 +351,38 @@ def fix_opciones(formset):

@login_required
def chequear_resultado(request):
"""vista que elige una mesa con cargas a confirmar y redirige a la url correspondiente"""
mesa = Mesa.con_carga_a_confirmar().order_by('?').first()
if not mesa:
return render(request, 'fiscales/sin-actas-cargadas.html')
eleccion = mesa.siguiente_eleccion_sin_carga()
eleccion = mesa.siguiente_eleccion_a_confirmar()
return redirect('chequear-resultado-mesa', eleccion_id=eleccion.id, mesa_numero=mesa.numero)



@login_required
def chequear_resultado_mesa(request, eleccion_id, mesa_numero):
mesa = get_object_or_404(Mesa, eleccion__id=eleccion_id, numero=mesa_numero)
"""muestra la carga actual de la eleccion para la mesa"""

me = get_object_or_404(MesaEleccion, mesa__numero=mesa_numero, eleccion__id=eleccion_id)
mesa = me.mesa
eleccion = me.eleccion

data = request.POST if request.method == 'POST' else None
if data and 'confirmar' in data:

mesa.carga_confirmada = True
mesa.save(update_fields=['carga_confirmada'])
me.confirmada = True
me.save(update_fields=['confirmada'])
messages.success(request, f'Confirmaste la categoria {eleccion} para {mesa}')
return redirect('chequear-resultado')

reportados = mesa.votomesareportado_set.all().order_by('opcion__orden')
reportados = mesa.votomesareportado_set.filter(eleccion=eleccion).order_by('opcion__orden')
return render(
request,
"fiscales/chequeo_mesa.html",
{
'reportados': reportados,
'object': mesa
'object': mesa,
'eleccion': me.eleccion
}
)

Expand Down
20 changes: 15 additions & 5 deletions problemas/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@
from django_admin_row_actions import AdminRowActionsMixin


def marcar_resuelto(modeladmin, request, queryset):
queryset.update(estado=Problema.ESTADOS.resuelto)


marcar_resuelto.short_description = "Marcar como resueltos"



class ProblemaAdmin(AdminRowActionsMixin, admin.ModelAdmin):

def mesa_(o):
Expand All @@ -19,11 +27,13 @@ def mesa_(o):

def get_row_actions(self, obj):
row_actions = []
row_actions.append({
'label': 'Editar/Cargar Mesa',
'url': reverse('mesa-cargar-resultados', args=[1, obj.mesa.numero]),
'enabled': True
})

for e in obj.mesa.eleccion.all():
row_actions.append({
'label': f'Editar/Cargar {e}',
'url': reverse('mesa-cargar-resultados', args=[e.id, obj.mesa.numero]),
'enabled': True
})
row_actions += super().get_row_actions(obj)
return row_actions

Expand Down
3 changes: 3 additions & 0 deletions problemas/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
class Problema(TimeStampedModel):

PROBLEMAS = Choices(
'Error de carga en Gobernador',
'Error de carga en Legisladores',
'Error de carga en Intendente'
'Foto/s no válidas',
'Total incorrecto',
'Otro'
Expand Down
2 changes: 1 addition & 1 deletion problemas/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ def form_valid(self, form):

problema.mesa = context['mesa']
problema.save()
messages.success(self.request, 'El problema fue reportado. Gracias')
messages.success(self.request, 'El problema de esta carga fue reportado. Gracias')

return redirect("home")

0 comments on commit 86f56c3

Please sign in to comment.