Browse Source

DIV-1153: Update API to save meta data using GraphQL

pull/170/head
ariannedee 5 years ago
parent
commit
503e973958
5 changed files with 82 additions and 1 deletions
  1. +1
    -0
      edivorce/apps/core/models.py
  2. +1
    -1
      edivorce/apps/core/redis.py
  3. +68
    -0
      edivorce/apps/core/views/api.py
  4. +6
    -0
      edivorce/settings/base.py
  5. +6
    -0
      edivorce/urls.py

+ 1
- 0
edivorce/apps/core/models.py View File

@ -143,6 +143,7 @@ class Document(models.Model):
class Meta: class Meta:
unique_together = ("bceid_user", "doc_type", "party_code", "filename", "size") unique_together = ("bceid_user", "doc_type", "party_code", "filename", "size")
ordering = ('sort_order',)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.filename: if not self.filename:


+ 1
- 1
edivorce/apps/core/redis.py View File

@ -15,7 +15,7 @@ from django.core.files.base import File
from django.core.files.storage import Storage from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible from django.utils.deconstruct import deconstructible
EX_EXPIRY = 60*24*7 # 1 week expiry
EX_EXPIRY = 60*60*24*30 # 1 month expiry in seconds
def generate_unique_filename(instance, filename): def generate_unique_filename(instance, filename):


+ 68
- 0
edivorce/apps/core/views/api.py View File

@ -1,4 +1,7 @@
import graphene
import graphene_django
from django.http import HttpResponse, HttpResponseGone from django.http import HttpResponse, HttpResponseGone
from graphql import GraphQLError
from rest_framework import permissions, status from rest_framework import permissions, status
from rest_framework.generics import CreateAPIView, ListAPIView, RetrieveUpdateDestroyAPIView from rest_framework.generics import CreateAPIView, ListAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.views import APIView from rest_framework.views import APIView
@ -86,3 +89,68 @@ class DocumentView(RetrieveUpdateDestroyAPIView):
doc.delete() doc.delete()
return HttpResponseGone('File no longer exists') return HttpResponseGone('File no longer exists')
return HttpResponse(file_contents, content_type=content_type) return HttpResponse(file_contents, content_type=content_type)
class DocumentType(graphene_django.DjangoObjectType):
url = graphene.String(source='get_file_url')
class Meta:
model = Document
class Query(graphene.ObjectType):
documents = graphene.List(DocumentType, doc_type=graphene.String(required=True), party_code=graphene.Int(required=True))
def resolve_documents(self, info, **kwargs):
if info.context.user.is_anonymous:
raise GraphQLError('Unauthorized')
q = Document.objects.filter(bceid_user=info.context.user, **kwargs)
return q
class DocumentInput(graphene.InputObjectType):
filename = graphene.String(required=True)
size = graphene.Int(required=True)
rotation = graphene.Int()
class DocumentMetaDataInput(graphene.InputObjectType):
files = graphene.List(DocumentInput, required=True)
doc_type = graphene.String(required=True)
party_code = graphene.Int(required=True)
class UpdateMetadata(graphene.Mutation):
class Arguments:
input = DocumentMetaDataInput(required=True)
documents = graphene.List(DocumentType)
def mutate(self, info, **kwargs):
if info.context.user.is_anonymous:
raise GraphQLError('Unauthorized')
input_ = kwargs['input']
documents = Document.objects.filter(bceid_user=info.context.user, doc_type=input_['doc_type'], party_code=input_['party_code'])
unique_files = [dict(s) for s in set(frozenset(d.items()) for d in input_['files'])]
if documents.count() != len(input_['files']) or documents.count() != len(unique_files):
raise GraphQLError("Invalid input: there must be the same number of files")
for i, file in enumerate(input_['files']):
try:
doc = documents.get(filename=file['filename'], size=file['size'])
doc.sort_order = i + 1
doc.rotation = file.get('rotation', file.rotation)
if doc.rotation not in [0, 90, 180, 270]:
raise GraphQLError(f"Invalid rotation {doc.rotation}, must be 0, 90, 180, 270")
doc.save()
except Document.DoesNotExist:
raise GraphQLError(f"Couldn't find document '{file['filename']}' with size '{file['size']}'")
return UpdateMetadata(documents=documents.all())
class Mutations(graphene.ObjectType):
update_metadata = UpdateMetadata.Field()
graphql_schema = graphene.Schema(query=Query, mutation=Mutations)

+ 6
- 0
edivorce/settings/base.py View File

@ -52,6 +52,7 @@ INSTALLED_APPS = (
'compressor', 'compressor',
'crispy_forms', 'crispy_forms',
'sass_processor', 'sass_processor',
'graphene_django',
) )
# add the POC app only if applicable # add the POC app only if applicable
@ -104,6 +105,11 @@ REST_FRAMEWORK = {
] ]
} }
GRAPHENE = {
'SCHEMA': 'edivorce.apps.core.views.api.graphql_schema'
}
LOGGING = { LOGGING = {
'version': 1, 'version': 1,
'disable_existing_loggers': False, 'disable_existing_loggers': False,


+ 6
- 0
edivorce/urls.py View File

@ -1,6 +1,9 @@
from django.conf import settings from django.conf import settings
from django.conf.urls import include, url from django.conf.urls import include, url
from django.contrib import admin from django.contrib import admin
from django.urls import path
from graphene_django.views import GraphQLView
from .apps.core.views import main from .apps.core.views import main
urlpatterns = [] urlpatterns = []
@ -9,6 +12,9 @@ if settings.ENVIRONMENT in ['localdev', 'dev', 'test', 'minishift']:
import debug_toolbar import debug_toolbar
urlpatterns.append(url(r'^__debug__/', include(debug_toolbar.urls)),) urlpatterns.append(url(r'^__debug__/', include(debug_toolbar.urls)),)
urlpatterns.append(url(r'^poc/', include('edivorce.apps.poc.urls'))) urlpatterns.append(url(r'^poc/', include('edivorce.apps.poc.urls')))
urlpatterns.append(path('api/graphql/', GraphQLView.as_view(graphiql=True))),
else:
urlpatterns.append(path('api/graphql/', GraphQLView.as_view(graphiql=False))),
if settings.ENVIRONMENT in ['localdev', 'minishift']: if settings.ENVIRONMENT in ['localdev', 'minishift']:
urlpatterns.append(url(r'^admin/', admin.site.urls)) urlpatterns.append(url(r'^admin/', admin.site.urls))


Loading…
Cancel
Save