src/p4l/api/serializers.py
changeset 47 b07f8d11f2b8
parent 16 19fe06edb58d
child 48 e2ccb0093452
--- a/src/p4l/api/serializers.py	Fri Sep 06 16:39:50 2013 +0200
+++ b/src/p4l/api/serializers.py	Sat Sep 07 14:41:20 2013 +0200
@@ -4,14 +4,37 @@
 
 @author: ymh
 '''
-from p4l.models import (Record, Title, Issn, Isbn, DocumentCode, Abstract, 
-    AddedTitle, TitleMainDocument, Imprint, Collation, VolumeIssue, Periodical, 
+from django.core.exceptions import ValidationError
+from p4l.models import (Record, Title, Issn, Isbn, DocumentCode, Abstract,
+    AddedTitle, TitleMainDocument, Imprint, Collation, VolumeIssue, Periodical,
     Meeting, SubjectMeeting, Serie, Url)
 from rest_framework import serializers
+import logging
+
+logger = logging.getLogger(__name__)
+
+class ThesaurusSerializer(serializers.SlugRelatedField):
+    
+    def __init__(self, *args, **kwargs):
+        kwargs.update({                       
+            'read_only': False,
+        })
+        serializers.SlugRelatedField.__init__(self, *args, **kwargs)
+        
+    def from_native(self, data):
+        if self.queryset is None:
+            raise Exception('Writable related fields must include a `queryset` argument')
+        try:
+            res, _ = self.queryset.get_or_create(**{self.slug_field: data})
+            return res
+        except (TypeError, ValueError):
+            msg = self.error_messages['invalid']
+            raise ValidationError(msg)
+
 
 class BaseTitleSerializer(serializers.ModelSerializer):
     class Meta:
-        fields = ('title','lang')
+        fields = ('title', 'lang')
     
 class TitleSerializer(BaseTitleSerializer):    
     class Meta(BaseTitleSerializer.Meta):
@@ -28,17 +51,17 @@
 class IssnSerializer(serializers.ModelSerializer):
     class Meta:
         model = Issn
-        fields = ('issn','lang')
+        fields = ('issn', 'lang')
 
 class IsbnSerializer(serializers.ModelSerializer):
     class Meta:
         model = Isbn
-        fields = ('isbn','lang')
+        fields = ('isbn', 'lang')
 
 class DocumentCodeSerializer(serializers.ModelSerializer):
     class Meta:
         model = DocumentCode
-        fields = ('documentCode','lang')
+        fields = ('documentCode', 'lang')
         
 class AbstractSerializer(serializers.ModelSerializer):
     class Meta:
@@ -48,7 +71,7 @@
 class ImprintSerializer(serializers.ModelSerializer):
     class Meta:
         model = Imprint
-        fields = ('imprintCity','publisher', 'imprintDate', 'lang')
+        fields = ('imprintCity', 'publisher', 'imprintDate', 'lang')
 
 class CollationSerializer(serializers.ModelSerializer):
     class Meta:
@@ -68,12 +91,12 @@
 class MeetingSerializer(serializers.ModelSerializer):
     class Meta:
         model = Meeting
-        fields = ('label','meetingNumber', 'meetingPlace','meetingDate', 'meetingYear', 'lang')
+        fields = ('label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear', 'lang')
 
 class SubjectMeetingSerializer(serializers.ModelSerializer):
     class Meta:
         model = SubjectMeeting
-        fields = ('label','meetingNumber', 'meetingPlace','meetingDate', 'meetingYear')
+        fields = ('label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear')
 
 class SerieSerializer(serializers.ModelSerializer):
     class Meta:
@@ -85,50 +108,54 @@
         model = Url
         fields = ('address', 'display', 'accessLevel')
 
+
 class RecordSerializer(serializers.ModelSerializer):
     '''
     Serializer for record
     '''
-
-    language = serializers.SlugRelatedField(read_only=False, slug_field='uri') 
-    other_languages = serializers.SlugRelatedField(many=True, read_only=False, slug_field='uri')
-    subjects = serializers.SlugRelatedField(many=True, read_only=False, slug_field='uri')
-    themes = serializers.SlugRelatedField(many=True, read_only=False, slug_field='uri')
-    countries = serializers.SlugRelatedField(many=True, read_only=False, slug_field='uri')
-    projectNames = serializers.SlugRelatedField(many=True, read_only=False, slug_field='uri')
-    subjectCorporateBodies = serializers.SlugRelatedField(many=True, read_only=False, slug_field='uri') 
-    corporateAuthors = serializers.SlugRelatedField(many=True, read_only=False, slug_field='uri')
-    titles = TitleSerializer(many=True, read_only=False)
-    addedTitles = AddedTitleSerializer(many=True, read_only=False)
-    issns = IssnSerializer(many=True, read_only=False)
-    isbns = IsbnSerializer(many=True, read_only=False)
-    documentCodes = DocumentCodeSerializer(many=True, read_only=False)
-    abstracts = AbstractSerializer(many=True, read_only=False)
-    titlesMainDocument = TitleMainDocumentSerializer(many=True, read_only=False)
-    imprints = ImprintSerializer(many=True, read_only=False)
-    collations = CollationSerializer(many=True, read_only=False)    
-    volumeIssues = VolumeIssueSerializer(many=True, read_only=False)
-    periodicals = PeriodicalSerializer(many=True, read_only=False)
-    meetings = MeetingSerializer(many=True, read_only=False)
-    subjectMeetings = SubjectMeetingSerializer(many=True, read_only=False)
-    series = SerieSerializer(many=True, read_only=False)
-    authors = serializers.SlugRelatedField(many=True, read_only=False, slug_field="name")
-    subjectPersons = serializers.SlugRelatedField(many=True, read_only=False, slug_field="name")
-    urls = UrlSerializer(many=True, read_only=False)
+    language = ThesaurusSerializer(many=False, slug_field='uri') 
+    otherLanguages = ThesaurusSerializer(many=True, slug_field='uri')
+    subjects = ThesaurusSerializer(many=True, slug_field='uri')
+    themes = ThesaurusSerializer(many=True, slug_field='uri')
+    countries = ThesaurusSerializer(many=True, slug_field='uri')
+    projectNames = ThesaurusSerializer(many=True, slug_field='uri')
+    subjectCorporateBodies = ThesaurusSerializer(many=True, slug_field='uri') 
+    corporateAuthors = ThesaurusSerializer(many=True, slug_field='uri')
+#    titles = TitleSerializer(many=True, read_only=False)
+#    addedTitles = AddedTitleSerializer(many=True, read_only=False)
+#    issns = IssnSerializer(many=True, read_only=False)
+#    isbns = IsbnSerializer(many=True, read_only=False)
+#    documentCodes = DocumentCodeSerializer(many=True, read_only=False)
+#    abstracts = AbstractSerializer(many=True, read_only=False)
+#    titlesMainDocument = TitleMainDocumentSerializer(many=True, read_only=False)
+#    imprints = ImprintSerializer(many=True, read_only=False)
+#    collations = CollationSerializer(many=True, read_only=False)    
+#    volumeIssues = VolumeIssueSerializer(many=True, read_only=False)
+#    periodicals = PeriodicalSerializer(many=True, read_only=False)
+#    meetings = MeetingSerializer(many=True, read_only=False)
+#    subjectMeetings = SubjectMeetingSerializer(many=True, read_only=False)
+#    series = SerieSerializer(many=True, read_only=False)
+#    authors = serializers.SlugRelatedField(many=True, read_only=False, slug_field="name")
+#    subjectPersons = serializers.SlugRelatedField(many=True, read_only=False, slug_field="name")
+#    urls = UrlSerializer(many=True, read_only=False)
 
     class Meta:
         model = Record
         depth = 1
         read_only_fields = ('identifier', 'uri')
-        fields = ("identifier", "uri", "language", "otherLanguages", "notes",
-                  "editionStatement", "recordType","isDocumentPart",
-                  "isMultilingual","subjects", "themes", "countries",
-                  "projectNames", "subjectCorporateBodies", "corporateAuthors",
-                  "titles", "issns", "isbns", "documentCodes", "abstracts",
-                  "addedTitles", "titlesMainDocument", "imprints",
-                  "collations", "volumeIssues", "periodicals", "meetings",
-                  "subjectMeetings", "series", "authors", "subjectPersons",
-                  "urls")        
+        fields = ("identifier", "uri", "subjects", "notes", "otherLanguages",
+                  "language", "editionStatement", "recordType", "isDocumentPart",
+                  "isMultilingual", "themes", "countries", "projectNames", 
+                  "subjectCorporateBodies", "corporateAuthors")
+#         fields = (
+#                       "editionStatement", "recordType","isDocumentPart",
+#                   "isMultilingual","subjects", "themes", "countries",
+#                   "projectNames", "subjectCorporateBodies", "corporateAuthors",
+#                   "titles", "issns", "isbns", "documentCodes", "abstracts",
+#                   "addedTitles", "titlesMainDocument", "imprints",
+#                   "collations", "volumeIssues", "periodicals", "meetings",
+#                   "subjectMeetings", "series", "authors", "subjectPersons",
+#                   "urls")        
 
 
-    
\ No newline at end of file
+