src/p4l/api/serializers.py
author ymh <ymh.work@gmail.com>
Sat, 07 Sep 2013 14:41:20 +0200
changeset 47 b07f8d11f2b8
parent 16 19fe06edb58d
child 48 e2ccb0093452
permissions -rw-r--r--
Update angular. Implement rest save for records
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 -*-
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
'''
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
Created on Sep 2, 2013
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
@author: ymh
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
'''
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
     7
from django.core.exceptions import ValidationError
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
     8
from p4l.models import (Record, Title, Issn, Isbn, DocumentCode, Abstract,
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
     9
    AddedTitle, TitleMainDocument, Imprint, Collation, VolumeIssue, Periodical,
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
    Meeting, SubjectMeeting, Serie, Url)
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
from rest_framework import serializers
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    12
import logging
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    13
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    14
logger = logging.getLogger(__name__)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    15
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    16
class ThesaurusSerializer(serializers.SlugRelatedField):
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    17
    
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    18
    def __init__(self, *args, **kwargs):
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    19
        kwargs.update({                       
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    20
            'read_only': False,
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    21
        })
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    22
        serializers.SlugRelatedField.__init__(self, *args, **kwargs)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    23
        
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    24
    def from_native(self, data):
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    25
        if self.queryset is None:
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    26
            raise Exception('Writable related fields must include a `queryset` argument')
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    27
        try:
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    28
            res, _ = self.queryset.get_or_create(**{self.slug_field: data})
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    29
            return res
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    30
        except (TypeError, ValueError):
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    31
            msg = self.error_messages['invalid']
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    32
            raise ValidationError(msg)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    33
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
class BaseTitleSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    class Meta:
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    37
        fields = ('title', 'lang')
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
class TitleSerializer(BaseTitleSerializer):    
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    class Meta(BaseTitleSerializer.Meta):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
        model = Title
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
class AddedTitleSerializer(BaseTitleSerializer):    
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    class Meta(BaseTitleSerializer.Meta):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        model = AddedTitle
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
class TitleMainDocumentSerializer(BaseTitleSerializer):    
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    class Meta(BaseTitleSerializer.Meta):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        model = TitleMainDocument
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
class IssnSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        model = Issn
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    54
        fields = ('issn', 'lang')
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
class IsbnSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        model = Isbn
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    59
        fields = ('isbn', 'lang')
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
class DocumentCodeSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
        model = DocumentCode
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    64
        fields = ('documentCode', 'lang')
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
        
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
class AbstractSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
        model = Abstract
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
        fields = ('abstract', 'lang')
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
class ImprintSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        model = Imprint
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    74
        fields = ('imprintCity', 'publisher', 'imprintDate', 'lang')
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
class CollationSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
        model = Collation
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
        fields = ('collation', 'lang')
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
class VolumeIssueSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        model = VolumeIssue
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        fields = ('volume', 'number', 'lang')
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
class PeriodicalSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
        model = Periodical
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
        fields = ('label', 'lang')
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
class MeetingSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
        model = Meeting
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    94
        fields = ('label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear', 'lang')
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
class SubjectMeetingSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        model = SubjectMeeting
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
    99
        fields = ('label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear')
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
class SerieSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
        model = Serie
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
        fields = ('title', 'volume', 'lang')
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
class UrlSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
        model = Url
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
        fields = ('address', 'display', 'accessLevel')
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   111
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
class RecordSerializer(serializers.ModelSerializer):
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    '''
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
    Serializer for record
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
    '''
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   116
    language = ThesaurusSerializer(many=False, slug_field='uri') 
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   117
    otherLanguages = ThesaurusSerializer(many=True, slug_field='uri')
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   118
    subjects = ThesaurusSerializer(many=True, slug_field='uri')
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   119
    themes = ThesaurusSerializer(many=True, slug_field='uri')
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   120
    countries = ThesaurusSerializer(many=True, slug_field='uri')
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   121
    projectNames = ThesaurusSerializer(many=True, slug_field='uri')
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   122
    subjectCorporateBodies = ThesaurusSerializer(many=True, slug_field='uri') 
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   123
    corporateAuthors = ThesaurusSerializer(many=True, slug_field='uri')
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   124
#    titles = TitleSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   125
#    addedTitles = AddedTitleSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   126
#    issns = IssnSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   127
#    isbns = IsbnSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   128
#    documentCodes = DocumentCodeSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   129
#    abstracts = AbstractSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   130
#    titlesMainDocument = TitleMainDocumentSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   131
#    imprints = ImprintSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   132
#    collations = CollationSerializer(many=True, read_only=False)    
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   133
#    volumeIssues = VolumeIssueSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   134
#    periodicals = PeriodicalSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   135
#    meetings = MeetingSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   136
#    subjectMeetings = SubjectMeetingSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   137
#    series = SerieSerializer(many=True, read_only=False)
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   138
#    authors = serializers.SlugRelatedField(many=True, read_only=False, slug_field="name")
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   139
#    subjectPersons = serializers.SlugRelatedField(many=True, read_only=False, slug_field="name")
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   140
#    urls = UrlSerializer(many=True, read_only=False)
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
    class Meta:
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
        model = Record
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
        depth = 1
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
        read_only_fields = ('identifier', 'uri')
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   146
        fields = ("identifier", "uri", "subjects", "notes", "otherLanguages",
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   147
                  "language", "editionStatement", "recordType", "isDocumentPart",
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   148
                  "isMultilingual", "themes", "countries", "projectNames", 
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   149
                  "subjectCorporateBodies", "corporateAuthors")
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   150
#         fields = (
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   151
#                       "editionStatement", "recordType","isDocumentPart",
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   152
#                   "isMultilingual","subjects", "themes", "countries",
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   153
#                   "projectNames", "subjectCorporateBodies", "corporateAuthors",
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   154
#                   "titles", "issns", "isbns", "documentCodes", "abstracts",
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   155
#                   "addedTitles", "titlesMainDocument", "imprints",
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   156
#                   "collations", "volumeIssues", "periodicals", "meetings",
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   157
#                   "subjectMeetings", "series", "authors", "subjectPersons",
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   158
#                   "urls")        
16
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
19fe06edb58d Add api for records
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
47
b07f8d11f2b8 Update angular.
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   161