src/p4l/mapping/serializers.py
author ymh <ymh.work@gmail.com>
Wed, 25 Sep 2013 23:22:29 +0200
changeset 118 d33a072d974b
parent 101 71532a54d1c4
child 126 a345f1a67bf1
permissions -rw-r--r--
Remove unecessary spaces in sparql queries
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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