Created
August 14, 2011 01:26
-
-
Save meirish/1144465 to your computer and use it in GitHub Desktop.
Transloadit.com wrapper by @redneckbeard
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{% extends "base.html" %} | |
{% block extra_head %} | |
<script type="text/javascript" charset="utf-8" src="{{ MEDIA_URL }}js/jquery.tools.date.min.js"></script> | |
<script type="text/javascript"> | |
var tlProtocol = (('https:' == document.location.protocol) ? 'https://' : 'http://'); | |
document.write(unescape("%3Cscript src='" + tlProtocol + "assets.transloadit.com/js/jquery.transloadit2.js' type='text/javascript'%3E%3C/script%3E")); | |
</script> | |
{% endblock %} | |
{% block content %} | |
<div class="narrow-form"> | |
{% if object %} | |
<h1>Change photo for {{ object }}</h1> | |
{% else %} | |
<h1>Upload photos</h1> | |
{% endif %} | |
<form id="upload" action="http://api2.transloadit.com/assemblies" enctype="multipart/form-data" method="POST"> | |
<p> | |
<label for="my_file">Choose some files to upload - you can even upload multiple ones.</label> | |
<input type="file" name="my_file" multiple="multiple" /> | |
</p> | |
{% if not object %} | |
<p> | |
<label for="date_taken">When were these photos taken? <span class="helptext">Don't worry you can change this later</span></label> | |
<input type="date" name="date_taken_user" /> | |
</p> | |
<input type="hidden" id="dateToServer" name="date_taken" /> | |
{% endif %} | |
<input type="hidden" name="photo_id" value="{{ object.id }}" /> | |
<input type="hidden" name="params" value="{{ params }}" /> | |
<input type="hidden" name="signature" value="{{ signature }}" /> | |
<div class="submit-wrap"> | |
<input type="submit" value="Upload"> | |
</div> | |
</form> | |
</div> | |
<div class="processing"> | |
<section class="upload-info"> | |
<h1>We're uploading your files!</h1> | |
<p>Depending on your connection & how many files you're uploading, this could take a while.</p> | |
<p>Check out the progress bar below for more detailed info.</p> | |
<div id="loading-bar"> | |
<p id="progress"></p> | |
<span class="helptext"></span> | |
<div id="loading"></div> | |
</div> | |
</section> | |
<section id="uploaded-photos"> | |
</section> | |
</div> | |
{% endblock %} | |
{% block scripts %} | |
<script> | |
$(document).ready(function() { | |
$('.processing').hide(); | |
$('#upload').transloadit({ | |
modal:false, | |
onStart: function(assembly){ | |
$('.narrow-form').fadeOut('fast', function(){ | |
$('.processing').fadeIn(); | |
}); | |
}, | |
onProgress: function(bytesReceived, bytesExpected, assembly) { | |
console.log(assembly); | |
var perDone = (bytesReceived / bytesExpected * 100).toFixed(2)+'%'; | |
var mbReceived=(bytesReceived/1024 / 1024).toFixed(2)+'MB'; | |
var mbExpected=(bytesExpected/1024/1024).toFixed(2)+'MB' ; | |
$('#progress').text(perDone); | |
$('#loading-bar span').text(mbReceived+' of '+mbExpected); | |
$('#loading').animate({width:perDone}, 3000); | |
}, | |
onError: function(assembly) { | |
//console.log(assembly.error+': '+assembly.message); | |
}, | |
onResult: function(step, result){ | |
if (step=='size_320'){ | |
$('<article class="photo"><h1></h1><div class="image-link"></div> </article>').appendTo('#uploaded-photos').hide().fadeIn('slow'); | |
console.log(result['name']); | |
$('.photo:last h1').text(result['name']); | |
$('<img />').attr('src', result['url']).appendTo('.image-link:last').hide().fadeIn('slow'); | |
} | |
}, | |
onSuccess: function(assembly){ | |
var dateInp = $(':date').data('dateinput'); | |
var dateArr = []; | |
dateArr.push(dateInp.getValue('yyyy')); | |
dateArr.push(dateInp.getValue('mmm')); | |
dateArr.push(dateInp.getValue('dd')); | |
var dateString = dateArr.join('/'); | |
$('.upload-info').fadeOut('fast', function(){ | |
$('<h1 class="finished">Your upload has finished! </h1>').prependTo('.processing').hide().fadeIn('slow'); | |
$('<a>Check them out here</a>').attr('href', '/'+dateString).appendTo('.finished'); | |
}); | |
}, | |
autoSubmit:false, | |
wait:true, | |
fields:true | |
}); | |
$(":date").dateinput({ | |
selectors: true | |
, yearRange:[-100,1] | |
, min: '1975-1-1' | |
, format: 'mmmm dd, yyyy' | |
, change: function() { | |
var isoDate = this.getValue('yyyy-mm-dd'); | |
$("#dateToServer").val(isoDate); | |
} | |
}); | |
}); | |
</script> | |
{% endblock %} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from datetime import datetime, timedelta | |
import copy | |
import hashlib | |
from django.utils import simplejson as json | |
import hmac | |
import urllib | |
import urllib2 | |
class Assembly(object): | |
params = {} | |
def __init__(self, url=None, key=None, secret=None): | |
self.url = url | |
self.key = key | |
self.secret = secret | |
def sign(self, **kwargs): | |
"""Creates the HMAC signature for the request and returns the parameters with | |
the signature as an additional key. | |
""" | |
params = self.params | |
params.update({ | |
'auth': { | |
'expires': (datetime.now() + timedelta(days=1)).strftime('%Y/%m/%d %H:%M:%S'), #+00:00'), | |
'key': self.key | |
} | |
}, **kwargs) | |
signature = hmac.new(self.secret, json.dumps(params), hashlib.sha1).hexdigest() | |
return json.dumps(params), signature | |
def status(self): | |
"""Returns the status of the assembly with the given ``assembly_url``.""" | |
if self.url is None: | |
raise AttributeError('No assembly URL was given') | |
self.sign() | |
return urllib2.open('%s?%s' % (self.url, urllib.urlencode(self.params))) | |
def delete(self): | |
"""Returns the status of the assembly with the given ``assembly_url``.""" | |
if self.url is None: | |
raise AttributeError('No assembly URL was given') | |
opener = urllib2.build_opener(urllib2.HTTPHandler) | |
self.sign() | |
request = urllib2.Request(self.url, data=urllib.urlencode(self.params)) | |
request.get_method = lambda: 'DELETE' | |
response = opener.open(request) | |
return json.loads(response.read()) | |
def add_step(self, name, **kwargs): | |
if 'steps' not in self.params: | |
self.params['steps'] = {} | |
self.params['steps'][name] = kwargs | |
return self | |
def add_template(self, id, **kwargs): | |
if 'template_id' not in self.params: | |
self.params['template_id'] = id | |
return self | |
def create(self, notify_url=None, post=True): | |
if notify_url is not None: | |
self.params['notify_url'] = notify_url | |
params, signature = self.sign() | |
if post is False: | |
return json.dumps(self.params) | |
response = urllib2.open('http://api2.transloadit.com/assemblies', data=urllib.urlencode(self.params)) | |
return json.loads(response.read()) | |
class Transloadit(object): | |
"""Wrapper class for the Transloadit API.""" | |
def __init__(self, key=None, secret=None): | |
try: | |
from django.conf import settings | |
except ImportError: | |
if not (key and secret): | |
raise ValueError('Transloadit object must be instantiated with an auth key and an auth secret') | |
else: | |
if key is None: | |
key = getattr(settings, 'TRANSLOADIT_AUTH_KEY') | |
if secret is None: | |
secret = getattr(settings, 'TRANSLOADIT_AUTH_SECRET') | |
self.key = key | |
self.secret = secret | |
def assembly(self, url=None): | |
return Assembly(url, self.key, self.secret) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.conf import settings | |
from django.core.urlresolvers import reverse | |
from django.shortcuts import get_object_or_404, render_to_response | |
from django.template import RequestContext | |
from django.views.generic.simple import direct_to_template | |
from django.views.generic.create_update import delete_object, update_object | |
from django.views.generic import list_detail, date_based | |
from django.views.decorators.csrf import csrf_exempt | |
from django.utils import simplejson as json | |
from taggit.models import Tag | |
from utils.transloadit import Transloadit | |
from irishphotos.photos.models import Photo | |
from irishphotos.photos.forms import PhotoForm | |
TAGS = Tag.objects.all | |
@permission_required('photos.add_photo') | |
def add_edit_transloadit(request, photo_id=None): | |
transloadit = Transloadit() | |
site = RequestSite(request) | |
params, signature = transloadit.assembly().add_template('4cfaf655c14c405ab4d875af72ec3211').sign( | |
notify_url='http://' + site.domain + reverse('register_results'), | |
redirect_url='http://' + site.domain + reverse('latest_index')) | |
if photo_id is None: | |
return direct_to_template( | |
request, | |
template='photos/upload.html', | |
extra_context = { | |
'params': params, | |
'signature': signature, | |
'tag_list': TAGS | |
} | |
) | |
else: | |
photo = get_object_or_404(Photo, id=photo_id) | |
return direct_to_template( | |
request, | |
template='photos/upload.html', | |
extra_context = { | |
'params': params, | |
'signature': signature, | |
'object': photo, | |
'tag_list': TAGS | |
} | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment