Skip to content

Commit

Permalink
Adding copy of positions of candidates
Browse files Browse the repository at this point in the history
  • Loading branch information
Felipe Álvarez committed Oct 9, 2015
1 parent 9bfc7e2 commit e0b41f5
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 9 deletions.
39 changes: 37 additions & 2 deletions elections/bin/second_round.py
@@ -1,4 +1,10 @@
import copy
from django.db.models import AutoField
def copy_model_instance(obj):
initial = dict([(f.name, getattr(obj, f.name))
for f in obj._meta.fields
if not isinstance(f, AutoField) and\
not f in obj._meta.parents.values()])
return obj.__class__(**initial)


class SecondRoundCreator(object):
Expand All @@ -14,9 +20,38 @@ def set_name(self, name):
self.second_round_name = name

def get_second_round(self):
second_round = copy.copy(self.election)
second_round = copy_model_instance(self.election)
second_round.id = None
if self.second_round_name is not None:
second_round.name = self.second_round_name
second_round.save()
for candidate in self.candidates:
second_round.candidates.add(candidate)
self.copy_categories(second_round)
return second_round

def copy_categories(self, second_round):
for category in self.election.categories.all():
category_copy = copy_model_instance(category)
category_copy.id = None
category_copy.save()
second_round.categories.add(category_copy)
for topic in category.topics.all():
_topic = copy_model_instance(topic)
_topic.id = None
_topic.category = category_copy
_topic.save()
for position in topic.positions.all():
_position = copy_model_instance(position)
_position.id = None
_position.topic = _topic
_position.save()
for taken_position in position.taken_positions.filter(person__in=self.candidates):
_taken_position = copy_model_instance(taken_position)
_taken_position.id = None
_taken_position.position = _position
_taken_position.topic = _topic
_taken_position.person = taken_position.person
_taken_position.save()
print _taken_position, _taken_position.topic.id, taken_position.person.id

18 changes: 18 additions & 0 deletions elections/fixtures/mini_2.yaml
Expand Up @@ -191,3 +191,21 @@
- fields: {topic: 6, position: 13, person: 3}
model: candidator.takenposition
pk: 9
- fields: {topic: 1, position: 1, person: 4}
model: candidator.takenposition
pk: 10
- fields: {topic: 1, position: 2, person: 5}
model: candidator.takenposition
pk: 11
- fields: {topic: 2, position: 4, person: 4}
model: candidator.takenposition
pk: 12
- fields: {topic: 2, position: 5, person: 5}
model: candidator.takenposition
pk: 13
- fields: {topic: 3, position: 6, person: 4}
model: candidator.takenposition
pk: 14
- fields: {topic: 3, position: 7, person: 5}
model: candidator.takenposition
pk: 15
29 changes: 22 additions & 7 deletions elections/tests/second_round_tests.py
@@ -1,9 +1,8 @@
# coding=utf-8
from elections.tests import VotaInteligenteTestCase as TestCase
from elections import get_writeit_instance
from django.test.utils import override_settings
from elections.models import Election, Candidate
from elections.models import Election
from elections.bin import SecondRoundCreator
from candidator.models import TakenPosition


class SecondRoundCreationTestCase(TestCase):
Expand All @@ -18,14 +17,30 @@ def test_create_a_second_round(self):
sc.pick_one(self.carlos)
self.assertEquals(sc.candidates[0], self.adela)
self.assertEquals(sc.candidates[1], self.carlos)

sc.set_name('second Round election')

second_round = sc.get_second_round()

self.assertIsInstance(second_round, Election)

self.assertEquals(second_round.name, 'second Round election')
# self.assertEquals(second_round.candidates.count(), 2)
# self.assertIn(self.adela, second_round.candidates.all())
# self.assertIn(self.carlos, second_round.candidates.all())
self.assertEquals(second_round.candidates.count(), 2)
self.assertIn(self.adela, second_round.candidates.all())
self.assertIn(self.carlos, second_round.candidates.all())

def test_copy_questions(self):
sc = SecondRoundCreator(self.tarapaca)
sc.pick_one(self.adela)
sc.pick_one(self.carlos)
second_round = sc.get_second_round()
self.assertEquals(second_round.categories.count(), self.tarapaca.categories.count())
for category in self.tarapaca.categories.all():
_category = second_round.categories.get(name=category.name)
self.assertEquals(_category.topics.count(), category.topics.count())
for topic in category.topics.all():
_topic = _category.topics.get(label=topic.label)
self.assertTrue(TakenPosition.objects.filter(topic=_topic, person=self.adela))
self.assertTrue(TakenPosition.objects.filter(topic=_topic, person=self.carlos))
for position in topic.positions.all():
self.assertTrue(_topic.positions.filter(label=position.label))

0 comments on commit e0b41f5

Please sign in to comment.