-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreceiver.py
72 lines (62 loc) · 2.04 KB
/
receiver.py
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
"""
Data format classes that can be plugged into
model_resource.ModelResource and determine how submissions
of model data need to look like (e.g. form submission MIME types,
XML, JSON, ...).
"""
from django.core import serializers
from django.forms import model_to_dict
class InvalidFormData(Exception):
"""
Raised if form data can not be decoded into key-value
pairs.
"""
class Receiver(object):
"""
Base class for all "receiver" data format classes.
All subclasses need to implement the method
get_data(self, request, method).
"""
def get_data(self, request, method):
raise Exception("Receiver subclass needs to implement get_data!")
def get_post_data(self, request):
return self.get_data(request, 'POST')
def get_put_data(self, request):
return self.get_data(request, 'PUT')
class FormReceiver(Receiver):
"""
Data format class with standard Django behavior:
POST and PUT data is in form submission format.
"""
def get_data(self, request, method):
return getattr(request, method)
class SerializeReceiver(Receiver):
"""
Base class for all data formats possible
within Django's serializer framework.
"""
def __init__(self, format):
self.format = format
def get_data(self, request, method):
try:
deserialized_objects = list(serializers.deserialize(self.format, request.raw_post_data))
except serializers.base.DeserializationError:
raise InvalidFormData
if len(deserialized_objects) != 1:
raise InvalidFormData
model = deserialized_objects[0].object
return model_to_dict(model)
class JSONReceiver(SerializeReceiver):
"""
Data format class for form submission in JSON,
e.g. for web browsers.
"""
def __init__(self):
self.format = 'json'
class XMLReceiver(SerializeReceiver):
"""
Data format class for form submission in XML,
e.g. for software clients.
"""
def __init__(self):
self.format = 'xml'