src/p4l/api/serializers.py
author ymh <ymh.work@gmail.com>
Sat, 05 Oct 2013 14:46:07 +0200
changeset 138 f01b65d6c724
parent 137 bb8bf2688d7e
permissions -rw-r--r--
Nouvelle version 0.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
126
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
     2
#
131
f1854630734f change copyright notice
ymh <ymh.work@gmail.com>
parents: 126
diff changeset
     3
# Copyright IRI (c) 2013
126
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
     4
#
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
     5
# contact@iri.centrepompidou.fr
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
     6
#
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
     7
# This software is governed by the CeCILL-B license under French law and
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
     8
# abiding by the rules of distribution of free software.  You can  use, 
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
     9
# modify and/ or redistribute the software under the terms of the CeCILL-B
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    10
# license as circulated by CEA, CNRS and INRIA at the following URL
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    11
# "http://www.cecill.info". 
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    12
#
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    13
# As a counterpart to the access to the source code and  rights to copy,
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    14
# modify and redistribute granted by the license, users are provided only
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    15
# with a limited warranty  and the software's author,  the holder of the
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    16
# economic rights,  and the successive licensors  have only  limited
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    17
# liability. 
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    18
#
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    19
# In this respect, the user's attention is drawn to the risks associated
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    20
# with loading,  using,  modifying and/or developing or reproducing the
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    21
# software by the user in light of its specific status of free software,
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    22
# that may mean  that it is complicated to manipulate,  and  that  also
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    23
# therefore means  that it is reserved for developers  and  experienced
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    24
# professionals having in-depth computer knowledge. Users are therefore
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    25
# encouraged to load and test the software's suitability as regards their
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    26
# requirements in conditions enabling the security of their systems and/or 
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    27
# data to be ensured and,  more generally, to use and operate it in the 
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    28
# same conditions as regards security. 
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    29
#
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    30
# The fact that you are presently reading this means that you have had
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    31
# knowledge of the CeCILL-B license and that you accept its terms.
a345f1a67bf1 Python licence headers
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    32
#
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    34
from django.core.exceptions import ValidationError
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    35
from p4l.models import Record
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
from rest_framework import serializers
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    37
import logging
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    38
from rest_framework.serializers import NestedValidationError
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    39
import copy
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    40
from django.db.models.fields.related import ForeignKey
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    41
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    42
logger = logging.getLogger(__name__)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    43
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    44
class ThesaurusSerializer(serializers.SlugRelatedField):
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    45
    
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    46
    def __init__(self, *args, **kwargs):
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    47
        kwargs.update({                       
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    48
            'read_only': False,
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    49
        })
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    50
        serializers.SlugRelatedField.__init__(self, *args, **kwargs)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    51
        
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    52
    def from_native(self, data):
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    53
        if self.queryset is None:
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    54
            raise Exception('Writable related fields must include a `queryset` argument')
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    55
        try:
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    56
            res, _ = self.queryset.get_or_create(**{self.slug_field: data})
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    57
            return res
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    58
        except (TypeError, ValueError):
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    59
            msg = self.error_messages['invalid']
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    60
            raise ValidationError(msg)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    61
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    63
class P4lModelSerializer(serializers.ModelSerializer):
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    64
    
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    66
    def get_nested_field(self, model_field, related_model, to_many):
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    67
        field_exclude = ()
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    68
        if model_field is None:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    69
            fk = [f.name for f in related_model._meta.fields if (isinstance(f, ForeignKey) and f.rel.to == Record)][0]
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    70
            field_exclude = ('id', fk)
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    71
        class NestedModelSerializer(P4lModelSerializer):
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    72
            class Meta:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    73
                model = related_model
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    74
                depth = self.opts.depth - 1
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    75
                exclude = field_exclude
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    77
        return NestedModelSerializer(many=to_many)
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    79
        
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    80
    def field_from_native(self, data, files, field_name, into):
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    81
        """
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    82
        Override default so that the serializer can be used as a writable
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    83
        nested field across relationships.
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    84
        """        
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    85
        if self.read_only:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    86
            return
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
        
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    88
        try:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    89
            value = data[field_name]
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    90
        except KeyError:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    91
            if self.default is not None and not self.partial:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    92
                # Note: partial updates shouldn't set defaults
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    93
                value = copy.deepcopy(self.default)
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    94
            else:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    95
                if self.required:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    96
                    raise ValidationError(self.error_messages['required'])
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    97
                return
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
    99
        # Set the serializer object if it exists
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   100
        obj = getattr(self.parent.object, field_name) if self.parent.object else None
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   102
        if self.source == '*':
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   103
            if value:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   104
                into.update(value)
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   105
        else:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   106
            if value in (None, ''):
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   107
                into[(self.source or field_name)] = None
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   108
            elif self.many and hasattr(value, '__iter__'):
117
0a4e7d6ebe80 - Do not create object for new
ymh <ymh.work@gmail.com>
parents: 105
diff changeset
   109
                if obj is not None:
0a4e7d6ebe80 - Do not create object for new
ymh <ymh.work@gmail.com>
parents: 105
diff changeset
   110
                    obj.all().delete()
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   111
                nested_items = []
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   112
                for val in value:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   113
                    kwargs = {
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   114
                        'instance': None,
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   115
                        'data': val,
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   116
                        'context': self.context,
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   117
                        'partial': self.partial,
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   118
                        'many': False
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   119
                    }
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   120
                    serializer = self.__class__(**kwargs)
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   121
                    nested_items.append(serializer.from_native(val, files))
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   122
                into[self.source or field_name] = nested_items
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   123
            else:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   124
                kwargs = {
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   125
                    'instance': obj,
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   126
                    'data': value,
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   127
                    'context': self.context,
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   128
                    'partial': self.partial,
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   129
                    'many': self.many
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   130
                }
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   131
                serializer = self.__class__(**kwargs)
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   133
                if serializer.is_valid():
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   134
                    into[self.source or field_name] = serializer.object
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   135
                else:
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   136
                    # Propagate errors up to our parent
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   137
                    raise NestedValidationError(serializer.errors)
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   139
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   140
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   141
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   142
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   143
class RecordSerializer(P4lModelSerializer):
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
    '''
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
    Serializer for record
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
    '''
93
c675183a9325 new record
cavaliet
parents: 48
diff changeset
   147
    language = ThesaurusSerializer(many=False, required=False, slug_field='uri') 
117
0a4e7d6ebe80 - Do not create object for new
ymh <ymh.work@gmail.com>
parents: 105
diff changeset
   148
    otherLanguages = ThesaurusSerializer(many=True, required=False, slug_field='uri')
0a4e7d6ebe80 - Do not create object for new
ymh <ymh.work@gmail.com>
parents: 105
diff changeset
   149
    subjects = ThesaurusSerializer(many=True, required=False, slug_field='uri')
0a4e7d6ebe80 - Do not create object for new
ymh <ymh.work@gmail.com>
parents: 105
diff changeset
   150
    themes = ThesaurusSerializer(many=True, required=False, slug_field='uri')
0a4e7d6ebe80 - Do not create object for new
ymh <ymh.work@gmail.com>
parents: 105
diff changeset
   151
    countries = ThesaurusSerializer(many=True, required=False, slug_field='uri')
0a4e7d6ebe80 - Do not create object for new
ymh <ymh.work@gmail.com>
parents: 105
diff changeset
   152
    projectNames = ThesaurusSerializer(many=True, required=False, slug_field='uri')
0a4e7d6ebe80 - Do not create object for new
ymh <ymh.work@gmail.com>
parents: 105
diff changeset
   153
    subjectCorporateBodies = ThesaurusSerializer(many=True, required=False, slug_field='uri') 
0a4e7d6ebe80 - Do not create object for new
ymh <ymh.work@gmail.com>
parents: 105
diff changeset
   154
    corporateAuthors = ThesaurusSerializer(many=True, required=False, slug_field='uri')
0a4e7d6ebe80 - Do not create object for new
ymh <ymh.work@gmail.com>
parents: 105
diff changeset
   155
    audiences = ThesaurusSerializer(many=True, required=False, slug_field='uri')
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
        model = Record
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
        depth = 1
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   160
        fields = ("identifier", "uri", "subjects", "notes", "otherLanguages",
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   161
                  "language", "editionStatement", "recordType", "isDocumentPart",
105
62e4429f55cd Correct new fields
ymh <ymh.work@gmail.com>
parents: 98
diff changeset
   162
                  "hidden", "restricted", "themes", "countries", "projectNames", 
98
7b6ca4ca3f67 modif from model change
cavaliet
parents: 93
diff changeset
   163
                  "subjectCorporateBodies", "corporateAuthors", "corporateAuthorLabel", 
7b6ca4ca3f67 modif from model change
cavaliet
parents: 93
diff changeset
   164
                  "imprints", "titles", "addedTitles", "issns", "isbns", "documentCodes",
48
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   165
                  "abstracts", "titlesMainDocument", "collations", "volumeIssues",
e2ccb0093452 Save nested fields.
ymh <ymh.work@gmail.com>
parents: 47
diff changeset
   166
                  "periodicals", "meetings", "subjectMeetings", "series",
98
7b6ca4ca3f67 modif from model change
cavaliet
parents: 93
diff changeset
   167
                  "authors", "subjectPersons", "urls", "audiences")
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   169