From 0f76e914d2ac46aa1c8f973a71b156c887752339 Mon Sep 17 00:00:00 2001 From: Nathan Keilar Date: Sat, 19 Jan 2013 21:25:30 -0800 Subject: [PATCH 01/12] add south migrations --- fileupload/migrations/0001_initial.py | 72 +++++++++++++++++++++++++++ fileupload/migrations/__init__.py | 0 2 files changed, 72 insertions(+) create mode 100644 fileupload/migrations/0001_initial.py create mode 100644 fileupload/migrations/__init__.py diff --git a/fileupload/migrations/0001_initial.py b/fileupload/migrations/0001_initial.py new file mode 100644 index 0000000..778269a --- /dev/null +++ b/fileupload/migrations/0001_initial.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Picture' + db.create_table('fileupload_picture', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('file', self.gf('django.db.models.fields.files.FileField')(max_length=100)), + ('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, blank=True)), + ('creator', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + )) + db.send_create_signal('fileupload', ['Picture']) + + + def backwards(self, orm): + # Deleting model 'Picture' + db.delete_table('fileupload_picture') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'fileupload.picture': { + 'Meta': {'object_name': 'Picture'}, + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + } + } + + complete_apps = ['fileupload'] \ No newline at end of file diff --git a/fileupload/migrations/__init__.py b/fileupload/migrations/__init__.py new file mode 100644 index 0000000..e69de29 From fde62923e1c3a598356ae6ab4057a70bbd813747 Mon Sep 17 00:00:00 2001 From: Nathan Keilar Date: Sat, 19 Jan 2013 21:26:59 -0800 Subject: [PATCH 02/12] change to ImageField, not FileField --- .../0002_auto__chg_field_picture_file.py | 66 +++++++++++++++++++ fileupload/models.py | 9 +-- 2 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 fileupload/migrations/0002_auto__chg_field_picture_file.py diff --git a/fileupload/migrations/0002_auto__chg_field_picture_file.py b/fileupload/migrations/0002_auto__chg_field_picture_file.py new file mode 100644 index 0000000..8af7bde --- /dev/null +++ b/fileupload/migrations/0002_auto__chg_field_picture_file.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'Picture.file' + db.alter_column('fileupload_picture', 'file', self.gf('django.db.models.fields.files.ImageField')(max_length=100)) + + def backwards(self, orm): + + # Changing field 'Picture.file' + db.alter_column('fileupload_picture', 'file', self.gf('django.db.models.fields.files.FileField')(max_length=100)) + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'fileupload.picture': { + 'Meta': {'object_name': 'Picture'}, + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), + 'file': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + } + } + + complete_apps = ['fileupload'] \ No newline at end of file diff --git a/fileupload/models.py b/fileupload/models.py index 64cf98b..0aaf0e3 100644 --- a/fileupload/models.py +++ b/fileupload/models.py @@ -1,13 +1,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. - - #file = models.FileField(upload_to="pictures") + # This is a small demo using FileField instead of ImageField, not + # depending on PIL. You will probably want ImageField in your app. file = models.ImageField(upload_to="pictures") slug = models.SlugField(max_length=50, blank=True) From b8a9414e927113515d71b77318027ee15733e42d Mon Sep 17 00:00:00 2001 From: Nathan Keilar Date: Sat, 19 Jan 2013 21:27:32 -0800 Subject: [PATCH 03/12] override delete to leave the file --- fileupload/models.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fileupload/models.py b/fileupload/models.py index 0aaf0e3..2ca528c 100644 --- a/fileupload/models.py +++ b/fileupload/models.py @@ -16,7 +16,3 @@ def get_absolute_url(self): def save(self, *args, **kwargs): self.slug = self.file.name super(Picture, self).save(*args, **kwargs) - - def delete(self, *args, **kwargs): - self.file.delete(False) - super(Picture, self).delete(*args, **kwargs) From 11e927b167474946fbe849a4cd1a90bf9ded5bb3 Mon Sep 17 00:00:00 2001 From: Nathan Keilar Date: Sat, 19 Jan 2013 21:27:52 -0800 Subject: [PATCH 04/12] dummy tests --- fileupload/tests.py | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 fileupload/tests.py diff --git a/fileupload/tests.py b/fileupload/tests.py deleted file mode 100644 index 501deb7..0000000 --- a/fileupload/tests.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -This file demonstrates writing tests using the unittest module. These will pass -when you run "manage.py test". - -Replace this with more appropriate tests for your application. -""" - -from django.test import TestCase - - -class SimpleTest(TestCase): - def test_basic_addition(self): - """ - Tests that 1 + 1 always equals 2. - """ - self.assertEqual(1 + 1, 2) From fb014751bc969f649ed15b95187780ed1bf1fc2c Mon Sep 17 00:00:00 2001 From: Nathan Keilar Date: Sat, 19 Jan 2013 21:28:20 -0800 Subject: [PATCH 05/12] associate user with Picture --- fileupload/models.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fileupload/models.py b/fileupload/models.py index 2ca528c..38a9635 100644 --- a/fileupload/models.py +++ b/fileupload/models.py @@ -1,10 +1,12 @@ from django.db import models +from django.contrib.auth.models import User class Picture(models.Model): # This is a small demo using FileField instead of ImageField, not # depending on PIL. You will probably want ImageField in your app. file = models.ImageField(upload_to="pictures") slug = models.SlugField(max_length=50, blank=True) + creator = models.ForeignKey(User) def __unicode__(self): return self.file From 5d3714fa6ae95f92530f59d9eb94ed40112dcdb0 Mon Sep 17 00:00:00 2001 From: Nathan Keilar Date: Sat, 19 Jan 2013 21:28:31 -0800 Subject: [PATCH 06/12] return the filename --- fileupload/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fileupload/models.py b/fileupload/models.py index 38a9635..9493501 100644 --- a/fileupload/models.py +++ b/fileupload/models.py @@ -9,7 +9,7 @@ class Picture(models.Model): creator = models.ForeignKey(User) def __unicode__(self): - return self.file + return self.file.name @models.permalink def get_absolute_url(self): From 02db8f950f84c69480b1ec95043622c3b349eaaa Mon Sep 17 00:00:00 2001 From: Nathan Keilar Date: Sat, 19 Jan 2013 21:34:17 -0800 Subject: [PATCH 07/12] fix javascript file reference --- fileupload/static/js/jquery.fileupload-fp.js | 2 +- fileupload/static/js/jquery.fileupload-ui.js | 2 +- fileupload/static/js/jquery.fileupload.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fileupload/static/js/jquery.fileupload-fp.js b/fileupload/static/js/jquery.fileupload-fp.js index 634fb5e..9b45c68 100644 --- a/fileupload/static/js/jquery.fileupload-fp.js +++ b/fileupload/static/js/jquery.fileupload-fp.js @@ -20,7 +20,7 @@ 'jquery', 'load-image', 'canvas-to-blob', - './jquery.fileupload' + './jquery.fileupload.js' ], factory); } else { // Browser globals: diff --git a/fileupload/static/js/jquery.fileupload-ui.js b/fileupload/static/js/jquery.fileupload-ui.js index f7fc3bf..11d1b96 100644 --- a/fileupload/static/js/jquery.fileupload-ui.js +++ b/fileupload/static/js/jquery.fileupload-ui.js @@ -20,7 +20,7 @@ 'jquery', 'tmpl', 'load-image', - './jquery.fileupload-fp' + './jquery.fileupload-fp.js' ], factory); } else { // Browser globals: diff --git a/fileupload/static/js/jquery.fileupload.js b/fileupload/static/js/jquery.fileupload.js index 05a654b..e145d21 100644 --- a/fileupload/static/js/jquery.fileupload.js +++ b/fileupload/static/js/jquery.fileupload.js @@ -18,7 +18,7 @@ // Register as an anonymous AMD module: define([ 'jquery', - 'jquery.ui.widget' + 'jquery.ui.widget.js' ], factory); } else { // Browser globals: From 72698a7251a4377bcc4ef30a880ac54171cab429 Mon Sep 17 00:00:00 2001 From: Nathan Keilar Date: Sat, 19 Jan 2013 21:34:27 -0800 Subject: [PATCH 08/12] update style --- fileupload/static/css/style.css | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/fileupload/static/css/style.css b/fileupload/static/css/style.css index cc924c5..0921e10 100644 --- a/fileupload/static/css/style.css +++ b/fileupload/static/css/style.css @@ -3,5 +3,30 @@ body{ } .preview img { - max-height: 50px; + max-height: 100px; } + +a.gallerypic{ + text-decoration:none; + position:relative; + display:block; + border:1px solid #666; + padding:3px; + margin-right:5px; + float:left; +} + +a.gallerypic span.zoom-icon{ + visibility:hidden; + position:absolute; + left:40%; + top:35%; + filter:alpha(opacity=50); + -moz-opacity:0.5; + -khtml-opacity: 0.5; + opacity: 0.5; +} + +a.gallerypic:hover span.zoom-icon{ + visibility:visible; +} \ No newline at end of file From 7709151792aab44d4952e360b338e667aa7a0abd Mon Sep 17 00:00:00 2001 From: Nathan Keilar Date: Sat, 19 Jan 2013 21:35:31 -0800 Subject: [PATCH 09/12] csrf update - works for me --- fileupload/static/js/jquery_fix_csrf.js | 41 +++++++++++++ fileupload/static/js/main.js | 20 ++++++- .../templatetags/minimal_upload_tags.py | 60 +++++++++++++++++++ 3 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 fileupload/static/js/jquery_fix_csrf.js create mode 100644 fileupload/templatetags/minimal_upload_tags.py diff --git a/fileupload/static/js/jquery_fix_csrf.js b/fileupload/static/js/jquery_fix_csrf.js new file mode 100644 index 0000000..5635522 --- /dev/null +++ b/fileupload/static/js/jquery_fix_csrf.js @@ -0,0 +1,41 @@ +//Source https://github.com/miki725/Django-jQuery-File-Uploader-Integration-demo/blob/master/static/js/jquery_fix_csrf.js + +// jQuery alteration which send CSRF token on each ajax request in order to pass Django CSRF +$(document).ajaxSend(function(event, xhr, settings) { + function getCookie(name) { + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + + function sameOrigin(url) { + // url could be relative or scheme relative or absolute + var host = document.location.host; // host + port + var protocol = document.location.protocol; + var sr_origin = '//' + host; + var origin = protocol + sr_origin; + // Allow absolute or scheme relative URLs to same origin + return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || + (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || + // or any other URL that isn't scheme relative or absolute i.e relative. + !(/^(\/\/|http:|https:).*/.test(url)); + } + + function safeMethod(method) { + return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); + } + + if (!safeMethod(settings.type) && sameOrigin(settings.url)) { + xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); + } +}); \ No newline at end of file diff --git a/fileupload/static/js/main.js b/fileupload/static/js/main.js index 01c86fe..dee3276 100644 --- a/fileupload/static/js/main.js +++ b/fileupload/static/js/main.js @@ -16,7 +16,25 @@ $(function () { 'use strict'; // Initialize the jQuery File Upload widget: - $('#fileupload').fileupload(); +// $('#fileupload').fileupload(); + $('#fileupload').fileupload( + 'option', + { +// url: '/path/to/upload/handler.json', +// sequentialUploads: true + autoUpload: true, + // this formData is neccessary to pass the csrf and pass uid to django + formData: [ + { name: "csrfmiddlewaretoken", value: "{{ csrf_token }}"} + ] + } + ); + + $('#fileupload').fileupload({ + add: function (e, data) { + data.submit(); + } + }); // Enable iframe cross-domain access via redirect option: $('#fileupload').fileupload( diff --git a/fileupload/templatetags/minimal_upload_tags.py b/fileupload/templatetags/minimal_upload_tags.py new file mode 100644 index 0000000..f1b544f --- /dev/null +++ b/fileupload/templatetags/minimal_upload_tags.py @@ -0,0 +1,60 @@ +from django import template + +register = template.Library() + +@register.simple_tag +def upload_js(): + return """ + + + + +""" From 89befabb8417e7be32eefb0a1ade7185585ae051 Mon Sep 17 00:00:00 2001 From: Nathan Keilar Date: Sat, 19 Jan 2013 21:38:53 -0800 Subject: [PATCH 10/12] white space updates --- fileupload/urls.py | 4 ++- fileupload/views.py | 86 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 82 insertions(+), 8 deletions(-) diff --git a/fileupload/urls.py b/fileupload/urls.py index e25eb11..05ef597 100644 --- a/fileupload/urls.py +++ b/fileupload/urls.py @@ -1,8 +1,10 @@ from django.conf.urls.defaults import * -from fileupload.views import PictureCreateView, PictureDeleteView +from fileupload.views import PictureCreateView, PictureDeleteView, MultiUploderView + urlpatterns = patterns('', (r'^new/$', PictureCreateView.as_view(), {}, 'upload-new'), + (r'^new/add/$', MultiUploderView.as_view(), {}, 'upload-add'), (r'^delete/(?P\d+)$', PictureDeleteView.as_view(), {}, 'upload-delete'), ) diff --git a/fileupload/views.py b/fileupload/views.py index 1747056..4062c3f 100644 --- a/fileupload/views.py +++ b/fileupload/views.py @@ -1,12 +1,13 @@ -from fileupload.models import Picture from django.views.generic import CreateView, DeleteView +from django.views.generic.base import View -from django.http import HttpResponse, HttpResponseRedirect +from django.http import HttpResponse, Http404 from django.utils import simplejson from django.core.urlresolvers import reverse - from django.conf import settings +from fileupload.models import Picture + def response_mimetype(request): if "application/json" in request.META['HTTP_ACCEPT']: return "application/json" @@ -19,12 +20,82 @@ class PictureCreateView(CreateView): def form_valid(self, form): self.object = form.save() f = self.request.FILES.get('file') - data = [{'name': f.name, 'url': settings.MEDIA_URL + "pictures/" + f.name.replace(" ", "_"), 'thumbnail_url': settings.MEDIA_URL + "pictures/" + f.name.replace(" ", "_"), 'delete_url': reverse('upload-delete', args=[self.object.id]), 'delete_type': "DELETE"}] + data = [{'name': f.name, 'url': settings.MEDIA_URL + "pictures/" + f.name.replace(" ", "_"), + 'thumbnail_url': settings.MEDIA_URL + "pictures/" + f.name.replace(" ", "_"), + 'delete_url': reverse('upload-delete', args=[self.object.id]), 'delete_type': "DELETE"}] response = JSONResponse(data, {}, response_mimetype(self.request)) response['Content-Disposition'] = 'inline; filename=files.json' return response +class MultiUploderView(View): + model = Picture + + def post(self, request, *args, **kwargs): + if request.FILES == None: + raise Http404("No objects uploaded") + file = request.FILES['file'] + + url = self.save_form(request, file, *args, **kwargs) + + result = [{'name': file.name, + 'size': file.size, + 'url': url, + 'thumbnail_url': url, + }, ] + + response_data = simplejson.dumps(result) + if "application/json" in request.META['HTTP_ACCEPT_ENCODING']: + mimetype = 'application/json' + else: + mimetype = 'text/plain' + return HttpResponse(response_data, mimetype=mimetype) + + def save_form(self, request, file, *args, **kwargs): + a = self.model() + a.creator = request.user + a.file.save(file.name, file) + a.save() + return a.file.url + + def get(self, request, *args, **kwargs): + """ + required to satisfy jquery upload get request + """ + return HttpResponse('Only POST accepted') + +# def get(self, request, *args, **kwargs): +# """ +# required to satisfy jquery upload get request for existing images +# """ +# try: +# recipe = Recipe.objects.get(id=self.kwargs['recipe_id']) +# except Recipe.DoesNotExist: +# raise Http404("Recipe does not exist, thus can't get images") +# +# # import ipdb; ipdb.set_trace() +# images = recipe.images.all() +# +# #generating json response array +# result = [] +# +# for image in images: +# result.append({"name":image.description, +# "size":image.file.size, +# "url":image.file.url, +# "thumbnail_url":image.file.url,}) +# +# response_data = simplejson.dumps(result) +# +# #checking for json data type +# #big thanks to Guy Shapiro +# if "application/json" in request.META['HTTP_ACCEPT_ENCODING']: +# mimetype = 'application/json' +# else: +# mimetype = 'text/plain' +# return HttpResponse(response_data, mimetype=mimetype) + + class PictureDeleteView(DeleteView): model = Picture @@ -44,6 +115,7 @@ def delete(self, request, *args, **kwargs): 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) + + 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) From 16114a06726baf6cbd7562cee56d31bfa3819d94 Mon Sep 17 00:00:00 2001 From: Nathan Keilar Date: Sat, 19 Jan 2013 21:39:36 -0800 Subject: [PATCH 11/12] auto format template for sanity --- .../templates/fileupload/picture_form.html | 209 +++++++++++------- 1 file changed, 127 insertions(+), 82 deletions(-) diff --git a/fileupload/templates/fileupload/picture_form.html b/fileupload/templates/fileupload/picture_form.html index 89b764a..6ae8177 100644 --- a/fileupload/templates/fileupload/picture_form.html +++ b/fileupload/templates/fileupload/picture_form.html @@ -1,88 +1,133 @@ -{% extends "base.html" %} -{% load upload_tags %} - -{% block content %} -
- -
{% csrf_token %} -
-
- - - Add files... - - - - - - -
-
-
-
+{% load upload_tags %} + + + + Django Jquery File Upload Example + + + + + + + + + + + + + + + + - -