diff options
author | Rogelio Mita <rogeliomita@activitycentral.com> | 2013-03-21 18:23:16 (GMT) |
---|---|---|
committer | Rogelio Mita <rogeliomita@activitycentral.com> | 2013-03-25 21:51:48 (GMT) |
commit | 01b45aeaf600ef7b03e0ed11f3f27c9fb4aecdf1 (patch) | |
tree | bac456b5f923be15b411bbee62262d544c9cd7a5 | |
parent | d410ee31a77a4cb3cc31cc589d079a2370ee5095 (diff) |
Refactoring
-rw-r--r-- | webapp/polls/models.py | 90 | ||||
-rw-r--r-- | webapp/polls/templates/poll-structure-form.html | 2 | ||||
-rw-r--r-- | webapp/polls/tests.py | 1 | ||||
-rw-r--r-- | webapp/polls/views.py | 37 |
4 files changed, 95 insertions, 35 deletions
diff --git a/webapp/polls/models.py b/webapp/polls/models.py index dde35e6..de392d2 100644 --- a/webapp/polls/models.py +++ b/webapp/polls/models.py @@ -2,6 +2,7 @@ import time import json import os +import shutil from exceptions import * from bson import ObjectId, DBRef @@ -141,6 +142,10 @@ class Option(AbastractObject): self.img = img self.img_name = img_name + if not self.img_name and isinstance(self.img, InMemoryUploadedFile): + fileExtension = os.path.splitext(self.img.name)[1] + self.img_name = '%s%s' % (self.id, fileExtension) + @staticmethod def from_dict(data): option = Option( @@ -159,8 +164,9 @@ class Option(AbastractObject): try: ImageField().to_python(self.img) except DjangoValidationError, e: - img_name = self.img.name - self.errors.append('%s: %s' % (img_name, e.messages[0])) + self.errors.append('%s: %s' % (self.img.name, e.messages[0])) + self.img_name = None + self.img = None if len(self.errors): raise Option.ValidationError(str(self.errors)) @@ -340,12 +346,22 @@ class Structure(AbastractObject): self.poll = poll self.id = None + # Getting parent poll id + self._poll_id = getattr(poll, 'id', None) + if self.data and self._poll_id is None: + poll_dbref = data.get('poll', None) + poll_id = poll_dbref.id if poll_dbref else None + self._poll_id = str(poll_id) if poll_id else self._poll_id + self._poll_id = self.data.get('poll_id', self._poll_id) + + # Getting id _id = data.get('id', None) or data.get('_id', None) if _id and (isinstance(_id, str) or isinstance(_id, unicode)): self.id = ObjectId(_id) elif _id and isinstance(_id, ObjectId): self.id = _id + # Build model Structure obj based in dict data if self.data: # TODO: Revisar la key groups groups_info = data['groups'] @@ -359,6 +375,14 @@ class Structure(AbastractObject): group.add_field(field, field_order) self.add_group(group, group_order) + # Require: parent poll id !!! + if not self._poll_id: + raise Exception('INTERNAL ERROR: A structure need a poll id!') + + @property + def poll_id(self): + return self._poll_id + def add_group(self, group, order): order = int(order) groups_pre = self.groups[:order] @@ -482,12 +506,17 @@ class Structure(AbastractObject): return structure def get_image_options_tmp_path(self): - path = None + path = settings.IMAGE_OPTIONS_ROOT + '/%s/tmp' % self.poll_id - if self.id: - path = settings.IMAGE_OPTIONS_ROOT + '/%s/tmp' % self.id - else: - path = settings.IMAGE_OPTIONS_ROOT + '/tmp' + try: + os.makedirs(path) + except OSError: + pass + + return path + + def get_image_options_path(self): + path = settings.IMAGE_OPTIONS_ROOT + '/%s' % self.poll_id try: os.makedirs(path) @@ -499,23 +528,26 @@ class Structure(AbastractObject): def get_image_options_tmp_media_url(self): media_url = None - if self.id: - media_url = settings.IMAGE_OPTIONS_MEDIA_URL + '/%s/tmp' % self.id - else: - media_url = settings.IMAGE_OPTIONS_MEDIA_URL + '/tmp' + media_url = settings.IMAGE_OPTIONS_MEDIA_URL + '/%s/tmp' % self.poll_id return media_url + def rollback(self): + tmp_path = self.get_image_options_tmp_path() + path = self.get_image_options_path() + for file in os.listdir(path): + if file != "tmp": + src_file = os.path.join(path, file) + dst_file = os.path.join(tmp_path, file) + shutil.move(src_file, dst_file) + def storing_image_options(self, path, options): for img_opt in options: if isinstance(img_opt.img, InMemoryUploadedFile): - fileExtension = os.path.splitext(img_opt.img.name)[1] - opt_img_name = '%s%s' % (img_opt.id, fileExtension) - with open(path + '/%s' % opt_img_name, 'wb+') as dst: + with open(path + '/%s' % img_opt.img_name, 'wb+') as dst: for chunk in img_opt.img.chunks(): dst.write(chunk) dst.close() - img_opt.img_name = opt_img_name def save_image_options(self, tmp=False): fields = reduce( @@ -525,11 +557,23 @@ class Structure(AbastractObject): valid_img_options = filter(lambda opt: not len(opt.errors), options) - if tmp: - path = self.get_image_options_tmp_path() - try: - os.makedirs(path) - except OSError: - pass - - self.storing_image_options(path, valid_img_options) + tmp_path = self.get_image_options_tmp_path() + + if len(valid_img_options): + if tmp: + self.storing_image_options(tmp_path, valid_img_options) + else: + path = self.get_image_options_path() + self.storing_image_options(path, valid_img_options) + + # Moving tmp images options to the final place for store them + for img_opt in valid_img_options: + src = '%s/%s' % (tmp_path, img_opt.img_name) + dst = '%s/%s' % (path, img_opt.img_name) + try: + shutil.move(src, dst) + except Exception: + # TODO: LOG orphan img options + pass + + os.removedirs(tmp_path) diff --git a/webapp/polls/templates/poll-structure-form.html b/webapp/polls/templates/poll-structure-form.html index 7724946..6a0a44e 100644 --- a/webapp/polls/templates/poll-structure-form.html +++ b/webapp/polls/templates/poll-structure-form.html @@ -36,6 +36,8 @@ <form class="form-inline" method="post" action="" enctype="multipart/form-data"> + <input type="hidden" name="poll_id" value="{{ poll.id }}" > + {% if structure.id %} <input type="hidden" name="id" value="{{ structure.id }}" /> {% endif %} diff --git a/webapp/polls/tests.py b/webapp/polls/tests.py index e472e25..74bf10d 100644 --- a/webapp/polls/tests.py +++ b/webapp/polls/tests.py @@ -274,6 +274,7 @@ class StructureTests(MongoTestCase): self.poll = Poll.get(id=poll_id) self.data = { + 'poll_id': 'POLL_ID', 'groups': { '0': { 'name': 'group_0', diff --git a/webapp/polls/views.py b/webapp/polls/views.py index 2a26390..673f903 100644 --- a/webapp/polls/views.py +++ b/webapp/polls/views.py @@ -116,7 +116,8 @@ class StructureFormView(TemplateView): {'poll.$id': self.poll.id}) structure_data = structure_data if structure_data else {} - context.update({'structure': Structure(data=structure_data)}) + context.update( + {'structure': Structure(data=structure_data, poll=self.poll)}) return self.render_to_response(context) @@ -151,17 +152,29 @@ class StructureFormView(TemplateView): ) if structure.is_valid(): - structure.save() - - messages.add_message( - self.request, - messages.SUCCESS, - u'La estructura de la encuesta "%s" fué' - ' guardada correctamente.' % self.poll.name - ) - return HttpResponseRedirect( - reverse('polls:success', kwargs={"poll_id": str(self.poll.id)}) - ) + try: + structure.save_image_options(tmp=False) + structure.save() + except Exception: + msg = u'Ocurrió un error, no se guardó la estructura.' + messages.add_message(self.request, messages.ERROR, msg) + + # Rollback img options to tmp directory + structure.rollback() + else: + messages.add_message( + self.request, + messages.SUCCESS, + u'La estructura de la encuesta "%s" fué' + ' guardada correctamente.' % self.poll.name + ) + + return HttpResponseRedirect( + reverse( + 'polls:success', + kwargs={"poll_id": str(self.poll.id)} + ) + ) else: structure.save_image_options(tmp=True) context.update({'errors': structure.errors}) |