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 (Δ2.3 KB):

raw changeset »

django_roa/db/models.py (12 lines added, 1 lines removed)

django_roa/db/query.py (29 lines added, 5 lines removed)

examples/django_roa_client/settings.py (13 lines added, 0 lines removed)

examples/django_roa_server/emitters.py (1 lines added, 1 lines removed)

examples/django_roa_server/handlers.py (1 lines added, 8 lines removed)

examples/django_roa_server/settings.py (11 lines added, 0 lines removed)

Up to file-list django_roa/db/models.py:

1
1
import sys
2
import logging
3
2
4
from django.conf import settings
3
5
from django.core import serializers
4
6
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, FieldError
@@ -13,6 +15,8 @@ from django.utils.functional import curr
13
15
from restclient import Resource, RequestFailed
14
16
from django_roa.db.exceptions import ROAException
15
17
18
logger = logging.getLogger("django_roa")
19
16
20
ROA_MODEL_NAME_MAPPING = getattr(settings, 'ROA_MODEL_NAME_MAPPING', [])
17
21
18
22
@@ -282,12 +286,16 @@ class ROAModel(models.Model):
282
286
        if force_update or pk_set and not self.id is None:
283
287
            resource = Resource(self.get_resource_url_detail())
284
288
            try:
289
                logger.debug(u"""Modifying : "%s" through %s""" % \
290
                    (self, resource.uri))
285
291
                response = resource.put(payload=args, **get_args)
286
292
            except RequestFailed, e:
287
293
                raise ROAException(e)
288
294
        else:
289
295
            resource = Resource(self.get_resource_url_list())
290
296
            try:
297
                logger.debug(u"""Creating  : "%s" through %s""" % \
298
                    (self, resource.uri))
291
299
                response = resource.post(payload=args, **get_args)
292
300
            except RequestFailed, e:
293
301
                raise ROAException(e)
@@ -304,9 +312,12 @@ class ROAModel(models.Model):
304
312
305
313
    def delete(self):
306
314
        assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." % (self._meta.object_name, self._meta.pk.attname)
307
315
                
308
316
        # Deletion in cascade should be done server side.
309
317
        resource = Resource(self.get_resource_url_detail())
318
        
319
        logger.debug(u"""Deleting  : "%s" through %s""" % \
320
            (self, resource.uri))
310
321
        response = resource.delete()
311
322
312
323
    delete.alters_data = True

Up to file-list django_roa/db/query.py:

1
import logging
2
1
3
from django.conf import settings
2
4
from django.db.models import query
3
5
from django.core import serializers
@@ -7,6 +9,8 @@ from django.db.models.query_utils import
7
9
from restclient import Resource, ResourceNotFound, RequestFailed
8
10
from django_roa.db.exceptions import ROAException
9
11
12
logger = logging.getLogger("django_roa")
13
10
14
ROA_MODEL_NAME_MAPPING = getattr(settings, 'ROA_MODEL_NAME_MAPPING', [])
11
15
ROA_ARGS_NAMES_MAPPING = getattr(settings, 'ROA_ARGS_NAMES_MAPPING', {})
12
16
@@ -186,7 +190,11 @@ class RemoteQuerySet(query.QuerySet):
186
190
        resource = Resource(self.model.get_resource_url_list())
187
191
188
192
        try:
189
            response = resource.get(**self.query.parameters)
193
            parameters = self.query.parameters
194
            logger.debug(u"""Requesting: "%s" through %s
195
                          with parameters "%s" """ % \
196
                (self.model.__name__, resource.uri, parameters))
197
            response = resource.get(**parameters)
190
198
        except ResourceNotFound:
191
199
            return
192
200
        except Exception, e:
@@ -214,7 +222,11 @@ class RemoteQuerySet(query.QuerySet):
214
222
        resource = Resource(clone.model.get_resource_url_list())
215
223
        
216
224
        try:
217
            response = resource.get(**clone.query.parameters)
225
            parameters = clone.query.parameters
226
            logger.debug(u"""Counting  : "%s" through %s
227
                          with parameters "%s" """ % \
228
                (clone.model.__name__, resource.uri, parameters))
229
            response = resource.get(**parameters)
218
230
        except ResourceNotFound:
219
231
            response = 0
220
232
        
@@ -343,7 +355,11 @@ class RemoteQuerySet(query.QuerySet):
343
355
        resource = Resource(instance.get_resource_url_detail())
344
356
        
345
357
        try:
346
            response = resource.put(**self.query.parameters)
358
            parameters = self.query.parameters
359
            logger.debug(u"""Adding    : "%s" for "%s"
360
                          with parameters "%s" """ % \
361
                (objs, instance, parameters))
362
            response = resource.put(**parameters)
347
363
        except RequestFailed, e:
348
364
            raise ROAException(e)
349
365
@@ -358,7 +374,11 @@ class RemoteQuerySet(query.QuerySet):
358
374
        resource = Resource(instance.get_resource_url_detail())
359
375
        
360
376
        try:
361
            response = resource.put(**self.query.parameters)
377
            parameters = self.query.parameters
378
            logger.debug(u"""Removing  : "%s" for "%s"
379
                          with parameters "%s" """ % \
380
                (objs, instance, parameters))
381
            response = resource.put(**parameters)
362
382
        except RequestFailed, e:
363
383
            raise ROAException(e)
364
384
@@ -372,7 +392,11 @@ class RemoteQuerySet(query.QuerySet):
372
392
        resource = Resource(instance.get_resource_url_detail())
373
393
        
374
394
        try:
375
            response = resource.put(**self.query.parameters)
395
            parameters = self.query.parameters
396
            logger.debug(u"""Clearing  : items for "%s"
397
                          with parameters "%s" """ % \
398
                (instance, parameters))
399
            response = resource.put(**parameters)
376
400
        except RequestFailed, e:
377
401
            raise ROAException(e)
378
402

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

@@ -48,6 +48,7 @@ SERIALIZATION_MODULES = {
48
48
    'django' : 'examples.django_roa_client.serializers',
49
49
}
50
50
51
## ROA custom settings
51
52
ROA_MODELS = True   # set to False if you'd like to develop/test locally
52
53
ROA_FORMAT = 'django' # json or xml
53
54
ROA_DJANGO_ERRORS = True # useful to ease debugging if you use test server
@@ -66,3 +67,15 @@ ROA_MODEL_NAME_MAPPING = (
66
67
ROA_ARGS_NAMES_MAPPING = {
67
68
    'COUNT': 'count_objects',
68
69
}
70
71
## Logging settings
72
import logging
73
# create logger
74
logger = logging.getLogger("django_roa")
75
logger.setLevel(logging.DEBUG)
76
# create console handler and set level to debug
77
ch = logging.StreamHandler()
78
ch.setLevel(logging.DEBUG)
79
ch.setFormatter(logging.Formatter("%(name)s - %(message)s"))
80
logger.addHandler(ch)
81

Up to file-list examples/django_roa_server/emitters.py:

@@ -6,7 +6,7 @@ from django.utils import simplejson
6
6
7
7
from piston.emitters import Emitter, DjangoEmitter
8
8
9
logger = logging.getLogger("django_roa_server log")
9
logger = logging.getLogger("django_roa_server")
10
10
11
11
12
12
class ROADjangoEmitter(DjangoEmitter):

Up to file-list examples/django_roa_server/handlers.py:

@@ -16,14 +16,7 @@ from django_roa_server.models import Rem
16
16
    RemotePageWithBooleanFields, RemotePageWithCustomSlug, \
17
17
    RemotePageWithOverriddenUrls, RemotePageWithRelations
18
18
19
# create logger
20
logger = logging.getLogger("django_roa_server log")
21
logger.setLevel(logging.DEBUG)
22
# create console handler and set level to debug
23
ch = logging.StreamHandler()
24
ch.setLevel(logging.DEBUG)
25
ch.setFormatter(logging.Formatter("%(name)s - %(message)s"))
26
logger.addHandler(ch)
19
logger = logging.getLogger("django_roa_server")
27
20
28
21
29
22
class ROAHandler(BaseHandler):

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

@@ -44,3 +44,14 @@ SERIALIZATION_MODULES = {
44
44
    'custom' : 'examples.django_roa_client.serializers',
45
45
}
46
46
PISTON_DISPLAY_ERRORS = False
47
48
## Logging settings
49
import logging
50
# create logger
51
logger = logging.getLogger("django_roa_server")
52
logger.setLevel(logging.DEBUG)
53
# create console handler and set level to debug
54
ch = logging.StreamHandler()
55
ch.setLevel(logging.DEBUG)
56
ch.setFormatter(logging.Formatter("%(name)s - %(message)s"))
57
logger.addHandler(ch)