Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRogelio Mita <rogeliomita@activitycentral.com>2013-03-21 18:23:16 (GMT)
committer Rogelio Mita <rogeliomita@activitycentral.com>2013-03-25 21:51:48 (GMT)
commit01b45aeaf600ef7b03e0ed11f3f27c9fb4aecdf1 (patch)
treebac456b5f923be15b411bbee62262d544c9cd7a5
parentd410ee31a77a4cb3cc31cc589d079a2370ee5095 (diff)
Refactoring
-rw-r--r--webapp/polls/models.py90
-rw-r--r--webapp/polls/templates/poll-structure-form.html2
-rw-r--r--webapp/polls/tests.py1
-rw-r--r--webapp/polls/views.py37
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})