diff --git a/elections/bin/second_round.py b/elections/bin/second_round.py index 60a3b6c7..9a793e47 100644 --- a/elections/bin/second_round.py +++ b/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): @@ -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 + diff --git a/elections/fixtures/mini_2.yaml b/elections/fixtures/mini_2.yaml index 5aad5c8c..69e58a61 100644 --- a/elections/fixtures/mini_2.yaml +++ b/elections/fixtures/mini_2.yaml @@ -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 diff --git a/elections/tests/second_round_tests.py b/elections/tests/second_round_tests.py index 16783924..948d2481 100644 --- a/elections/tests/second_round_tests.py +++ b/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): @@ -18,7 +17,6 @@ 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() @@ -26,6 +24,23 @@ def test_create_a_second_round(self): 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)) +