From 8fb62852e0289d826f750a72c32e909844a14d8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Dubas?= Date: Wed, 18 Sep 2013 15:09:26 -0300 Subject: [PATCH 01/31] Separate serialiazation and json response from view processing. --- fileupload/response.py | 27 +++++++++++++++ fileupload/serialize.py | 36 +++++++++++++++++++ fileupload/views.py | 77 ++++++++++++----------------------------- 3 files changed, 86 insertions(+), 54 deletions(-) create mode 100644 fileupload/response.py create mode 100644 fileupload/serialize.py diff --git a/fileupload/response.py b/fileupload/response.py new file mode 100644 index 0000000..26324be --- /dev/null +++ b/fileupload/response.py @@ -0,0 +1,27 @@ +# encoding: utf-8 +from django.http import HttpResponse +from django.utils import simplejson + +MIMEANY = '*/*' +MIMEJSON = 'application/json' +MIMETEXT = 'text/plain' + + +def response_mimetype(request): + """response_mimetype -- Return a proper response mimetype, accordingly to + what the client accepts, as available in the `HTTP_ACCEPT` header. + + request -- a HttpRequest instance. + + """ + can_json = MIMEJSON in request.META['HTTP_ACCEPT'] + can_json |= MIMEANY in request.META['HTTP_ACCEPT'] + return MIMEJSON if can_json else MIMETEXT + + +class JSONResponse(HttpResponse): + """JSON response class.""" + def __init__(self, obj='', json_opts=None, mimetype=MIMEJSON, *args, **kwargs): + json_opts = json_opts if isinstance(json_opts, dict) else {} + content = simplejson.dumps(obj, **json_opts) + super(JSONResponse, self).__init__(content, mimetype, *args, **kwargs) diff --git a/fileupload/serialize.py b/fileupload/serialize.py new file mode 100644 index 0000000..f746c83 --- /dev/null +++ b/fileupload/serialize.py @@ -0,0 +1,36 @@ +# encoding: utf-8 +import mimetypes +import re +from django.core.urlresolvers import reverse + + +def order_name(name): + """order_name -- Limit the name to 20 chars length, and convert to a + ellipsed string. + + name -- text to be limited. + + """ + name = re.sub (r'^.*/', '', name) + if len(name)>20: + return name[:10] + "..." + name[-7:] + else: + return name + + +def serialize(instance): + """serialize -- Serialize a Picture instance into a `json` object. + + instance -- Picture instance + """ + return { + 'url': instance.file.url, + 'name': order_name(instance.file.name), + 'type': mimetypes.guess_type(instance.file.path)[0] or 'image/png', + 'thumbnailUrl': instance.file.url, + 'size': instance.file.size, + 'deleteUrl': reverse('upload-delete', args=[instance.pk]), + 'deleteType': 'DELETE', + } + + diff --git a/fileupload/views.py b/fileupload/views.py index 18a9dc8..20e09d2 100644 --- a/fileupload/views.py +++ b/fileupload/views.py @@ -1,86 +1,55 @@ -from fileupload.models import Picture -from django.views.generic import CreateView, DeleteView +# encoding: utf-8 +from django.views.generic import CreateView, DeleteView, View +from .models import Picture +from .response import JSONResponse, response_mimetype +from .serialize import serialize -from django.http import HttpResponse, HttpResponseRedirect -from django.utils import simplejson -from django.core.urlresolvers import reverse - -from django.conf import settings -import re - -def response_mimetype(request): - if "application/json" in request.META['HTTP_ACCEPT']: - return "application/json" - else: - return "text/plain" - -def orderName(name): - name = re.sub (r'^.*/', '', name) - if len(name)>20: - return name[:10] + "..." + name[-7:] - else: - return name class PictureCreateView(CreateView): model = Picture def form_valid(self, form): self.object = form.save() - f = self.request.FILES.get('file') - files = [{ - 'url': self.object.file.url, - 'name': orderName(f.name), - "type": "image/png", - 'thumbnailUrl': self.object.file.url, - 'size': f.size, - 'deleteUrl': reverse('upload-delete', args=[self.object.id]), - 'deleteType': "DELETE", - }] + files = [serialize(self.object)] data = {"files": files} - response = JSONResponse(data, {}, response_mimetype(self.request)) + response = JSONResponse(data, mimetype=response_mimetype(self.request)) response['Content-Disposition'] = 'inline; filename=files.json' return response + class BasicVersionCreateView(PictureCreateView): template_name_suffix = '_basic_form' + class BasicPlusVersionCreateView(PictureCreateView): template_name_suffix = '_basicplus_form' + class AngularVersionCreateView(PictureCreateView): template_name_suffix = '_angular_form' + class jQueryVersionCreateView(PictureCreateView): template_name_suffix = '_jquery_form' + class PictureDeleteView(DeleteView): model = Picture def delete(self, request, *args, **kwargs): self.object = self.get_object() self.object.delete() - response = JSONResponse(True, {}, response_mimetype(self.request)) + response = JSONResponse(True, mimetype=response_mimetype(request)) response['Content-Disposition'] = 'inline; filename=files.json' return response -def PictureListView(request): - files = [] - for obj in Picture.objects.all(): - files += [{ - 'name': orderName(obj.file.name), - 'size': obj.file.size, - 'url': obj.file.url, - 'thumbnailUrl': obj.file.url, - 'deleteUrl': reverse('upload-delete', args=[obj.id]), - 'deleteType': "DELETE" - }] - data = {"files": files} - response = JSONResponse(data, {}, response_mimetype(request)) - response['Content-Disposition'] = 'inline; filename=files.json' - return response - -class JSONResponse(HttpResponse): - """JSON response class.""" - def __init__(self,obj='',json_opts={},mimetype="application/json",*args,**kwargs): - content = simplejson.dumps(obj,**json_opts) - super(JSONResponse,self).__init__(content,mimetype,*args,**kwargs) + +class PictureListView(View): + def get(self, request, *args, **kwargs): + files = [] + for obj in Picture.objects.all(): + files.append(serialize(obj)) + data = {'files': files} + response = JSONResponse(data, mimetype=response_mimetype(request)) + response['Content-Disposition'] = 'inline; filename=files.json' + return response From cf8c3f139c04295939032e85eae37ade46ca4611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Dubas?= Date: Wed, 18 Sep 2013 15:10:36 -0300 Subject: [PATCH 02/31] Improve urls formatting. --- fileupload/urls.py | 49 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/fileupload/urls.py b/fileupload/urls.py index bfdf903..4e43070 100644 --- a/fileupload/urls.py +++ b/fileupload/urls.py @@ -1,15 +1,42 @@ from django.conf.urls import patterns, url -from fileupload.views import BasicVersionCreateView, BasicPlusVersionCreateView, PictureCreateView, AngularVersionCreateView, jQueryVersionCreateView, PictureDeleteView +from .views import (BasicVersionCreateView, BasicPlusVersionCreateView, + PictureCreateView, AngularVersionCreateView, jQueryVersionCreateView, + PictureDeleteView, PictureListView) urlpatterns = patterns('', - (r'^basic/$', BasicVersionCreateView.as_view(), {}, 'upload-basic'), - (r'^basic/plus/$', BasicPlusVersionCreateView.as_view(), {}, 'upload-basic-plus'), - (r'^new/$', PictureCreateView.as_view(), {}, 'upload-new'), - (r'^angular/$', AngularVersionCreateView.as_view(), {}, 'upload-angular'), - (r'^jquery-ui/$', jQueryVersionCreateView.as_view(), {}, 'upload-jquery'), - (r'^delete/(?P\d+)$', PictureDeleteView.as_view(), {}, 'upload-delete'), - url(r'^view/$', 'fileupload.views.PictureListView', name='upload-view'), + url( + r'^basic/$', + BasicVersionCreateView.as_view(), + name='upload-basic' + ), + url( + r'^basic/plus/$', + BasicPlusVersionCreateView.as_view(), + name='upload-basic-plus' + ), + url( + r'^new/$', + PictureCreateView.as_view(), + name='upload-new' + ), + url( + r'^angular/$', + AngularVersionCreateView.as_view(), + name='upload-angular' + ), + url( + r'^jquery-ui/$', + jQueryVersionCreateView.as_view(), + name='upload-jquery' + ), + url( + r'^delete/(?P\d+)$', + PictureDeleteView.as_view(), + name='upload-delete' + ), + url( + r'^view/$', + PictureListView.as_view(), + name='upload-view' + ), ) - - - From b3ece12190a414f62cb913f6f13468e35d795a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Dubas?= Date: Wed, 18 Sep 2013 15:18:11 -0300 Subject: [PATCH 03/31] Apply PEP8 formatting. --- fileupload/models.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/fileupload/models.py b/fileupload/models.py index 63a3b0e..f28d242 100644 --- a/fileupload/models.py +++ b/fileupload/models.py @@ -1,13 +1,14 @@ +# encoding: utf-8 from django.db import models -class Picture(models.Model): - # This is a small demo using just two fields. The slug field is really not - # necessary, but makes the code simpler. ImageField depends on PIL or - # pillow (where Pillow is easily installable in a virtualenv. If you have - # problems installing pillow, use a more generic FileField instead. +class Picture(models.Model): + """This is a small demo using just two fields. The slug field is really not + necessary, but makes the code simpler. ImageField depends on PIL or + pillow (where Pillow is easily installable in a virtualenv. If you have + problems installing pillow, use a more generic FileField instead. - #file = models.FileField(upload_to="pictures") + """ file = models.ImageField(upload_to="pictures") slug = models.SlugField(max_length=50, blank=True) @@ -22,7 +23,7 @@ def save(self, *args, **kwargs): self.slug = self.file.name super(Picture, self).save(*args, **kwargs) - # remove to leave file. def delete(self, *args, **kwargs): + """delete -- Remove to leave file.""" self.file.delete(False) super(Picture, self).delete(*args, **kwargs) From ef55de7907fa84ccc9da7bee7aae650a8c82eecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Dubas?= Date: Thu, 19 Sep 2013 08:11:26 -0300 Subject: [PATCH 04/31] Remove extra space for method call. --- fileupload/serialize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fileupload/serialize.py b/fileupload/serialize.py index f746c83..3244f8e 100644 --- a/fileupload/serialize.py +++ b/fileupload/serialize.py @@ -11,7 +11,7 @@ def order_name(name): name -- text to be limited. """ - name = re.sub (r'^.*/', '', name) + name = re.sub(r'^.*/', '', name) if len(name)>20: return name[:10] + "..." + name[-7:] else: From b612edf855a53c6924232c0adbc30a1a5ff28094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Dubas?= Date: Mon, 23 Sep 2013 17:16:53 -0300 Subject: [PATCH 05/31] Improve response documentation. --- fileupload/response.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/fileupload/response.py b/fileupload/response.py index 26324be..829685a 100644 --- a/fileupload/response.py +++ b/fileupload/response.py @@ -20,7 +20,18 @@ def response_mimetype(request): class JSONResponse(HttpResponse): - """JSON response class.""" + """JSONResponse -- Extends HTTPResponse to handle JSON format response. + + This response can be used in any view that should return a json stream of + data. + + Usage: + + def a_iew(request): + content = {'key': 'value'} + return JSONResponse(content, mimetype=response_mimetype(request)) + + """ def __init__(self, obj='', json_opts=None, mimetype=MIMEJSON, *args, **kwargs): json_opts = json_opts if isinstance(json_opts, dict) else {} content = simplejson.dumps(obj, **json_opts) From eaeaa6fb9bc328c9ee1012924ff0ac59d7590564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Dubas?= Date: Mon, 23 Sep 2013 17:17:22 -0300 Subject: [PATCH 06/31] Minor improvements in order_name and serialize methods. --- fileupload/serialize.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/fileupload/serialize.py b/fileupload/serialize.py index 3244f8e..4494e79 100644 --- a/fileupload/serialize.py +++ b/fileupload/serialize.py @@ -5,30 +5,32 @@ def order_name(name): - """order_name -- Limit the name to 20 chars length, and convert to a - ellipsed string. + """order_name -- Limit a text to 20 chars length, if necessary strips the + middle of the text and substitute it for an ellipsis. name -- text to be limited. """ name = re.sub(r'^.*/', '', name) - if len(name)>20: - return name[:10] + "..." + name[-7:] - else: + if len(name) <= 20: return name + return name[:10] + "..." + name[-7:] -def serialize(instance): - """serialize -- Serialize a Picture instance into a `json` object. +def serialize(instance, file_attr='file'): + """serialize -- Serialize a Picture instance into a dict. instance -- Picture instance + file_attr -- attribute name that contains the FileField or ImageField + """ + obj = getattr(instance, file_attr) return { - 'url': instance.file.url, - 'name': order_name(instance.file.name), - 'type': mimetypes.guess_type(instance.file.path)[0] or 'image/png', - 'thumbnailUrl': instance.file.url, - 'size': instance.file.size, + 'url': obj.url, + 'name': order_name(obj.name), + 'type': mimetypes.guess_type(obj.path)[0] or 'image/png', + 'thumbnailUrl': obj.url, + 'size': obj.size, 'deleteUrl': reverse('upload-delete', args=[instance.pk]), 'deleteType': 'DELETE', } From 650c6635e58988242e13fd20997af09c83a20954 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Dubas?= Date: Mon, 23 Sep 2013 17:17:42 -0300 Subject: [PATCH 07/31] Minor aesthetics changes. --- fileupload/urls.py | 1 + fileupload/views.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/fileupload/urls.py b/fileupload/urls.py index 4e43070..d6d6f7e 100644 --- a/fileupload/urls.py +++ b/fileupload/urls.py @@ -1,3 +1,4 @@ +# encoding: utf-8 from django.conf.urls import patterns, url from .views import (BasicVersionCreateView, BasicPlusVersionCreateView, PictureCreateView, AngularVersionCreateView, jQueryVersionCreateView, diff --git a/fileupload/views.py b/fileupload/views.py index 20e09d2..2b06e79 100644 --- a/fileupload/views.py +++ b/fileupload/views.py @@ -11,7 +11,7 @@ class PictureCreateView(CreateView): def form_valid(self, form): self.object = form.save() files = [serialize(self.object)] - data = {"files": files} + data = {'files': files} response = JSONResponse(data, mimetype=response_mimetype(self.request)) response['Content-Disposition'] = 'inline; filename=files.json' return response From 206991a376c0d7ee9d431c82323b1da72593708d Mon Sep 17 00:00:00 2001 From: ET-CS Date: Sat, 28 Sep 2013 15:55:50 +0300 Subject: [PATCH 08/31] Revert "Improve urls formatting." This reverts commit cf8c3f139c04295939032e85eae37ade46ca4611. --- fileupload/urls.py | 49 +++++++++++----------------------------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/fileupload/urls.py b/fileupload/urls.py index d6d6f7e..06de8ec 100644 --- a/fileupload/urls.py +++ b/fileupload/urls.py @@ -1,43 +1,16 @@ # encoding: utf-8 from django.conf.urls import patterns, url -from .views import (BasicVersionCreateView, BasicPlusVersionCreateView, - PictureCreateView, AngularVersionCreateView, jQueryVersionCreateView, - PictureDeleteView, PictureListView) +from fileupload.views import BasicVersionCreateView, BasicPlusVersionCreateView, PictureCreateView, AngularVersionCreateView, jQueryVersionCreateView, PictureDeleteView urlpatterns = patterns('', - url( - r'^basic/$', - BasicVersionCreateView.as_view(), - name='upload-basic' - ), - url( - r'^basic/plus/$', - BasicPlusVersionCreateView.as_view(), - name='upload-basic-plus' - ), - url( - r'^new/$', - PictureCreateView.as_view(), - name='upload-new' - ), - url( - r'^angular/$', - AngularVersionCreateView.as_view(), - name='upload-angular' - ), - url( - r'^jquery-ui/$', - jQueryVersionCreateView.as_view(), - name='upload-jquery' - ), - url( - r'^delete/(?P\d+)$', - PictureDeleteView.as_view(), - name='upload-delete' - ), - url( - r'^view/$', - PictureListView.as_view(), - name='upload-view' - ), + (r'^basic/$', BasicVersionCreateView.as_view(), {}, 'upload-basic'), + (r'^basic/plus/$', BasicPlusVersionCreateView.as_view(), {}, 'upload-basic-plus'), + (r'^new/$', PictureCreateView.as_view(), {}, 'upload-new'), + (r'^angular/$', AngularVersionCreateView.as_view(), {}, 'upload-angular'), + (r'^jquery-ui/$', jQueryVersionCreateView.as_view(), {}, 'upload-jquery'), + (r'^delete/(?P\d+)$', PictureDeleteView.as_view(), {}, 'upload-delete'), + url(r'^view/$', 'fileupload.views.PictureListView', name='upload-view'), ) + + + From a3ec02631204621719456bb6f1a5864f43d1d5f5 Mon Sep 17 00:00:00 2001 From: Sigurd Gartmann Date: Wed, 2 Oct 2013 13:08:34 +0200 Subject: [PATCH 09/31] Fix view that lists already uploaded files. Transform PictureListView to a generic ListView Fix url to use as_view() --- fileupload/urls.py | 8 ++++++-- fileupload/views.py | 14 +++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/fileupload/urls.py b/fileupload/urls.py index 06de8ec..21f48a3 100644 --- a/fileupload/urls.py +++ b/fileupload/urls.py @@ -1,6 +1,10 @@ # encoding: utf-8 from django.conf.urls import patterns, url -from fileupload.views import BasicVersionCreateView, BasicPlusVersionCreateView, PictureCreateView, AngularVersionCreateView, jQueryVersionCreateView, PictureDeleteView +from fileupload.views import ( + BasicVersionCreateView, BasicPlusVersionCreateView, + jQueryVersionCreateView, AngularVersionCreateView, + PictureCreateView, PictureDeleteView, PictureListView, + ) urlpatterns = patterns('', (r'^basic/$', BasicVersionCreateView.as_view(), {}, 'upload-basic'), @@ -9,7 +13,7 @@ (r'^angular/$', AngularVersionCreateView.as_view(), {}, 'upload-angular'), (r'^jquery-ui/$', jQueryVersionCreateView.as_view(), {}, 'upload-jquery'), (r'^delete/(?P\d+)$', PictureDeleteView.as_view(), {}, 'upload-delete'), - url(r'^view/$', 'fileupload.views.PictureListView', name='upload-view'), + url(r'^view/$', PictureListView.as_view(), name='upload-view'), ) diff --git a/fileupload/views.py b/fileupload/views.py index 2b06e79..e863a20 100644 --- a/fileupload/views.py +++ b/fileupload/views.py @@ -1,5 +1,5 @@ # encoding: utf-8 -from django.views.generic import CreateView, DeleteView, View +from django.views.generic import CreateView, DeleteView, ListView from .models import Picture from .response import JSONResponse, response_mimetype from .serialize import serialize @@ -44,12 +44,12 @@ def delete(self, request, *args, **kwargs): return response -class PictureListView(View): - def get(self, request, *args, **kwargs): - files = [] - for obj in Picture.objects.all(): - files.append(serialize(obj)) +class PictureListView(ListView): + model = Picture + + def render_to_response(self, context, **response_kwargs): + files = [ serialize(p) for p in self.get_queryset() ] data = {'files': files} - response = JSONResponse(data, mimetype=response_mimetype(request)) + response = JSONResponse(data, mimetype=response_mimetype(self.request)) response['Content-Disposition'] = 'inline; filename=files.json' return response From 04278dcb86b167f64b06472412659de81434e9e7 Mon Sep 17 00:00:00 2001 From: Sigurd Gartmann Date: Wed, 2 Oct 2013 13:10:45 +0200 Subject: [PATCH 10/31] Use newer url syntax for all urls --- fileupload/urls.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/fileupload/urls.py b/fileupload/urls.py index 21f48a3..dbbcbca 100644 --- a/fileupload/urls.py +++ b/fileupload/urls.py @@ -7,14 +7,11 @@ ) urlpatterns = patterns('', - (r'^basic/$', BasicVersionCreateView.as_view(), {}, 'upload-basic'), - (r'^basic/plus/$', BasicPlusVersionCreateView.as_view(), {}, 'upload-basic-plus'), - (r'^new/$', PictureCreateView.as_view(), {}, 'upload-new'), - (r'^angular/$', AngularVersionCreateView.as_view(), {}, 'upload-angular'), - (r'^jquery-ui/$', jQueryVersionCreateView.as_view(), {}, 'upload-jquery'), - (r'^delete/(?P\d+)$', PictureDeleteView.as_view(), {}, 'upload-delete'), + url(r'^basic/$', BasicVersionCreateView.as_view(), name='upload-basic'), + url(r'^basic/plus/$', BasicPlusVersionCreateView.as_view(), name='upload-basic-plus'), + url(r'^new/$', PictureCreateView.as_view(), name='upload-new'), + url(r'^angular/$', AngularVersionCreateView.as_view(), name='upload-angular'), + url(r'^jquery-ui/$', jQueryVersionCreateView.as_view(), name='upload-jquery'), + url(r'^delete/(?P\d+)$', PictureDeleteView.as_view(), name='upload-delete'), url(r'^view/$', PictureListView.as_view(), name='upload-view'), ) - - - From 9eaa47e8b52a1a633fc7bedd0587351793451b98 Mon Sep 17 00:00:00 2001 From: Sigurd Gartmann Date: Wed, 2 Oct 2013 13:32:08 +0200 Subject: [PATCH 11/31] Rename base.html to upload_base.html base.html is a very common name, and may clash with users' base.html --- fileupload/templates/fileupload/picture_form.html | 2 +- fileupload/templates/{base.html => upload_base.html} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename fileupload/templates/{base.html => upload_base.html} (100%) diff --git a/fileupload/templates/fileupload/picture_form.html b/fileupload/templates/fileupload/picture_form.html index e01d929..a8754bc 100644 --- a/fileupload/templates/fileupload/picture_form.html +++ b/fileupload/templates/fileupload/picture_form.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "upload_base.html" %} {% load upload_tags %} {% block content %} diff --git a/fileupload/templates/base.html b/fileupload/templates/upload_base.html similarity index 100% rename from fileupload/templates/base.html rename to fileupload/templates/upload_base.html From 4b0aca483ca5f80c7a2ed48536e8430810a275bc Mon Sep 17 00:00:00 2001 From: Sigurd Gartmann Date: Sun, 8 Dec 2013 02:31:39 +0100 Subject: [PATCH 12/31] Ignore this until django 1.6 branch takes over --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e74c193..b0d4e48 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,8 @@ db /share /env /venv +/django-jquery-file-upload *.log *.pot *.pyc -local_settings.py \ No newline at end of file +local_settings.py From 8d97d7fb8e63fab6c28857ae8471d3ac5195a5d4 Mon Sep 17 00:00:00 2001 From: Sigurd Gartmann Date: Sun, 8 Dec 2013 02:35:07 +0100 Subject: [PATCH 13/31] This works up until Django 1.6. A new branch exists for 1.6. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 67a04d6..23cb63a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ -django +django<1.6 pillow From d5523a67d68528cfca39fa2a8d21ff34d94de4ed Mon Sep 17 00:00:00 2001 From: Sigurd Gartmann Date: Wed, 11 Dec 2013 19:43:06 +0100 Subject: [PATCH 14/31] Better handling of errors in backend. --- fileupload/views.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fileupload/views.py b/fileupload/views.py index e863a20..98b339c 100644 --- a/fileupload/views.py +++ b/fileupload/views.py @@ -1,4 +1,7 @@ # encoding: utf-8 +import json + +from django.http import HttpResponse from django.views.generic import CreateView, DeleteView, ListView from .models import Picture from .response import JSONResponse, response_mimetype @@ -16,6 +19,9 @@ def form_valid(self, form): response['Content-Disposition'] = 'inline; filename=files.json' return response + def form_invalid(self, form): + data = json.dumps(form.errors) + return HttpResponse(content=data, status=400, content_type='application/json') class BasicVersionCreateView(PictureCreateView): template_name_suffix = '_basic_form' From 97c66173318c46985f7809df77edfea316bfdd53 Mon Sep 17 00:00:00 2001 From: Sigurd Gartmann Date: Wed, 11 Dec 2013 19:49:39 +0100 Subject: [PATCH 15/31] Show form validation errors from Django. --- fileupload/static/js/jquery.fileupload.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fileupload/static/js/jquery.fileupload.js b/fileupload/static/js/jquery.fileupload.js index d048a94..3a1ec70 100644 --- a/fileupload/static/js/jquery.fileupload.js +++ b/fileupload/static/js/jquery.fileupload.js @@ -805,6 +805,9 @@ response.jqXHR = options.jqXHR = jqXHR; response.textStatus = options.textStatus = textStatus; response.errorThrown = options.errorThrown = errorThrown; + if ('file' in response.jqXHR.responseJSON) { + response.errorThrown = options.errorThrown = response.jqXHR.responseJSON.file.join(", "); + } this._trigger('fail', null, options); }, From d362c94a962788805ffbdc21f8594759b74a00e2 Mon Sep 17 00:00:00 2001 From: Sigurd Gartmann Date: Mon, 20 Jan 2014 13:03:05 +0100 Subject: [PATCH 16/31] Add csrf.js, as suggested by @ET-CS, fixes #49. --- fileupload/templates/fileupload/picture_jquery_form.html | 1 + 1 file changed, 1 insertion(+) diff --git a/fileupload/templates/fileupload/picture_jquery_form.html b/fileupload/templates/fileupload/picture_jquery_form.html index cad7980..cf0ed04 100644 --- a/fileupload/templates/fileupload/picture_jquery_form.html +++ b/fileupload/templates/fileupload/picture_jquery_form.html @@ -233,6 +233,7 @@

+ - + - + - + - + - + - + - + - + - + - + - + - + - - + + diff --git a/fileupload/templates/fileupload/picture_basic_form.html b/fileupload/templates/fileupload/picture_basic_form.html index 6bd17a4..69993d0 100644 --- a/fileupload/templates/fileupload/picture_basic_form.html +++ b/fileupload/templates/fileupload/picture_basic_form.html @@ -10,9 +10,9 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/fileupload/templates/fileupload/picture_jquery_form.html b/fileupload/templates/fileupload/picture_jquery_form.html index cf0ed04..0332c31 100644 --- a/fileupload/templates/fileupload/picture_jquery_form.html +++ b/fileupload/templates/fileupload/picture_jquery_form.html @@ -24,9 +24,9 @@ - + - + - + - +