Skip to content

Instantly share code, notes, and snippets.

@meirish
Created August 14, 2011 01:26
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save meirish/1144465 to your computer and use it in GitHub Desktop.
Save meirish/1144465 to your computer and use it in GitHub Desktop.
Transloadit.com wrapper by @redneckbeard
{% 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 %}
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)
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