권주희

implement search API by keyword

from django.contrib.auth.models import User, Group
from rest_framework import serializers
from api.models import Item
from api.models import Item, SharedItem
class UserSerializer(serializers.HyperlinkedModelSerializer):
......@@ -17,3 +17,8 @@ class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = '__all__'
class SharedItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = '__all__'
......
import mimetypes
import json
import os
import boto3
from django.contrib.auth.models import User, Group
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
......@@ -14,10 +16,10 @@ from rest_framework.decorators import action
from rest_framework.parsers import JSONParser
from rest_framework.permissions import IsAuthenticated, AllowAny
from api.models import Item
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):
"""
......@@ -27,70 +29,6 @@ class UserViewSet(viewsets.ModelViewSet):
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated]
"""
def item_list(request):
if request.method == 'GET':
items = Item.objects.all()
serializer = ItemSerializer(items, many=True)
return JsonResponse(serializer.data, safe=False)
elif request.method == 'POST':
s3 = boto3.client('s3')
s3_bucket = os.environ.get('AWS_STORAGE_BUCKET_NAME')
file_name = request.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']
def item_detail(request, pk):
try:
item = Item.objects.get(pk=pk)
except Item.DoesNotExist:
return HttpResponse(status=404)
if request.method == 'GET':
serializer = ItemSerializer(item)
return JsonResponse(serializer.data)
elif request.method == 'PUT':
s3 = boto3.client('s3')
s3_bucket = os.environ.get('AWS_STORAGE_BUCKET_NAME')
file_name = item.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']
elif request.method == 'DELETE':
item.delete()
return HttpResponse(status=204)
"""
class ItemViewSet(viewsets.ModelViewSet):
......@@ -99,10 +37,9 @@ class ItemViewSet(viewsets.ModelViewSet):
permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny,
#IsOwnerOrReadOnly
]
# url: /upload
@action(methods=['POST'], detail=True, permission_classes=[AllowAny],
url_path='upload', url_name='upload')
url_path='upload', url_name='upload')
def upload(self, request, pk):
if request.method == 'POST':
s3 = boto3.client('s3')
......@@ -142,106 +79,14 @@ class ItemViewSet(viewsets.ModelViewSet):
return Response({'Error': 'File Upload Error'}, status=status.HTTP_200_OK)
return Response({'Message': 'File Upload Successful'}, status=status.HTTP_200_OK)
"""
# url: /children
@action(methods=['POST'], detail=True, permission_classes=[AllowAny],
url_path='children', url_name='children')
def children(self, request):
if request.method == 'POST':
#name = request.POST['name']
name = request.POST.get('name', '')
path = request.POST.get('path', '')
parent = request.POST.get('item_id', '')
daughter = Item(name = name, path = path, parent = parent)
daughter.save()
"""
"""
class ItemViewSet(viewsets.ModelViewSet):
#API endpoint that allows groups to be viewed or edited.
queryset = Item.objects.all().order_by('-item_id')
serializer_class = ItemSerializer
permission_classes = [permissions.IsAuthenticated]
def item_list(self, request):
# 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':
items = Item.objects.all()
serializer = ItemSerializer(items, many=True)
return JsonResponse(serializer.data, safe=False)
elif request.method == 'POST':
s3 = boto3.client('s3')
s3_bucket = os.environ.get('AWS_STORAGE_BUCKET_NAME')
file_name = request.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: /items/{item_id}/upload
@action(methods=['post'], detail=True, permission_classes=[IsAuthenticated],
url_path='upload', url_name='upload')
def upload(self, request):
s3 = boto3.client('s3')
s3_bucket = os.environ.get('AWS_STORAGE_BUCKET_NAME')
file_name = request.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']
def upload(self, request):
if request.method == 'POST':
serializer = ItemSerializer(data=request.data)
if serializer.is_valid():
BUCKET_NAME = 'presigned-post-example'
KEY_NAME = 'cat.jpg'
s3 = boto3.client('s3')
resp = s3.generate_presigned_post(
Bucket = BUCKET_NAME,
Key = KEY_NAME,
)
resp['fields']['file'] = '@{key}'.format(key=KEY_NAME)
keyword = request.GET.get('keyword', '')
item_list = Item.objects.filter(name__icontains = keyword)
form_values = "\n".join(["-F {key}={value} \\".format(key=key, value=value)
for key, value in resp['fields'].items()])
data = serializers.serialize("json", item_list)
return Response({'data': {'list' : data}}, status=status.HTTP_200_OK)
# authentication_classes = (authentication.SessionAuthentication,)
# permission_classes = [IsAuthenticated, ]
"""
......
......@@ -30,4 +30,6 @@ urlpatterns = [
path('', include(router.urls)),
url(r'^upload/$', views.ItemViewSet.upload, name='upload'),
url(r'^status/$', views.ItemViewSet.status, name='status'),
url(r'^search/$', views.ItemViewSet.search, name='search'),
]
......