| author | ymh <ymh.work@gmail.com> |
| Thu, 26 Sep 2013 15:24:41 +0200 | |
| changeset 119 | ece69ca3ac24 |
| parent 101 | 71532a54d1c4 |
| child 126 | a345f1a67bf1 |
| permissions | -rw-r--r-- |
|
101
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
1 |
# -*- coding: utf-8 -*- |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
2 |
''' |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
3 |
Created on Sep 19, 2013 |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
4 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
5 |
@author: ymh |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
6 |
''' |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
7 |
import logging |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
8 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
9 |
from rdflib.namespace import RDF |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
10 |
from rdflib.term import URIRef, Literal, BNode |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
11 |
from collections import OrderedDict |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
12 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
13 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
14 |
logger = logging.getLogger(__name__) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
15 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
16 |
class BaseSerializer(object): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
17 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
18 |
creation_counter = 0 |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
19 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
20 |
def __init__(self, predicate=None, many=False): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
21 |
self.predicate = predicate |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
22 |
self.creation_counter = BaseSerializer.creation_counter |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
23 |
self.many = many |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
24 |
BaseSerializer.creation_counter += 1 |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
25 |
if self.predicate and not isinstance(self.predicate, URIRef): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
26 |
self.predicate = URIRef(predicate) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
27 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
28 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
29 |
class FieldSerializer(BaseSerializer): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
30 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
31 |
def __init__(self, predicate=None, convert=None, source=None, many=False): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
32 |
super(FieldSerializer, self).__init__(predicate=predicate, many=many) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
33 |
self.convert = convert or (lambda x: Literal(unicode(x)) if x else None) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
34 |
self.source = source |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
35 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
36 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
37 |
def get_rdf_object(self, obj, fieldname): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
38 |
raise NotImplemented() |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
39 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
40 |
def to_graph(self, subject, obj, fieldname, graph): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
41 |
o = self.get_rdf_object(obj, fieldname) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
42 |
if o: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
43 |
graph.add((subject, self.predicate, o)) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
44 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
45 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
46 |
class SimpleFieldSerializer(FieldSerializer): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
47 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
48 |
def __init__(self, predicate=None, convert=None, source=None, lang_field=None): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
49 |
super(SimpleFieldSerializer, self).__init__(predicate=predicate, convert=convert, source=source, many=False) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
50 |
self.lang_field = lang_field |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
51 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
52 |
def get_rdf_object(self, obj, fieldname): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
53 |
res = self.convert(getattr(obj, self.source or fieldname)) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
54 |
if res is None: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
55 |
return |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
56 |
if not isinstance(res, Literal): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
57 |
res = Literal(unicode(res)) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
58 |
lang = getattr(obj, self.lang_field, None) if self.lang_field else None |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
59 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
60 |
return Literal(res.value, lang) if lang else res |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
61 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
62 |
class BooleanFieldSerializer(SimpleFieldSerializer): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
63 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
64 |
def bool_convert(self, value): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
65 |
return (Literal('TRUE') if value else Literal('FALSE')) if value is not None else None |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
66 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
67 |
def __init__(self, predicate=None, convert=None, source=None, lang_field=None): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
68 |
super(BooleanFieldSerializer, self).__init__( predicate, convert=convert, source=source, lang_field=lang_field) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
69 |
self.convert = lambda x: self.bool_convert(x) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
70 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
71 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
72 |
class RelatedFieldSerializer(SimpleFieldSerializer): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
73 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
74 |
def __init__(self, value_field, predicate=None, convert=None, source=None, many=False, lang_field=None): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
75 |
super(RelatedFieldSerializer, self).__init__(predicate, convert, source, lang_field=lang_field) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
76 |
self.many = many |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
77 |
self.value_field = value_field |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
78 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
79 |
def to_graph(self, subject, obj, fieldname, graph): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
80 |
value = getattr(obj, fieldname, None) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
81 |
if not value: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
82 |
return |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
83 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
84 |
values_to_add = [] |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
85 |
if self.many: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
86 |
for related_obj in value.all(): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
87 |
values_to_add.append(self.get_rdf_object(related_obj, self.value_field)) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
88 |
else: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
89 |
values_to_add.append(self.get_rdf_object(value, self.value_field)) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
90 |
for o in values_to_add: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
91 |
if o: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
92 |
graph.add((subject, self.predicate, o)) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
93 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
94 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
95 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
96 |
# Directly adapted from serializers in rest_framework |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
97 |
def _get_declared_fields(bases, attrs): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
98 |
""" |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
99 |
Create a list of serializer field instances from the passed in 'attrs', |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
100 |
plus any fields on the base classes (in 'bases'). |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
101 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
102 |
Note that all fields from the base classes are used. |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
103 |
""" |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
104 |
fields = [(field_name, attrs.pop(field_name)) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
105 |
for field_name, obj in list(attrs.iteritems()) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
106 |
if isinstance(obj, BaseSerializer)] |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
107 |
fields.sort(key=lambda x: x[1].creation_counter) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
108 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
109 |
# If this class is subclassing another Serializer, add that Serializer's |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
110 |
# fields. Note that we loop over the bases in *reverse*. This is necessary |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
111 |
# in order to maintain the correct order of fields. |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
112 |
for base in bases[::-1]: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
113 |
if hasattr(base, 'base_serializers'): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
114 |
fields = list(base.base_serializers.items()) + fields |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
115 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
116 |
return OrderedDict(fields) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
117 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
118 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
119 |
class SerializerMetaclass(type): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
120 |
def __new__(cls, name, bases, attrs): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
121 |
attrs['base_serializers'] = _get_declared_fields(bases, attrs) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
122 |
return super(SerializerMetaclass, cls).__new__(cls, name, bases, attrs) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
123 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
124 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
125 |
class ModelSerializerOptions(object): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
126 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
127 |
def __init__(self, meta): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
128 |
self.type = getattr(meta, 'type', None) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
129 |
if self.type and not isinstance(self.type, URIRef): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
130 |
self.type = URIRef(self.type) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
131 |
self.uri_fieldname = getattr(meta, 'uri_fieldname', None) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
132 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
133 |
class ModelSerializer(BaseSerializer): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
134 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
135 |
__metaclass__ = SerializerMetaclass |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
136 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
137 |
class Meta(object): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
138 |
pass |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
139 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
140 |
def get_serializers(self): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
141 |
return [] |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
142 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
143 |
def get_uri(self, obj): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
144 |
uri = None |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
145 |
if self.opts.uri_fieldname: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
146 |
uri = getattr(obj, self.opts.uri_fieldname, None) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
147 |
return URIRef(uri) if uri else None |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
148 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
149 |
def object_to_graph(self, subject, uri, obj, graph): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
150 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
151 |
if self.predicate: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
152 |
graph.add((subject, self.predicate, uri)) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
153 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
154 |
for serializer_fieldname, field_serializer in self.base_serializers.iteritems(): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
155 |
field_serializer.to_graph(uri, obj, serializer_fieldname, graph) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
156 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
157 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
158 |
def to_graph(self, subject, obj, fieldname, graph): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
159 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
160 |
uri = self.get_uri(obj) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
161 |
if self.opts.type: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
162 |
graph.add((uri, RDF.type, self.opts.type)) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
163 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
164 |
obj_to_add = [] |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
165 |
if fieldname: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
166 |
field_value = getattr(obj, fieldname, None) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
167 |
if field_value: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
168 |
if self.many: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
169 |
obj_to_add = [(nested_obj, BNode()) for nested_obj in field_value.all()] |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
170 |
else: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
171 |
obj_to_add = [(field_value, BNode())] |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
172 |
else: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
173 |
obj_to_add = [(obj, uri)] |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
174 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
175 |
for nested_obj, nested_uri in obj_to_add: |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
176 |
self.object_to_graph( subject, nested_uri, nested_obj, graph) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
177 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
178 |
|
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
179 |
def __init__(self, predicate=None, many=False): |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
180 |
BaseSerializer.__init__(self, predicate=predicate, many=many) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
181 |
self.opts = ModelSerializerOptions(self.Meta) |
|
71532a54d1c4
update virtualenv + implement record serialization
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
182 |