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.
| commit 89: | 55aa123c5ab9 |
| parent 88: | db83bd1879cd |
| branch: | default |
16 months ago
Changed (Δ2.3 KB):
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
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) |
