views.py 3.6 KB
import mimetypes
import json
import os
import boto3

from django.contrib.auth.models import User
from django.core import serializers
from django.http import HttpResponse, JsonResponse
from rest_framework import viewsets
from rest_framework import permissions
from django.views.decorators.csrf import csrf_exempt
from rest_framework import renderers
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework.parsers import JSONParser
from rest_framework.permissions import IsAuthenticated, AllowAny

from api.models import Item, SharedItem
from api.serializers import UserSerializer,GroupSerializer,ItemSerializer
from rest_framework import generics
from rest_framework import status

class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    permission_classes = [permissions.IsAuthenticated]


class ItemViewSet(viewsets.ModelViewSet):

    queryset = Item.objects.all()
    serializer_class = ItemSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny,
                          #IsOwnerOrReadOnly
                          ]
    # url: /upload
    @action(methods=['POST'], detail=True, permission_classes=[AllowAny],
            url_path='upload', url_name='upload')
    def upload(self, request, pk):
        if request.method == 'POST':
            s3 = boto3.client('s3')
            #s3_bucket = os.environ.get('AWS_STORAGE_BUCKET_NAME')
            s3_bucket = 'arn:aws:s3:::[s3id]'
            #file_name = request.GET['image_name']
            file_name = request.GET.get('image_name', '')
            file_type = mimetypes.guess_type(file_name)[0]
            presigned_post = s3.generate_presigned_post(
                Bucket=s3_bucket,
                Key=file_name,
                Fields={"acl": "private", "Content-Type": file_type},
                Conditions=[
                    {"acl": "public-read"},
                    {"Content-Type": file_type}
                ],
                ExpiresIn=3600
            )

            data = {
                "signed_url": presigned_post,
                'url': 'https://%s.s3.amazonaws.com/%s' % (s3_bucket, file_name)
            }
            return presigned_post['url']

    # url: /status
    @action(methods=['POST'], detail=True, permission_classes=[AllowAny],
                     url_path='status', url_name='status')
    def status(self, request):
        if request.method == 'POST':
            #name = request.POST['name']
            name = request.POST.get('name', '')
            up_time = request.POST.get('updated_time', '')
            try:
                item = Item.objects.get(name=name, updated_time=up_time)
            except Item.DoesNotExist:
                return Response({'Error': 'File Upload Error'}, status=status.HTTP_200_OK)
            return Response({'Message': 'File Upload Successful'}, status=status.HTTP_200_OK)


    # url: items/search
    @action(methods=['GET'], detail=False, permission_classes=[AllowAny], url_path='search', url_name='search')
    def search(self, request):
        if request.method == 'GET':
            keyword = request.GET.get('keyword', '')
            item_list = Item.objects.filter(name__icontains = keyword)

            data = serializers.serialize("json", item_list)
            return Response({'data': {'list' : data}}, status=status.HTTP_200_OK)