From e16889824887c7eead1c4cb546bdaabd8986aac5 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 22 Jul 2014 02:32:06 -0400 Subject: [PATCH] Make API writable --- mayan/apps/documents/api_views.py | 21 ++++++++++++++++----- mayan/apps/documents/models.py | 28 ++++++++++++++++++---------- mayan/apps/documents/serializers.py | 3 ++- mayan/apps/documents/urls.py | 4 +++- 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/mayan/apps/documents/api_views.py b/mayan/apps/documents/api_views.py index 5d1de99c2b..35dd435b88 100644 --- a/mayan/apps/documents/api_views.py +++ b/mayan/apps/documents/api_views.py @@ -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. diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index f3f5579719..3bf44d051d 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -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')) diff --git a/mayan/apps/documents/serializers.py b/mayan/apps/documents/serializers.py index a1720e0eb5..14f580f73b 100644 --- a/mayan/apps/documents/serializers.py +++ b/mayan/apps/documents/serializers.py @@ -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 diff --git a/mayan/apps/documents/urls.py b/mayan/apps/documents/urls.py index b5d44a653b..9d36cc6cc4 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -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[0-9]+)/$', APIDocumentVersionView.as_view(), name='documentversion-detail'), url(r'^document_page/(?P[0-9]+)/$', APIDocumentPageView.as_view(), name='documentpage-detail'), url(r'^documents/(?P[0-9]+)/image/$', APIDocumentImageView.as_view(), name='document-image'), + url(r'^documents/(?P[0-9]+)/new_version/$', APIDocumentVersionCreateView.as_view(), name='document-new-version'), )