""" 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)