Skip to content

Commit 8095199

Browse files
authored
Merge pull request EGCETSII#30 from joszamama/G2-feature/Imperiali
G2 feature/imperiali
2 parents 06f0dbb + 180bdd6 commit 8095199

File tree

4 files changed

+86
-7
lines changed

4 files changed

+86
-7
lines changed

decide/postproc/tests.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,3 +255,34 @@ def testDHont6(self): #Escaños elevados
255255

256256
values = response.json()
257257
self.assertEqual(values, expected_result)
258+
259+
def test_imperiali(self):
260+
data={
261+
'type':'IMPERIALI',
262+
'options':[
263+
{'option':'A', 'number':1, 'votes':391000},
264+
{'option':'B', 'number':2, 'votes':311000},
265+
{'option':'C', 'number':2, 'votes':184000},
266+
{'option':'D', 'number':4, 'votes':73000},
267+
{'option':'E', 'number':5, 'votes':27000},
268+
{'option':'F', 'number':6, 'votes':12000},
269+
{'option':'G', 'number':7, 'votes':2000},
270+
], 'escanyosTotales':21
271+
}
272+
273+
expected_result=[
274+
{'option':'A', 'number':1, 'votes':391000, 'postproc':0},
275+
{'option':'B', 'number':2, 'votes':311000, 'postproc':0},
276+
{'option':'C', 'number':2, 'votes':184000, 'postproc':0},
277+
{'option':'D', 'number':4, 'votes':73000, 'postproc':0},
278+
{'option':'E', 'number':5, 'votes':27000, 'postproc':0},
279+
{'option':'F', 'number':6, 'votes':12000, 'postproc':0},
280+
{'option':'G', 'number':7, 'votes':2000, 'postproc':0},
281+
]
282+
283+
response = self.client.post('/postproc/', data, format='json')
284+
self.assertEqual(response.status_code, 200)
285+
286+
values = response.json()
287+
self.assertEqual(values, expected_result)
288+

decide/postproc/views.py

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from rest_framework.views import APIView
33
from rest_framework.response import Response
44
import math
5-
import numpy as np
5+
#import numpy as np
66

77

88
class PostProcView(APIView):
@@ -122,6 +122,52 @@ def HuntingtonHill(self,options,numEscanyos):
122122
return Response(options)
123123

124124

125+
def imperiali(self, options,numEscanyos):
126+
votosTotales = 0
127+
128+
for i in options:
129+
votosTotales= votosTotales+ i['votes']
130+
131+
if votosTotales>0 and numEscanyos>0:
132+
133+
q=round(votosTotales/(numEscanyos+2),0)
134+
135+
escanyosAsigandos=0
136+
for i in options:
137+
votos= i['votes']
138+
escanyos=math.floor(votos/q)
139+
i.update({'postproc': escanyos})
140+
escanyosAsigandos=escanyosAsigandos+i['postproc']
141+
142+
#Mientras queden escaños libre
143+
144+
while(escanyosAsigandos<numEscanyos):
145+
#Se almacenan los votos residuo
146+
for i in options:
147+
i.update({'votosResiduos': i['votes']- (q*i['postproc'])})
148+
149+
150+
#se ordena según los votos residuos
151+
ordenadoMayorMenor= options.sort(key = lambda i :-i['votosResiduos'])
152+
153+
154+
#se añade un escaño más al que tenga mayor residuo
155+
votoMayorResiduo= ordenadoMayorMenor[0]
156+
votoMayorResiduo.update({'postproc': votoMayorResiduo['postproc']+1})
157+
158+
#se elimina la nueva clave para que no afecte a futuras iteraciones
159+
for i in options:
160+
i.pop('votosResiduos')
161+
162+
options.sort(key = lambda i :-i['postproc'])
163+
164+
return Response(options)
165+
166+
else:
167+
for i in options:
168+
i.update({'postproc': 0})
169+
return Response(options)
170+
125171
def dHont(self, options, numEscanyos):
126172

127173
#Añadimos un campo para el contador de escaños asignados a cada opción
@@ -176,7 +222,7 @@ def sortByVotes(e):
176222

177223
def post(self, request):
178224
"""
179-
* type: IDENTITY | HUNTINGTONHILL | DHONT | HAMILTON | BIPARTITANSHIP
225+
* type: IDENTITY | HUNTINGTONHILL | DHONT | HAMILTON | BIPARTITANSHIP| IMPERIALI
180226
* options: [
181227
{
182228
option: str,
@@ -194,7 +240,6 @@ def post(self, request):
194240
if t == 'IDENTITY':
195241
return self.identity(opts)
196242

197-
198243
elif t=='HUNTINGTONHILL':
199244
return self.HuntingtonHill(options=opts, numEscanyos=numEscanyos)
200245

@@ -206,5 +251,8 @@ def post(self, request):
206251

207252
elif t == 'BIPARTISHANSHIP':
208253
return self.bipartishanship(options=opts, numEscanyos=numEscanyos)
254+
255+
elif t=='IMPERIALI':
256+
return self.imperiali(opts,numEscanos)
209257

210-
return Response({})
258+
return Response({})

decide/voting/migrations/0004_voting_tipo.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class Migration(migrations.Migration):
1313
migrations.AddField(
1414
model_name='voting',
1515
name='tipo',
16-
field=models.CharField(choices=[('IDENTITY', 'IDENTITY'), ('HUNTINGTONHILL', 'HUNTINGTONHILL'), ('HAMILTON','HAMILTON'), ('BIPARTITANSHIP', 'BIPARTITANSHIP')], default='IDENTITY', max_length=20, verbose_name='Count method'),
16+
17+
field=models.CharField(choices=[('IDENTITY', 'IDENTITY'), ('HUNTINGTONHILL', 'HUNTINGTONHILL'), ('HAMILTON','HAMILTON'), ('BIPARTITANSHIP', 'BIPARTITANSHIP'),("IMPERIALI", "IMPERIALI")], default='IDENTITY', max_length=20, verbose_name='Count method'),
1718
),
1819
]

decide/voting/models.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ class Voting(models.Model):
3636
start_date = models.DateTimeField(blank=True, null=True)
3737
end_date = models.DateTimeField(blank=True, null=True)
3838

39-
40-
tipo_votacion = [("IDENTITY", "IDENTITY"),("HUNTINGTONHILL", "HUNTINGTONHILL"),("DHONT","DHONT"), ('HAMILTON', 'HAMILTON'),("BIPARTISHANSHIP", "BIPARTISHANSHIP")]
39+
tipo_votacion = [("IDENTITY", "IDENTITY"),("HUNTINGTONHILL", "HUNTINGTONHILL"),("DHONT","DHONT"), ('HAMILTON', 'HAMILTON'),("BIPARTISHANSHIP", "BIPARTISHANSHIP"),("IMPERIALI", "IMPERIALI")]
4140
tipo = models.CharField(choices=tipo_votacion, max_length=20, default="IDENTITY", verbose_name='Count method')
4241

4342

0 commit comments

Comments
 (0)