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

from django.contrib.auth.models import User
from django.core import serializers
from django.views.decorators.csrf import csrf_exempt
from rest_framework import viewsets
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated, AllowAny

from api.models import Item, SharedItem
from api.serializers import UserSerializer,GroupSerializer,ItemSerializer
from rest_framework import status
from annoying.functions import get_object_or_None

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.ViewSet):

    queryset = Item.objects.all()
    serializer_class = ItemSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny,
                          #IsOwnerOrReadOnly
                          ]
    permission_classes_by_action = {'get': [permissions.AllowAny],
                                    'destroy': [permissions.AllowAny]}

    # 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)
            json_data = json.loads(data)
            return Response({'data': {'list' : json_data}}, status=status.HTTP_200_OK)

    # url: items/11/
    # 마지막 slash도 써주어야함
    def get(self, request, pk):
        print(pk)
        return Response({'message': "info complete"}, status=status.HTTP_200_OK)

    # url: items/11/
    # 마지막 slash도 써주어야함
    def destroy(self, request, pk):
        if request.method == 'DELETE':
            print(pk)
            item = get_object_or_None(Item, item_id=pk)
            if item != None:
                if item.is_folder == True: # 폴더는 삭제 안되도록 처리
                    return Response({'message': 'This item is folder.'}, status=status.HTTP_200_OK)
                item.is_deleted = True
                # item.delete() 이거 하면 완전 삭제되어버림 is deleted True 면 휴지통에서 리스트 조회할 수 있도록!
                return Response({'message': 'delete complete'},status=status.HTTP_200_OK)
            return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT)

    def get_permissions(self):
        try:
            # return permission_classes depending on `action`
            return [permission() for permission in self.permission_classes_by_action[self.action]]
        except KeyError:
            # action is not set return default permission_classes
            return [permission() for permission in self.permission_classes]


class SharedItemViewSet(viewsets.ModelViewSet):

    queryset = SharedItem.objects.all()
    # serializer_class = SharedItemSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny,
                          # IsOwnerOrReadOnly
                          ]
    # url: http://localhost:8000/items/1/share/
    # 마지막 slash도 써주어야함
    @csrf_exempt
    @action(methods=['POST'], detail=True, permission_classes=[AllowAny], url_path='share', url_name='share')
    def share(self, request, pk):
        if request.method == 'POST':
            password = request.POST.get('password', '')
            expires = request.POST.get('expires', '')

            sharedfile = get_object_or_None(SharedItem, item_id=pk)
            if sharedfile != None:
                # 서버는 정상이나 이미 공유객체로 등록된 파일임
                return Response({'message': 'This file is already shared'}, status=status.HTTP_200_OK)
            sharedfile = SharedItem(item_id =pk, password=password, expires = expires)
            sharedfile.save()
            sharedfile = SharedItem.objects.get(item_id = pk)

            # sf = serializers.serialize("json", sharedfile)
            item = Item.objects.filter(item_id = pk)
            item_json = serializers.serialize("json", item)

            json_data = json.loads(item_json)
            return Response({"shared": sharedfile.created_time , 'data': json_data}, status=status.HTTP_200_OK)

item = ItemViewSet.as_view({
    'delete': 'destroy',
})