Browse Source

DIV-1154 and 1156: Update API to retrieve document metadata and get image

pull/170/head
ariannedee 5 years ago
parent
commit
9816df36a8
4 changed files with 79 additions and 23 deletions
  1. +15
    -4
      edivorce/apps/core/models.py
  2. +25
    -5
      edivorce/apps/core/serializer.py
  3. +4
    -6
      edivorce/apps/core/urls.py
  4. +35
    -8
      edivorce/apps/core/views/api.py

+ 15
- 4
edivorce/apps/core/models.py View File

@ -1,5 +1,7 @@
from django.contrib import admin from django.contrib import admin
from django.db import models from django.db import models
from django.db.models import F
from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
@ -143,8 +145,10 @@ class Document(models.Model):
unique_together = ("bceid_user", "doc_type", "party_code", "filename", "size") unique_together = ("bceid_user", "doc_type", "party_code", "filename", "size")
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.filename = self.file.name
self.size = self.file.size
if not self.filename:
self.filename = self.file.name
if not self.size:
self.size = self.file.size
super(Document, self).save(*args, **kwargs) super(Document, self).save(*args, **kwargs)
@ -153,12 +157,19 @@ class Document(models.Model):
Override delete so we can delete the Redis object when this instance is deleted. Override delete so we can delete the Redis object when this instance is deleted.
""" """
self.file.delete(save=False) self.file.delete(save=False)
self.update_sort_orders()
super(Document, self).delete(**kwargs) super(Document, self).delete(**kwargs)
def str(self):
def __str__(self):
return f'User {self.bceid_user.display_name}: {self.filename} ({self.doc_type} - {self.party_code})' return f'User {self.bceid_user.display_name}: {self.filename} ({self.doc_type} - {self.party_code})'
def get_file_url(self):
return reverse('document', kwargs={'filename': self.filename, 'doc_type': self.doc_type, 'party_code': self.party_code, 'size': self.size})
def update_sort_orders(self):
q = Document.objects.filter(bceid_user=self.bceid_user, doc_type=self.doc_type, party_code=self.party_code, sort_order__gt=self.sort_order)
q.update(sort_order=F('sort_order') - 1)
class DontLog: class DontLog:
def log_addition(self, *args): def log_addition(self, *args):


+ 25
- 5
edivorce/apps/core/serializer.py View File

@ -23,18 +23,19 @@ class UserResponseSerializer(serializers.ModelSerializer):
instance.save() instance.save()
class DocumentSerializer(serializers.ModelSerializer):
doc_type = serializers.CharField()
party_code = serializers.IntegerField(min_value=0, max_value=2)
file = serializers.FileField()
class CreateDocumentSerializer(serializers.ModelSerializer):
doc_type = serializers.CharField(required=True)
party_code = serializers.IntegerField(min_value=0, max_value=2, required=True)
file = serializers.FileField(required=True)
filename = serializers.CharField(read_only=True) filename = serializers.CharField(read_only=True)
size = serializers.IntegerField(read_only=True) size = serializers.IntegerField(read_only=True)
rotation = serializers.IntegerField(read_only=True) rotation = serializers.IntegerField(read_only=True)
sort_order = serializers.IntegerField(read_only=True) sort_order = serializers.IntegerField(read_only=True)
file_url = serializers.URLField(source='get_file_url', read_only=True)
class Meta: class Meta:
model = Document model = Document
fields = ('file', 'doc_type', 'party_code', 'filename', 'size', 'rotation', 'sort_order')
fields = ('file', 'doc_type', 'party_code', 'filename', 'size', 'rotation', 'sort_order', 'file_url')
def create(self, validated_data): def create(self, validated_data):
filename = validated_data['file'].name filename = validated_data['file'].name
@ -47,3 +48,22 @@ class DocumentSerializer(serializers.ModelSerializer):
except IntegrityError: except IntegrityError:
raise ValidationError("You have already uploaded that file") raise ValidationError("You have already uploaded that file")
return response return response
def valid_rotation(value):
if value % 90 != 0:
raise serializers.ValidationError('Rotation must be 0, 90, 180, or 270')
class DocumentMetadataSerializer(serializers.ModelSerializer):
doc_type = serializers.CharField(read_only=True)
party_code = serializers.IntegerField(read_only=True)
filename = serializers.CharField(read_only=True)
size = serializers.IntegerField(read_only=True)
rotation = serializers.IntegerField(min_value=0, max_value=270, validators=[valid_rotation])
sort_order = serializers.IntegerField(read_only=True)
file_url = serializers.URLField(source='get_file_url', read_only=True)
class Meta:
model = Document
fields = ('doc_type', 'party_code', 'filename', 'size', 'rotation', 'sort_order', 'file_url')

+ 4
- 6
edivorce/apps/core/urls.py View File

@ -1,12 +1,14 @@
from django.conf.urls import url from django.conf.urls import url
from rest_framework.routers import DefaultRouter
from django.urls import path
from .views import main, system, pdf, api, localdev from .views import main, system, pdf, api, localdev
from .views.api import DocumentViewSet
urlpatterns = [ urlpatterns = [
# url(r'^guide$', styleguide.guide), # url(r'^guide$', styleguide.guide),
url(r'^api/response$', api.UserResponseHandler.as_view()), url(r'^api/response$', api.UserResponseHandler.as_view()),
url(r'^api/documents/$', api.DocumentCreateView.as_view(), name='documents'),
path('api/documents/<doc_type>/<int:party_code>/', api.DocumentMetaDataView.as_view(), name='documents-meta'),
path('api/documents/<doc_type>/<int:party_code>/<filename>/<int:size>/', api.DocumentView.as_view(), name='document'),
# url(r'^login/headers$', system.headers), # url(r'^login/headers$', system.headers),
@ -34,7 +36,3 @@ urlpatterns = [
url(r'^current$', system.current, name="current"), url(r'^current$', system.current, name="current"),
url(r'^$', main.home, name="home"), url(r'^$', main.home, name="home"),
] ]
router = DefaultRouter()
router.register(r'api/documents', DocumentViewSet, basename='document')
urlpatterns += router.urls

+ 35
- 8
edivorce/apps/core/views/api.py View File

@ -1,10 +1,11 @@
from django.http import HttpResponse, HttpResponseGone
from rest_framework import permissions, status from rest_framework import permissions, status
from rest_framework.generics import CreateAPIView, ListAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from ..models import Document, Question from ..models import Document, Question
from ..serializer import DocumentSerializer, UserResponseSerializer
from ..serializer import CreateDocumentSerializer, DocumentMetadataSerializer, UserResponseSerializer
from ..utils.question_step_mapping import question_step_mapping from ..utils.question_step_mapping import question_step_mapping
from ..utils.user_response import save_to_session, save_to_db from ..utils.user_response import save_to_session, save_to_db
@ -50,12 +51,38 @@ class UserResponseHandler(APIView):
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
class DocumentViewSet(ModelViewSet):
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
class DocumentCreateView(CreateAPIView):
serializer_class = CreateDocumentSerializer
permission_classes = [permissions.IsAuthenticated]
queryset = Document.objects.all() queryset = Document.objects.all()
serializer_class = DocumentSerializer
class DocumentMetaDataView(ListAPIView):
serializer_class = DocumentMetadataSerializer
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self): def get_queryset(self):
if self.request.user.is_anonymous:
return Document.objects.none()
return Document.objects.filter(bceid_user=self.request.user)
doc_type = self.kwargs['doc_type']
party_code = self.kwargs['party_code']
return Document.objects.filter(doc_type=doc_type, party_code=party_code, bceid_user=self.request.user).order_by('sort_order')
class DocumentView(RetrieveUpdateDestroyAPIView):
serializer_class = DocumentMetadataSerializer
permission_classes = [permissions.IsAuthenticated]
def get_object(self):
return Document.objects.get(bceid_user=self.request.user, **self.kwargs)
def retrieve(self, request, *args, **kwargs):
""" Return the file instead of meta data """
doc = self.get_object()
content_type = 'application/pdf' if 'pdf' in doc.filename else 'image/jpeg'
# If file doesn't exist anymore, delete it
try:
file_contents = doc.file.read()
except TypeError:
doc.delete()
return HttpResponseGone('File no longer exists')
return HttpResponse(file_contents, content_type=content_type)

Loading…
Cancel
Save