Skip to content

Commit d22aeb4

Browse files
committed
saving to django model(s)
1 parent 89e1174 commit d22aeb4

File tree

6 files changed

+74
-14
lines changed

6 files changed

+74
-14
lines changed

README.rst

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,7 @@ Fonts, colors and charts are not supported.
6161

6262
Installation
6363
============
64-
You can install it via pip::
65-
66-
$ pip install django-excel
67-
68-
69-
or clone it and install it::
64+
You can install it from github only for now:
7065

7166
$ git clone http://github.com/chfw/django-pyexcel.git
7267
$ cd django-excel

django_excel/__init__.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,20 @@ def load_single_sheet(self, sheet_name=None, **keywords):
1616
def load_book(self):
1717
return pe.load_book_from_memory(self._get_file_extension(), self.file.read())
1818

19+
def save_to_database(self, model=None,
20+
sheet_name=None, name_columns_by_row=0, name_rows_by_column=-1, **keywords):
21+
sheet = self.load_single_sheet(sheet_name=sheet_name,
22+
name_columns_by_row=name_columns_by_row,
23+
name_rows_by_column=name_rows_by_column,
24+
**keywords)
25+
if sheet:
26+
sheet.save_to_django_model(model)
27+
28+
def save_book_to_database(self, models=None, **keywords):
29+
book = self.load_book(**keywords)
30+
if book:
31+
book.save_to_django_models(models)
32+
1933

2034
class ExcelInMemoryUploadedFile(ExcelMixin, InMemoryUploadedFile):
2135
pass
@@ -58,6 +72,12 @@ def new_file(self, file_name, *args, **kwargs):
5872
make_response_from_dict,
5973
make_response_from_records,
6074
make_response_from_book_dict,
61-
make_response_from_a_table,
62-
make_response_from_tables
6375
)
76+
77+
def make_response_from_a_model(model, file_type, status=200, **keywords):
78+
sheet = pe.get_sheet(model, **keywords)
79+
return make_response(sheet, file_type, status, **keywords)
80+
81+
def make_response_from_models(models, file_type, status=200, **keywords):
82+
book = pe.get_book(models, **keywords)
83+
return make_response(book, file_type, status, **keywords)

doc/source/index.rst

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,7 @@ Then run the test application::
5858
Performing system checks...
5959
6060
System check identified no issues (0 silenced).
61-
62-
You have unapplied migrations; your app may not work properly until they are applied.
63-
Run 'python manage.py migrate' to apply them.
64-
January 27, 2015 - 17:57:03
61+
January 29, 2015 - 18:11:06
6562
Django version 1.7.1, using settings 'mysite.settings'
6663
Starting development server at http://127.0.0.1:8000/
6764
Quit the server with CTRL-BREAK.

polls/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
class Question(models.Model):
55
question_text = models.CharField(max_length=200)
66
pub_date = models.DateTimeField('date published')
7+
slug = models.CharField(max_length=10, unique=True, default="question")
78

89

910
class Choice(models.Model):

polls/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@
77
url(r'^$', views.upload, name='uplink'),
88
url(r'^download/(.*)', views.download, name="download"),
99
url(r'^exchange/(.*)', views.exchange, name="exchange"),
10-
url(r'^parse/(.*)', views.parse, name="parse")
10+
url(r'^parse/(.*)', views.parse, name="parse"),
11+
url(r'^import/', views.import_data, name="import"),
12+
url(r'^export/(.*)', views.export_data, name="export")
1113
)

polls/views.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from django.shortcuts import render_to_response
2-
from django.http import HttpResponseBadRequest, JsonResponse
2+
from django.http import HttpResponseBadRequest, JsonResponse, HttpResponse
33
from django import forms
44
from django.template import RequestContext
55
import django_excel as excel
6+
from polls.models import Question, Choice
67
import pyexcel.ext.xls
78
import pyexcel.ext.xlsx
89
import sys
@@ -37,6 +38,50 @@ def download(request, file_type):
3738
sheet = excel.pe.Sheet(data)
3839
return excel.make_response(sheet, file_type)
3940

41+
def export_data(request, atype):
42+
if atype == "sheet":
43+
return excel.make_response_from_a_model(Question, 'csv')
44+
elif atype == "book":
45+
return excel.make_response_from_a_model([Question, Choice], 'csv')
46+
47+
def import_data(request):
48+
if request.method == "POST":
49+
form = UploadFileForm(request.POST, request.FILES)
50+
def choice_func(row):
51+
print row[0]
52+
q = Question.objects.filter(slug=row[0])[0]
53+
row[0] = q
54+
return row
55+
if form.is_valid():
56+
request.FILES['file'].save_book_to_database(
57+
models=[
58+
(Question, ['question_text', 'pub_date', 'slug'], None, 0),
59+
(Choice, ['question', 'choice_text', 'votes'], choice_func, 0)
60+
]
61+
)
62+
return HttpResponse("OK")
63+
else:
64+
return HttpResponseBadRequest()
65+
else:
66+
form = UploadFileForm()
67+
return render_to_response('upload_form.html', {'form': form}, context_instance=RequestContext(request))
68+
69+
70+
def import_dataa(request):
71+
if request.method == "POST":
72+
form = UploadFileForm(request.POST, request.FILES)
73+
if form.is_valid():
74+
request.FILES['file'].save_to_database(
75+
model=(Question,
76+
['question_text', 'pub_date']))
77+
return HttpResponse("OK")
78+
else:
79+
return HttpResponseBadRequest()
80+
else:
81+
form = UploadFileForm()
82+
return render_to_response('upload_form.html', {'form': form}, context_instance=RequestContext(request))
83+
84+
4085
def exchange(request, file_type):
4186
form = UploadFileForm(request.POST, request.FILES)
4287
if form.is_valid():

0 commit comments

Comments
 (0)