My favorites | Sign in
Project Home Downloads Wiki Issues Source
Repository:
Checkout   Browse   Changes   Clones    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# Copyright (C) 2010 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""OAuth 2.0 utilities for Django.

Utilities for using OAuth 2.0 in conjunction with
the Django datastore.
"""

__author__ = 'jcgregorio@google.com (Joe Gregorio)'

import oauth2client
import base64
import pickle

from django.db import models
from oauth2client.client import Storage as BaseStorage

class CredentialsField(models.Field):

__metaclass__ = models.SubfieldBase

def get_internal_type(self):
return "TextField"

def to_python(self, value):
if not value:
return None
if isinstance(value, oauth2client.client.Credentials):
return value
return pickle.loads(base64.b64decode(value))

def get_db_prep_value(self, value, connection, prepared=False):
return base64.b64encode(pickle.dumps(value))


class FlowField(models.Field):

__metaclass__ = models.SubfieldBase

def get_internal_type(self):
return "TextField"

def to_python(self, value):
if value is None:
return None
if isinstance(value, oauth2client.client.Flow):
return value
return pickle.loads(base64.b64decode(value))

def get_db_prep_value(self, value, connection, prepared=False):
return base64.b64encode(pickle.dumps(value))


class Storage(BaseStorage):
"""Store and retrieve a single credential to and from
the datastore.

This Storage helper presumes the Credentials
have been stored as a CredenialsField
on a db model class.
"""

def __init__(self, model_class, key_name, key_value, property_name):
"""Constructor for Storage.

Args:
model: db.Model, model class
key_name: string, key name for the entity that has the credentials
key_value: string, key value for the entity that has the credentials
property_name: string, name of the property that is an CredentialsProperty
"""
self.model_class = model_class
self.key_name = key_name
self.key_value = key_value
self.property_name = property_name

def locked_get(self):
"""Retrieve Credential from datastore.

Returns:
oauth2client.Credentials
"""
credential = None

query = {self.key_name: self.key_value}
entities = self.model_class.objects.filter(**query)
if len(entities) > 0:
credential = getattr(entities[0], self.property_name)
if credential and hasattr(credential, 'set_store'):
credential.set_store(self)
return credential

def locked_put(self, credentials):
"""Write a Credentials to the datastore.

Args:
credentials: Credentials, the credentials to store.
"""
args = {self.key_name: self.key_value}
entity = self.model_class(**args)
setattr(entity, self.property_name, credentials)
entity.save()

def locked_delete(self):
"""Delete Credentials from the datastore."""

query = {self.key_name: self.key_value}
entities = self.model_class.objects.filter(**query).delete()

Change log

40924b2a9cd2 by Joe Gregorio <jcgrego...@google.com> on Feb 6, 2012   Diff
Add .delete() method to Django Storage.
Reviewed in
http://codereview.appspot.com/5636054/
Go to: 

Older revisions

d16460395f38 by Joe Gregorio <jcgrego...@google.com> on Oct 14, 2011   Diff
Make django_orm models use TEXT
instead of VARCHAR.

Reviewed in
http://codereview.appspot.com/5165047/
d68eb65bb173 by Joe Gregorio <jcgrego...@google.com> on Sep 15, 2011   Diff
Fixed bug with refreshing tokens in
file Storage
c4c1be2a741e by Joe Gregorio <jcgrego...@google.com> on Sep 11, 2011   Diff
Add fancy locking to oauth2client.

Reviewed in
http://codereview.appspot.com/4919049/
All revisions of this file

File info

Size: 3442 bytes, 120 lines
Powered by Google Project Hosting