diff -r 1cee12d1d400 -r b07f8d11f2b8 src/p4l/api/serializers.py --- 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 +