Make API writable

This commit is contained in:
Roberto Rosario
2014-07-22 02:32:06 -04:00
parent 5e21b91b24
commit e168898248
4 changed files with 39 additions and 17 deletions

View File

@@ -20,8 +20,9 @@ from .models import Document, DocumentPage, DocumentVersion
from .serializers import (DocumentImageSerializer, DocumentPageSerializer,
DocumentSerializer, DocumentVersionSerializer)
#TODO: PUT, POST, permissions
class APIDocumentListView(generics.ListAPIView):
class APIDocumentListView(generics.ListCreateAPIView):
"""
Returns a list of all the documents.
"""
@@ -33,12 +34,11 @@ class APIDocumentListView(generics.ListAPIView):
mayan_object_permissions = [PERMISSION_DOCUMENT_VIEW]
class APIDocumentPageView(generics.RetrieveAPIView):
class APIDocumentPageView(generics.RetrieveUpdateAPIView):
"""
Returns the selected document page details.
"""
allowed_methods = ['GET']
serializer_class = DocumentPageSerializer
queryset = DocumentPage.objects.all()
@@ -47,12 +47,11 @@ class APIDocumentPageView(generics.RetrieveAPIView):
mayan_permission_attribute_check = 'document'
class APIDocumentView(generics.RetrieveAPIView):
class APIDocumentView(generics.RetrieveUpdateDestroyAPIView):
"""
Returns the selected document details.
"""
allowed_methods = ['GET']
serializer_class = DocumentSerializer
queryset = Document.objects.all()
@@ -60,6 +59,18 @@ class APIDocumentView(generics.RetrieveAPIView):
mayan_object_permissions = [PERMISSION_DOCUMENT_VIEW]
class APIDocumentVersionCreateView(generics.CreateAPIView):
"""
Create a new document version.
"""
serializer_class = DocumentVersionSerializer
queryset = DocumentVersion.objects.all()
#filter_backends = (MayanObjectPermissionsFilter,)
#mayan_object_permissions = [PERMISSION_DOCUMENT_VIEW]
class APIDocumentVersionView(generics.RetrieveAPIView):
"""
Returns the selected document version details.

View File

@@ -95,7 +95,11 @@ class Document(models.Model):
ordering = ['-date_added']
def __unicode__(self):
return self.latest_version.filename
try:
return self.latest_version.filename
except AttributeError:
# Document has no version yet, let's return a place holder text
return ugettext(u'Uninitialized document')
@models.permalink
def get_absolute_url(self):
@@ -250,7 +254,11 @@ class Document(models.Model):
@property
def pages(self):
return self.latest_version.pages
try:
return self.latest_version.pages
except AttributeError:
# Document has no version yet
return 0
@property
def page_count(self):
@@ -258,11 +266,11 @@ class Document(models.Model):
@property
def latest_version(self):
return self.versions.order_by('-timestamp')[0]
return self.versions.order_by('timestamp').last()
@property
def first_version(self):
return self.versions.order_by('timestamp')[0]
return self.versions.order_by('timestamp').first()
def rename(self, new_name):
version = self.latest_version
@@ -302,12 +310,12 @@ class DocumentVersion(models.Model):
def register_post_save_hook(cls, order, func):
cls._post_save_hooks[order] = func
document = models.ForeignKey(Document, verbose_name=_(u'document'), editable=False, related_name='versions')
major = models.PositiveIntegerField(verbose_name=_(u'mayor'), default=1, editable=False)
minor = models.PositiveIntegerField(verbose_name=_(u'minor'), default=0, editable=False)
micro = models.PositiveIntegerField(verbose_name=_(u'micro'), default=0, editable=False)
release_level = models.PositiveIntegerField(choices=RELEASE_LEVEL_CHOICES, default=RELEASE_LEVEL_FINAL, verbose_name=_(u'release level'), editable=False)
serial = models.PositiveIntegerField(verbose_name=_(u'serial'), default=0, editable=False)
document = models.ForeignKey(Document, verbose_name=_(u'document'), related_name='versions')
major = models.PositiveIntegerField(verbose_name=_(u'mayor'), default=1)
minor = models.PositiveIntegerField(verbose_name=_(u'minor'), default=0)
micro = models.PositiveIntegerField(verbose_name=_(u'micro'), default=0)
release_level = models.PositiveIntegerField(choices=RELEASE_LEVEL_CHOICES, default=RELEASE_LEVEL_FINAL, verbose_name=_(u'release level'))
serial = models.PositiveIntegerField(verbose_name=_(u'serial'), default=0)
timestamp = models.DateTimeField(verbose_name=_(u'timestamp'), editable=False)
comment = models.TextField(blank=True, verbose_name=_(u'comment'))

View File

@@ -11,7 +11,7 @@ class DocumentPageSerializer(serializers.HyperlinkedModelSerializer):
class DocumentVersionSerializer(serializers.HyperlinkedModelSerializer):
pages = DocumentPageSerializer(many=True, read_only=True)
pages = DocumentPageSerializer(many=True, required=False, read_only=True)
class Meta:
model = DocumentVersion
@@ -25,6 +25,7 @@ class DocumentImageSerializer(serializers.Serializer):
class DocumentSerializer(serializers.HyperlinkedModelSerializer):
versions = DocumentVersionSerializer(many=True, read_only=True)
image = serializers.HyperlinkedIdentityField(view_name='document-image')
new_version = serializers.HyperlinkedIdentityField(view_name='document-new-version')
class Meta:
model = Document

View File

@@ -3,7 +3,8 @@ from __future__ import absolute_import
from django.conf.urls import patterns, url
from .api_views import (APIDocumentView, APIDocumentImageView, APIDocumentListView,
APIDocumentPageView, APIDocumentVersionView)
APIDocumentPageView, APIDocumentVersionCreateView,
APIDocumentVersionView)
from .conf.settings import PRINT_SIZE, DISPLAY_SIZE
urlpatterns = patterns('documents.views',
@@ -74,4 +75,5 @@ api_urls = patterns('',
url(r'^document_version/(?P<pk>[0-9]+)/$', APIDocumentVersionView.as_view(), name='documentversion-detail'),
url(r'^document_page/(?P<pk>[0-9]+)/$', APIDocumentPageView.as_view(), name='documentpage-detail'),
url(r'^documents/(?P<pk>[0-9]+)/image/$', APIDocumentImageView.as_view(), name='document-image'),
url(r'^documents/(?P<pk>[0-9]+)/new_version/$', APIDocumentVersionCreateView.as_view(), name='document-new-version'),
)