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 %}
-