瀏覽代碼

Merged DrkSephy/django-hackathon-starter into default

Eswari Pravallika Swarna 10 年之前
父節點
當前提交
f726543759

+ 2 - 1
hackathon_starter/hackathon/admin.py

@@ -1,8 +1,9 @@
 from django.contrib import admin
-from hackathon.models import UserProfile, Profile, InstagramProfile
+from hackathon.models import UserProfile, Profile, InstagramProfile, TwitterProfile
 
 # Register your models here.
 admin.site.register(UserProfile)
 admin.site.register(Profile)
 admin.site.register(InstagramProfile)
+admin.site.register(TwitterProfile)
 

+ 10 - 0
hackathon_starter/hackathon/models.py

@@ -20,11 +20,21 @@ class Profile(models.Model):
 
 class InstagramProfile(models.Model):
     user = models.ForeignKey(User)
+    instagram_user = models.CharField(max_length=200)
     access_token = models.CharField(max_length=200)
 
     def __unicode__(self):
         return unicode(self.user)
 
+class TwitterProfile(models.Model):
+    user = models.ForeignKey(User)
+    twitter_user = models.CharField(max_length=200)
+    oauth_token = models.CharField(max_length=200)
+    oauth_token_secret = models.CharField(max_length=200)
+
+    def __unicode__(self):
+        return unicode(self.user)
+
 class Snippet(models.Model):
     created = models.DateTimeField(auto_now_add=True)
     title = models.CharField(max_length=100, blank=True, default='')

+ 13 - 0
hackathon_starter/hackathon/scripts/instagram.py

@@ -148,6 +148,19 @@ class InstagramOauthClient(object):
 		return data
 
 	def search_for_location(self, address, access_token):
+		'''
+		Parameters:
+			access_token: String
+				- The access_token given after granting permission
+				  application access to Instagram data.
+			address: String
+				- The address is a user input.
+
+		Returns:
+			location: Dictionary
+				- A dictionary returning the latitude, and longitude
+				  of an address.
+		'''		
 		gmaps = googlemaps.Client(key=settings.GOOGLEMAP_API_KEY)
 		#geocoding and address
 		geocode_result = gmaps.geocode(address)

+ 160 - 8
hackathon_starter/hackathon/scripts/twitter.py

@@ -1,19 +1,42 @@
+
+'''
+twitter.py contains a handful of methods for interacting
+with Twitter data and returning the responses as JSON.
+'''
+
+
 import urlparse
 import oauth2 as oauth
 import requests
 import base64, random
+import urllib
+import binascii
+import time, collections, json, hmac, hashlib
+import simplejson as json2
 
 request_token_url = 'https://api.twitter.com/oauth/request_token'
 access_token_url = 'https://api.twitter.com/oauth/access_token'
 authorize_url = 'https://api.twitter.com/oauth/authorize'
 
 class TwitterOauthClient(object):
+	'''
+	Python Client for Twitter API.
+	'''	
 
 	oauth_token = None
 	oauth_token_secret = None
 
 
 	def __init__(self, consumer_key, consumer_secret, access_token, access_token_secret):
+		'''
+		Parameters:
+			consumer_key: String
+				- The consumer_key from registering application
+				  on Instagram.
+			consumer_secret: String
+				- The consumer_secret from registering application
+				  on Instagram.
+		'''		
 		self.consumer_key = consumer_key
 		self.consumer_secret = consumer_secret
 		self.access_token = access_token
@@ -67,19 +90,148 @@ class TwitterOauthClient(object):
 		self.username = access_token['screen_name']
 
 
-	def get_nonce(self):
-		'''
-		Unique token generated for each request.
-		'''
-		n = base64.b64encode(
-			''.join([str(random.randint(0, 9)) for i in range(24)]))
-		return n
 
-	#def get_trends_available(self):
 
+	def get_trends_available(self, yahoo_consumer_key):
+		method = "get"
+		link = 'https://api.twitter.com/1.1/trends/available.json'
+		link_parameters = {}
+		#link = 'https://api.twitter.com/1.1/trends/closest.json'
+		#link_parameters = {'lat':'40.782032', 'long':'-73.9717188'}
+		#link = 'https://api.twitter.com/1.1/trends/place.json'
+		#link_parameters = {'id': '1'}
 		
 
+		oauth_parameters = get_oauth_parameters(
+		    self.consumer_key,
+		    self.access_token
+		)
+
+		oauth_parameters['oauth_signature'] = generate_signature(
+		    method,
+		    link,
+		    link_parameters,
+		    oauth_parameters,
+		    self.consumer_key,
+		    self.consumer_secret,
+		    self.access_token_secret
+		)
+
+		headers = {'Authorization': create_auth_header(oauth_parameters)}
+
+		if link_parameters:
+			link += '?'+urllib.urlencode(link_parameters)
+
+		req = requests.get(link, headers=headers)
+		#print req.status_code
+		
+		if int(req.status_code) != 200:
+			raise Exception('Invalid response %s' %req.status_code)
+
+		content = json2.loads(req.content)
+		#print len(content)
+		
+		for place in content:
+			for e in place:
+				if e == 'url':
+					request_neighbor_data=  requests.get(place[e]+'/neighbors?appid='+yahoo_consumer_key+'&format=json')
+					#print request_neighbor_data.status_code
+					if request_neighbor_data.status_code == 200:
+						neighbor = json2.loads(request_neighbor_data.content)
+					else:
+						neighbor = {}
+
+			place['neighbor'] = neighbor
+					#print place
+
+
+		return content
+		
+
+
+
+
+def percent_encode(string):
+	'''
+	Percent encode strings.
+	'''
+	return urllib.quote(string, safe='~')
+
+
+def get_nonce():
+	'''
+	Generate unique token per request.
+	'''
+
+	n = base64.b64encode(''.join([str(random.randint(0, 9)) for i in range(24)]))
+	return n
+
+
+def generate_signature(method, link, link_parameters, oauth_parameters, oauth_consumer_key, oauth_consumer_secret, oauth_token_secret=None, status=None):
+    '''
+    Generate signature.
+    '''
+    if link_parameters:
+    	new_dict = dict(oauth_parameters, **link_parameters)
+    	parameters = urllib.urlencode(collections.OrderedDict(sorted(new_dict.items())))
+    else:
+    	parameters = urllib.urlencode(collections.OrderedDict(sorted(oauth_parameters.items())))
+
+    #Create your Signature Base String
+    signature_base_string = ( method.upper() + '&' + percent_encode(str(link)) + '&' + percent_encode(parameters))
+
+    #Get the signing key
+    signing_key = create_signing_key(oauth_consumer_secret, oauth_token_secret)
+
+    return calculate_signature(signing_key, signature_base_string)
+
+
+
+def calculate_signature(signing_key, signature_base_string):
+    '''
+    Calculate signature using HMAC-SHA1 hashing algorithm.
+    '''
+    hashed = hmac.new(signing_key, signature_base_string, hashlib.sha1)
+
+    sig = binascii.b2a_base64(hashed.digest())[:-1]
+
+    return percent_encode(sig)
+
+
+def create_signing_key(oauth_consumer_secret, oauth_token_secret):
+    '''
+    Creates a key to sign the request with.
+    '''
+
+    signing_key = percent_encode(oauth_consumer_secret) + '&' + percent_encode(oauth_token_secret)
+
+    return signing_key
+
+
+def create_auth_header(parameters):
+	'''
+	Format authorization header with oath parameters.
+	'''
+
+	ordered_parameters = collections.OrderedDict(sorted(parameters.items()))
+	auth_header = ('%s="%s"' % (k, v) for k, v in ordered_parameters.iteritems())
+
+	return "OAuth " + ', '.join(auth_header)
 
 
+def get_oauth_parameters(consumer_key, access_token):
+    '''
+    Returns parameters for making requests.
+    '''
+    oauth_parameters = {
+        'oauth_timestamp': str(int(time.time())),
+        'oauth_signature_method': "HMAC-SHA1",
+        'oauth_version': "1.0",
+        'oauth_token': access_token,
+        'oauth_nonce': get_nonce(),
+        'oauth_consumer_key': consumer_key
+    }
 
+    return oauth_parameters
 
+    

+ 39 - 1
hackathon_starter/hackathon/templates/hackathon/twitter.html

@@ -3,5 +3,43 @@
 <body>
 	{% include 'hackathon/base.html' %}
 	<h1 class="text-center"> {{ title }}</h1> 
-	</div>	
+	</div>
+	<div class="col-lg-12">
+        <div class="table-responsive">
+            <table class="table table-bordered table-hover table-striped tablesorter">
+                <thead>
+                <tr>
+                <th class="header"> Name <i class="icon-sort"></i></th>
+                <th class="header"> Woeid <i class="icon-sort"></i></th>
+                <th class="header"> Place type <i class="icon-sort"></i></th>
+                <th class="header"> Country <i class="icon-sort"></i></th>
+                <th class="header"> Country Code <i class="icon-sort"></i></th>
+                <th class="header"> ParentID <i class="icon-sort"></i></th>
+                <th class="header"> Neighbor <i class="icon-sort"></i></th>
+                </tr>
+            </thead>
+            <tbody>
+            {% for item in value %}
+                <tr>
+                    <td>{{ item.name }}</td> 
+                    <td>{{ item.woeid }}</td>
+                    <td>{{ item.placeType.name}}</td>
+                    <td>{{ item.country}}</td>
+                    <td>{{ item.countryCode}}</td>
+                    <td>{{ item.parentid}}</td>
+                    {% if item.neighbor %}
+                        <td>
+                            {% for v in item.neighbor.places.place %}
+                                {{ v.name }},
+                            {% endfor %}
+                        </td>
+                    {% else %}
+                        <td>No available Data.</td>
+                    {% endif %}
+            {% endfor %}
+            </tbody>
+            </table>
+        </div>
+    </div>
+
 </html>

+ 37 - 28
hackathon_starter/hackathon/views.py

@@ -27,11 +27,12 @@ from rest_framework.renderers import JSONRenderer
 from rest_framework.parsers import JSONParser
 
 # Models
-from hackathon.models import Snippet, Profile, InstagramProfile
+from hackathon.models import Snippet, Profile, InstagramProfile, TwitterProfile
 from hackathon.serializers import SnippetSerializer
 from hackathon.forms import UserForm
 
 
+
 getTumblr = TumblrOauthClient(settings.TUMBLR_CONSUMER_KEY, settings.TUMBLR_CONSUMER_SECRET)
 getInstagram = InstagramOauthClient(settings.INSTAGRAM_CLIENT_ID, settings.INSTAGRAM_CLIENT_SECRET)
 getTwitter = TwitterOauthClient(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET, settings.TWITTER_ACCESS_TOKEN, settings.TWITTER_ACCESS_TOKEN_SECRET)
@@ -172,7 +173,7 @@ def tumblr(request):
         except User.DoesNotExist:
             user_info, total_blog = getTumblr.getUserInfo()
             username = str(user_info['name'])+ "2"
-            new_user = User.objects.create_user(username, username+'@example.com','password')
+            new_user = User.objects.create_user(username, username+'@tumblr.com','password')
             new_user.save()
             profile =Profile()
             profile.user = new_user
@@ -203,30 +204,29 @@ def instagram(request):
     getInstagram.get_access_token(code)
 
     #check if user in User profile
-    if request.user not in User.objects.all():
-        print "user not in User"
+    if not User.objects.all().filter(username=request.user.username):
+        print "anno"
         try:  
             user = User.objects.get(username=getInstagram.user_data['username'])
         except User.DoesNotExist:
-            username = getInstagram.user_data['username']
-            new_user = User.objects.create_user(username, username+'@example.com', 'password')
+            username = getTwitter.username 
+            new_user = User.objects.create_user(username, username+'@madewithinstagram.com', 'password')
             new_user.save()
-            profile = InstagramProfile()
-            profile.user = new_user
-            profile.access_token = getInstagram.access_token 
+            profile = InstagramProfile(user = new_user, access_token = getInstagram.access_token, instagram_user=new_user.username+'instagram')
             profile.save()
-
-        user = authenticate(username=getInstagram.user_data['username'], password='password')
-        login(request, user)
+        user = authenticate(username=getInstagram.user_data['username'] , password='password')
+        login(request, user)            
     else:
+        print "exist instagram"
         #check if user has an Instragram profile
         try:  
             user = User.objects.get(username=request.user.username)
-            instagramUser = InstagramProfile.objects.get(user=user.id)
+            twitterUser = InstagramProfile.objects.get(user=user.id)
         except InstagramProfile.DoesNotExist:
             new_user = User.objects.get(username=request.user.username)
-            profile = InstagramProfile(user = new_user, access_token=getInstagram.access_token)
-            profile.save()
+            profile = InstagramProfile(user = new_user, access_token = getInstagram.access_token, instagram_user=new_user.username+'@instagram')
+            profile.save()  
+
 
     search_tag = 'kitten'
     #return tagged objects
@@ -251,6 +251,7 @@ def instagramUserMedia(request):
     return JsonResponse({'data': parsedData })
 
 def instagramMediaByLocation(request):
+    print request.user
     if request.method == 'GET':
         if request.GET.items():
             #check if user has a User profile
@@ -283,28 +284,36 @@ def instagramMediaByLocation(request):
 ####################
 def twitter(request):
     oauth_verifier = request.GET['oauth_verifier']
-    getTwitter.get_access_token_url(oauth_verifier)     
+    getTwitter.get_access_token_url(oauth_verifier)   
+    print request.user
 
-
-    if request.user not in User.objects.all():
+    if not User.objects.all().filter(username=request.user.username):
         try:  
-            user = User.objects.get(username=getTwitter.username )
+            user = User.objects.get(username=getTwitter.username)
         except User.DoesNotExist:
             username = getTwitter.username 
-            new_user = User.objects.create_user(username, username+'@example.com', 'password')
+            new_user = User.objects.create_user(username, username+'@madewithtwitter.com', 'password')
             new_user.save()
-            profile = Profile()
-            profile.user = new_user
-            profile.oauth_token = getTwitter.oauth_token
-            profile.oauth_secret = getTwitter.oauth_token_secret
+            profile = TwitterProfile(user = new_user,oauth_token = getTwitter.oauth_token, oauth_token_secret= getTwitter.oauth_token_secret, twitter_user=new_user.username+'twitter')
             profile.save()
-
         user = authenticate(username=getTwitter.username, password='password')
-        login(request, user)
+        login(request, user)            
+    else:
+        print "exist twitter"
+        #check if user has an Instragram profile
+        try:  
+            user = User.objects.get(username=request.user.username)
+            twitterUser = TwitterProfile.objects.get(user=user.id)
+        except TwitterProfile.DoesNotExist:
+            new_user = User.objects.get(username=request.user.username)
+            profile = TwitterProfile(user = new_user, oauth_token = getTwitter.oauth_token, oauth_token_secret = getTwitter.oauth_token_secret, twitter_user=new_user.username+'@twitter')
+            profile.save()            
+
 
-    #getTwitter.get_trends_available()
+    value = getTwitter.get_trends_available(settings.YAHOO_CONSUMER_KEY)
+    #yahoo_woeid_link = 'http://where.yahooapis.com/v1/place/'+returned_woeid+'?appid='+settings.YAHOO_CONSUMER_KEY
 
-    context ={'title': 'twitter'}
+    context ={'title': 'twitter', 'value': value}
     return render(request, 'hackathon/twitter.html', context)
 
 

+ 3 - 0
hackathon_starter/hackathon_starter/settings.py

@@ -117,6 +117,9 @@ INSTAGRAM_CLIENT_ID = '77dc10b9e3624e908ce437c0a82da92e'
 INSTAGRAM_CLIENT_SECRET = '8bcf3139857149aaba7acaa61288427f'
 
 GOOGLEMAP_API_KEY = 'AIzaSyA7tttML91EGZ32S_FOOoxu-mbxN9Ojds8'
+YAHOO_CONSUMER_KEY = 'dj0yJmk9bUtPVmVpZEczZWp5JmQ9WVdrOWQxbDJkMjFhTmpRbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD1iOQ--'
+YAHOO_CONSUMER_SECRET = '630e59649caf71255679853ca3f6b0580c571e98'
+YAHOO_APP_ID = 'wYvwmZ64'
 
 TWITTER_CONSUMER_KEY = 'MS8DNyi5HX9HhJgigL24VEkqA'
 TWITTER_CONSUMER_SECRET = '1QdaLTNyrGIoZUniToou5bqax8mo7yuzIm7o4XjxzMhBE4UPY1'