2010-06-29 20:16:09 -04:00
|
|
|
# -*- coding: utf-8 -*-
|
2010-07-05 17:11:04 -04:00
|
|
|
import urlparse
|
2010-08-16 15:45:35 -04:00
|
|
|
from utils import log as logging
|
2010-07-05 17:11:04 -04:00
|
|
|
import oauth2 as oauth
|
2010-06-29 20:16:09 -04:00
|
|
|
from django.contrib.sites.models import Site
|
|
|
|
from django.http import HttpResponse, HttpResponseRedirect
|
|
|
|
from django.conf import settings
|
|
|
|
from django.core.urlresolvers import reverse
|
2010-07-05 17:11:04 -04:00
|
|
|
from django.template import RequestContext
|
|
|
|
from django.contrib.auth import login as login_user
|
|
|
|
from django.shortcuts import render_to_response
|
2010-08-13 19:21:29 -04:00
|
|
|
from django.db.models import Q
|
2010-07-05 17:11:04 -04:00
|
|
|
from apps.reader.forms import SignupForm
|
|
|
|
from apps.reader.models import UserSubscription
|
|
|
|
from apps.feed_import.models import OAuthToken, OPMLImporter, GoogleReaderImporter
|
|
|
|
from utils import json
|
2010-07-24 15:54:25 -04:00
|
|
|
from utils.user_functions import ajax_login_required
|
2010-06-29 20:16:09 -04:00
|
|
|
|
|
|
|
|
2010-07-24 15:54:25 -04:00
|
|
|
@ajax_login_required
|
2010-06-29 20:16:09 -04:00
|
|
|
def opml_upload(request):
|
|
|
|
xml_opml = None
|
|
|
|
message = "OK"
|
|
|
|
code = 1
|
|
|
|
payload = {}
|
|
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
if 'file' in request.FILES:
|
|
|
|
file = request.FILES['file']
|
|
|
|
xml_opml = file.read()
|
|
|
|
|
|
|
|
opml_importer = OPMLImporter(xml_opml, request.user)
|
|
|
|
folders = opml_importer.process()
|
|
|
|
|
|
|
|
feeds = UserSubscription.objects.filter(user=request.user).values()
|
|
|
|
payload = dict(folders=folders, feeds=feeds)
|
|
|
|
else:
|
|
|
|
message = "Attach an .opml file."
|
|
|
|
code = -1
|
|
|
|
|
|
|
|
data = json.encode(dict(message=message, code=code, payload=payload))
|
|
|
|
return HttpResponse(data, mimetype='text/plain')
|
|
|
|
|
|
|
|
|
|
|
|
def reader_authorize(request):
|
2010-08-17 17:45:51 -04:00
|
|
|
logging.info(" ---> [%s] Authorize Google Reader import (%s) - %s" % (
|
2010-07-15 00:44:38 -04:00
|
|
|
request.user,
|
|
|
|
request.session.session_key,
|
|
|
|
request.META['REMOTE_ADDR'],
|
2010-08-15 12:04:26 -04:00
|
|
|
))
|
2010-06-29 20:16:09 -04:00
|
|
|
oauth_key = settings.OAUTH_KEY
|
|
|
|
oauth_secret = settings.OAUTH_SECRET
|
|
|
|
scope = "http://www.google.com/reader/api"
|
2010-07-05 17:11:04 -04:00
|
|
|
request_token_url = ("https://www.google.com/accounts/OAuthGetRequestToken?"
|
|
|
|
"scope=%s&oauth_callback=http://%s%s") % (
|
|
|
|
scope,
|
|
|
|
Site.objects.get_current().domain,
|
2010-08-17 23:40:03 -04:00
|
|
|
reverse('google-reader-callback'),
|
2010-07-05 17:11:04 -04:00
|
|
|
)
|
2010-06-29 20:16:09 -04:00
|
|
|
authorize_url = 'https://www.google.com/accounts/OAuthAuthorizeToken'
|
|
|
|
|
2010-07-05 17:11:04 -04:00
|
|
|
# Grab request token from Google's OAuth
|
2010-06-29 20:16:09 -04:00
|
|
|
consumer = oauth.Consumer(oauth_key, oauth_secret)
|
|
|
|
client = oauth.Client(consumer)
|
|
|
|
resp, content = client.request(request_token_url, "GET")
|
|
|
|
request_token = dict(urlparse.parse_qsl(content))
|
2010-07-05 17:11:04 -04:00
|
|
|
|
|
|
|
# Save request token and delete old tokens
|
|
|
|
auth_token_dict = dict(request_token=request_token['oauth_token'],
|
|
|
|
request_token_secret=request_token['oauth_token_secret'])
|
|
|
|
if request.user.is_authenticated():
|
|
|
|
OAuthToken.objects.filter(user=request.user).delete()
|
|
|
|
auth_token_dict['user'] = request.user
|
|
|
|
else:
|
|
|
|
OAuthToken.objects.filter(session_id=request.session.session_key).delete()
|
2010-08-13 18:18:46 -04:00
|
|
|
OAuthToken.objects.filter(remote_ip=request.META['REMOTE_ADDR']).delete()
|
2010-08-13 19:21:29 -04:00
|
|
|
auth_token_dict['session_id'] = request.session.session_key
|
|
|
|
auth_token_dict['remote_ip'] = request.META['REMOTE_ADDR']
|
2010-07-05 17:11:04 -04:00
|
|
|
OAuthToken.objects.create(**auth_token_dict)
|
2010-06-29 20:16:09 -04:00
|
|
|
|
|
|
|
redirect = "%s?oauth_token=%s" % (authorize_url, request_token['oauth_token'])
|
|
|
|
return HttpResponseRedirect(redirect)
|
|
|
|
|
|
|
|
def reader_callback(request):
|
|
|
|
access_token_url = 'https://www.google.com/accounts/OAuthGetAccessToken'
|
|
|
|
consumer = oauth.Consumer(settings.OAUTH_KEY, settings.OAUTH_SECRET)
|
2010-07-05 17:11:04 -04:00
|
|
|
|
|
|
|
if request.user.is_authenticated():
|
|
|
|
user_token = OAuthToken.objects.get(user=request.user)
|
|
|
|
else:
|
2010-07-17 11:50:16 -04:00
|
|
|
try:
|
|
|
|
user_token = OAuthToken.objects.get(session_id=request.session.session_key)
|
|
|
|
except OAuthToken.DoesNotExist:
|
|
|
|
user_tokens = OAuthToken.objects.filter(remote_ip=request.META['REMOTE_ADDR']).order_by('-created_date')
|
2010-08-15 12:04:26 -04:00
|
|
|
logging.info("Found ip user_tokens: %s" % user_tokens)
|
2010-07-17 11:50:16 -04:00
|
|
|
if user_tokens:
|
|
|
|
user_token = user_tokens[0]
|
2010-07-17 11:55:25 -04:00
|
|
|
user_token.session_id = request.session.session_key
|
|
|
|
user_token.save()
|
2010-08-18 20:35:45 -04:00
|
|
|
|
2010-08-15 12:04:26 -04:00
|
|
|
logging.info("Google Reader request.GET: %s" % request.GET)
|
2010-07-05 17:11:04 -04:00
|
|
|
# Authenticated in Google, so verify and fetch access tokens
|
2010-06-29 20:16:09 -04:00
|
|
|
token = oauth.Token(user_token.request_token, user_token.request_token_secret)
|
|
|
|
token.set_verifier(request.GET['oauth_verifier'])
|
|
|
|
client = oauth.Client(consumer, token)
|
|
|
|
resp, content = client.request(access_token_url, "POST")
|
|
|
|
access_token = dict(urlparse.parse_qsl(content))
|
2010-08-18 20:35:45 -04:00
|
|
|
original_token = dict(urlparse.parse_qsl(token))
|
2010-08-15 12:04:26 -04:00
|
|
|
logging.info(" ---> [%s] OAuth Reader Content: %s -- %s" % (token, access_token, content))
|
2010-08-18 20:35:45 -04:00
|
|
|
user_token.access_token = access_token.get('oauth_token') or original_token.get('oauth_token')
|
|
|
|
user_token.access_token_secret = access_token.get('oauth_token_secret') or original_token.get('oauth_token_secret')
|
2010-06-29 20:16:09 -04:00
|
|
|
user_token.save()
|
|
|
|
|
2010-07-05 17:11:04 -04:00
|
|
|
# Fetch imported feeds on next page load
|
2010-06-29 20:16:09 -04:00
|
|
|
request.session['import_from_google_reader'] = True
|
|
|
|
|
2010-07-05 17:11:04 -04:00
|
|
|
if request.user.is_authenticated():
|
|
|
|
return HttpResponseRedirect(reverse('index'))
|
|
|
|
|
|
|
|
return HttpResponseRedirect(reverse('import-signup'))
|
2010-06-29 20:16:09 -04:00
|
|
|
|
2010-08-17 20:59:47 -04:00
|
|
|
@json.json_view
|
|
|
|
def import_from_google_reader(request):
|
2010-06-29 20:16:09 -04:00
|
|
|
scope = "http://www.google.com/reader/api"
|
|
|
|
sub_url = "%s/0/subscription/list" % scope
|
2010-08-17 20:59:47 -04:00
|
|
|
code = 0
|
2010-08-17 23:40:03 -04:00
|
|
|
|
2010-08-17 20:59:47 -04:00
|
|
|
if request.user.is_authenticated():
|
|
|
|
user_tokens = OAuthToken.objects.filter(user=request.user)
|
2010-07-05 17:11:04 -04:00
|
|
|
if user_tokens.count():
|
|
|
|
user_token = user_tokens[0]
|
|
|
|
consumer = oauth.Consumer(settings.OAUTH_KEY, settings.OAUTH_SECRET)
|
|
|
|
token = oauth.Token(user_token.access_token, user_token.access_token_secret)
|
|
|
|
client = oauth.Client(consumer, token)
|
|
|
|
|
|
|
|
resp, content = client.request(sub_url, 'GET')
|
2010-08-17 20:59:47 -04:00
|
|
|
reader_importer = GoogleReaderImporter(content, request.user)
|
|
|
|
reader_importer.process()
|
|
|
|
code = 1
|
2010-08-18 07:46:32 -04:00
|
|
|
if 'import_from_google_reader' in request.session:
|
|
|
|
del request.session['import_from_google_reader']
|
2010-08-17 20:59:47 -04:00
|
|
|
|
|
|
|
return dict(code=code)
|
2010-07-05 17:11:04 -04:00
|
|
|
|
|
|
|
def import_signup(request):
|
|
|
|
if request.method == "POST":
|
|
|
|
signup_form = SignupForm(prefix='signup', data=request.POST)
|
|
|
|
if signup_form.is_valid():
|
|
|
|
new_user = signup_form.save()
|
2010-07-17 19:52:51 -04:00
|
|
|
try:
|
|
|
|
user_token = OAuthToken.objects.get(session_id=request.session.session_key)
|
|
|
|
except OAuthToken.DoesNotExist:
|
|
|
|
user_tokens = OAuthToken.objects.filter(remote_ip=request.META['REMOTE_ADDR']).order_by('-created_date')
|
|
|
|
if user_tokens:
|
|
|
|
user_token = user_tokens[0]
|
|
|
|
user_token.session_id = request.session.session_key
|
|
|
|
user_token.save()
|
2010-07-05 17:11:04 -04:00
|
|
|
user_token.user = new_user
|
|
|
|
user_token.save()
|
|
|
|
login_user(request, new_user)
|
|
|
|
return HttpResponseRedirect(reverse('index'))
|
|
|
|
else:
|
|
|
|
signup_form = SignupForm(prefix='signup')
|
|
|
|
|
|
|
|
return render_to_response('import/signup.xhtml', {
|
|
|
|
'signup_form': signup_form,
|
|
|
|
}, context_instance=RequestContext(request))
|