권주희

implement share API by item_id

# Generated by Django 3.0.6 on 2020-06-06 08:17
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('api', '0002_auto_20200605_1851'),
]
operations = [
migrations.RenameField(
model_name='shareditem',
old_name='valid',
new_name='expires',
),
]
# Generated by Django 3.0.6 on 2020-06-06 08:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0003_auto_20200606_0817'),
]
operations = [
migrations.AddField(
model_name='shareditem',
name='created_time',
field=models.DateTimeField(auto_now=True),
),
migrations.AddField(
model_name='user',
name='created_time',
field=models.DateTimeField(auto_now=True),
),
migrations.AlterField(
model_name='item',
name='created_time',
field=models.DateTimeField(auto_now=True),
),
]
......@@ -11,7 +11,7 @@ class Item(models.Model):
user_id = models.IntegerField()
size = models.IntegerField()
is_deleted = models.BooleanField(default = False)
created_time = models.DateTimeField(blank = False)
created_time = models.DateTimeField(auto_now=True)
updated_time = models.DateTimeField()
status = models.BooleanField()
......@@ -24,9 +24,9 @@ class Item(models.Model):
class SharedItem(models.Model):
item_id = models.IntegerField()
#file_id?
valid = models.DateTimeField()
expires = models.DateTimeField()
password = models.CharField(max_length = 20)
created_time = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['item_id']
......@@ -38,6 +38,6 @@ class User(models.Model):
password = models.CharField(max_length = 20)
total_size = models.IntegerField()
current_size = models.IntegerField()
created_time = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['int_id']
......
......@@ -5,11 +5,9 @@ import boto3
from django.contrib.auth.models import User
from django.core import serializers
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
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
......@@ -17,9 +15,10 @@ 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 api.serializers import UserSerializer,GroupSerializer,ItemSerializer,SharedItemSerializer
from rest_framework import generics
from rest_framework import status
from annoying.functions import get_object_or_None
class UserViewSet(viewsets.ModelViewSet):
"""
......@@ -37,48 +36,6 @@ 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')
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')
......@@ -90,3 +47,33 @@ class ItemViewSet(viewsets.ModelViewSet):
data = serializers.serialize("json", item_list)
return Response({'data': {'list' : data}}, status=status.HTTP_200_OK)
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)
# data = serializers.serialize("json", item_list)
return Response({"shared": sharedfile.created_time , 'data': item_json}, status=status.HTTP_200_OK)
\ No newline at end of file
......
......@@ -22,14 +22,14 @@ from django.conf.urls import url
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'items', views.ItemViewSet)
router.register(r'items', views.SharedItemViewSet)
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
path('admin/', admin.site.urls),
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'),
url(r'^<int:pk>/share/$', views.SharedItemViewSet.share, name='share'),
]
......