From 7ab2e49436a4b983442dfc0453f7c3894dcfac81 Mon Sep 17 00:00:00 2001 From: JoseFrancisco-uvus <61029409+JoseFrancisco-uvus@users.noreply.github.com> Date: Thu, 31 Dec 2020 17:16:12 +0100 Subject: [PATCH 01/51] Feature. Implementado def VotingTally MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se ha implementado def VotingTally que debería obtener los votos del tally y convertilo en un archivo descargable --- decide/voting/views.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/decide/voting/views.py b/decide/voting/views.py index 2f2227edc9..5699c249ea 100644 --- a/decide/voting/views.py +++ b/decide/voting/views.py @@ -10,6 +10,9 @@ from base.perms import UserIsStaff from base.models import Auth +import os, tempfile, zipfile +from django.http import HttpResponse +from wsgiref.util import FileWrapper class VotingView(generics.ListCreateAPIView): queryset = Voting.objects.all() @@ -99,3 +102,29 @@ def put(self, request, voting_id, *args, **kwars): msg = 'Action not found, try with start, stop or tally' st = status.HTTP_400_BAD_REQUEST return Response(msg, status=st) + +class VotingTally(): + def send_file(request): + + filename = Voting.tally_votes # Select your file here. + wrapper = FileWrapper(file(filename)) + response = HttpResponse(wrapper, content_type='text/plain') + response['Content-Length'] = os.path.getsize(filename) + return response + + + def send_zipfile(request): + + temp = tempfile.TemporaryFile() + archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED) + "Para descargar X veces el archivo" + for index in range(10): + filename = Voting.tally_votes# Select your files here. + archive.write(filename, 'tally%d.txt' % index) + archive.close() + wrapper = FileWrapper(temp) + response = HttpResponse(wrapper, content_type='application/zip') + response['Content-Disposition'] = 'attachment; filename=tally.zip' + response['Content-Length'] = temp.tell() + temp.seek(0) + return response From 79e5e66f972b19d27abfdb8ab37d03d954e1a3d8 Mon Sep 17 00:00:00 2001 From: josregmej Date: Fri, 8 Jan 2021 16:17:18 +0000 Subject: [PATCH 02/51] =?UTF-8?q?Feature:=20A=C3=B1adida=20la=20creaci?= =?UTF-8?q?=C3=B3n=20de=20fichero=20tally.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se ha implementado la funcionalidad que crea fichero tally.txt con el tally del voting seleccionado --- decide/tally.txt | 3 +++ decide/voting/models.py | 9 +++++++++ decide/voting/models.py.save | 0 3 files changed, 12 insertions(+) create mode 100644 decide/tally.txt create mode 100644 decide/voting/models.py.save diff --git a/decide/tally.txt b/decide/tally.txt new file mode 100644 index 0000000000..4e70dc04ca --- /dev/null +++ b/decide/tally.txt @@ -0,0 +1,3 @@ + + Hola Mundo +[{'option': 'Hola', 'number': 2, 'votes': 1}, {'option': 'Hey', 'number': 3, 'votes': 0}, {'option': 'Mundo', 'number': 4, 'votes': 0}] \ No newline at end of file diff --git a/decide/voting/models.py b/decide/voting/models.py index a10ab2bcb6..269c4f5338 100644 --- a/decide/voting/models.py +++ b/decide/voting/models.py @@ -6,6 +6,8 @@ from base import mods from base.models import Auth, Key +from django.http import HttpResponse +from reportlab.pdfgen import canvas class Question(models.Model): desc = models.TextField() @@ -97,6 +99,7 @@ def tally_votes(self, token=''): self.do_postproc() + def do_postproc(self): tally = self.tally options = self.question.options.all() @@ -119,5 +122,11 @@ def do_postproc(self): self.postproc = postp self.save() + archivo = open("tally.txt","w") + archivo.write("\n Hola Mundo\n") + archivo.write(str((opts))) + archivo.close() + + def __str__(self): return self.name diff --git a/decide/voting/models.py.save b/decide/voting/models.py.save new file mode 100644 index 0000000000..e69de29bb2 From 0c8f46dffe30c2d6feea108b2c73874f4782dadb Mon Sep 17 00:00:00 2001 From: josregmej Date: Fri, 8 Jan 2021 19:26:22 +0000 Subject: [PATCH 03/51] Fix: Corregido error provocado por un import Se ha corregido un error que era provocado por no tener instalado algo necesario para un import que no se usaba --- decide/tally.txt | 3 --- decide/voting/models.py | 5 ++--- decide/voting/models.py.save | 0 decide/voting/views.py | 28 ---------------------------- 4 files changed, 2 insertions(+), 34 deletions(-) delete mode 100644 decide/tally.txt delete mode 100644 decide/voting/models.py.save diff --git a/decide/tally.txt b/decide/tally.txt deleted file mode 100644 index 4e70dc04ca..0000000000 --- a/decide/tally.txt +++ /dev/null @@ -1,3 +0,0 @@ - - Hola Mundo -[{'option': 'Hola', 'number': 2, 'votes': 1}, {'option': 'Hey', 'number': 3, 'votes': 0}, {'option': 'Mundo', 'number': 4, 'votes': 0}] \ No newline at end of file diff --git a/decide/voting/models.py b/decide/voting/models.py index 269c4f5338..ecdf3604b8 100644 --- a/decide/voting/models.py +++ b/decide/voting/models.py @@ -7,7 +7,6 @@ from base.models import Auth, Key from django.http import HttpResponse -from reportlab.pdfgen import canvas class Question(models.Model): desc = models.TextField() @@ -99,7 +98,7 @@ def tally_votes(self, token=''): self.do_postproc() - + def do_postproc(self): tally = self.tally options = self.question.options.all() @@ -122,7 +121,7 @@ def do_postproc(self): self.postproc = postp self.save() - archivo = open("tally.txt","w") + archivo = open("tallydeVoting"+str((self.id))+".txt","w") archivo.write("\n Hola Mundo\n") archivo.write(str((opts))) archivo.close() diff --git a/decide/voting/models.py.save b/decide/voting/models.py.save deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/decide/voting/views.py b/decide/voting/views.py index 5699c249ea..5591e20a8f 100644 --- a/decide/voting/views.py +++ b/decide/voting/views.py @@ -10,10 +10,6 @@ from base.perms import UserIsStaff from base.models import Auth -import os, tempfile, zipfile -from django.http import HttpResponse -from wsgiref.util import FileWrapper - class VotingView(generics.ListCreateAPIView): queryset = Voting.objects.all() serializer_class = VotingSerializer @@ -103,28 +99,4 @@ def put(self, request, voting_id, *args, **kwars): st = status.HTTP_400_BAD_REQUEST return Response(msg, status=st) -class VotingTally(): - def send_file(request): - - filename = Voting.tally_votes # Select your file here. - wrapper = FileWrapper(file(filename)) - response = HttpResponse(wrapper, content_type='text/plain') - response['Content-Length'] = os.path.getsize(filename) - return response - - - def send_zipfile(request): - temp = tempfile.TemporaryFile() - archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED) - "Para descargar X veces el archivo" - for index in range(10): - filename = Voting.tally_votes# Select your files here. - archive.write(filename, 'tally%d.txt' % index) - archive.close() - wrapper = FileWrapper(temp) - response = HttpResponse(wrapper, content_type='application/zip') - response['Content-Disposition'] = 'attachment; filename=tally.zip' - response['Content-Length'] = temp.tell() - temp.seek(0) - return response From 704c8581b95f6cd93d6161bf41c0c4ea8c5101f6 Mon Sep 17 00:00:00 2001 From: josregmej Date: Sun, 10 Jan 2021 18:07:37 +0000 Subject: [PATCH 04/51] Feature: Implementada la creacion de un zip con el tally Se ha implementado que a partir del txt generado con el tally se cree un zip --- decide/voting/models.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/decide/voting/models.py b/decide/voting/models.py index ecdf3604b8..c81af3f66f 100644 --- a/decide/voting/models.py +++ b/decide/voting/models.py @@ -6,6 +6,8 @@ from base import mods from base.models import Auth, Key +import zipfile + from django.http import HttpResponse class Question(models.Model): @@ -126,6 +128,11 @@ def do_postproc(self): archivo.write(str((opts))) archivo.close() + zip_file=zipfile.ZipFile("tally.zip", mode="w") + zip_file.write("tallydeVoting"+str((self.id))+".txt") + zip_file.close() + + return zip_file def __str__(self): return self.name From c668bc9483e1ecb4aae3d0fbbb5fe81e055f5d49 Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Wed, 13 Jan 2021 14:49:20 +0100 Subject: [PATCH 05/51] =?UTF-8?q?Test:=20Creado=20test=20de=20votaci=C3=B3?= =?UTF-8?q?n=20con=20url=20ya=20existente;=20#19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decide/voting/tests.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/decide/voting/tests.py b/decide/voting/tests.py index 063c52e1cc..9277494312 100644 --- a/decide/voting/tests.py +++ b/decide/voting/tests.py @@ -31,13 +31,18 @@ def encrypt_msg(self, msg, v, bits=settings.KEYBITS): k.k = ElGamal.construct((p, g, y)) return k.encrypt(msg) - def create_voting(self): + def create_voting(self, url=None): q = Question(desc='test question') q.save() for i in range(5): opt = QuestionOption(question=q, option='option {}'.format(i+1)) opt.save() - v = Voting(name='test voting', question=q) + + if url: + v = Voting(name='test voting', question=q, url=url) + else: + v = Voting(name='test voting', question=q) + v.save() a, _ = Auth.objects.get_or_create(url=settings.BASEURL, @@ -208,3 +213,17 @@ def test_update_voting(self): response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') self.assertEqual(response.status_code, 400) self.assertEqual(response.json(), 'Voting already tallied') + + def test_create_voting_url_exists(self): + v = self.create_voting(url="_test_voting") + + data = { + 'name': 'Example', + 'desc': 'Description example', + 'url': '_test_voting', + 'question': 'Is this a question? ', + 'question_opt': ['Yes', 'No'] + } + + response = self.client.post('/voting/', data, format='json') + self.assertEqual(response.status_code, 401) From a8afa910b780a556329a790c7da41a35499acd0f Mon Sep 17 00:00:00 2001 From: josregmej Date: Wed, 13 Jan 2021 21:22:49 +0000 Subject: [PATCH 06/51] Test: Creado metodo y test para que haga una prueba con 10 voters Se ha implementado un nuevo metodo para tener 10 votantes y poder ejecutar pruebas con 10 votantes y no 100, ademas se ha creado una prueba usando este metodo --- decide/tally.zip | Bin 0 -> 392 bytes decide/tallydeVoting1.txt | 3 ++ decide/tallydeVoting2.txt | 3 ++ decide/tallydeVoting4.txt | 3 ++ decide/tallydeVoting6.txt | 3 ++ .../voting/migrations/0010_orderquestion.py | 21 ++++++++++ decide/voting/tests.py | 36 +++++++++++++++++- 7 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 decide/tally.zip create mode 100644 decide/tallydeVoting1.txt create mode 100644 decide/tallydeVoting2.txt create mode 100644 decide/tallydeVoting4.txt create mode 100644 decide/tallydeVoting6.txt create mode 100644 decide/voting/migrations/0010_orderquestion.py diff --git a/decide/tally.zip b/decide/tally.zip new file mode 100644 index 0000000000000000000000000000000000000000..6ec2b21db59a5cbdb191cad3343a2d666462d17e GIT binary patch literal 392 zcmWIWW@Zs#0D*O@bc0O2=ae!rGBAL!5KycnF(;=oB{eL+Br`AFM6aZxgiFCAKPOSa zw=^#$pDVgrJ-?tNGe1w=N&(7JFjUu3P|qvPO-d~SiW&hqW%(tk#Xz<}t&Rc~4Mr#$ zj0tNnM$uqGSc3_Q22;WsOi?tLp=gK=@MdHZVa6S1;J^eDTN*(u%n%IlW@Q7(Fan_i LkTwE_H3I_xkEUlp literal 0 HcmV?d00001 diff --git a/decide/tallydeVoting1.txt b/decide/tallydeVoting1.txt new file mode 100644 index 0000000000..308ec8d895 --- /dev/null +++ b/decide/tallydeVoting1.txt @@ -0,0 +1,3 @@ + + Hola Mundo +[{'option': 'option 1', 'number': 2, 'votes': 5}, {'option': 'option 2', 'number': 3, 'votes': 3}, {'option': 'option 3', 'number': 4, 'votes': 1}, {'option': 'option 4', 'number': 5, 'votes': 0}, {'option': 'option 5', 'number': 6, 'votes': 0}] \ No newline at end of file diff --git a/decide/tallydeVoting2.txt b/decide/tallydeVoting2.txt new file mode 100644 index 0000000000..292cb74aaa --- /dev/null +++ b/decide/tallydeVoting2.txt @@ -0,0 +1,3 @@ + + Hola Mundo +[{'option': 'option 1', 'number': 2, 'votes': 3}, {'option': 'option 2', 'number': 3, 'votes': 5}, {'option': 'option 3', 'number': 4, 'votes': 0}, {'option': 'option 4', 'number': 5, 'votes': 4}, {'option': 'option 5', 'number': 6, 'votes': 2}] \ No newline at end of file diff --git a/decide/tallydeVoting4.txt b/decide/tallydeVoting4.txt new file mode 100644 index 0000000000..c6a4c34757 --- /dev/null +++ b/decide/tallydeVoting4.txt @@ -0,0 +1,3 @@ + + Hola Mundo +[{'option': 'option 1', 'number': 2, 'votes': 0}, {'option': 'option 2', 'number': 3, 'votes': 0}, {'option': 'option 3', 'number': 4, 'votes': 0}, {'option': 'option 4', 'number': 5, 'votes': 0}, {'option': 'option 5', 'number': 6, 'votes': 0}] \ No newline at end of file diff --git a/decide/tallydeVoting6.txt b/decide/tallydeVoting6.txt new file mode 100644 index 0000000000..a3b72e7380 --- /dev/null +++ b/decide/tallydeVoting6.txt @@ -0,0 +1,3 @@ + + Hola Mundo +[{'option': 'Sí', 'number': 2, 'votes': 0}, {'option': 'No', 'number': 3, 'votes': 1}] \ No newline at end of file diff --git a/decide/voting/migrations/0010_orderquestion.py b/decide/voting/migrations/0010_orderquestion.py new file mode 100644 index 0000000000..4574e1478e --- /dev/null +++ b/decide/voting/migrations/0010_orderquestion.py @@ -0,0 +1,21 @@ +# Generated by Django 2.0 on 2021-01-12 15:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('voting', '0009_auto_20210106_2332'), + ] + + operations = [ + migrations.CreateModel( + name='OrderQuestion', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('desc', models.TextField()), + ('preference', models.CharField(blank=True, choices=[('B', '1'), ('M', '2'), ('A', '3')], max_length=1)), + ], + ), + ] diff --git a/decide/voting/tests.py b/decide/voting/tests.py index 063c52e1cc..3d682f1653 100644 --- a/decide/voting/tests.py +++ b/decide/voting/tests.py @@ -55,6 +55,14 @@ def create_voters(self, v): c = Census(voter_id=u.id, voting_id=v.id) c.save() + def create_tenvoters(self, v): + for i in range(10): + u, _ = User.objects.get_or_create(username='testvoter{}'.format(i)) + u.is_active = True + u.save() + c = Census(voter_id=u.id, voting_id=v.id) + c.save() + def get_or_create_user(self, pk): user, _ = User.objects.get_or_create(pk=pk) user.username = 'user{}'.format(pk) @@ -83,9 +91,9 @@ def store_votes(self, v): mods.post('store', json=data) return clear - def test_complete_voting(self): + def test_complete_voting_tenvoters(self): v = self.create_voting() - self.create_voters(v) + self.create_tenvoters(v) v.create_pubkey() v.start_date = timezone.now() @@ -106,6 +114,30 @@ def test_complete_voting(self): for q in v.postproc: self.assertEqual(tally.get(q["number"], 0), q["votes"]) + + def test_complete_voting_with_voters(self): + v = self.create_voting() + self.create_voters(v) + + v.create_pubkey() + v.start_date = timezone.now() + v.save() + + clear = self.store_votes(v) + + self.login() + v.tally_votes(self.token) + + tally = v.tally + tally.sort() + tally = {k: len(list(x)) for k, x in itertools.groupby(tally)} + + for q in v.question.options.all(): + self.assertEqual(tally.get(q.number, 0), clear.get(q.number, 0)) + + for q in v.postproc: + self.assertEqual(tally.get(q["number"], 0), q["votes"]) + def test_create_voting_from_api(self): data = {'name': 'Example'} response = self.client.post('/voting/', data, format='json') From 6b162c4c1dcd8d6636022b9791ffde367fb9056a Mon Sep 17 00:00:00 2001 From: jaime Date: Thu, 14 Jan 2021 17:56:50 +0100 Subject: [PATCH 07/51] Test: modificado .travis.yml Modificado fichero .travis.yml para lanzar las pruebas automaticamente desde travisCI --- .travis.yml | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index b72f88a6e0..b9e0f5bb33 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,22 @@ -dist: xenial - -services: - - postgresql -addons: - postgresql: "9.4" -before_script: - - psql -U postgres -c "create user decide password 'decide'" - - psql -U postgres -c "create database test_decide owner decide" - - psql -U postgres -c "ALTER USER decide CREATEDB" language: python python: - - "3.6" +- '3.6' +services: +- postgresql +env: +- DJANGO=2.0 DB=postgres +global: +- PGPORT=5432 +before_install: +- cd decide install: - - pip install -r requirements.txt - - pip install codacy-coverage +- pip install -r ../requirements.txt +before_script: +- cp local_settings.travis.py local_settings.py +- psql -c "create user decide with password 'decide'" +- psql -c "create database decide owner decide" +- python manage.py migrate script: - - cd decide - - coverage run --branch --source=. ./manage.py test --keepdb --with-xunit - - coverage xml - - python-codacy-coverage -r coverage.xml +- python manage.py test +addons: + postgresql: '9.6' From b525d5dc82883bf215ec65f801eca4545b71da90 Mon Sep 17 00:00:00 2001 From: jaime Date: Thu, 14 Jan 2021 18:07:39 +0100 Subject: [PATCH 08/51] fix: modificado .travis.yml para lanzar en ramas master y develop Modificado el fichero .travis.yml para lanzar los tests siempre que haya cambios en el repositorio en las ramas master o develop --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index b9e0f5bb33..8f919b5c0b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,10 @@ language: python python: - '3.6' +branches: + only: + - master + - develop services: - postgresql env: From ddaafd3808e8132a650556654a5d9fb493e8beab Mon Sep 17 00:00:00 2001 From: josregmej Date: Fri, 15 Jan 2021 21:05:33 +0000 Subject: [PATCH 09/51] Test: Se han creado 2 nuevas pruebas Se han implementado 2 nuevas pruebas create_voting_from_api_noadmin y create_voting_from_api_admin --- decide/tally.zip | Bin 392 -> 392 bytes decide/tallydeVoting1.txt | 2 +- decide/tallydeVoting2.txt | 2 +- decide/tallydeVoting5.txt | 3 +++ decide/voting/tests.py | 50 +++++++++++++++++++++++++++++++++----- 5 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 decide/tallydeVoting5.txt diff --git a/decide/tally.zip b/decide/tally.zip index 6ec2b21db59a5cbdb191cad3343a2d666462d17e..c4cea2e790598d6dc4a1352ca0cdd38601ee82a3 100644 GIT binary patch delta 41 tcmeBR?qKE(@MdNaVE}>375Wo-IgA1138l&8Fd& Date: Fri, 15 Jan 2021 22:31:23 +0100 Subject: [PATCH 10/51] Doc: modificacion del badge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modificación del badge para que apunte al estado del build en nuestra cuenta de TravisCI --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1539feb2cb..48af79309d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.com/wadobo/decide.svg?branch=master)](https://travis-ci.com/wadobo/decide) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/94a85eaa0e974c71af6899ea3b0d27e0)](https://www.codacy.com/app/Wadobo/decide?utm_source=github.com&utm_medium=referral&utm_content=wadobo/decide&utm_campaign=Badge_Grade) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/94a85eaa0e974c71af6899ea3b0d27e0)](https://www.codacy.com/app/Wadobo/decide?utm_source=github.com&utm_medium=referral&utm_content=wadobo/decide&utm_campaign=Badge_Coverage) +[![Build Status](https://travis-ci.com/RioTinto-Votaciones/decide.svg?branch=develop)](https://travis-ci.com/RioTinto-Votaciones/decide) Plataforma voto electrónico educativa pro ===================================== From 5eec377e0db024faa8532bd3c2c236d7195d57b7 Mon Sep 17 00:00:00 2001 From: jaime Date: Fri, 15 Jan 2021 22:41:38 +0100 Subject: [PATCH 11/51] =?UTF-8?q?Fix:=20a=C3=B1adido=20local=5Fsettings.tr?= =?UTF-8?q?avis.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añadido local_settings.travis.py para despliegue en TravisCI --- decide/local_settings.travis.py | 41 +++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 decide/local_settings.travis.py diff --git a/decide/local_settings.travis.py b/decide/local_settings.travis.py new file mode 100644 index 0000000000..d4162dae92 --- /dev/null +++ b/decide/local_settings.travis.py @@ -0,0 +1,41 @@ +ALLOWED_HOSTS = ["*"] + +# Modules in use, commented modules that you won't use +MODULES = [ + 'authentication', + 'base', + 'booth', + 'census', + 'mixnet', + 'postproc', + 'store', + 'visualizer', + 'voting', +] + +APIS = { + 'authentication': 'http://localhost:8000', + 'base': 'http://localhost:8000', + 'booth': 'http://localhost:8000', + 'census': 'http://localhost:8000', + 'mixnet': 'http://localhost:8000', + 'postproc': 'http://localhost:8000', + 'store': 'http://localhost:8000', + 'visualizer': 'http://localhost:8000', + 'voting': 'http://localhost:8000', +} + +BASEURL = 'http://localhost:8000' + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'postgres', + 'USER': 'postgres', + 'HOST': 'localhost', + 'PORT': '5432', + } +} + +# number of bits for the key, all auths should use the same number of bits +KEYBITS = 256 From 155831ec544f3c330067ae9019b1cdc750f302c1 Mon Sep 17 00:00:00 2001 From: jaime Date: Fri, 15 Jan 2021 22:55:00 +0100 Subject: [PATCH 12/51] Fix: arreglo para despliegue en travis.yml Arreglo para despliegue en travis.yml para crear la base de datos --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8f919b5c0b..ccdfdc5f12 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,8 +17,9 @@ install: - pip install -r ../requirements.txt before_script: - cp local_settings.travis.py local_settings.py -- psql -c "create user decide with password 'decide'" -- psql -c "create database decide owner decide" +- psql -U postgres -c "create user decide password 'decide'" +- psql -U postgres -c "create database test_decide owner decide" +- psql -U postgres -c "ALTER USER decide CREATEDB" - python manage.py migrate script: - python manage.py test From 59b9554aeb84b68de0a82c720f59756e9c59f79a Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Fri, 15 Jan 2021 22:55:07 +0100 Subject: [PATCH 13/51] =?UTF-8?q?Test=20Creado=20test=20de=20votaci=C3=B3n?= =?UTF-8?q?=20cuya=20URL=20tiene=20un=20espacio=20en=20blanco;=20#19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decide/voting/tests.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/decide/voting/tests.py b/decide/voting/tests.py index 9277494312..64c571f0fc 100644 --- a/decide/voting/tests.py +++ b/decide/voting/tests.py @@ -214,6 +214,10 @@ def test_update_voting(self): self.assertEqual(response.status_code, 400) self.assertEqual(response.json(), 'Voting already tallied') + def test_create_voting_url_whitespaces(self): + v = self.create_voting(url="_test voting") + self.assertTrue(Voting.objects.filter(url="_test+voting").exists()) + def test_create_voting_url_exists(self): v = self.create_voting(url="_test_voting") From d9a6bd443bd43032d692291da74cb0f5e0e2c0fa Mon Sep 17 00:00:00 2001 From: jaime Date: Fri, 15 Jan 2021 23:02:11 +0100 Subject: [PATCH 14/51] =?UTF-8?q?Fix:=20a=C3=B1adido=20makemigrations=20a?= =?UTF-8?q?=20travis.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añadido makemigrations a travis.yml para migrar todos los cambios del modelo --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index ccdfdc5f12..0b6fb4e691 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,7 @@ before_script: - psql -U postgres -c "create user decide password 'decide'" - psql -U postgres -c "create database test_decide owner decide" - psql -U postgres -c "ALTER USER decide CREATEDB" +- python manage.py makemigrations - python manage.py migrate script: - python manage.py test From 1793aa59a32127f485e55646bee2036ad4cbd5ea Mon Sep 17 00:00:00 2001 From: jaime Date: Fri, 15 Jan 2021 23:55:48 +0100 Subject: [PATCH 15/51] Fix: cambios en Dockerfile para apuntar a nuestro repo Cambios en Dockerfile para clonar nuestra repo cuando se haga el despliegue en docker --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 032eed28e2..781628331f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -10,7 +10,7 @@ RUN pip install ipython WORKDIR /app -RUN git clone https://github.com/wadobo/decide.git . +RUN git clone https://github.com/RioTinto-Votaciones/decide.git . RUN pip install -r requirements.txt WORKDIR /app/decide From 22d69ec6545494ee4444bf8e7289ff219a22ac00 Mon Sep 17 00:00:00 2001 From: jaime Date: Sat, 16 Jan 2021 00:10:39 +0100 Subject: [PATCH 16/51] Fix: cambios varios para despliegue en Heroku Cambios en runtime.txt, Procfile y settings.py para poder desplegar en heroku --- Procfile | 4 ++++ decide/decide/settings.py | 5 ++++- requirements.txt | 2 ++ runtime.txt | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Procfile create mode 100644 runtime.txt diff --git a/Procfile b/Procfile new file mode 100644 index 0000000000..818fef7fe3 --- /dev/null +++ b/Procfile @@ -0,0 +1,4 @@ +% prepara el repositorio para su despliegue. +release: sh -c 'cd decide && python manage.py migrate' +% especifica el comando para lanzar Decide +web: sh -c 'cd decide && gunicorn decide.wsgi --log-file -' diff --git a/decide/decide/settings.py b/decide/decide/settings.py index 1d22b67324..09d0a95532 100644 --- a/decide/decide/settings.py +++ b/decide/decide/settings.py @@ -70,7 +70,7 @@ 'voting', ] -BASEURL = 'http://localhost:8000' +BASEURL = 'https://votacionegc.herokuapp.com/' MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', @@ -180,3 +180,6 @@ INSTALLED_APPS = INSTALLED_APPS + MODULES + +import django_heroku +django_heroku.settings(locals()) diff --git a/requirements.txt b/requirements.txt index 73e5855f29..b2cb3d53cc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,3 +9,5 @@ django-rest-swagger==2.2.0 coverage==4.5.2 django-nose==1.4.6 jsonnet==0.12.1 +django-heroku +gunicorn diff --git a/runtime.txt b/runtime.txt new file mode 100644 index 0000000000..4255f73ae6 --- /dev/null +++ b/runtime.txt @@ -0,0 +1 @@ +python-3.7.1 From 273a782ce89a828c9cc2af4e6b11ac244c000fe8 Mon Sep 17 00:00:00 2001 From: jaime Date: Sat, 16 Jan 2021 10:01:10 +0100 Subject: [PATCH 17/51] Fix: modificado .gitignore para poder trackear local_settings.py Modificado .gitignore para poder trackear local_settings.py para poder desplegar en heroku --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b823e313b4..ed5f6e3706 100644 --- a/.gitignore +++ b/.gitignore @@ -52,7 +52,7 @@ coverage.xml # Django stuff: *.log -local_settings.py +#local_settings.py # Flask stuff: instance/ From dbd98baba41e1a5f8e1389af326f9a94a033d14b Mon Sep 17 00:00:00 2001 From: jaime Date: Sat, 16 Jan 2021 10:07:33 +0100 Subject: [PATCH 18/51] =?UTF-8?q?Fix:=20a=C3=B1adido=20local=5Fsettings.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añadido local_settings.py para despliegue en heroku --- decide/local_settings.py | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 decide/local_settings.py diff --git a/decide/local_settings.py b/decide/local_settings.py new file mode 100644 index 0000000000..66651f19b4 --- /dev/null +++ b/decide/local_settings.py @@ -0,0 +1,45 @@ +ALLOWED_HOSTS = ["*"] + +# Modules in use, commented modules that you won't use +MODULES = [ + 'authentication', + 'base', + 'booth', + 'census', + 'mixnet', + 'postproc', + 'store', + 'visualizer', + 'voting', +] + +APIS = { + 'authentication': 'http://localhost:8000', + 'base': 'http://localhost:8000', + 'booth': 'http://localhost:8000', + 'census': 'http://localhost:8000', + 'mixnet': 'http://localhost:8000', + 'postproc': 'http://localhost:8000', + 'store': 'http://localhost:8000', + 'visualizer': 'http://localhost:8000', + 'voting': 'http://localhost:8000', +} + +BASEURL = 'http://localhost:8000' + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'decide', + 'USER': 'decide', + 'PASSWORD': 'decide', + 'HOST': 'localhost', + 'PORT': '5432', + } +} + +# number of bits for the key, all auths should use the same number of bits +KEYBITS = 256 + +STATIC_URL = '/static/' + From dee40628b9cb1f853393bc7fe7e03070695c8da9 Mon Sep 17 00:00:00 2001 From: jaime Date: Sat, 16 Jan 2021 11:08:27 +0100 Subject: [PATCH 19/51] =?UTF-8?q?Fix:=20a=C3=B1adido=20ficheros=20para=20d?= =?UTF-8?q?espliegue=20en=20Heroku?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añadidos Procfile, runtime.txt, dependencias en requirements.txt e importado django-heroku en settings.py --- Procfile | 4 ++++ decide/decide/settings.py | 5 ++++- requirements.txt | 2 ++ runtime.txt | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Procfile create mode 100644 runtime.txt diff --git a/Procfile b/Procfile new file mode 100644 index 0000000000..818fef7fe3 --- /dev/null +++ b/Procfile @@ -0,0 +1,4 @@ +% prepara el repositorio para su despliegue. +release: sh -c 'cd decide && python manage.py migrate' +% especifica el comando para lanzar Decide +web: sh -c 'cd decide && gunicorn decide.wsgi --log-file -' diff --git a/decide/decide/settings.py b/decide/decide/settings.py index 1d22b67324..09d0a95532 100644 --- a/decide/decide/settings.py +++ b/decide/decide/settings.py @@ -70,7 +70,7 @@ 'voting', ] -BASEURL = 'http://localhost:8000' +BASEURL = 'https://votacionegc.herokuapp.com/' MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', @@ -180,3 +180,6 @@ INSTALLED_APPS = INSTALLED_APPS + MODULES + +import django_heroku +django_heroku.settings(locals()) diff --git a/requirements.txt b/requirements.txt index 73e5855f29..b2cb3d53cc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,3 +9,5 @@ django-rest-swagger==2.2.0 coverage==4.5.2 django-nose==1.4.6 jsonnet==0.12.1 +django-heroku +gunicorn diff --git a/runtime.txt b/runtime.txt new file mode 100644 index 0000000000..aefcfbece7 --- /dev/null +++ b/runtime.txt @@ -0,0 +1 @@ +python-3.7.5 From 5550dbb66a4dc63e9e2c60c66b0c9dc0c8ea08d1 Mon Sep 17 00:00:00 2001 From: jaime Date: Sat, 16 Jan 2021 11:12:09 +0100 Subject: [PATCH 20/51] Fix: cambiada version de python a 3.7.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cambiada la versión de python de 3.7.5 a 3.7.1 --- runtime.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime.txt b/runtime.txt index aefcfbece7..4255f73ae6 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.7.5 +python-3.7.1 From 7f33149f38d023bd0e3b85d529a9eadaf5f1d766 Mon Sep 17 00:00:00 2001 From: jaime Date: Sat, 16 Jan 2021 11:22:04 +0100 Subject: [PATCH 21/51] Fix: cambiada version de python a 3.7.9 en runtime.txt Cambiada la version de python a 3.7.9 en runtime.txt, la version anterior daba problemas para pushear a heroku --- runtime.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime.txt b/runtime.txt index 4255f73ae6..795ee725a0 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.7.1 +python-3.7.9 From 312216ab1ec0cbe66a06155fc19d43c7738fa584 Mon Sep 17 00:00:00 2001 From: jaime Date: Sat, 16 Jan 2021 11:58:44 +0100 Subject: [PATCH 22/51] =?UTF-8?q?Fix:=20a=C3=B1adido=20array=20APIS=20vaci?= =?UTF-8?q?o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añadido array APIS vacio para despligue en Heroku --- decide/decide/settings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/decide/decide/settings.py b/decide/decide/settings.py index 09d0a95532..8ea9e51189 100644 --- a/decide/decide/settings.py +++ b/decide/decide/settings.py @@ -161,6 +161,8 @@ # number of bits for the key, all auths should use the same number of bits KEYBITS = 256 +APIS = {} + # Versioning ALLOWED_VERSIONS = ['v1', 'v2'] DEFAULT_VERSION = 'v1' From 0fa9bd5e98bc6f8ce563fd23a9ab25652082a029 Mon Sep 17 00:00:00 2001 From: jaime Date: Sat, 16 Jan 2021 12:08:58 +0100 Subject: [PATCH 23/51] Fix: runtime cambiado a version python 3.7.5 Runtime cambiado version python de 3.7.9 a 3.7.5 --- runtime.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime.txt b/runtime.txt index 795ee725a0..aefcfbece7 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.7.9 +python-3.7.5 From fb52ca2617e857f387bc3f78b74d3288b58e5a14 Mon Sep 17 00:00:00 2001 From: josregmej Date: Sun, 17 Jan 2021 15:01:41 +0000 Subject: [PATCH 24/51] Test: Se han creado varias pruebas nuevas Se han implementado pruebas de creacion voting sin url, sin url y pregunta, sin url y sin opciones --- decide/tally.zip | Bin 392 -> 392 bytes decide/tallydeVoting1.txt | 2 +- decide/tallydeVoting2.txt | 2 +- decide/tallydeVoting6.txt | 2 +- decide/tallydeVoting7.txt | 3 + decide/tallydeVoting8.txt | 3 + decide/voting/tests.py | 37 +++++ decide/voting/tests.py.save | 263 ++++++++++++++++++++++++++++++++++++ 8 files changed, 309 insertions(+), 3 deletions(-) create mode 100644 decide/tallydeVoting7.txt create mode 100644 decide/tallydeVoting8.txt create mode 100644 decide/voting/tests.py.save diff --git a/decide/tally.zip b/decide/tally.zip index c4cea2e790598d6dc4a1352ca0cdd38601ee82a3..8acf3c234a3bacaa439ab0c42d7f913af55cafc5 100644 GIT binary patch delta 41 scmeBR?qKE(@MdNaVE_T?3d4!Ka*P%mb%Yq1ft<;Xj5>@Klk*s*0G22Rpa1{> delta 41 tcmeBR?qKE(@MdNaVE}>375Wo-IgA1138l&8Fd& Date: Sun, 17 Jan 2021 22:20:50 +0100 Subject: [PATCH 25/51] =?UTF-8?q?Fix:=20correci=C3=B3n=20en=20order=20ques?= =?UTF-8?q?tion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0008_merge_20210106_2220.py | 14 +++++++++++ .../voting/migrations/0009_orderquestion.py | 21 +++++++++++++++++ .../migrations/0010_merge_20210117_2029.py | 14 +++++++++++ .../migrations/0011_voting_orderquestion.py | 19 +++++++++++++++ .../migrations/0012_auto_20210117_2115.py | 19 +++++++++++++++ .../migrations/0013_auto_20210117_2117.py | 23 +++++++++++++++++++ decide/voting/models.py | 3 +++ 7 files changed, 113 insertions(+) create mode 100644 decide/voting/migrations/0008_merge_20210106_2220.py create mode 100644 decide/voting/migrations/0009_orderquestion.py create mode 100644 decide/voting/migrations/0010_merge_20210117_2029.py create mode 100644 decide/voting/migrations/0011_voting_orderquestion.py create mode 100644 decide/voting/migrations/0012_auto_20210117_2115.py create mode 100644 decide/voting/migrations/0013_auto_20210117_2117.py diff --git a/decide/voting/migrations/0008_merge_20210106_2220.py b/decide/voting/migrations/0008_merge_20210106_2220.py new file mode 100644 index 0000000000..b4a91551e7 --- /dev/null +++ b/decide/voting/migrations/0008_merge_20210106_2220.py @@ -0,0 +1,14 @@ +# Generated by Django 2.0 on 2021-01-06 22:20 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('voting', '0005_auto_20210101_1813'), + ('voting', '0007_auto_20210106_1529'), + ] + + operations = [ + ] diff --git a/decide/voting/migrations/0009_orderquestion.py b/decide/voting/migrations/0009_orderquestion.py new file mode 100644 index 0000000000..d6b9fd9e2f --- /dev/null +++ b/decide/voting/migrations/0009_orderquestion.py @@ -0,0 +1,21 @@ +# Generated by Django 2.0 on 2021-01-06 23:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('voting', '0008_merge_20210106_2220'), + ] + + operations = [ + migrations.CreateModel( + name='OrderQuestion', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('desc', models.TextField()), + ('preference', models.CharField(blank=True, choices=[('B', '1'), ('M', '2'), ('A', '3')], max_length=1)), + ], + ), + ] diff --git a/decide/voting/migrations/0010_merge_20210117_2029.py b/decide/voting/migrations/0010_merge_20210117_2029.py new file mode 100644 index 0000000000..bb4d6e8e72 --- /dev/null +++ b/decide/voting/migrations/0010_merge_20210117_2029.py @@ -0,0 +1,14 @@ +# Generated by Django 2.0 on 2021-01-17 20:29 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('voting', '0009_orderquestion'), + ('voting', '0009_auto_20210106_2332'), + ] + + operations = [ + ] diff --git a/decide/voting/migrations/0011_voting_orderquestion.py b/decide/voting/migrations/0011_voting_orderquestion.py new file mode 100644 index 0000000000..6586dc903a --- /dev/null +++ b/decide/voting/migrations/0011_voting_orderquestion.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0 on 2021-01-17 21:07 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('voting', '0010_merge_20210117_2029'), + ] + + operations = [ + migrations.AddField( + model_name='voting', + name='orderquestion', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.OrderQuestion'), + ), + ] diff --git a/decide/voting/migrations/0012_auto_20210117_2115.py b/decide/voting/migrations/0012_auto_20210117_2115.py new file mode 100644 index 0000000000..4b26f9f94f --- /dev/null +++ b/decide/voting/migrations/0012_auto_20210117_2115.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0 on 2021-01-17 21:15 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('voting', '0011_voting_orderquestion'), + ] + + operations = [ + migrations.AlterField( + model_name='voting', + name='orderquestion', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.OrderQuestion', verbose_name='Order question'), + ), + ] diff --git a/decide/voting/migrations/0013_auto_20210117_2117.py b/decide/voting/migrations/0013_auto_20210117_2117.py new file mode 100644 index 0000000000..5c2d74a59f --- /dev/null +++ b/decide/voting/migrations/0013_auto_20210117_2117.py @@ -0,0 +1,23 @@ +# Generated by Django 2.0 on 2021-01-17 21:17 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('voting', '0012_auto_20210117_2115'), + ] + + operations = [ + migrations.RemoveField( + model_name='voting', + name='orderquestion', + ), + migrations.AddField( + model_name='voting', + name='order_question', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.OrderQuestion'), + ), + ] diff --git a/decide/voting/models.py b/decide/voting/models.py index 3204b3e894..9b9c73f8fa 100644 --- a/decide/voting/models.py +++ b/decide/voting/models.py @@ -80,6 +80,9 @@ class Voting(models.Model): question = models.ForeignKey(Question, related_name='voting', on_delete=models.CASCADE) political_party = models.ForeignKey(PoliticalParty, related_name='voting', on_delete=models.CASCADE, null=True) # ,blank=True + + order_question = models.ForeignKey(OrderQuestion, related_name='voting', on_delete=models.CASCADE, null= True) + start_date = models.DateTimeField(blank=True, null=True) end_date = models.DateTimeField(blank=True, null=True) From adddb92e018216204c47d70073d31ff32bfc0890 Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Sun, 17 Jan 2021 22:52:24 +0100 Subject: [PATCH 26/51] Fix: Borrados archivos tally autogenerados al hacer recuentos --- decide/tally.zip | Bin 392 -> 0 bytes decide/tallydeVoting1.txt | 3 --- decide/tallydeVoting2.txt | 3 --- decide/tallydeVoting4.txt | 3 --- decide/tallydeVoting5.txt | 3 --- decide/tallydeVoting6.txt | 3 --- decide/tallydeVoting7.txt | 3 --- decide/tallydeVoting8.txt | 3 --- 8 files changed, 21 deletions(-) delete mode 100644 decide/tally.zip delete mode 100644 decide/tallydeVoting1.txt delete mode 100644 decide/tallydeVoting2.txt delete mode 100644 decide/tallydeVoting4.txt delete mode 100644 decide/tallydeVoting5.txt delete mode 100644 decide/tallydeVoting6.txt delete mode 100644 decide/tallydeVoting7.txt delete mode 100644 decide/tallydeVoting8.txt diff --git a/decide/tally.zip b/decide/tally.zip deleted file mode 100644 index 8acf3c234a3bacaa439ab0c42d7f913af55cafc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 392 zcmWIWW@Zs#00HR=!yr@dIi*aD3=AMF1QaVt%*m-tNe#;{$;?Z)&?~7Z;ZpF(&q-A9 zEzL{G=ZdaY&o3y+%+FJ|Qh>4)4ApfM)bmPnlTwR-qDDYYS$;`sF_3LgtD}HLgAs}b zW5ODYQ8btk)?k97!IZEDQxpwmC>mk|ycwB9m~n?0I52_4mPQZ@GXw*?S=m4`j6moB Lq>X@K&A Date: Sun, 17 Jan 2021 22:53:15 +0100 Subject: [PATCH 27/51] =?UTF-8?q?Fix:=20arreglo=20mala=20identaci=C3=B3n?= =?UTF-8?q?=20en=20el=20local=5Fsettings.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decide/local_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decide/local_settings.py b/decide/local_settings.py index 66651f19b4..8c07e7684d 100644 --- a/decide/local_settings.py +++ b/decide/local_settings.py @@ -32,7 +32,7 @@ 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'decide', 'USER': 'decide', - 'PASSWORD': 'decide', + 'PASSWORD': 'decide', 'HOST': 'localhost', 'PORT': '5432', } From 3a2c7610e1f72cb1680332ee62bddae9622f4363 Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Sun, 17 Jan 2021 22:53:38 +0100 Subject: [PATCH 28/51] Fix: arreglado error con las migraciones de django --- decide/base/migrations/0001_initial.py | 11 ++--- .../migrations/0002_auto_20180921_1056.py | 33 -------------- .../migrations/0003_auto_20180921_1119.py | 34 -------------- decide/census/migrations/0001_initial.py | 2 +- decide/mixnet/migrations/0001_initial.py | 31 +++---------- .../migrations/0002_auto_20180216_1617.py | 18 -------- .../migrations/0003_mixnet_auth_position.py | 18 -------- .../migrations/0004_auto_20180605_0842.py | 36 --------------- decide/store/migrations/0001_initial.py | 8 ++-- decide/store/migrations/0002_vote_voted.py | 18 -------- .../migrations/0003_auto_20180921_1522.py | 24 ---------- decide/voting/migrations/0001_initial.py | 45 +++++++++++++++++-- .../migrations/0002_auto_20180302_1100.py | 24 ---------- .../migrations/0003_auto_20180605_0842.py | 24 ---------- decide/voting/migrations/0004_voting_url.py | 19 -------- .../migrations/0004_yesorno_yesornooption.py | 29 ------------ .../migrations/0005_auto_20210101_1813.py | 18 -------- .../migrations/0005_auto_20210106_1519.py | 26 ----------- .../migrations/0006_auto_20210106_1523.py | 18 -------- .../migrations/0007_auto_20210106_1529.py | 17 ------- .../migrations/0008_merge_20210106_2217.py | 14 ------ .../migrations/0008_merge_20210106_2220.py | 14 ------ .../migrations/0009_auto_20210106_2332.py | 34 -------------- .../voting/migrations/0009_orderquestion.py | 21 --------- .../migrations/0010_merge_20210117_2029.py | 14 ------ .../voting/migrations/0010_orderquestion.py | 21 --------- .../migrations/0011_voting_orderquestion.py | 19 -------- .../migrations/0012_auto_20210117_2115.py | 19 -------- .../migrations/0013_auto_20210117_2117.py | 23 ---------- 29 files changed, 60 insertions(+), 572 deletions(-) delete mode 100644 decide/base/migrations/0002_auto_20180921_1056.py delete mode 100644 decide/base/migrations/0003_auto_20180921_1119.py delete mode 100644 decide/mixnet/migrations/0002_auto_20180216_1617.py delete mode 100644 decide/mixnet/migrations/0003_mixnet_auth_position.py delete mode 100644 decide/mixnet/migrations/0004_auto_20180605_0842.py delete mode 100644 decide/store/migrations/0002_vote_voted.py delete mode 100644 decide/store/migrations/0003_auto_20180921_1522.py delete mode 100644 decide/voting/migrations/0002_auto_20180302_1100.py delete mode 100644 decide/voting/migrations/0003_auto_20180605_0842.py delete mode 100644 decide/voting/migrations/0004_voting_url.py delete mode 100644 decide/voting/migrations/0004_yesorno_yesornooption.py delete mode 100644 decide/voting/migrations/0005_auto_20210101_1813.py delete mode 100644 decide/voting/migrations/0005_auto_20210106_1519.py delete mode 100644 decide/voting/migrations/0006_auto_20210106_1523.py delete mode 100644 decide/voting/migrations/0007_auto_20210106_1529.py delete mode 100644 decide/voting/migrations/0008_merge_20210106_2217.py delete mode 100644 decide/voting/migrations/0008_merge_20210106_2220.py delete mode 100644 decide/voting/migrations/0009_auto_20210106_2332.py delete mode 100644 decide/voting/migrations/0009_orderquestion.py delete mode 100644 decide/voting/migrations/0010_merge_20210117_2029.py delete mode 100644 decide/voting/migrations/0010_orderquestion.py delete mode 100644 decide/voting/migrations/0011_voting_orderquestion.py delete mode 100644 decide/voting/migrations/0012_auto_20210117_2115.py delete mode 100644 decide/voting/migrations/0013_auto_20210117_2117.py diff --git a/decide/base/migrations/0001_initial.py b/decide/base/migrations/0001_initial.py index 3130a73e76..f8e411a4bf 100644 --- a/decide/base/migrations/0001_initial.py +++ b/decide/base/migrations/0001_initial.py @@ -1,5 +1,6 @@ -# Generated by Django 2.0 on 2018-06-05 08:42 +# Generated by Django 2.0 on 2021-01-17 21:48 +import base.models from django.db import migrations, models @@ -24,10 +25,10 @@ class Migration(migrations.Migration): name='Key', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('p', models.IntegerField()), - ('g', models.IntegerField()), - ('y', models.IntegerField()), - ('x', models.IntegerField(blank=True, null=True)), + ('p', base.models.BigBigField()), + ('g', base.models.BigBigField()), + ('y', base.models.BigBigField()), + ('x', base.models.BigBigField(blank=True, null=True)), ], ), ] diff --git a/decide/base/migrations/0002_auto_20180921_1056.py b/decide/base/migrations/0002_auto_20180921_1056.py deleted file mode 100644 index e7582f11b2..0000000000 --- a/decide/base/migrations/0002_auto_20180921_1056.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 2.0 on 2018-09-21 10:56 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('base', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='key', - name='g', - field=models.BigIntegerField(), - ), - migrations.AlterField( - model_name='key', - name='p', - field=models.BigIntegerField(), - ), - migrations.AlterField( - model_name='key', - name='x', - field=models.BigIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='key', - name='y', - field=models.BigIntegerField(), - ), - ] diff --git a/decide/base/migrations/0003_auto_20180921_1119.py b/decide/base/migrations/0003_auto_20180921_1119.py deleted file mode 100644 index eef3af603a..0000000000 --- a/decide/base/migrations/0003_auto_20180921_1119.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 2.0 on 2018-09-21 11:19 - -import base.models -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('base', '0002_auto_20180921_1056'), - ] - - operations = [ - migrations.AlterField( - model_name='key', - name='g', - field=base.models.BigBigField(), - ), - migrations.AlterField( - model_name='key', - name='p', - field=base.models.BigBigField(), - ), - migrations.AlterField( - model_name='key', - name='x', - field=base.models.BigBigField(blank=True, null=True), - ), - migrations.AlterField( - model_name='key', - name='y', - field=base.models.BigBigField(), - ), - ] diff --git a/decide/census/migrations/0001_initial.py b/decide/census/migrations/0001_initial.py index bc5718e987..81e41abc71 100644 --- a/decide/census/migrations/0001_initial.py +++ b/decide/census/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0 on 2018-04-08 17:16 +# Generated by Django 2.0 on 2021-01-17 21:48 from django.db import migrations, models diff --git a/decide/mixnet/migrations/0001_initial.py b/decide/mixnet/migrations/0001_initial.py index 5cde9a643c..be0f74da56 100644 --- a/decide/mixnet/migrations/0001_initial.py +++ b/decide/mixnet/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0 on 2018-02-16 11:26 +# Generated by Django 2.0 on 2021-01-17 21:48 from django.db import migrations, models import django.db.models.deletion @@ -9,36 +9,19 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('base', '0001_initial'), ] operations = [ - migrations.CreateModel( - name='Auth', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200)), - ('url', models.URLField()), - ('me', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='Key', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('p', models.IntegerField()), - ('g', models.IntegerField()), - ('y', models.IntegerField()), - ('x', models.IntegerField(blank=True, null=True)), - ], - ), migrations.CreateModel( name='Mixnet', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('vote_id', models.PositiveIntegerField()), - ('auths', models.ManyToManyField(related_name='mixnets', to='mixnet.Auth')), - ('key', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mixnets', to='mixnet.Key')), - ('pubkey', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mixnets_pub', to='mixnet.Key')), + ('voting_id', models.PositiveIntegerField()), + ('auth_position', models.PositiveIntegerField(default=0)), + ('auths', models.ManyToManyField(related_name='mixnets', to='base.Auth')), + ('key', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mixnets', to='base.Key')), + ('pubkey', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mixnets_pub', to='base.Key')), ], ), ] diff --git a/decide/mixnet/migrations/0002_auto_20180216_1617.py b/decide/mixnet/migrations/0002_auto_20180216_1617.py deleted file mode 100644 index 998f04f623..0000000000 --- a/decide/mixnet/migrations/0002_auto_20180216_1617.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.0 on 2018-02-16 16:17 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('mixnet', '0001_initial'), - ] - - operations = [ - migrations.RenameField( - model_name='mixnet', - old_name='vote_id', - new_name='voting_id', - ), - ] diff --git a/decide/mixnet/migrations/0003_mixnet_auth_position.py b/decide/mixnet/migrations/0003_mixnet_auth_position.py deleted file mode 100644 index 434ef330c6..0000000000 --- a/decide/mixnet/migrations/0003_mixnet_auth_position.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.0 on 2018-04-04 10:13 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('mixnet', '0002_auto_20180216_1617'), - ] - - operations = [ - migrations.AddField( - model_name='mixnet', - name='auth_position', - field=models.PositiveIntegerField(default=0), - ), - ] diff --git a/decide/mixnet/migrations/0004_auto_20180605_0842.py b/decide/mixnet/migrations/0004_auto_20180605_0842.py deleted file mode 100644 index 5e81e4a1ea..0000000000 --- a/decide/mixnet/migrations/0004_auto_20180605_0842.py +++ /dev/null @@ -1,36 +0,0 @@ -# Generated by Django 2.0 on 2018-06-05 08:42 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0003_auto_20180605_0842'), - ('mixnet', '0003_mixnet_auth_position'), - ] - - operations = [ - migrations.DeleteModel( - name='Auth', - ), - migrations.AlterField( - model_name='mixnet', - name='auths', - field=models.ManyToManyField(related_name='mixnets', to='base.Auth'), - ), - migrations.AlterField( - model_name='mixnet', - name='key', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mixnets', to='base.Key'), - ), - migrations.AlterField( - model_name='mixnet', - name='pubkey', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mixnets_pub', to='base.Key'), - ), - migrations.DeleteModel( - name='Key', - ), - ] diff --git a/decide/store/migrations/0001_initial.py b/decide/store/migrations/0001_initial.py index cfd46db23d..c561de7338 100644 --- a/decide/store/migrations/0001_initial.py +++ b/decide/store/migrations/0001_initial.py @@ -1,5 +1,6 @@ -# Generated by Django 2.0 on 2018-02-24 07:33 +# Generated by Django 2.0 on 2021-01-17 21:48 +import base.models from django.db import migrations, models @@ -17,8 +18,9 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('voting_id', models.PositiveIntegerField()), ('voter_id', models.PositiveIntegerField()), - ('a', models.PositiveIntegerField()), - ('b', models.PositiveIntegerField()), + ('a', base.models.BigBigField()), + ('b', base.models.BigBigField()), + ('voted', models.DateTimeField(auto_now=True)), ], ), ] diff --git a/decide/store/migrations/0002_vote_voted.py b/decide/store/migrations/0002_vote_voted.py deleted file mode 100644 index c636eef782..0000000000 --- a/decide/store/migrations/0002_vote_voted.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.0 on 2018-02-24 08:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('store', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='vote', - name='voted', - field=models.DateTimeField(auto_now=True), - ), - ] diff --git a/decide/store/migrations/0003_auto_20180921_1522.py b/decide/store/migrations/0003_auto_20180921_1522.py deleted file mode 100644 index a57789ed68..0000000000 --- a/decide/store/migrations/0003_auto_20180921_1522.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 2.0 on 2018-09-21 15:22 - -import base.models -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('store', '0002_vote_voted'), - ] - - operations = [ - migrations.AlterField( - model_name='vote', - name='a', - field=base.models.BigBigField(), - ), - migrations.AlterField( - model_name='vote', - name='b', - field=base.models.BigBigField(), - ), - ] diff --git a/decide/voting/migrations/0001_initial.py b/decide/voting/migrations/0001_initial.py index a64c76ed70..7412e4628a 100644 --- a/decide/voting/migrations/0001_initial.py +++ b/decide/voting/migrations/0001_initial.py @@ -1,5 +1,6 @@ -# Generated by Django 2.0 on 2018-02-23 11:42 +# Generated by Django 2.0 on 2021-01-17 21:48 +import django.contrib.postgres.fields.jsonb from django.db import migrations, models import django.db.models.deletion @@ -9,10 +10,29 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('mixnet', '0002_auto_20180216_1617'), + ('base', '0001_initial'), ] operations = [ + migrations.CreateModel( + name='OrderQuestion', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('desc', models.TextField()), + ('preference', models.CharField(blank=True, choices=[('B', '1'), ('M', '2'), ('A', '3')], max_length=1)), + ], + ), + migrations.CreateModel( + name='PoliticalParty', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('acronym', models.CharField(max_length=10)), + ('description', models.TextField(blank=True, null=True)), + ('leader', models.CharField(max_length=200)), + ('president', models.CharField(blank=True, max_length=151, null=True)), + ], + ), migrations.CreateModel( name='Question', fields=[ @@ -37,9 +57,26 @@ class Migration(migrations.Migration): ('desc', models.TextField(blank=True, null=True)), ('start_date', models.DateTimeField(blank=True, null=True)), ('end_date', models.DateTimeField(blank=True, null=True)), - ('auths', models.ManyToManyField(related_name='votings', to='mixnet.Auth')), - ('pub_key', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='voting', to='mixnet.Key')), + ('tally', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True)), + ('postproc', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True)), + ('url', models.CharField(help_text='http://localhost:8000/booth/', max_length=40)), + ('auths', models.ManyToManyField(related_name='votings', to='base.Auth')), + ('order_question', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.OrderQuestion')), + ('political_party', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.PoliticalParty')), + ('pub_key', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='voting', to='base.Key')), ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.Question')), ], ), + migrations.CreateModel( + name='YesOrNoQuestion', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('desc', models.TextField()), + ('choice', models.CharField(blank=True, choices=[('Y', 'Yes'), ('N', 'No')], max_length=1)), + ], + ), + migrations.AlterUniqueTogether( + name='politicalparty', + unique_together={('name', 'acronym', 'leader')}, + ), ] diff --git a/decide/voting/migrations/0002_auto_20180302_1100.py b/decide/voting/migrations/0002_auto_20180302_1100.py deleted file mode 100644 index 9bb8fa6c52..0000000000 --- a/decide/voting/migrations/0002_auto_20180302_1100.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 2.0 on 2018-03-02 11:00 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='voting', - name='postproc', - field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True), - ), - migrations.AddField( - model_name='voting', - name='tally', - field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True), - ), - ] diff --git a/decide/voting/migrations/0003_auto_20180605_0842.py b/decide/voting/migrations/0003_auto_20180605_0842.py deleted file mode 100644 index 4a64b26350..0000000000 --- a/decide/voting/migrations/0003_auto_20180605_0842.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 2.0 on 2018-06-05 08:42 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0002_auto_20180302_1100'), - ] - - operations = [ - migrations.AlterField( - model_name='voting', - name='auths', - field=models.ManyToManyField(related_name='votings', to='base.Auth'), - ), - migrations.AlterField( - model_name='voting', - name='pub_key', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='voting', to='base.Key'), - ), - ] diff --git a/decide/voting/migrations/0004_voting_url.py b/decide/voting/migrations/0004_voting_url.py deleted file mode 100644 index ca8888b089..0000000000 --- a/decide/voting/migrations/0004_voting_url.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.0 on 2021-01-01 18:10 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0003_auto_20180605_0842'), - ] - - operations = [ - migrations.AddField( - model_name='voting', - name='url', - field=models.CharField(default='_voting_decide_example', max_length=40), - preserve_default=False, - ), - ] diff --git a/decide/voting/migrations/0004_yesorno_yesornooption.py b/decide/voting/migrations/0004_yesorno_yesornooption.py deleted file mode 100644 index 164881b653..0000000000 --- a/decide/voting/migrations/0004_yesorno_yesornooption.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 2.0 on 2021-01-06 12:25 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0003_auto_20180605_0842'), - ] - - operations = [ - migrations.CreateModel( - name='YesOrNo', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('desc', models.TextField()), - ], - ), - migrations.CreateModel( - name='YesOrNoOption', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('option', models.TextField()), - ('yesorno', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='options', to='voting.YesOrNo')), - ], - ), - ] diff --git a/decide/voting/migrations/0005_auto_20210101_1813.py b/decide/voting/migrations/0005_auto_20210101_1813.py deleted file mode 100644 index 984b21cf75..0000000000 --- a/decide/voting/migrations/0005_auto_20210101_1813.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.0 on 2021-01-01 18:13 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0004_voting_url'), - ] - - operations = [ - migrations.AlterField( - model_name='voting', - name='url', - field=models.CharField(help_text='http://localhost:8000/booth/', max_length=40), - ), - ] diff --git a/decide/voting/migrations/0005_auto_20210106_1519.py b/decide/voting/migrations/0005_auto_20210106_1519.py deleted file mode 100644 index e54741adc9..0000000000 --- a/decide/voting/migrations/0005_auto_20210106_1519.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 2.0 on 2021-01-06 15:19 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0004_yesorno_yesornooption'), - ] - - operations = [ - migrations.RemoveField( - model_name='yesornooption', - name='yesorno', - ), - migrations.AddField( - model_name='yesorno', - name='choice', - field=models.CharField(choices=[('Y', 'Yes'), ('N', 'No')], default='N', max_length=1), - preserve_default=False, - ), - migrations.DeleteModel( - name='YesOrNoOption', - ), - ] diff --git a/decide/voting/migrations/0006_auto_20210106_1523.py b/decide/voting/migrations/0006_auto_20210106_1523.py deleted file mode 100644 index ac5649d592..0000000000 --- a/decide/voting/migrations/0006_auto_20210106_1523.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.0 on 2021-01-06 15:23 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0005_auto_20210106_1519'), - ] - - operations = [ - migrations.AlterField( - model_name='yesorno', - name='choice', - field=models.CharField(blank=True, choices=[('Y', 'Yes'), ('N', 'No')], max_length=1), - ), - ] diff --git a/decide/voting/migrations/0007_auto_20210106_1529.py b/decide/voting/migrations/0007_auto_20210106_1529.py deleted file mode 100644 index 94656b799e..0000000000 --- a/decide/voting/migrations/0007_auto_20210106_1529.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 2.0 on 2021-01-06 15:29 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0006_auto_20210106_1523'), - ] - - operations = [ - migrations.RenameModel( - old_name='YesOrNo', - new_name='YesOrNoQuestion', - ), - ] diff --git a/decide/voting/migrations/0008_merge_20210106_2217.py b/decide/voting/migrations/0008_merge_20210106_2217.py deleted file mode 100644 index 9615158112..0000000000 --- a/decide/voting/migrations/0008_merge_20210106_2217.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 2.0 on 2021-01-06 22:17 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0007_auto_20210106_1529'), - ('voting', '0005_auto_20210101_1813'), - ] - - operations = [ - ] diff --git a/decide/voting/migrations/0008_merge_20210106_2220.py b/decide/voting/migrations/0008_merge_20210106_2220.py deleted file mode 100644 index b4a91551e7..0000000000 --- a/decide/voting/migrations/0008_merge_20210106_2220.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 2.0 on 2021-01-06 22:20 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0005_auto_20210101_1813'), - ('voting', '0007_auto_20210106_1529'), - ] - - operations = [ - ] diff --git a/decide/voting/migrations/0009_auto_20210106_2332.py b/decide/voting/migrations/0009_auto_20210106_2332.py deleted file mode 100644 index 4af8d8e416..0000000000 --- a/decide/voting/migrations/0009_auto_20210106_2332.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 2.0 on 2021-01-06 23:32 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0008_merge_20210106_2217'), - ] - - operations = [ - migrations.CreateModel( - name='PoliticalParty', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200)), - ('acronym', models.CharField(max_length=10)), - ('description', models.TextField(blank=True, null=True)), - ('leader', models.CharField(max_length=200)), - ('president', models.CharField(blank=True, max_length=151, null=True)), - ], - ), - migrations.AlterUniqueTogether( - name='politicalparty', - unique_together={('name', 'acronym', 'leader')}, - ), - migrations.AddField( - model_name='voting', - name='political_party', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.PoliticalParty'), - ), - ] diff --git a/decide/voting/migrations/0009_orderquestion.py b/decide/voting/migrations/0009_orderquestion.py deleted file mode 100644 index d6b9fd9e2f..0000000000 --- a/decide/voting/migrations/0009_orderquestion.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 2.0 on 2021-01-06 23:05 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0008_merge_20210106_2220'), - ] - - operations = [ - migrations.CreateModel( - name='OrderQuestion', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('desc', models.TextField()), - ('preference', models.CharField(blank=True, choices=[('B', '1'), ('M', '2'), ('A', '3')], max_length=1)), - ], - ), - ] diff --git a/decide/voting/migrations/0010_merge_20210117_2029.py b/decide/voting/migrations/0010_merge_20210117_2029.py deleted file mode 100644 index bb4d6e8e72..0000000000 --- a/decide/voting/migrations/0010_merge_20210117_2029.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 2.0 on 2021-01-17 20:29 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0009_orderquestion'), - ('voting', '0009_auto_20210106_2332'), - ] - - operations = [ - ] diff --git a/decide/voting/migrations/0010_orderquestion.py b/decide/voting/migrations/0010_orderquestion.py deleted file mode 100644 index 4574e1478e..0000000000 --- a/decide/voting/migrations/0010_orderquestion.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 2.0 on 2021-01-12 15:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0009_auto_20210106_2332'), - ] - - operations = [ - migrations.CreateModel( - name='OrderQuestion', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('desc', models.TextField()), - ('preference', models.CharField(blank=True, choices=[('B', '1'), ('M', '2'), ('A', '3')], max_length=1)), - ], - ), - ] diff --git a/decide/voting/migrations/0011_voting_orderquestion.py b/decide/voting/migrations/0011_voting_orderquestion.py deleted file mode 100644 index 6586dc903a..0000000000 --- a/decide/voting/migrations/0011_voting_orderquestion.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.0 on 2021-01-17 21:07 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0010_merge_20210117_2029'), - ] - - operations = [ - migrations.AddField( - model_name='voting', - name='orderquestion', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.OrderQuestion'), - ), - ] diff --git a/decide/voting/migrations/0012_auto_20210117_2115.py b/decide/voting/migrations/0012_auto_20210117_2115.py deleted file mode 100644 index 4b26f9f94f..0000000000 --- a/decide/voting/migrations/0012_auto_20210117_2115.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.0 on 2021-01-17 21:15 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0011_voting_orderquestion'), - ] - - operations = [ - migrations.AlterField( - model_name='voting', - name='orderquestion', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.OrderQuestion', verbose_name='Order question'), - ), - ] diff --git a/decide/voting/migrations/0013_auto_20210117_2117.py b/decide/voting/migrations/0013_auto_20210117_2117.py deleted file mode 100644 index 5c2d74a59f..0000000000 --- a/decide/voting/migrations/0013_auto_20210117_2117.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 2.0 on 2021-01-17 21:17 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('voting', '0012_auto_20210117_2115'), - ] - - operations = [ - migrations.RemoveField( - model_name='voting', - name='orderquestion', - ), - migrations.AddField( - model_name='voting', - name='order_question', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.OrderQuestion'), - ), - ] From 27d02e5b3bba049f856959d31c88b7bcdf3c53bd Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Sun, 17 Jan 2021 23:27:25 +0100 Subject: [PATCH 29/51] =?UTF-8?q?Feature:=20A=C3=B1adidas=20las=20pregunta?= =?UTF-8?q?s=20'Yes=20or=20No'=20al=20crear=20una=20votaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0002_auto_20210117_2215.py | 29 +++++++++++++++++++ .../0003_voting_yes_or_no_question.py | 19 ++++++++++++ decide/voting/models.py | 7 +++-- 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 decide/voting/migrations/0002_auto_20210117_2215.py create mode 100644 decide/voting/migrations/0003_voting_yes_or_no_question.py diff --git a/decide/voting/migrations/0002_auto_20210117_2215.py b/decide/voting/migrations/0002_auto_20210117_2215.py new file mode 100644 index 0000000000..3f3a138cda --- /dev/null +++ b/decide/voting/migrations/0002_auto_20210117_2215.py @@ -0,0 +1,29 @@ +# Generated by Django 2.0 on 2021-01-17 22:15 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('voting', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='voting', + name='order_question', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.OrderQuestion'), + ), + migrations.AlterField( + model_name='voting', + name='political_party', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.PoliticalParty'), + ), + migrations.AlterField( + model_name='voting', + name='question', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.Question'), + ), + ] diff --git a/decide/voting/migrations/0003_voting_yes_or_no_question.py b/decide/voting/migrations/0003_voting_yes_or_no_question.py new file mode 100644 index 0000000000..72323abbf9 --- /dev/null +++ b/decide/voting/migrations/0003_voting_yes_or_no_question.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0 on 2021-01-17 22:24 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('voting', '0002_auto_20210117_2215'), + ] + + operations = [ + migrations.AddField( + model_name='voting', + name='yes_or_no_question', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='voting', to='voting.YesOrNoQuestion'), + ), + ] diff --git a/decide/voting/models.py b/decide/voting/models.py index b2385c6e11..b32f7eb5ac 100644 --- a/decide/voting/models.py +++ b/decide/voting/models.py @@ -80,12 +80,13 @@ def __str__(self): class Voting(models.Model): name = models.CharField(max_length=200) desc = models.TextField(blank=True, null=True) - question = models.ForeignKey(Question, related_name='voting', on_delete=models.CASCADE) - political_party = models.ForeignKey(PoliticalParty, related_name='voting', on_delete=models.CASCADE, null=True) + question = models.ForeignKey(Question, related_name='voting', on_delete=models.CASCADE, null=True, blank=True) + political_party = models.ForeignKey(PoliticalParty, related_name='voting', on_delete=models.CASCADE, null=True, blank=True) # ,blank=True - order_question = models.ForeignKey(OrderQuestion, related_name='voting', on_delete=models.CASCADE, null= True) + order_question = models.ForeignKey(OrderQuestion, related_name='voting', on_delete=models.CASCADE, null= True, blank=True) + yes_or_no_question = models.ForeignKey(YesOrNoQuestion, related_name='voting', on_delete=models.CASCADE, null=True, blank=True) start_date = models.DateTimeField(blank=True, null=True) end_date = models.DateTimeField(blank=True, null=True) From be82c68f00594e975da4d4ac9dc94fbc5c48169a Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Sun, 17 Jan 2021 23:47:20 +0100 Subject: [PATCH 30/51] =?UTF-8?q?Fix:=20Solucionado=20error=20url=20al=20e?= =?UTF-8?q?ditar=20una=20votaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decide/voting/models.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/decide/voting/models.py b/decide/voting/models.py index b32f7eb5ac..5bebecb896 100644 --- a/decide/voting/models.py +++ b/decide/voting/models.py @@ -104,7 +104,9 @@ def clean_fields(self, exclude=None): url = urllib.parse.quote_plus(self.url.encode('utf-8')) - if Voting.objects.filter(url=url).exists(): + print(Voting.objects.filter(url=url)) + + if Voting.objects.filter(url=url).exists() and Voting.objects.filter(url=url)[0] != self: raise ValidationError({'url': "The url already exists."}) def save(self, *args, **kwargs): From 63747b293da051bc99e2f67dd8f55805e8f1f551 Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Mon, 18 Jan 2021 00:32:12 +0100 Subject: [PATCH 31/51] Feat: Despliegue en docker --- docker/Dockerfile | 4 +++- docker/docker-compose.yml | 4 +++- docker/docker-settings.py | 1 + requirements_docker.txt | 13 +++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 requirements_docker.txt diff --git a/docker/Dockerfile b/docker/Dockerfile index 781628331f..74aedd2ff0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -from python:alpine +from python:3.7-alpine RUN apk add --no-cache git postgresql-dev gcc libc-dev RUN apk add --no-cache gcc g++ make libffi-dev python3-dev build-base @@ -10,6 +10,8 @@ RUN pip install ipython WORKDIR /app +ADD requirements_docker.txt /app/requirements.txt + RUN git clone https://github.com/RioTinto-Votaciones/decide.git . RUN pip install -r requirements.txt diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 095583eb02..4689c5ff98 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -4,11 +4,13 @@ services: db: restart: always container_name: decide_db - image: postgres:alpine + image: postgres:10.15-alpine volumes: - db:/var/lib/postgresql/data networks: - decide + environment: + - POSTGRES_PASSWORD=postgres web: restart: always container_name: decide_web diff --git a/docker/docker-settings.py b/docker/docker-settings.py index 01e643d936..f1b6cb5335 100644 --- a/docker/docker-settings.py +++ b/docker/docker-settings.py @@ -5,6 +5,7 @@ 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', + 'PASSWORD': 'postgres', 'HOST': 'db', 'PORT': 5432, } diff --git a/requirements_docker.txt b/requirements_docker.txt new file mode 100644 index 0000000000..9b83fb4496 --- /dev/null +++ b/requirements_docker.txt @@ -0,0 +1,13 @@ +Django==2.0 +pycryptodome==3.6.6 +djangorestframework==3.7.7 +django-cors-headers==2.1.0 +requests==2.18.4 +django-filter==1.1.0 +psycopg2-binary==2.7.4 +django-rest-swagger==2.2.0 +coverage==4.5.2 +django-nose==1.4.6 +jsonnet==0.12.1 +django-heroku +gunicorn From 92cb6df90b51bfdd6e387481dae5ecdf50efe34b Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Mon, 18 Jan 2021 00:46:10 +0100 Subject: [PATCH 32/51] Fix: arreglado fallo requirements.txt Docker --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 74aedd2ff0..9fd6259a95 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -10,7 +10,7 @@ RUN pip install ipython WORKDIR /app -ADD requirements_docker.txt /app/requirements.txt +ADD requirements_docker.txt /app/decide/requirements.txt RUN git clone https://github.com/RioTinto-Votaciones/decide.git . RUN pip install -r requirements.txt From 4c81f3ee6070739a775466f3073f486d34e82c9c Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Mon, 18 Jan 2021 00:48:15 +0100 Subject: [PATCH 33/51] Fix: arreglado error requirements.txt not found --- requirements_docker.txt => docker/requirements_docker.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename requirements_docker.txt => docker/requirements_docker.txt (100%) diff --git a/requirements_docker.txt b/docker/requirements_docker.txt similarity index 100% rename from requirements_docker.txt rename to docker/requirements_docker.txt From 4b44ad397e58504c7ab6695eaae5e5f0a4786c52 Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Mon, 18 Jan 2021 00:54:07 +0100 Subject: [PATCH 34/51] Fix: cambiado ADD a COPY en Dockerfile para el requirements.txt --- docker/Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 9fd6259a95..c33fc47ca8 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -10,9 +10,8 @@ RUN pip install ipython WORKDIR /app -ADD requirements_docker.txt /app/decide/requirements.txt - RUN git clone https://github.com/RioTinto-Votaciones/decide.git . +COPY requirements_docker.txt /app/decide/requirements.txt RUN pip install -r requirements.txt WORKDIR /app/decide From 5c5c9d15152eb9f1d58db29f23c82a93f25090b8 Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Sat, 6 Feb 2021 13:52:10 +0100 Subject: [PATCH 35/51] =?UTF-8?q?Test:=20Creado=20test=20de=20vista=20crea?= =?UTF-8?q?r=20votaci=C3=B3n=20con=20URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decide/base/tests.py | 4 ++ decide/voting/tests_selenium.py | 76 +++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 decide/voting/tests_selenium.py diff --git a/decide/base/tests.py b/decide/base/tests.py index 907964aa95..d2ba15992b 100644 --- a/decide/base/tests.py +++ b/decide/base/tests.py @@ -20,6 +20,10 @@ def setUp(self): user_admin.set_password('qwerty') user_admin.save() + user_admin = User(username='admin-selenium', is_staff=True, is_superuser=True, is_active=True) + user_admin.set_password('qwerty') + user_admin.save() + def tearDown(self): self.client = None self.token = None diff --git a/decide/voting/tests_selenium.py b/decide/voting/tests_selenium.py new file mode 100644 index 0000000000..393d5e49ad --- /dev/null +++ b/decide/voting/tests_selenium.py @@ -0,0 +1,76 @@ +import time + +from base.models import Auth +from base.tests import BaseTestCase +from django.contrib.staticfiles.testing import StaticLiveServerTestCase +from django.test import TestCase +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import Select, WebDriverWait + +from .models import PoliticalParty, Question, QuestionOption + + +class VotingAdminTestCase(StaticLiveServerTestCase): + + def setUp(self): + self.base = BaseTestCase() + self.base.setUp() + + question = Question(desc="_Question_Test_Descripción_") + question.save() + + option1 = QuestionOption(question=question, option="_Option_1_Test_") + option1.save() + + option2 = QuestionOption(question=question, option="_Option_2_Test_") + option2.save() + + political_party = PoliticalParty(name="_Political_Party_Test_", acronym="_PPT_", description="_Political_Party_Test_Descripción_", leader="_Leader_") + political_party.save() + + auth = Auth(name="_Auth_Test", url=self.live_server_url, me=True) + auth.save() + + options = webdriver.ChromeOptions() + options.headless = True + self.driver = webdriver.Chrome(options=options) + + super().setUp() + + def tearDown(self): + super().tearDown() + self.driver.quit() + + self.base.tearDown() + + def test_create_voting_with_url(self): + self.driver.get(f'{self.live_server_url}/admin') + self.driver.set_window_size(924, 1053) + self.driver.find_element(By.ID, "id_username").send_keys("admin-selenium") + self.driver.find_element(By.ID, "id_password").send_keys("qwerty") + self.driver.find_element(By.ID, "id_password").send_keys(Keys.ENTER) + time.sleep(3) + + self.driver.find_element(By.CSS_SELECTOR, ".model-voting .addlink").click() + time.sleep(3) + self.driver.find_element(By.ID, "id_name").send_keys("_Votación_Test_") + self.driver.find_element(By.ID, "id_desc").click() + self.driver.find_element(By.ID, "id_desc").send_keys("_Votación_Test_Descripción_") + + select = Select(self.driver.find_element_by_id('id_question')) + select.select_by_visible_text('_Question_Test_Descripción_') + + select = Select(self.driver.find_element_by_id('id_political_party')) + select.select_by_visible_text('_PPT_ (_Political_Party_Test_) - _Leader_') + + select = Select(self.driver.find_element_by_id('id_auths')) + select.select_by_visible_text(str(self.live_server_url)) + + self.driver.find_element(By.ID, "id_url").click() + self.driver.find_element(By.ID, "id_url").send_keys("_votacion_test_ejemplo_") + + self.driver.find_element(By.NAME, "_save").click() + self.assertTrue(len(self.driver.find_elements_by_class_name('success'))==1) From 05a5ca3e9338d3d41f5165e2c38edd4bff9acf78 Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Sat, 6 Feb 2021 14:16:32 +0100 Subject: [PATCH 36/51] =?UTF-8?q?Test:=20Creado=20test=20de=20vista=20crea?= =?UTF-8?q?r=20votaci=C3=B3n=20sin=20URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decide/voting/tests_selenium.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/decide/voting/tests_selenium.py b/decide/voting/tests_selenium.py index 393d5e49ad..abbf43dc7b 100644 --- a/decide/voting/tests_selenium.py +++ b/decide/voting/tests_selenium.py @@ -74,3 +74,29 @@ def test_create_voting_with_url(self): self.driver.find_element(By.NAME, "_save").click() self.assertTrue(len(self.driver.find_elements_by_class_name('success'))==1) + + def test_create_voting_without_url(self): + self.driver.get(f'{self.live_server_url}/admin') + self.driver.set_window_size(924, 1053) + self.driver.find_element(By.ID, "id_username").send_keys("admin-selenium") + self.driver.find_element(By.ID, "id_password").send_keys("qwerty") + self.driver.find_element(By.ID, "id_password").send_keys(Keys.ENTER) + time.sleep(3) + + self.driver.find_element(By.CSS_SELECTOR, ".model-voting .addlink").click() + time.sleep(3) + self.driver.find_element(By.ID, "id_name").send_keys("_Votación_Test_No_URL") + self.driver.find_element(By.ID, "id_desc").click() + self.driver.find_element(By.ID, "id_desc").send_keys("_Votación_Test_Descripción_") + + select = Select(self.driver.find_element_by_id('id_question')) + select.select_by_visible_text('_Question_Test_Descripción_') + + select = Select(self.driver.find_element_by_id('id_political_party')) + select.select_by_visible_text('_PPT_ (_Political_Party_Test_) - _Leader_') + + select = Select(self.driver.find_element_by_id('id_auths')) + select.select_by_visible_text(str(self.live_server_url)) + + self.driver.find_element(By.NAME, "_save").click() + self.assertTrue(len(self.driver.find_elements_by_class_name('errorlist'))==1) From 6b21dbdf3047399ad57e78dc3831b1ebf80f869e Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Sat, 6 Feb 2021 16:21:24 +0100 Subject: [PATCH 37/51] =?UTF-8?q?Test:=20C=C3=B3digo=20de=20los=20test=20d?= =?UTF-8?q?e=20vista=20refactorizado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decide/voting/tests_selenium.py | 34 ++++++++------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/decide/voting/tests_selenium.py b/decide/voting/tests_selenium.py index abbf43dc7b..5fbeae8edc 100644 --- a/decide/voting/tests_selenium.py +++ b/decide/voting/tests_selenium.py @@ -46,7 +46,7 @@ def tearDown(self): self.base.tearDown() - def test_create_voting_with_url(self): + def create_voting(self, url=None): self.driver.get(f'{self.live_server_url}/admin') self.driver.set_window_size(924, 1053) self.driver.find_element(By.ID, "id_username").send_keys("admin-selenium") @@ -69,34 +69,16 @@ def test_create_voting_with_url(self): select = Select(self.driver.find_element_by_id('id_auths')) select.select_by_visible_text(str(self.live_server_url)) - self.driver.find_element(By.ID, "id_url").click() - self.driver.find_element(By.ID, "id_url").send_keys("_votacion_test_ejemplo_") + if url: + self.driver.find_element(By.ID, "id_url").click() + self.driver.find_element(By.ID, "id_url").send_keys(url) self.driver.find_element(By.NAME, "_save").click() + + def test_create_voting_with_url(self): + self.create_voting(url="_votacion_test_ejemplo_") self.assertTrue(len(self.driver.find_elements_by_class_name('success'))==1) def test_create_voting_without_url(self): - self.driver.get(f'{self.live_server_url}/admin') - self.driver.set_window_size(924, 1053) - self.driver.find_element(By.ID, "id_username").send_keys("admin-selenium") - self.driver.find_element(By.ID, "id_password").send_keys("qwerty") - self.driver.find_element(By.ID, "id_password").send_keys(Keys.ENTER) - time.sleep(3) - - self.driver.find_element(By.CSS_SELECTOR, ".model-voting .addlink").click() - time.sleep(3) - self.driver.find_element(By.ID, "id_name").send_keys("_Votación_Test_No_URL") - self.driver.find_element(By.ID, "id_desc").click() - self.driver.find_element(By.ID, "id_desc").send_keys("_Votación_Test_Descripción_") - - select = Select(self.driver.find_element_by_id('id_question')) - select.select_by_visible_text('_Question_Test_Descripción_') - - select = Select(self.driver.find_element_by_id('id_political_party')) - select.select_by_visible_text('_PPT_ (_Political_Party_Test_) - _Leader_') - - select = Select(self.driver.find_element_by_id('id_auths')) - select.select_by_visible_text(str(self.live_server_url)) - - self.driver.find_element(By.NAME, "_save").click() + self.create_voting() self.assertTrue(len(self.driver.find_elements_by_class_name('errorlist'))==1) From 5fdc9f9777d2eab0f21312c42156d895cd4828d2 Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Sat, 6 Feb 2021 16:30:44 +0100 Subject: [PATCH 38/51] =?UTF-8?q?Test:=20Creado=20test=20de=20vista=20crea?= =?UTF-8?q?r=20votaci=C3=B3n=20con=20URL=20ya=20existente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decide/voting/tests_selenium.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/decide/voting/tests_selenium.py b/decide/voting/tests_selenium.py index 5fbeae8edc..9c94a4d4da 100644 --- a/decide/voting/tests_selenium.py +++ b/decide/voting/tests_selenium.py @@ -10,7 +10,7 @@ from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import Select, WebDriverWait -from .models import PoliticalParty, Question, QuestionOption +from .models import PoliticalParty, Question, QuestionOption, Voting class VotingAdminTestCase(StaticLiveServerTestCase): @@ -34,6 +34,11 @@ def setUp(self): auth = Auth(name="_Auth_Test", url=self.live_server_url, me=True) auth.save() + voting = Voting(desc="_Votación_Test_Ya_Existente", name="_Votación_Test_Ya_Existente_Descripción", question=question, political_party=political_party, url="_votacion_test_ejemplo_already_exists") + voting.save() + + voting.auths.add(auth) + options = webdriver.ChromeOptions() options.headless = True self.driver = webdriver.Chrome(options=options) @@ -82,3 +87,7 @@ def test_create_voting_with_url(self): def test_create_voting_without_url(self): self.create_voting() self.assertTrue(len(self.driver.find_elements_by_class_name('errorlist'))==1) + + def test_create_voting_existing_url(self): + self.create_voting(url="_votacion_test_ejemplo_already_exists") + self.assertTrue(len(self.driver.find_elements_by_class_name('errorlist'))==1) From de77139ff221975df0b32cab0b6a628dbc056a7a Mon Sep 17 00:00:00 2001 From: Francisco Javier Date: Sun, 7 Feb 2021 12:41:16 +0100 Subject: [PATCH 39/51] =?UTF-8?q?Test:=20Creaci=C3=B3n=20de=20una=20votaci?= =?UTF-8?q?=C3=B3n=20sin=20URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decide/voting/tests.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/decide/voting/tests.py b/decide/voting/tests.py index 64c571f0fc..2df1f99eba 100644 --- a/decide/voting/tests.py +++ b/decide/voting/tests.py @@ -231,3 +231,14 @@ def test_create_voting_url_exists(self): response = self.client.post('/voting/', data, format='json') self.assertEqual(response.status_code, 401) + + def test_create_voting_without_url(self): + data = { + 'name': 'Example No URL', + 'desc': 'Description example', + 'question': 'Is this a question? ', + 'question_opt': ['Yes', 'No'] + } + + response = self.client.post('/voting/', data, format='json') + self.assertEqual(response.status_code, 401) From 13122adf6ca135f05848547d0ce3b46868da6ef4 Mon Sep 17 00:00:00 2001 From: lizseth Date: Tue, 9 Feb 2021 19:39:49 +0100 Subject: [PATCH 40/51] --- decide/decide/settings.py | 4 +-- decide/tally.zip | Bin 0 -> 392 bytes decide/tallydeVoting1.txt | 3 ++ decide/tallydeVoting2.txt | 3 ++ decide/tallydeVoting9.txt | 3 ++ decide/voting/tests_selenium.py | 57 +++++++++++++++++++++++++++++++- 6 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 decide/tally.zip create mode 100644 decide/tallydeVoting1.txt create mode 100644 decide/tallydeVoting2.txt create mode 100644 decide/tallydeVoting9.txt diff --git a/decide/decide/settings.py b/decide/decide/settings.py index 8ea9e51189..6d60cf0e38 100644 --- a/decide/decide/settings.py +++ b/decide/decide/settings.py @@ -183,5 +183,5 @@ INSTALLED_APPS = INSTALLED_APPS + MODULES -import django_heroku -django_heroku.settings(locals()) +# import django_heroku +# django_heroku.settings(locals()) diff --git a/decide/tally.zip b/decide/tally.zip new file mode 100644 index 0000000000000000000000000000000000000000..0fd8870ae3e57164641957099bf3ef96c8679aad GIT binary patch literal 392 zcmWIWW@Zs#0D+z?isOOdDCZ!euMU8-*viy?NVj$a~R!0Gg1|t*= z#)LH(qi8T8tic3DgDGJRrYIWBP&C8_cr!AIFyjt0a9{$7EsY=+W(Wp&v$BC?7=h3M LNE-pent=fTWZGvE literal 0 HcmV?d00001 diff --git a/decide/tallydeVoting1.txt b/decide/tallydeVoting1.txt new file mode 100644 index 0000000000..259414f9f9 --- /dev/null +++ b/decide/tallydeVoting1.txt @@ -0,0 +1,3 @@ + + Hola Mundo +[{'option': 'option 1', 'number': 2, 'votes': 4}, {'option': 'option 2', 'number': 3, 'votes': 3}, {'option': 'option 3', 'number': 4, 'votes': 1}, {'option': 'option 4', 'number': 5, 'votes': 0}, {'option': 'option 5', 'number': 6, 'votes': 2}] \ No newline at end of file diff --git a/decide/tallydeVoting2.txt b/decide/tallydeVoting2.txt new file mode 100644 index 0000000000..a4c8fe09ce --- /dev/null +++ b/decide/tallydeVoting2.txt @@ -0,0 +1,3 @@ + + Hola Mundo +[{'option': 'option 1', 'number': 2, 'votes': 2}, {'option': 'option 2', 'number': 3, 'votes': 3}, {'option': 'option 3', 'number': 4, 'votes': 5}, {'option': 'option 4', 'number': 5, 'votes': 2}, {'option': 'option 5', 'number': 6, 'votes': 5}] \ No newline at end of file diff --git a/decide/tallydeVoting9.txt b/decide/tallydeVoting9.txt new file mode 100644 index 0000000000..c6a4c34757 --- /dev/null +++ b/decide/tallydeVoting9.txt @@ -0,0 +1,3 @@ + + Hola Mundo +[{'option': 'option 1', 'number': 2, 'votes': 0}, {'option': 'option 2', 'number': 3, 'votes': 0}, {'option': 'option 3', 'number': 4, 'votes': 0}, {'option': 'option 4', 'number': 5, 'votes': 0}, {'option': 'option 5', 'number': 6, 'votes': 0}] \ No newline at end of file diff --git a/decide/voting/tests_selenium.py b/decide/voting/tests_selenium.py index 9c94a4d4da..6e7039883d 100644 --- a/decide/voting/tests_selenium.py +++ b/decide/voting/tests_selenium.py @@ -40,7 +40,7 @@ def setUp(self): voting.auths.add(auth) options = webdriver.ChromeOptions() - options.headless = True + # options.headless = True self.driver = webdriver.Chrome(options=options) super().setUp() @@ -91,3 +91,58 @@ def test_create_voting_without_url(self): def test_create_voting_existing_url(self): self.create_voting(url="_votacion_test_ejemplo_already_exists") self.assertTrue(len(self.driver.find_elements_by_class_name('errorlist'))==1) + + def create_orderquestionsuccess(self): + self.driver.get(f'{self.live_server_url}/admin') + self.driver.set_window_size(1920, 1031) + self.driver.find_element(By.ID, "id_username").send_keys("admin-selenium") + self.driver.find_element(By.ID, "id_password").click() + self.driver.find_element(By.ID, "id_password").send_keys("qwerty") + self.driver.find_element(By.ID, "id_password").send_keys(Keys.ENTER) + self.driver.find_element(By.ID, "container").click() + self.driver.find_element(By.CSS_SELECTOR, ".model-orderquestion .addlink").click() + self.driver.find_element(By.ID, "id_desc").click() + self.driver.find_element(By.ID, "id_desc").click() + self.driver.find_element(By.ID, "id_desc").click() + self.driver.find_element(By.ID, "id_desc").send_keys("¿Del 1 al 3 cuanto te gusta este partido?") + self.driver.find_element(By.NAME, "_save").click() + self.driver.find_element(By.CSS_SELECTOR, "html").click() + self.driver.find_element(By.CSS_SELECTOR, "html").click() + + def test_create_orderquestion_success(self): + self.create_orderquestionsuccess() + self.assertTrue(len(self.driver.find_elements_by_class_name('success'))==1) + + def test_create_voting_orderquestion(self): + self.create_orderquestionsuccess() + self.driver.find_element(By.LINK_TEXT, "Home").click() + self.driver.find_element(By.CSS_SELECTOR, ".model-voting .addlink").click() + time.sleep(3) + self.driver.find_element(By.ID, "id_name").send_keys("_Votación_Test_") + self.driver.find_element(By.ID, "id_desc").click() + self.driver.find_element(By.ID, "id_desc").send_keys("_Votación_Test_Descripción_") + + select = Select(self.driver.find_element_by_id('id_order_question')) + select.select_by_visible_text('¿Del 1 al 3 cuanto te gusta este partido?') + + select = Select(self.driver.find_element_by_id('id_auths')) + select.select_by_visible_text(str(self.live_server_url)) + + self.driver.find_element(By.ID, "id_url").click() + self.driver.find_element(By.ID, "id_url").send_keys('test') + + self.driver.find_element(By.NAME, "_save").click() + self.assertTrue(len(self.driver.find_elements_by_class_name('success'))==1) + + + def test_orderquestionwitherror(self): + self.driver.get(f'{self.live_server_url}/admin') + self.driver.set_window_size(1920, 1031) + self.driver.find_element(By.ID, "id_username").send_keys("admin-selenium") + self.driver.find_element(By.ID, "id_password").click() + self.driver.find_element(By.ID, "id_password").send_keys("qwerty") + self.driver.find_element(By.ID, "id_password").send_keys(Keys.ENTER) + self.driver.find_element(By.ID, "container").click() + self.driver.find_element(By.CSS_SELECTOR, ".model-orderquestion .addlink").click() + self.driver.find_element(By.NAME, "_save").click() + self.assertTrue(len(self.driver.find_elements_by_class_name('errorlist'))==1) From 094300eecad07d358816a8ce9337e22935eeb2a8 Mon Sep 17 00:00:00 2001 From: lizseth Date: Tue, 9 Feb 2021 19:41:48 +0100 Subject: [PATCH 41/51] Test: tests de order question. --- decide/tally.zip | Bin 392 -> 392 bytes decide/tallydeVoting1.txt | 2 +- decide/tallydeVoting2.txt | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/decide/tally.zip b/decide/tally.zip index 0fd8870ae3e57164641957099bf3ef96c8679aad..05e07c28a6a4c20315e9fa5dfea02f1c350fdec4 100644 GIT binary patch delta 28 hcmeBR?qKE#@MdNaVE_S{sT+BW7@1_IPIh4Q002jC1xWw^ delta 28 hcmeBR?qKE#@MdNaVE}=iDI0l=7@2yeOm<-O002*}1}6Xj diff --git a/decide/tallydeVoting1.txt b/decide/tallydeVoting1.txt index 259414f9f9..c2e365f1a4 100644 --- a/decide/tallydeVoting1.txt +++ b/decide/tallydeVoting1.txt @@ -1,3 +1,3 @@ Hola Mundo -[{'option': 'option 1', 'number': 2, 'votes': 4}, {'option': 'option 2', 'number': 3, 'votes': 3}, {'option': 'option 3', 'number': 4, 'votes': 1}, {'option': 'option 4', 'number': 5, 'votes': 0}, {'option': 'option 5', 'number': 6, 'votes': 2}] \ No newline at end of file +[{'option': 'option 1', 'number': 2, 'votes': 2}, {'option': 'option 2', 'number': 3, 'votes': 5}, {'option': 'option 3', 'number': 4, 'votes': 2}, {'option': 'option 4', 'number': 5, 'votes': 5}, {'option': 'option 5', 'number': 6, 'votes': 3}] \ No newline at end of file diff --git a/decide/tallydeVoting2.txt b/decide/tallydeVoting2.txt index a4c8fe09ce..f9b25a1a83 100644 --- a/decide/tallydeVoting2.txt +++ b/decide/tallydeVoting2.txt @@ -1,3 +1,3 @@ Hola Mundo -[{'option': 'option 1', 'number': 2, 'votes': 2}, {'option': 'option 2', 'number': 3, 'votes': 3}, {'option': 'option 3', 'number': 4, 'votes': 5}, {'option': 'option 4', 'number': 5, 'votes': 2}, {'option': 'option 5', 'number': 6, 'votes': 5}] \ No newline at end of file +[{'option': 'option 1', 'number': 2, 'votes': 5}, {'option': 'option 2', 'number': 3, 'votes': 4}, {'option': 'option 3', 'number': 4, 'votes': 5}, {'option': 'option 4', 'number': 5, 'votes': 4}, {'option': 'option 5', 'number': 6, 'votes': 4}] \ No newline at end of file From 70ed0168e3c5b9a67079163d6802edf107799e66 Mon Sep 17 00:00:00 2001 From: lizseth Date: Tue, 9 Feb 2021 19:47:23 +0100 Subject: [PATCH 42/51] Fix: test order questions --- decide/voting/tests_selenium.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decide/voting/tests_selenium.py b/decide/voting/tests_selenium.py index 6e7039883d..cdf66d8c86 100644 --- a/decide/voting/tests_selenium.py +++ b/decide/voting/tests_selenium.py @@ -40,7 +40,7 @@ def setUp(self): voting.auths.add(auth) options = webdriver.ChromeOptions() - # options.headless = True + options.headless = True self.driver = webdriver.Chrome(options=options) super().setUp() From 59924ec1053b8b4bdb86d40a9eae0bb350585542 Mon Sep 17 00:00:00 2001 From: lizseth Date: Wed, 10 Feb 2021 10:09:20 +0100 Subject: [PATCH 43/51] Test: test unitario create question whitout description. --- decide/voting/tests.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/decide/voting/tests.py b/decide/voting/tests.py index 5ca6752e0a..37be5bed54 100644 --- a/decide/voting/tests.py +++ b/decide/voting/tests.py @@ -13,7 +13,7 @@ from mixnet.mixcrypt import ElGamal from mixnet.mixcrypt import MixCrypt from mixnet.models import Auth -from voting.models import Voting, Question, QuestionOption +from voting.models import Voting, Question, QuestionOption, OrderQuestion class VotingTestCase(BaseTestCase): @@ -349,3 +349,14 @@ def test_create_voting_without_url(self): response = self.client.post('/voting/', data, format='json') self.assertEqual(response.status_code, 401) + + + def test_create_orderquestion_without_desc(self): + data = { + + } + response = self.client.post('/voting/', data, format='json') + self.assertEqual(response.status_code, 401) + + + From 5510c1d82c221e26dd6631d0a5d8f824f96629e5 Mon Sep 17 00:00:00 2001 From: lizseth Date: Wed, 10 Feb 2021 10:45:36 +0100 Subject: [PATCH 44/51] Test: test unitario create order question --- decide/voting/tests.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/decide/voting/tests.py b/decide/voting/tests.py index 37be5bed54..24fe200cf8 100644 --- a/decide/voting/tests.py +++ b/decide/voting/tests.py @@ -357,6 +357,15 @@ def test_create_orderquestion_without_desc(self): } response = self.client.post('/voting/', data, format='json') self.assertEqual(response.status_code, 401) + + def test_create_orderquestion_with_desc(self): + data = { + + 'desc': 'Description example', + + } + self.assertEqual(response.status_code, 200) + From df5b82b62bc0d7b7d8b68c7d2e73cc69a55a446a Mon Sep 17 00:00:00 2001 From: lizseth Date: Wed, 10 Feb 2021 11:20:37 +0100 Subject: [PATCH 45/51] Test: test unitario create voting whit order question. --- decide/voting/tests.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/decide/voting/tests.py b/decide/voting/tests.py index 24fe200cf8..f78331fe0d 100644 --- a/decide/voting/tests.py +++ b/decide/voting/tests.py @@ -355,7 +355,7 @@ def test_create_orderquestion_without_desc(self): data = { } - response = self.client.post('/voting/', data, format='json') + response = self.client.post('/orderquestion/', data, format='json') self.assertEqual(response.status_code, 401) def test_create_orderquestion_with_desc(self): @@ -364,8 +364,17 @@ def test_create_orderquestion_with_desc(self): 'desc': 'Description example', } + response = self.client.post(???) self.assertEqual(response.status_code, 200) - + + def test_create_voting_whit_orderquestion(self): + data = { + 'name': 'Example test', + 'desc': 'Description example', + 'orderquestion': '¿Cuanto te gusta este partido?' + 'url': '_test_voting', + + } From 800b576bb47d4be5ab656d667e3618c72de171a9 Mon Sep 17 00:00:00 2001 From: lizseth Date: Wed, 10 Feb 2021 12:18:32 +0100 Subject: [PATCH 46/51] Fix: delete tests.py --- decide/voting/tests.py.save | 263 ------------------------------------ 1 file changed, 263 deletions(-) delete mode 100644 decide/voting/tests.py.save diff --git a/decide/voting/tests.py.save b/decide/voting/tests.py.save deleted file mode 100644 index d38ceddb19..0000000000 --- a/decide/voting/tests.py.save +++ /dev/null @@ -1,263 +0,0 @@ -import random -import itertools -from django.utils import timezone -from django.conf import settings -from django.contrib.auth.models import User -from django.test import TestCase -from rest_framework.test import APIClient -from rest_framework.test import APITestCase - -from base import mods -from base.tests import BaseTestCase -from census.models import Census -from mixnet.mixcrypt import ElGamal -from mixnet.mixcrypt import MixCrypt -from mixnet.models import Auth -from voting.models import Voting, Question, QuestionOption - - -class VotingTestCase(BaseTestCase): - - def setUp(self): - super().setUp() - - def tearDown(self): - super().tearDown() - - def encrypt_msg(self, msg, v, bits=settings.KEYBITS): - pk = v.pub_key - p, g, y = (pk.p, pk.g, pk.y) - k = MixCrypt(bits=bits) - k.k = ElGamal.construct((p, g, y)) - return k.encrypt(msg) - - def create_voting(self): - q = Question(desc='test question') - q.save() - for i in range(5): - opt = QuestionOption(question=q, option='option {}'.format(i+1)) - opt.save() - v = Voting(name='test voting', question=q) - v.save() - - a, _ = Auth.objects.get_or_create(url=settings.BASEURL, - defaults={'me': True, 'name': 'test auth'}) - a.save() - v.auths.add(a) - - return v - - def create_voters(self, v): - for i in rensus(voter_id=u.id, voting_id=v.id) - c.save() -ange(100): - u, _ = User.objects.get_or_create(username='testvoter{}'.format(i)) - u.is_active = True - u.save() - c = Census(voter_id=u.id, voting_id=v.id) - c.save() - - def create_tenvoters(self, v): - for i in range(10): - u, _ = User.objects.get_or_create(username='testvoter{}'.format(i)) - u.is_active = True - u.save() - c = Census(voter_id=u.id, voting_id=v.id) - c.save() - - def get_or_create_user(self, pk): - user, _ = User.objects.get_or_create(pk=pk) - user.username = 'user{}'.format(pk) - user.set_password('qwerty') - user.save() - return user - - def store_votes(self, v): - voters = list(Census.objects.filter(voting_id=v.id)) - voter = voters.pop() - - clear = {} - for opt in v.question.options.all(): - clear[opt.number] = 0 - for i in range(random.randint(0, 5)): - a, b = self.encrypt_msg(opt.number, v) - data = { - 'voting': v.id, - 'voter': voter.voter_id, - 'vote': { 'a': a, 'b': b }, - } - clear[opt.number] += 1 - user = self.get_or_create_user(voter.voter_id) - self.login(user=user.username) - voter = voters.pop() - mods.post('store', json=data) - return clear - - def test_complete_voting_tenvoters(self): - v = self.create_voting() - self.create_tenvoters(v) - - v.create_pubkey() - v.start_date = timezone.now() - v.save() - - clear = self.store_votes(v) - - self.login() # set token - v.tally_votes(self.token) - - tally = v.tally - tally.sort() - tally = {k: len(list(x)) for k, x in itertools.groupby(tally)} - - for q in v.question.options.all(): - self.assertEqual(tally.get(q.number, 0), clear.get(q.number, 0)) - - for q in v.postproc: - self.assertEqual(tally.get(q["number"], 0), q["votes"]) - - - def test_complete_voting_with_voters(self): - v = self.create_voting() - self.create_voters(v2) - - v.create_pubkey() - v.start_date = timezone.now() - v.save() - - clear = self.store_votes(v) - - self.login() - v.tally_votes(self.token) - - tally = v.tally - tally.sort() - tally = {k: len(list(x)) for k, x in itertools.groupby(tally)} - - for q in v.question.options.all(): - self.assertEqual(tally.get(q.number, 0), clear.get(q.number, 0)) - - for q in v.postproc: - self.assertEqual(tally.get(q["number"], 0), q["votes"]) - - def test_create_voting_from_api(self): - data = {'name': 'Example'} - response = self.client.post('/voting/', data, format='json') - self.assertEqual(response.status_code, 401) - - # login with user no admin - self.login(user='noadmin') - response = mods.post('voting', params=data, response=True) - self.assertEqual(response.status_code, 403) - - # login with user admin - self.login() - response = mods.post('voting', params=data, response=True) - self.assertEqual(response.status_code, 400) - - data = { - 'name': 'Example', - 'desc': 'Description example', - 'question': 'I want a ', - 'question_opt': ['cat', 'dog', 'horse'] - } - - response = self.client.post('/voting/', data, format='json') - self.assertEqual(response.status_code, 201) - - def test_create_voting_from_api_noadmin(self): - data = {'name': 'Example'} - response = self.client.post('/voting/', data, format='json') - self.assertEqual(response.status_code, 401) - - self.login(user='noadmin') - response = mods.post('voting', params=data, response=True) - self.assertEqual(response.status_code, 403) - - data = { - 'name': 'Example', - 'desc': 'Description example', - 'question': 'I want a ', - 'question_opt': ['cat', 'dog', 'horse'] - } - - response = self.client.post('/voting/', data, format='json') - self.assertEqual(response.status_code, 403 ) - - def test_update_voting(self): - voting = self.create_voting() - - data = {'action': 'start'} - #response = self.client.post('/voting/{}/'.format(voting.pk), data, format='json') - #self.assertEqual(response.status_code, 401) - - # login with user no admin - self.login(user='noadmin') - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 403) - - # login with user admin - self.login() - data = {'action': 'bad'} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 400) - - # STATUS VOTING: not started - for action in ['stop', 'tally']: - data = {'action': action} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json(), 'Voting is not started') - - data = {'action': 'start'} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json(), 'Voting started') - - # STATUS VOTING: started - data = {'action': 'start'} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json(), 'Voting already started') - - data = {'action': 'tally'} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json(), 'Voting is not stopped') - - data = {'action': 'stop'} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json(), 'Voting stopped') - - # STATUS VOTING: stopped - data = {'action': 'start'} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json(), 'Voting already started') - - data = {'action': 'stop'} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json(), 'Voting already stopped') - - data = {'action': 'tally'} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json(), 'Voting tallied') - - # STATUS VOTING: tallied - data = {'action': 'start'} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json(), 'Voting already started') - - data = {'action': 'stop'} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json(), 'Voting already stopped') - - data = {'action': 'tally'} - response = self.client.put('/voting/{}/'.format(voting.pk), data, format='json') - self.assertEqual(response.status_code, 400) - self.assertEqual(response.json(), 'Voting already tallied') From 1bcbc38b88e020d3eb2813910d8b5d569097d180 Mon Sep 17 00:00:00 2001 From: lizseth Date: Wed, 10 Feb 2021 19:53:08 +0100 Subject: [PATCH 47/51] Fix: Arreglar errores en test unitarios de order question. --- decide/voting/tests.py | 44 ++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/decide/voting/tests.py b/decide/voting/tests.py index f78331fe0d..b4b4482510 100644 --- a/decide/voting/tests.py +++ b/decide/voting/tests.py @@ -351,30 +351,28 @@ def test_create_voting_without_url(self): self.assertEqual(response.status_code, 401) - def test_create_orderquestion_without_desc(self): - data = { - - } - response = self.client.post('/orderquestion/', data, format='json') - self.assertEqual(response.status_code, 401) - - def test_create_orderquestion_with_desc(self): - data = { - - 'desc': 'Description example', + def test_create_voting_orderquestion(self): + orderquestion = OrderQuestion(desc="Descripción de ejemplo") + orderquestion.save() - } - response = self.client.post(???) - self.assertEqual(response.status_code, 200) + v = Voting(name='test voting', url="_test_voting_orderquestion", order_question=orderquestion) + + v.save() - def test_create_voting_whit_orderquestion(self): - data = { - 'name': 'Example test', - 'desc': 'Description example', - 'orderquestion': '¿Cuanto te gusta este partido?' - 'url': '_test_voting', - - } - + a, _ = Auth.objects.get_or_create(url=settings.BASEURL, + defaults={'me': True, 'name': 'test auth'}) + a.save() + v.auths.add(a) + self.assertTrue(Voting.objects.get(url="_test_voting_orderquestion").order_question==orderquestion) + + def test_create_orderquestion(self): + orderquestion = OrderQuestion(desc="Descripción de ejemplo") + orderquestion.save() + + self.assertTrue(OrderQuestion.objects.filter(desc="Descripción de ejemplo").exists()) + + + + From cd064b49653d3389510b41571dff87e2e1287d10 Mon Sep 17 00:00:00 2001 From: lizseth Date: Wed, 10 Feb 2021 23:41:19 +0100 Subject: [PATCH 48/51] Fix: correccion test n order questi --- decide/voting/tests.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/decide/voting/tests.py b/decide/voting/tests.py index b4b4482510..e8dd35a98d 100644 --- a/decide/voting/tests.py +++ b/decide/voting/tests.py @@ -205,18 +205,18 @@ def test_create_voting_from_api_admin(self): response = self.client.post('/voting/', data, format='json') self.assertEqual(response.status_code, 201 ) - def test_create_voting_without_url(self): - v = self.create_voting() - - data = { - 'name': 'Example', - 'desc': 'Description example', - 'question': 'Is there any url? ', - 'question_opt': ['Yes', 'No'] - } - - response = self.client.post('/voting/', data, format='json') - self.assertEqual(response.status_code, 401) + # def test_create_voting_without_url(self): + # v = self.create_voting() + + # data = { + # 'name': 'Example', + # 'desc': 'Description example', + # 'question': 'Is there any url? ', + # 'question_opt': ['Yes', 'No'] + # } + + # response = self.client.post('/voting/', data, format='json') + # self.assertEqual(response.status_code, 401) def test_create_voting_without_url_and_question(self): v = self.create_voting() From 5c8724caa2d3a58e9c7eb17937492451f3a7324d Mon Sep 17 00:00:00 2001 From: lizseth Date: Wed, 10 Feb 2021 23:43:01 +0100 Subject: [PATCH 49/51] Test: create test voting con yes or no question. --- decide/voting/tests_selenium.py | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/decide/voting/tests_selenium.py b/decide/voting/tests_selenium.py index cdf66d8c86..ab0c1ed711 100644 --- a/decide/voting/tests_selenium.py +++ b/decide/voting/tests_selenium.py @@ -146,3 +146,41 @@ def test_orderquestionwitherror(self): self.driver.find_element(By.CSS_SELECTOR, ".model-orderquestion .addlink").click() self.driver.find_element(By.NAME, "_save").click() self.assertTrue(len(self.driver.find_elements_by_class_name('errorlist'))==1) + + + def createYesOrNoQuestion(self): + self.driver.get(f'{self.live_server_url}/admin') + self.driver.set_window_size(1920, 1031) + self.driver.find_element(By.ID, "id_username").send_keys("admin-selenium") + self.driver.find_element(By.ID, "id_password").click() + self.driver.find_element(By.ID, "id_password").send_keys("qwerty") + self.driver.find_element(By.ID, "id_password").send_keys(Keys.ENTER) + self.driver.find_element(By.ID, "container").click() + self.driver.find_element(By.LINK_TEXT, "Yes or no questions").click() + self.driver.find_element(By.CSS_SELECTOR, ".addlink").click() + self.driver.find_element(By.ID, "id_desc").send_keys("Prueba yes or no question") + self.driver.find_element(By.NAME, "_save").click() + + def test_votingwithyesornoquestion(self): + self.createYesOrNoQuestion() + self.driver.find_element(By.LINK_TEXT, "Home").click() + self.driver.find_element(By.CSS_SELECTOR, ".model-voting .addlink").click() + time.sleep(3) + self.driver.find_element(By.ID, "id_name").send_keys("_Votación_Test_") + self.driver.find_element(By.ID, "id_desc").click() + self.driver.find_element(By.ID, "id_desc").send_keys("_Votación_Test_Descripción_") + + dropdown = self.driver.find_element(By.ID, "id_yes_or_no_question") + dropdown.find_element(By.XPATH, "//option[. = 'Prueba yes or no question']").click() + self.driver.find_element(By.ID, "id_yes_or_no_question").click() + + + + select = Select(self.driver.find_element_by_id('id_auths')) + select.select_by_visible_text(str(self.live_server_url)) + + self.driver.find_element(By.ID, "id_url").click() + self.driver.find_element(By.ID, "id_url").send_keys('test') + + self.driver.find_element(By.NAME, "_save").click() + self.assertTrue(len(self.driver.find_elements_by_class_name('success'))==1) From 3aec5663767a0f84d1c27c145ec4b75181766f26 Mon Sep 17 00:00:00 2001 From: lizseth Date: Thu, 11 Feb 2021 00:10:52 +0100 Subject: [PATCH 50/51] Test: test create yesornoquestion success --- decide/voting/tests_selenium.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/decide/voting/tests_selenium.py b/decide/voting/tests_selenium.py index ab0c1ed711..940a830751 100644 --- a/decide/voting/tests_selenium.py +++ b/decide/voting/tests_selenium.py @@ -161,6 +161,10 @@ def createYesOrNoQuestion(self): self.driver.find_element(By.ID, "id_desc").send_keys("Prueba yes or no question") self.driver.find_element(By.NAME, "_save").click() + def test_create_yesornoquestion_success(self): + self.createYesOrNoQuestion() + self.assertTrue(len(self.driver.find_elements_by_class_name('success'))==1) + def test_votingwithyesornoquestion(self): self.createYesOrNoQuestion() self.driver.find_element(By.LINK_TEXT, "Home").click() @@ -174,8 +178,6 @@ def test_votingwithyesornoquestion(self): dropdown.find_element(By.XPATH, "//option[. = 'Prueba yes or no question']").click() self.driver.find_element(By.ID, "id_yes_or_no_question").click() - - select = Select(self.driver.find_element_by_id('id_auths')) select.select_by_visible_text(str(self.live_server_url)) From 761289f6dc51d968be8e4a761698eeb79e1013ca Mon Sep 17 00:00:00 2001 From: lizseth Date: Thu, 11 Feb 2021 00:23:44 +0100 Subject: [PATCH 51/51] Test: test create yes or no question succes and error. --- decide/voting/tests_selenium.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/decide/voting/tests_selenium.py b/decide/voting/tests_selenium.py index 940a830751..6577842b58 100644 --- a/decide/voting/tests_selenium.py +++ b/decide/voting/tests_selenium.py @@ -165,6 +165,18 @@ def test_create_yesornoquestion_success(self): self.createYesOrNoQuestion() self.assertTrue(len(self.driver.find_elements_by_class_name('success'))==1) + def test_yesornoquestionwitherror(self): + self.driver.get(f'{self.live_server_url}/admin') + self.driver.set_window_size(1920, 1031) + self.driver.find_element(By.ID, "id_username").send_keys("admin-selenium") + self.driver.find_element(By.ID, "id_password").click() + self.driver.find_element(By.ID, "id_password").send_keys("qwerty") + self.driver.find_element(By.ID, "id_password").send_keys(Keys.ENTER) + self.driver.find_element(By.ID, "container").click() + self.driver.find_element(By.CSS_SELECTOR, ".model-yesornoquestion .addlink").click() + self.driver.find_element(By.NAME, "_save").click() + self.assertTrue(len(self.driver.find_elements_by_class_name('errorlist'))==1) + def test_votingwithyesornoquestion(self): self.createYesOrNoQuestion() self.driver.find_element(By.LINK_TEXT, "Home").click()