david / django-roa (http://welldev.org/)

Turn your models into remote resources that you can access through Django's ORM. ROA stands for Resource Oriented Architecture.

Clone this repository (size: 560.7 KB): HTTPS / SSH
$ hg clone http://code.welldev.org/django-roa

Changed (Δ6.6 KB):

raw changeset »

examples/twitter_roa/__init__.py (null-size change)

examples/twitter_roa/admin.py (24 lines added, 0 lines removed)

examples/twitter_roa/manage.py (14 lines added, 0 lines removed)

examples/twitter_roa/models.py (44 lines added, 0 lines removed)

examples/twitter_roa/serializers.py (58 lines added, 0 lines removed)

examples/twitter_roa/settings.py (70 lines added, 0 lines removed)

examples/twitter_roa/urls.py (8 lines added, 0 lines removed)

Up to file-list examples/twitter_roa/admin.py:

1
from django.contrib import admin
2
from django_roa import ModelAdmin
3
from models import Tweet, User
4
5
class TweetAdmin(ModelAdmin):
6
    list_display = ('id', 'text', 'get_source_for_admin', 'get_user_link')
7
8
    def get_source_for_admin(self, item):
9
        return item.source
10
    get_source_for_admin.short_description = u'Source'
11
    get_source_for_admin.allow_tags = True
12
13
    def get_user_link(self, item):
14
        url = '../user/%s/' % (item.user.id)
15
        return '<a href="%s" title="">%s</a>' % (url, item.user)
16
    get_user_link.short_description = u'User'
17
    get_user_link.allow_tags = True
18
19
admin.site.register(Tweet, TweetAdmin)
20
21
class UserAdmin(ModelAdmin):
22
    list_display = ('screen_name',)
23
24
admin.site.register(User, UserAdmin)

Up to file-list examples/twitter_roa/manage.py:

1
import sys, os
2
sys.path.insert(0, os.path.split(os.path.split(os.getcwd())[0])[0])
3
4
from django.core.management import execute_manager
5
6
try:
7
    import settings # Assumed to be in the same directory.
8
except ImportError:
9
    import sys
10
    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
11
    sys.exit(1)
12
13
if __name__ == "__main__":
14
    execute_manager(settings)

Up to file-list examples/twitter_roa/models.py:

1
from django.db import models
2
3
from django_roa import Model, Manager
4
from django_roa.db.query import RemoteQuerySet
5
6
class User(Model):
7
    name = models.CharField(max_length=50)
8
    screen_name = models.CharField(max_length=50)
9
    description = models.TextField()
10
11
    def __unicode__(self):
12
        return u'%s (%s)' % (self.name, self.screen_name)
13
14
    @staticmethod
15
    def get_resource_url_list():
16
        return u'http://twitter.com/users/show.json'
17
18
19
class FakeCountRemoteQuerySet(RemoteQuerySet):
20
    def count(self):
21
        """
22
        Because trying to count the whole number of tweets is stupid.
23
        """
24
        return 20
25
26
27
class TweetManager(Manager):
28
    def get_query_set(self):
29
        return FakeCountRemoteQuerySet(self.model)
30
31
32
class Tweet(Model):
33
    text = models.TextField()
34
    source = models.CharField(max_length=50)
35
    user = models.ForeignKey(User)
36
    
37
    objects = TweetManager()
38
    
39
    def __unicode__(self):
40
        return u'%s (%s)' % (self.text, self.id)
41
42
    @staticmethod
43
    def get_resource_url_list():
44
        return u'http://twitter.com/statuses/public_timeline.json'

Up to file-list examples/twitter_roa/serializers.py:

1
import simplejson
2
from StringIO import StringIO
3
4
from django.conf import settings
5
from django.db import models
6
from django.utils.encoding import smart_unicode
7
from django.core.serializers import base
8
from django.core.serializers.json import Serializer as JSONSerializer
9
from django.core.serializers.python import _get_model
10
11
class Serializer(JSONSerializer):
12
    pass
13
14
15
def Deserializer(stream_or_string, **options):
16
    """
17
    Deserialize a stream or string of JSON data.
18
    """
19
    if isinstance(stream_or_string, basestring):
20
        stream = StringIO(stream_or_string)
21
    else:
22
        stream = stream_or_string
23
    models.get_apps()
24
    object_list = simplejson.load(stream)
25
    if not isinstance(object_list, list):
26
        object_list = [object_list]
27
    for obj in object_list:
28
        # Look up the model and starting build a dict of data for it.
29
        if 'name' in obj:
30
            Model = _get_model('twitter_roa.user')
31
        else:
32
            Model = _get_model("twitter_roa.tweet")
33
        data = {}
34
        m2m_data = {}
35
        
36
        # Handle each field
37
        for (field_name, field_value) in obj.iteritems():
38
            if isinstance(field_value, str):
39
                field_value = smart_unicode(field_value, options.get("encoding", settings.DEFAULT_CHARSET), strings_only=True)
40
        
41
            try:
42
                field = Model._meta.get_field(field_name)
43
            except models.fields.FieldDoesNotExist:
44
                continue
45
        
46
            # Handle FK fields
47
            if field.rel and isinstance(field.rel, models.ManyToOneRel):
48
                if field_value is not None:
49
                    data[field.attname] = field.rel.to._meta.get_field(field.rel.field_name).to_python(field_value['id'])
50
                else:
51
                    data[field.attname] = None
52
53
            # Handle all other fields
54
            else:
55
                data[field.name] = field.to_python(field_value)
56
        
57
        yield base.DeserializedObject(Model(**data), m2m_data)
58
        

Up to file-list examples/twitter_roa/settings.py:

1
import os
2
ROOT_PATH = os.path.dirname(__file__)
3
4
TEMPLATE_DEBUG = DEBUG = True
5
MANAGERS = ADMINS = ()
6
DATABASE_ENGINE = 'sqlite3'
7
DATABASE_NAME = os.path.join(ROOT_PATH, 'testdb.sqlite')
8
9
TIME_ZONE = 'America/Chicago'
10
LANGUAGE_CODE = 'en-us'
11
SITE_ID = 1
12
USE_I18N = True
13
MEDIA_ROOT = ''
14
MEDIA_URL = ''
15
ADMIN_MEDIA_PREFIX = '/media/'
16
SECRET_KEY = '2+@4vnr#v8e273^+a)g$8%dre^dwcn#d&n#8+l6jk7r#$p&3zk'
17
TEMPLATE_LOADERS = (
18
    'django.template.loaders.filesystem.load_template_source',
19
    'django.template.loaders.app_directories.load_template_source',
20
)
21
TEMPLATE_CONTEXT_PROCESSORS = (
22
    "django.core.context_processors.auth",
23
    "django.core.context_processors.debug",
24
    "django.core.context_processors.i18n",
25
    "django.core.context_processors.request",
26
)
27
MIDDLEWARE_CLASSES = (
28
    'django.middleware.common.CommonMiddleware',
29
    'django.contrib.sessions.middleware.SessionMiddleware',
30
    'django.contrib.auth.middleware.AuthenticationMiddleware',
31
)
32
ROOT_URLCONF = 'urls'
33
TEMPLATE_DIRS = (os.path.join(ROOT_PATH, '../../templates'),)
34
INSTALLED_APPS = (
35
    'django_roa',
36
    'twitter_roa',
37
    'django.contrib.admin',
38
    'django.contrib.auth',
39
    'django.contrib.contenttypes',
40
    'django.contrib.sessions',
41
)
42
SESSION_ENGINE = "django.contrib.sessions.backends.file"
43
SERIALIZATION_MODULES = {
44
    'twitter' : 'examples.twitter_roa.serializers',
45
}
46
47
## ROA custom settings
48
ROA_MODELS = True   # set to False if you'd like to develop/test locally
49
ROA_FORMAT = 'twitter' # json or xml
50
ROA_DJANGO_ERRORS = True # useful to ease debugging if you use test server
51
52
ROA_URL_OVERRIDES_DETAIL = {
53
    'twitter_roa.tweet': lambda o: u'http://twitter.com/statuses/show/%s.json' % o.id,
54
    'twitter_roa.user': lambda o: u'http://twitter.com/users/show/%s.json' % o.id,
55
}
56
ROA_ARGS_NAMES_MAPPING = {
57
    'filter_id__exact': 'user_id',
58
}
59
60
## Logging settings
61
import logging
62
# create logger
63
logger = logging.getLogger("django_roa")
64
logger.setLevel(logging.DEBUG)
65
# create console handler and set level to debug
66
ch = logging.StreamHandler()
67
ch.setLevel(logging.DEBUG)
68
ch.setFormatter(logging.Formatter("%(name)s - %(message)s"))
69
logger.addHandler(ch)
70

Up to file-list examples/twitter_roa/urls.py:

1
from django.conf.urls.defaults import *
2
from django.contrib import admin
3
4
admin.autodiscover()
5
6
urlpatterns = patterns('',
7
    url(r'^admin/(.*)', admin.site.root),
8
)