diff --git a/README.markdown b/README.markdown index 961f340..bd179e0 100644 --- a/README.markdown +++ b/README.markdown @@ -34,20 +34,29 @@ Twython also requires the (most excellent) OAuth2 library for handling OAuth tok Installation ----------------------------------------------------------------------------------------------------- -Copy the "twython_django_oauth" app into your project, and add it to your "INSTALLED_APPS" in your -settings.py file. If you wish to use the example template, feel free to copy that over as well. + +pip install git+http://github.com/zandeez/twython-django.git + +Add "twython_django_oauth" to your "INSTALLED_APPS" in your settings.py file. If you wish to use the example +template, feel free to copy that over as well. After you've done that, specify the following urlconf in your root urls.py: - (r'^your_url_extension/', include('your_app.twython_django_oauth.urls')), + (r'^your_url_extension/', include('twython_django_oauth.urls')), + +Add the following settings to settings.py: -If you're using this app bare-bones (i.e, just starting out), add the following to your settings.py: +TWITTER_KEY = 'your_key' - AUTH_PROFILE_MODULE = 'twython_django_oauth.Profile' - -(Obviously, if you've got your own custom User/Profile setup going, this should all be pretty self explanatory -to integrate into your application. The OAuth handshake flow is well documented here, as well as how to use it -with Twython calls.) +TWITTER_SECRET = 'your_secret' + +LOGIN_URL='/your_url_extension/login' + +LOGOUT_URL='/your_url_extension/logout' + +LOGIN_REDIRECT_URL='/' + +LOGOUT_REDIRECT_URL='/' Restart your Django app, and it should all work auto-magically. Build onwards from here if you're just starting out, or integrate this into your existing model setup if you're already Django-savvy. diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..2614124 --- /dev/null +++ b/setup.py @@ -0,0 +1,39 @@ +#!/usr/bin/python + +import sys, os +from setuptools import setup +from setuptools import find_packages + +__author__ = 'Ryan McGrath ' +__version__ = '1.4.5' + +setup( + # Basic package information. + name = 'twython-django', + version = __version__, + packages = find_packages(), + + # Packaging options. + include_package_data = True, + + # Package dependencies. + install_requires = ['simplejson', 'oauth2', 'httplib2', 'twython', 'django'], + provides = ['twython_django_oauth'], + + # Metadata for PyPI. + author = 'Ryan McGrath', + author_email = 'ryan@venodesigns.net', + license = 'MIT License', + url = 'http://github.com/ryanmcgrath/twython-django/tree/master', + keywords = 'Django integration for twython', + description = 'An easy (and up to date) way to access Twitter data with Python.', + long_description = open('README.markdown').read(), + classifiers = [ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: Communications :: Chat', + 'Topic :: Internet' + ] +) \ No newline at end of file diff --git a/twython_django_oauth/models.py b/twython_django_oauth/models.py index bb3f5a1..0e51bc3 100644 --- a/twython_django_oauth/models.py +++ b/twython_django_oauth/models.py @@ -1,12 +1,12 @@ from django.db import models from django.contrib.auth.models import User -class Profile(models.Model): +class TwitterProfile(models.Model): """ An example Profile model that handles storing the oauth_token and oauth_secret in relation to a user. Adapt this if you have a current setup, there's really nothing special going on here. """ - user = models.ForeignKey(User) + user = models.OneToOneField(User) oauth_token = models.CharField(max_length = 200) oauth_secret = models.CharField(max_length = 200) diff --git a/twython_django_oauth/urls.py b/twython_django_oauth/urls.py index a8c8782..27a4164 100644 --- a/twython_django_oauth/urls.py +++ b/twython_django_oauth/urls.py @@ -1,19 +1,19 @@ from django.conf.urls.defaults import * # your_app = name of your root djang app. -urlpatterns = patterns('your_app.twython_django_oauth.views', +urlpatterns = patterns('twython_django_oauth.views', # First leg of the authentication journey... - (r'^login/?$', "begin_auth"), + url(r'^login/?$', "begin_auth", name="twitter_login"), # Logout, if need be - (r'^/logout?$', "logout"), # Calling logout and what not + url(r'^logout/?$', "logout", name="twitter_logout"), # Calling logout and what not # This is where they're redirected to after authorizing - we'll # further (silently) redirect them again here after storing tokens and such. - (r'^thanks/?$', "thanks"), + url(r'^thanks/?$', "thanks", name="twitter_callback"), # An example view using a Twython method with proper OAuth credentials. Clone # this view and url definition to get the rest of your desired pages/functionality. - (r'^user_timeline/?$', "user_timeline"), + url(r'^user_timeline/?$', "user_timeline", name="twitter_timeline"), ) diff --git a/twython_django_oauth/views.py b/twython_django_oauth/views.py index 7b44d43..4f0548a 100644 --- a/twython_django_oauth/views.py +++ b/twython_django_oauth/views.py @@ -1,26 +1,24 @@ -from django.contrib.auth import authenticate, login, logout +from django.contrib.auth import authenticate, login, logout as django_logout from django.contrib.auth.models import User from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render_to_response from django.contrib.auth.decorators import login_required +from django.conf import settings +from django.core.urlresolvers import reverse from twython import Twython # If you've got your own Profile setup, see the note in the models file # about adapting this to your own setup. -from your_app.twython_django_oauth.models import Profile +from twython_django_oauth.models import TwitterProfile -# Move these into your settings.py if you're feeling adventurous. -CONSUMER_KEY = "YOUR CONSUMER KEY HERE" -CONSUMER_SECRET = "YOUR CONSUMER SECRET HERE" - -def logout(request): +def logout(request, redirect_url=settings.LOGOUT_REDIRECT_URL): """ Nothing hilariously hidden here, logs a user out. Strip this out if your application already has hooks to handle this. """ - logout(request) - return HttpResponseRedirect('/') + django_logout(request) + return HttpResponseRedirect(request.build_absolute_uri(redirect_url)) def begin_auth(request): """ @@ -29,8 +27,9 @@ def begin_auth(request): """ # Instantiate Twython with the first leg of our trip. twitter = Twython( - twitter_token = CONSUMER_KEY, - twitter_secret = CONSUMER_SECRET + twitter_token = settings.TWITTER_KEY, + twitter_secret = settings.TWITTER_SECRET, + callback_url = request.build_absolute_uri(reverse('twython_django_oauth.views.thanks')) ) # Request an authorization url to send the user to... @@ -40,7 +39,7 @@ def begin_auth(request): request.session['request_token'] = auth_props return HttpResponseRedirect(auth_props['auth_url']) -def thanks(request): +def thanks(request, redirect_url=settings.LOGIN_REDIRECT_URL): """ A user gets redirected here after hitting Twitter and authorizing your app to use their data. @@ -53,10 +52,10 @@ def thanks(request): # Now that we've got the magic tokens back from Twitter, we need to exchange # for permanent ones and store them... twitter = Twython( - twitter_token = CONSUMER_KEY, - twitter_secret = CONSUMER_SECRET, + twitter_token = settings.TWITTER_KEY, + twitter_secret = settings.TWITTER_SECRET, oauth_token = request.session['request_token']['oauth_token'], - oauth_token_secret = request.session['request_token']['oauth_token_secret'] + oauth_token_secret = request.session['request_token']['oauth_token_secret'], ) # Retrieve the tokens we want... @@ -68,7 +67,7 @@ def thanks(request): except User.DoesNotExist: # We mock a creation here; no email, password is just the token, etc. user = User.objects.create_user(authorized_tokens['screen_name'], "fjdsfn@jfndjfn.com", authorized_tokens['oauth_token_secret']) - profile = Profile() + profile = TwitterProfile() profile.user = user profile.oauth_token = authorized_tokens['oauth_token'] profile.oauth_secret = authorized_tokens['oauth_token_secret'] @@ -79,17 +78,17 @@ def thanks(request): password = authorized_tokens['oauth_token_secret'] ) login(request, user) - return HttpResponseRedirect('/timeline') + return HttpResponseRedirect(redirect_url) def user_timeline(request): """ An example view with Twython/OAuth hooks/calls to fetch data about the user in question. Pretty self explanatory if you read through it... """ - user = request.user.get_profile() + user = request.user.twitterprofile twitter = Twython( - twitter_token = CONSUMER_KEY, - twitter_secret = CONSUMER_SECRET, + twitter_token = settings.TWITTER_KEY, + twitter_secret = settings.TWITTER_SECRET, oauth_token = user.oauth_token, oauth_token_secret = user.oauth_secret )