Skip to content

Commit 31fe1d3

Browse files
committed
enable isave_as and isave_book_as to save SheetStream and BookStream to django model(s)
1 parent 22c8b35 commit 31fe1d3

File tree

5 files changed

+139
-2
lines changed

5 files changed

+139
-2
lines changed

django_excel/__init__.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,31 @@ def save_book_to_database(self, models=None, initializers=None,
6161
params['dest_batch_size'] = batch_size
6262
pe.save_book_as(**params)
6363

64+
def isave_to_database(self, model=None, initializer=None, mapdict=None,
65+
**keywords):
66+
"""
67+
Save data from a sheet to a nominated django model
68+
"""
69+
params = self.get_params(**keywords)
70+
params['dest_model'] = model
71+
params['dest_initializer'] = initializer
72+
params['dest_mapdict'] = mapdict
73+
pe.isave_as(**params)
74+
self.free_resources()
75+
76+
def isave_book_to_database(self, models=None, initializers=None,
77+
mapdicts=None, batch_size=None,
78+
**keywords):
79+
"""
80+
Save data from a book to a nominated django models
81+
"""
82+
params = self.get_params(**keywords)
83+
params['dest_models'] = models
84+
params['dest_initializers'] = initializers
85+
params['dest_mapdicts'] = mapdicts
86+
params['dest_batch_size'] = batch_size
87+
pe.isave_book_as(**params)
88+
6489

6590
class ExcelInMemoryUploadedFile(ExcelMixin, InMemoryUploadedFile):
6691
"""
@@ -135,7 +160,7 @@ def _make_response(content, content_type, status, file_name=None):
135160
return response
136161

137162

138-
webio.ExcelResponse = _make_response
163+
webio.init_webio(_make_response)
139164

140165

141166
from pyexcel_webio import ( # noqa

polls/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,10 @@
2323
# survey_result
2424
url('^survey_result/',
2525
views.survey_result, name='survey_result'),
26+
27+
# testing purpose
28+
url(r'^import_using_isave/',
29+
views.import_data_using_isave_book_as),
30+
url(r'^import_sheet_using_isave/',
31+
views.import_sheet_using_isave_to_database)
2632
]

polls/views.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,38 @@ def choice_func(row):
101101
})
102102

103103

104+
def import_data_using_isave_book_as(request):
105+
if request.method == "POST":
106+
form = UploadFileForm(request.POST,
107+
request.FILES)
108+
109+
def choice_func(row):
110+
q = Question.objects.filter(slug=row[0])[0]
111+
row[0] = q
112+
return row
113+
if form.is_valid():
114+
request.FILES['file'].save_book_to_database(
115+
models=[Question, Choice],
116+
initializers=[None, choice_func],
117+
mapdicts=[
118+
['question_text', 'pub_date', 'slug'],
119+
['question', 'choice_text', 'votes']]
120+
)
121+
return redirect('handson_view')
122+
else:
123+
return HttpResponseBadRequest()
124+
else:
125+
form = UploadFileForm()
126+
return render(
127+
request,
128+
'upload_form.html',
129+
{
130+
'form': form,
131+
'title': 'Import excel data into database example',
132+
'header': 'Please upload sample-data.xls:'
133+
})
134+
135+
104136
def import_sheet(request):
105137
if request.method == "POST":
106138
form = UploadFileForm(request.POST,
@@ -121,6 +153,25 @@ def import_sheet(request):
121153
{'form': form})
122154

123155

156+
def import_sheet_using_isave_to_database(request):
157+
if request.method == "POST":
158+
form = UploadFileForm(request.POST,
159+
request.FILES)
160+
if form.is_valid():
161+
request.FILES['file'].isave_to_database(
162+
model=Question,
163+
mapdict=['question_text', 'pub_date', 'slug'])
164+
return HttpResponse("OK")
165+
else:
166+
return HttpResponseBadRequest()
167+
else:
168+
form = UploadFileForm()
169+
return render(
170+
request,
171+
'upload_form.html',
172+
{'form': form})
173+
174+
124175
def exchange(request, file_type):
125176
form = UploadFileForm(request.POST, request.FILES)
126177
if form.is_valid():

sample-sheet-for-isave.xls

5.5 KB
Binary file not shown.

testResponse.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ def test_exchange(self):
162162
tmp_filename = "test.%s" % in_file_type
163163
sheet.save_as(tmp_filename)
164164
for file_type in FILE_TYPE_MIME_TABLE.keys():
165-
print("Post %s -> Respond %s" % (in_file_type, file_type))
166165
with open(tmp_filename, "rb") as fp:
167166
response = self.client.post(
168167
'/polls/exchange/'+file_type,
@@ -219,6 +218,43 @@ def testBook(self):
219218
+---------------+----+-------------+-------+""").strip('\n') # noqa
220219
self.assertEqual(str(book), content)
221220

221+
def testBookUsingIsave(self):
222+
fp = open(self.testfile, "rb")
223+
response = self.client.post('/polls/import_using_isave/',
224+
data={"file": fp})
225+
eq_(response.status_code, 302)
226+
response2 = self.client.get('/polls/export/book')
227+
assert response2.status_code == 200
228+
book = pe.get_book(file_type='xls', file_content=response2.content)
229+
content = dedent("""
230+
question:
231+
+----+---------------------------+----------------------------------------------+----------+
232+
| id | pub_date | question_text | slug |
233+
+----+---------------------------+----------------------------------------------+----------+
234+
| 1 | 2015-01-28T00:00:00+00:00 | What is your favourite programming language? | language |
235+
+----+---------------------------+----------------------------------------------+----------+
236+
| 2 | 2015-01-29T00:00:00+00:00 | What is your favourite IDE? | ide |
237+
+----+---------------------------+----------------------------------------------+----------+
238+
choice:
239+
+---------------+----+-------------+-------+
240+
| choice_text | id | question_id | votes |
241+
+---------------+----+-------------+-------+
242+
| Java | 1 | 1 | 0 |
243+
+---------------+----+-------------+-------+
244+
| C++ | 2 | 1 | 0 |
245+
+---------------+----+-------------+-------+
246+
| C | 3 | 1 | 0 |
247+
+---------------+----+-------------+-------+
248+
| Eclipse | 4 | 2 | 0 |
249+
+---------------+----+-------------+-------+
250+
| Visual Studio | 5 | 2 | 0 |
251+
+---------------+----+-------------+-------+
252+
| PyCharm | 6 | 2 | 0 |
253+
+---------------+----+-------------+-------+
254+
| IntelliJ | 7 | 2 | 0 |
255+
+---------------+----+-------------+-------+""").strip('\n') # noqa
256+
self.assertEqual(str(book), content)
257+
222258
def testSheet(self):
223259
fp = open(self.testfile, "rb")
224260
response = self.client.post('/polls/import/', data={"file": fp})
@@ -255,6 +291,25 @@ def testImportSheet(self):
255291
+----+---------------------------+----------------------------------------------+----------+""").strip('\n') # noqa
256292
self.assertEqual(str(sheet), content)
257293

294+
def testImportSheetUsingISave(self):
295+
fp = open("sample-sheet-for-isave.xls", "rb")
296+
response = self.client.post('/polls/import_sheet_using_isave/',
297+
data={"file": fp})
298+
eq_(response.status_code, 200)
299+
response2 = self.client.get('/polls/export/sheet')
300+
eq_(response2.status_code, 200)
301+
sheet = pe.get_sheet(file_type='xls', file_content=response2.content)
302+
content = dedent("""
303+
question:
304+
+----+---------------------------+----------------------------------------------+----------+
305+
| id | pub_date | question_text | slug |
306+
+----+---------------------------+----------------------------------------------+----------+
307+
| 1 | 2015-01-28T00:00:00+00:00 | What is your favourite programming language? | language |
308+
+----+---------------------------+----------------------------------------------+----------+
309+
| 2 | 2015-01-29T00:00:00+00:00 | What is your favourite IDE? | ide |
310+
+----+---------------------------+----------------------------------------------+----------+""").strip('\n') # noqa
311+
self.assertEqual(str(sheet), content)
312+
258313
def testCustomExport(self):
259314
fp = open(self.testfile, "rb")
260315
response = self.client.post('/polls/import/', data={"file": fp})

0 commit comments

Comments
 (0)