diff options
Diffstat (limited to 'webapp/polls/views.py')
-rw-r--r-- | webapp/polls/views.py | 154 |
1 files changed, 59 insertions, 95 deletions
diff --git a/webapp/polls/views.py b/webapp/polls/views.py index c19eac1..526cabc 100644 --- a/webapp/polls/views.py +++ b/webapp/polls/views.py @@ -1,7 +1,6 @@ +# pylint: disable=C0111 # -*- encoding: utf-8 -*- import os -import json -import StringIO import warnings from importlib import import_module @@ -23,11 +22,9 @@ from django.conf import settings from utils.forms import BadFormValidation from utils.data_structure import dict_merge -from polls.models import (WIDGET_TYPES, Structure, Poll, PollResult, - PollResultFile) +from polls.models import (WIDGET_TYPES, Structure, Poll, PollResultFile) from polls.models import is_image_file from polls.forms import PollForm -from pollster.models import Pollster module_path = settings.CLOCK_CLASS.split('.')[:-1] @@ -357,102 +354,69 @@ class UnploadPollResultFormView(TemplateView): template_name = "poll-result-form.html" - def post(self, request, *args, **kwargs): + def post(self, request, *args, **kwargs): # pylint: disable=W0613 context = self.get_context_data() + user = request.user files = dict(request.FILES.lists()).get('result', []) - # si se subió algún archivo: - if len(files): - # Esto hace todo - - to_json = [] - - # genera una lista de dict python en to_json - for file in files: - json_dst = StringIO.StringIO() - for chunk in file.chunks(): - json_dst.write(chunk) - json_dst.seek(0) - to_json.append(json.load(json_dst, 'utf-8')) - file.seek(0) - - # comprueba si los archivos ya existían y los excluye - poll_id = to_json[0].get("poll_id", None) - results_path = "%s/%s" % (settings.RESULT_BCK_ROOT, poll_id) - uploaded_files = [] - for index, file in enumerate(files): - file_path = "%s/%s" % (results_path, file.name) - if os.path.exists(file_path): - uploaded_files.append(file.name) - del files[index] - - if len(uploaded_files): - msg = u'Los siguientes resultados ya se encuentran \ - publicados: %s y no serán procesados.' % ( - ", ".join(uploaded_files)) - messages.add_message(self.request, messages.INFO, msg) - - # si no hay más archivos, vuelve al usuario - if not len(files): - return self.render_to_response(context) - - # revisa si el primero de los archivos es del usuario actual - # si no, vuelve al usuario - if len(to_json): - pollster_id = to_json[0].get("pollster_id", None) - if str(request.user.pollster.id) != pollster_id: - pollster_username = to_json[0].get( - "pollster_username", None) - if not pollster_username: - pollster_username = "Desconocido!" - msg = u'El sistema cree que este archivo resultado \ - no pertence a una encuesta realizada por usted. \ - Asegúrese de estar usando el mismo usuario que \ - utilizó para descargar este modelo de encuesta. \ - Usuario esperado: %s.' % pollster_username - messages.add_message(request, messages.ERROR, msg) - return self.render_to_response(context) - - # crea un poll result con todos los archivos implicados - poll_result = PollResult(to_json) - - poll = poll_result.get_poll() - pollster = Pollster.get_by_user_id(request.user.id) - - # valida que el pollster esté asignado a la poll en cuestión - assigned_polls_id = [ - p.id for p in poll.assigned_to_pollster(pollster)] - - if poll.id not in assigned_polls_id: - msg = u'Estos son resultados de una encuesta \ - que no le fué asignada.' + if not len(files): + msg = u'Necesita seleccionar un archivo.' + messages.add_message(self.request, messages.INFO, msg) + + processed_files = [] + existing = [] + not_authored_by_user = [] + poll_not_assigned_to_user = [] + + date_time_string = Clock.get_time_string() + for file_ in files: + file_name = file_.name + tmp_file_path = file_.temporary_file_path() + try: + prf = PollResultFile(tmp_file_path) + if prf.exists(): + existing.append(file_name) + elif not prf.is_authored_by(user): + not_authored_by_user.append(file_name) + elif not prf.poll_is_assigned_to(user): + poll_not_assigned_to_user.append(file_name) + else: + prf.name = file_name + prf.set_upload_timestamp(date_time_string) + prf.save() + processed_files.append(file_name) + except ValueError: + fname = file_.name + msg = u'{0}: No es un .poll_result válido.'.format(fname) messages.add_message(self.request, messages.ERROR, msg) - else: - # End validations - - date_time_string = Clock.get_time_string() - uploaded_files = [ - (f.name, f.temporary_file_path()) for f in files - ] - for name, path in uploaded_files: - result_file = PollResultFile(path) - result_file.name = name - result_file.set_upload_timestamp(date_time_string) - result_file.save() - - processed_files = [file.name for file in files] - messages.add_message( - self.request, - messages.SUCCESS, - u'Los resultados se guardaron con éxito.\ - Los siguientes archivos fueron procesados: \ - %s' % ", ".join(processed_files) - ) - # si no hay ningún archivo - else: - msg = u'Necesita seleccionar un archivo.' + if len(existing): + msg = u'Los siguientes resultados ya se encuentran \ + publicados: %s y no serán procesados.' % (", ".join(existing)) messages.add_message(self.request, messages.INFO, msg) + if len(not_authored_by_user): + msg = u'El sistema cree que estos archivos no pertencen a una \ + encuesta realizada por usted: {0}'.format( + ", ".join(not_authored_by_user) + ) + messages.add_message(request, messages.ERROR, msg) + + if len(poll_not_assigned_to_user): + msg = u'Estos son resultados de una encuesta \ + que no le fué asignada. {0}'.format( + ", ".join(poll_not_assigned_to_user) + ) + messages.add_message(self.request, messages.ERROR, msg) + + if len(processed_files): + messages.add_message( + self.request, + messages.SUCCESS, + u'Los resultados se guardaron con éxito.\ + Los siguientes archivos fueron procesados: \ + %s' % ", ".join(processed_files) + ) + return self.render_to_response(context) |