summaryrefslogtreecommitdiff
path: root/yaksh/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'yaksh/models.py')
-rw-r--r--yaksh/models.py46
1 files changed, 39 insertions, 7 deletions
diff --git a/yaksh/models.py b/yaksh/models.py
index 73d4b27..d626b26 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -10,9 +10,13 @@ from django.forms.models import model_to_dict
from django.contrib.contenttypes.models import ContentType
from taggit.managers import TaggableManager
from django.utils import timezone
+from django.core.files import File
+from StringIO import StringIO
import pytz
import os
import shutil
+import zipfile
+
languages = (
("python", "Python"),
@@ -231,27 +235,32 @@ class Question(models.Model):
def dump_into_json(self, question_ids, user):
questions = Question.objects.filter(id__in=question_ids, user_id=user.id)
questions_dict = []
+ zip_file_name = StringIO()
+ zip_file = zipfile.ZipFile(zip_file_name, "a")
for question in questions:
test_case = question.get_test_cases()
+ files = question._add_and_get_files(zip_file)
q_dict = {'summary': question.summary,
'description': question.description,
- 'points': question.points,
- 'language': question.language,
- 'type': question.type,
- 'active': question.active,
+ 'points': question.points, 'language': question.language,
+ 'type': question.type, 'active': question.active,
'test_case_type': question.test_case_type,
'snippet': question.snippet,
- 'testcase': [case.get_field_value() for case in test_case]}
+ 'testcase': [case.get_field_value() for case in test_case],
+ 'files': files}
questions_dict.append(q_dict)
-
- return json.dumps(questions_dict, indent=2)
+ question._add_json_to_zip(zip_file, questions_dict)
+ return zip_file_name
def load_from_json(self, questions_list, user):
questions = json.loads(questions_list)
+ ques = Question()
for question in questions:
question['user'] = user
+ files = question.pop('files')
test_cases = question.pop('testcase')
que, result = Question.objects.get_or_create(**question)
+ que._add_files_to_db(files)
model_class = get_model_class(que.test_case_type)
for test_case in test_cases:
model_class.objects.get_or_create(question=que, **test_case)
@@ -278,6 +287,29 @@ class Question(models.Model):
return test_case
+ def _add_and_get_files(self, zip_file):
+ files = FileUpload.objects.filter(question=self)
+ for file in files:
+ zip_file.write(file.file.path, (os.path.basename(file.file.path)))
+ files_list = [os.path.basename(file.file.name) for file in files]
+ return files_list
+
+ def _add_files_to_db(self, files):
+ if files:
+ for file_name in files:
+ file = open(file_name, 'r')
+ django_file = File(file)
+ f = FileUpload.objects.get_or_create(file=django_file, question=self)
+ os.remove(file_name)
+
+ def _add_json_to_zip(self, zip_file, q_dict):
+ json_data = json.dumps(q_dict, indent=2)
+ with open("questions_dump.json", "w") as json_file:
+ json_file.write(json_data)
+ zip_file.write(json_file.name)
+ zip_file.close()
+ os.remove(json_file.name)
+
def __unicode__(self):
return self.summary