"""
django view methods to interact with the dropbox api
"""
from dropbox import client, session
from dropbox.rest import ErrorResponse
from oauth.oauth import OAuthToken
from django.http import HttpResponseRedirect
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponse
from models import DropboxExtra
DROPBOX_REQUEST_SESSION_KEY = 'dropbox_request_token3' # random temp storage name
def _saveUserToken(user, token):
try:
d = user.django_dropbox
except:
d = DropboxExtra()
d.user = user
d.dropbox_token = token
d.save()
def _dropboxConnect(request,sess):
request_token = sess.obtain_request_token()
request.session[DROPBOX_REQUEST_SESSION_KEY] = request_token
url = sess.build_authorize_url(request_token,request.build_absolute_uri())
return HttpResponseRedirect(url)
def dropbox_user_required(funk):
@login_required
def _dropbox_wrap(request, *args, **kwargs):
_keys = settings.DROPBOX_SETTINGS
sess = session.DropboxSession(_keys['app_key'], _keys['app_secret'],_keys['type'])
try:
if request.session.has_key(DROPBOX_REQUEST_SESSION_KEY):
sess.token = sess.obtain_access_token(request.session.pop(DROPBOX_REQUEST_SESSION_KEY))
_saveUserToken( request.user, sess.token )
else:
token = request.user.django_dropbox.dropbox_token
sess.token = OAuthToken.from_string(token)
c = client.DropboxClient(sess)
except ObjectDoesNotExist:
return _dropboxConnect(request, sess)
try:
return funk(request, *args, dropbox_client=c, **kwargs)
except ErrorResponse, e:
if e.status == 401:
_dropboxConnect(request, sess)# re authentication needed
else:
raise e # let django log the exception that the usier did not handle
return _dropbox_wrap
## and to store personal dropbox access tocens you need
# -*- coding: utf-8 -*-
from django.db import models
from django.contrib.auth.models import User
class DropboxExtra(models.Model):
user = models.OneToOneField(User,related_name="django_dropbox")
dropbox_token = models.CharField(max_length=256)
Comments