# HG changeset patch # User ymh # Date 1378128592 -7200 # Node ID 19fe06edb58d529e642ddd9aff6eccaddcc6161c # Parent be595253ced5611fd9ec17f2cd9b57e6ae413602 Add api for records diff -r be595253ced5 -r 19fe06edb58d src/p4l/api/__init__.py diff -r be595253ced5 -r 19fe06edb58d src/p4l/api/serializers.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/p4l/api/serializers.py Mon Sep 02 15:29:52 2013 +0200 @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +''' +Created on Sep 2, 2013 + +@author: ymh +''' +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 + +class BaseTitleSerializer(serializers.ModelSerializer): + class Meta: + fields = ('title','lang') + +class TitleSerializer(BaseTitleSerializer): + class Meta(BaseTitleSerializer.Meta): + model = Title + +class AddedTitleSerializer(BaseTitleSerializer): + class Meta(BaseTitleSerializer.Meta): + model = AddedTitle + +class TitleMainDocumentSerializer(BaseTitleSerializer): + class Meta(BaseTitleSerializer.Meta): + model = TitleMainDocument + +class IssnSerializer(serializers.ModelSerializer): + class Meta: + model = Issn + fields = ('issn','lang') + +class IsbnSerializer(serializers.ModelSerializer): + class Meta: + model = Isbn + fields = ('isbn','lang') + +class DocumentCodeSerializer(serializers.ModelSerializer): + class Meta: + model = DocumentCode + fields = ('documentCode','lang') + +class AbstractSerializer(serializers.ModelSerializer): + class Meta: + model = Abstract + fields = ('abstract', 'lang') + +class ImprintSerializer(serializers.ModelSerializer): + class Meta: + model = Imprint + fields = ('imprintCity','publisher', 'imprintDate', 'lang') + +class CollationSerializer(serializers.ModelSerializer): + class Meta: + model = Collation + fields = ('collation', 'lang') + +class VolumeIssueSerializer(serializers.ModelSerializer): + class Meta: + model = VolumeIssue + fields = ('volume', 'number', 'lang') + +class PeriodicalSerializer(serializers.ModelSerializer): + class Meta: + model = Periodical + fields = ('label', 'lang') + +class MeetingSerializer(serializers.ModelSerializer): + class Meta: + model = Meeting + fields = ('label','meetingNumber', 'meetingPlace','meetingDate', 'meetingYear', 'lang') + +class SubjectMeetingSerializer(serializers.ModelSerializer): + class Meta: + model = SubjectMeeting + fields = ('label','meetingNumber', 'meetingPlace','meetingDate', 'meetingYear') + +class SerieSerializer(serializers.ModelSerializer): + class Meta: + model = Serie + fields = ('title', 'volume', 'lang') + +class UrlSerializer(serializers.ModelSerializer): + class Meta: + 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) + + 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") + + + \ No newline at end of file diff -r be595253ced5 -r 19fe06edb58d src/p4l/api/urls.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/p4l/api/urls.py Mon Sep 02 15:29:52 2013 +0200 @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +''' +Created on Sep 2, 2013 + +@author: ymh +''' + +from django.conf.urls import patterns, include, url +from rest_framework import routers +from p4l.api import views + +router = routers.DefaultRouter() +router.register(r'records', views.RecordViewSet) + +urlpatterns = patterns('', + url(r'^', include(router.urls)), + url(r'^auth/', include('rest_framework.urls', namespace='rest_framework')) +) \ No newline at end of file diff -r be595253ced5 -r 19fe06edb58d src/p4l/api/views.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/p4l/api/views.py Mon Sep 02 15:29:52 2013 +0200 @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +''' +Created on Sep 2, 2013 + +@author: ymh +''' +from p4l.api.serializers import RecordSerializer +from p4l.models import Record +from rest_framework import viewsets + +class RecordViewSet(viewsets.ModelViewSet): + ''' + API endpoint that allow Record to be viewed or edited + ''' + + queryset = Record.objects.all() + serializer_class = RecordSerializer + lookup_field = 'identifier' diff -r be595253ced5 -r 19fe06edb58d src/p4l/modwsgi.wsgi --- a/src/p4l/modwsgi.wsgi Mon Sep 02 11:45:01 2013 +0200 +++ b/src/p4l/modwsgi.wsgi Mon Sep 02 15:29:52 2013 +0200 @@ -12,7 +12,7 @@ sys.path.append(environ['PROJECT_PATH']) for path in environ.get('PYTHON_PATH',"").split(os.pathsep): if path: - site.addsitedir(path) + site.addsitedir(path) # @UndefinedVariable new_sys_path = [] for item in list(sys.path): diff -r be595253ced5 -r 19fe06edb58d src/p4l/settings.py --- a/src/p4l/settings.py Mon Sep 02 11:45:01 2013 +0200 +++ b/src/p4l/settings.py Mon Sep 02 15:29:52 2013 +0200 @@ -131,6 +131,7 @@ 'django.contrib.staticfiles', 'django.contrib.admin', 'south', + 'rest_framework', 'p4l' ) @@ -166,6 +167,22 @@ NB_RECORDS_BY_PAGE = 20 SPARQL_QUERY_ENDPOINT = "http://localhost:8080/openrdf-sesame/repositories/plan4learning" +REST_FRAMEWORK = { + # Use hyperlinked styles by default. + # Only used if the `serializer_class` attribute is not set on a view. + 'DEFAULT_MODEL_SERIALIZER_CLASS': + 'rest_framework.serializers.HyperlinkedModelSerializer', + + # Use Django's standard `django.contrib.auth` permissions, + # or allow read-only access for unauthenticated users. + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' + ], + + 'PAGINATE_BY': 20, + 'PAGINATE_BY_PARAM': 'page_size' +} + from config import * # @UnusedWildImport if not "SRC_BASE_URL" in locals(): diff -r be595253ced5 -r 19fe06edb58d src/p4l/urls.py --- a/src/p4l/urls.py Mon Sep 02 11:45:01 2013 +0200 +++ b/src/p4l/urls.py Mon Sep 02 15:29:52 2013 +0200 @@ -1,18 +1,18 @@ -from django.conf import settings from django.conf.urls import patterns, include, url -from .views import RecordListView, RecordDetailView +from django.contrib import admin +from p4l.views import RecordListView, RecordDetailView -from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', # Examples: url(r'^$', RecordListView.as_view(), name='p4l_home'), url(r'^record/view$', RecordDetailView.as_view(), name='p4l_record_view'), - # url(r'^p4l/', include('p4l.foo.urls')), + url(r'^api/', include('p4l.api.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), url(r'^admin/', include(admin.site.urls)), + ) \ No newline at end of file