Permalink
Browse files

Saving FB access token (closes #27, closes #11)

  • Loading branch information...
1 parent 03ee7c2 commit e1172aabaf107643c5c8a8016760f5042749a74a @pennersr pennersr committed Dec 8, 2011
@@ -1,10 +1,15 @@
from django.contrib import admin
-from models import FacebookApp, FacebookAccount
+from models import FacebookApp, FacebookAccount, FacebookAccessToken
class FacebookAccountAdmin(admin.ModelAdmin):
raw_id_fields = ('user',)
+ list_display = ('user', 'social_id', 'name')
+
+class FacebookAccessTokenAdmin(admin.ModelAdmin):
+ raw_id_fields = ('account',)
admin.site.register(FacebookApp)
admin.site.register(FacebookAccount, FacebookAccountAdmin)
+admin.site.register(FacebookAccessToken, FacebookAccessTokenAdmin)
@@ -0,0 +1,108 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding model 'FacebookAccessToken'
+ db.create_table('facebook_facebookaccesstoken', (
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('app', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['facebook.FacebookApp'])),
+ ('account', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['facebook.FacebookAccount'])),
+ ('access_token', self.gf('django.db.models.fields.CharField')(max_length=200)),
+ ))
+ db.send_create_signal('facebook', ['FacebookAccessToken'])
+
+ # Adding unique constraint on 'FacebookAccessToken', fields ['app', 'account']
+ db.create_unique('facebook_facebookaccesstoken', ['app_id', 'account_id'])
+
+
+ def backwards(self, orm):
+
+ # Removing unique constraint on 'FacebookAccessToken', fields ['app', 'account']
+ db.delete_unique('facebook_facebookaccesstoken', ['app_id', 'account_id'])
+
+ # Deleting model 'FacebookAccessToken'
+ db.delete_table('facebook_facebookaccesstoken')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'facebook.facebookaccesstoken': {
+ 'Meta': {'unique_together': "(('app', 'account'),)", 'object_name': 'FacebookAccessToken'},
+ 'access_token': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'account': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['facebook.FacebookAccount']"}),
+ 'app': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['facebook.FacebookApp']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'facebook.facebookaccount': {
+ 'Meta': {'object_name': 'FacebookAccount', '_ormbases': ['socialaccount.SocialAccount']},
+ 'link': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'social_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+ 'socialaccount_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['socialaccount.SocialAccount']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ 'facebook.facebookapp': {
+ 'Meta': {'object_name': 'FacebookApp'},
+ 'api_key': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
+ 'application_id': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
+ 'application_secret': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+ 'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"})
+ },
+ 'sites.site': {
+ 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'socialaccount.socialaccount': {
+ 'Meta': {'object_name': 'SocialAccount'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ }
+ }
+
+ complete_apps = ['facebook']
View
@@ -38,4 +38,26 @@ def get_avatar_url(self):
def __unicode__(self):
return "%s (%s)" % (self.name, self.social_id)
+
+ def sync(self, data):
+ self.link = data['facebook_me']['link']
+ self.name = data['facebook_me']['name']
+ self.save()
+ access_token = data['facebook_access_token']
+ token, created = FacebookAccessToken.objects \
+ .get_or_create(app=FacebookApp.objects.get_current(),
+ account=self,
+ defaults={'access_token': access_token})
+ if not created and token.access_token != access_token:
+ token.access_token = access_token
+ token.save()
+class FacebookAccessToken(models.Model):
+ app = models.ForeignKey(FacebookApp)
+ account = models.ForeignKey(FacebookAccount)
+ access_token = models.CharField(max_length=200)
+
+ class Meta:
+ unique_together = ('app', 'account')
+ def __unicode__(self):
+ return self.access_token
View
@@ -37,15 +37,17 @@ def login(request):
account = FacebookAccount.objects.get(social_id=social_id)
except FacebookAccount.DoesNotExist:
account = FacebookAccount(social_id=social_id)
- account.link = facebook_me['link']
- account.name = facebook_me['name']
- if account.pk:
- account.save()
data = dict(email=email,
+ facebook_access_token=token,
facebook_me=facebook_me)
# some facebook accounts don't have this data
data.update((k,v) for (k,v) in facebook_me.items()
if k in ['username', 'first_name', 'last_name'])
+ # Don't save partial/temporary accounts that haven't
+ # gone through the full signup yet, as there is no
+ # User attached yet.
+ if account.pk:
+ account.sync(data)
ret = complete_social_login(request, data, account)
except (GraphAPIError, IOError):
pass
@@ -62,7 +62,7 @@ def _process_signup(request, data, account):
u.is_active = not account_settings.EMAIL_VERIFICATION
u.save()
account.user = u
- account.save()
+ account.sync(data)
send_email_confirmation(u, request=request)
ret = complete_social_signup(request, u, account)
return ret
@@ -105,7 +105,7 @@ def complete_social_login(request, data, account):
else:
# New social account
account.user = request.user
- account.save()
+ account.sync(data)
messages.add_message \
(request, messages.INFO,
_('The social account has been connected to your existing account'))
@@ -32,3 +32,6 @@ def get_provider_account(self):
except self._meta.get_field_by_name(f)[0].model.DoesNotExist:
pass
assert False, "Dangling SocialAccount encountered: allauth.<foo> missing from INSTALLED_APPS ?"
+
+ def sync(self, data):
+ self.save()
@@ -36,7 +36,7 @@ def signup(request, **kwargs):
user.save()
account = signup['account']
account.user = user
- account.save()
+ account.sync(data)
return helpers.complete_social_signup(request, user, account)
else:
form = form_class(initial=data)

0 comments on commit e1172aa

Please sign in to comment.