Skip to content
Snippets Groups Projects
Commit d2ef5311 authored by Sylvain Le Bon's avatar Sylvain Le Bon
Browse files

feature: basic CRUD

parents
No related branches found
No related tags found
No related merge requests found
*.pyc
*~
from django.apps import AppConfig
class DjangoldpConfig(AppConfig):
name = 'djangoldp'
from rest_framework.serializers import ModelSerializer, ListSerializer, CharField
from rest_framework.utils.serializer_helpers import ReturnDict
class IdField(CharField):
def to_native(self, value):
return "%s"%value
def to_internal_value(self, instance):
return super(IdField, self).to_internal_value(instance.split("/")[-1]) or None
class ContainerSerializer(ListSerializer):
def to_representation(self, data):
return {'@id': '', 'ldp:contains':super(ContainerSerializer, self).to_representation(data)}
@property
def data(self):
return ReturnDict(super(ListSerializer, self).data, serializer=self)
class LDPSerializer(ModelSerializer):
def __init__(self, *args, **kwargs):
super(LDPSerializer, self).__init__(*args, **kwargs)
self.fields['@id'] = IdField(source="id", required=False)
@classmethod
def many_init(cls, *args, **kwargs):
kwargs['child'] = cls()
return ContainerSerializer(*args, **kwargs)
from django.test import TestCase
# Create your tests here.
views.py 0 → 100644
from pyld import jsonld
from django.conf.urls import url
from django.utils.decorators import classonlymethod
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from rest_framework.viewsets import ModelViewSet
from .serializers import LDPSerializer
class JSONLDRenderer(JSONRenderer):
media_type = 'application/ld+json'
def render(self, data, accepted_media_type=None, renderer_context=None):
data["@context"] = "http://owl.openinitiative.com/oicontext.jsonld"
return super(JSONLDRenderer, self).render(data, accepted_media_type, renderer_context)
class JSONLDParser(JSONParser):
media_type = 'application/ld+json'
def parse(self, stream, media_type=None, parser_context=None):
data = super(JSONLDParser, self).parse(stream, media_type, parser_context)
return jsonld.compact(data, ctx=data["@context"])
class LDPViewSet(ModelViewSet):
model = None
renderer_classes = (JSONLDRenderer, )
parser_classes = (JSONLDParser, )
def __init__(self, model, **kwargs):
class_attrs = {'Meta': type('Meta', (), {'model': model, 'exclude': ('id',)})}
self.serializer_class = type(LDPSerializer)(model.__name__+'Serializer', (LDPSerializer,), class_attrs)
super().__init__(model=model, **kwargs)
def get_queryset(self, *args, **kwargs):
if self.model:
return self.model.objects.all()
else:
return super(LDPView, self).get_queryset(*args, **kwargs)
@classonlymethod
def urls(cls, **kwargs):
return [
url(r'^$', cls.as_view({'get': 'list', 'post': 'create'}, **kwargs), name='list'),
url(r'^(?P<pk>\d+)$', cls.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}, **kwargs), name='object'),
]
def dispatch(self, request, *args, **kwargs):
response = super(LDPViewSet, self).dispatch(request, *args, **kwargs)
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST,PUT"
response["Access-Control-Allow-Headers"] = "Content-Type, if-match"
response["Accept-Post"] = "application/ld+json"
return response
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment