Committed by
GitHub
Showing
14 changed files
with
260 additions
and
73 deletions
dcloud/calculator.java
0 → 100644
| 1 | +import java.util.Scanner; | ||
| 2 | + | ||
| 3 | +class calculator{ | ||
| 4 | + public static void main(String[] args) { | ||
| 5 | + | ||
| 6 | + Scanner scn = new Scanner(System.in); | ||
| 7 | + | ||
| 8 | + System.out.print("Input first args: "); | ||
| 9 | + | ||
| 10 | + float num1 = scn.nextFloat(); | ||
| 11 | + | ||
| 12 | + System.out.print("Input second args: "); | ||
| 13 | + float num2 = scn.nextFloat(); | ||
| 14 | + | ||
| 15 | + System.out.print("Input Operator(+,-,/,*): "); | ||
| 16 | + | ||
| 17 | + String oper = scn.next(); | ||
| 18 | + | ||
| 19 | + float result = 0.0f; | ||
| 20 | + | ||
| 21 | + switch (oper) { | ||
| 22 | + case "+": | ||
| 23 | + result = num1 + num2; | ||
| 24 | + break; | ||
| 25 | + | ||
| 26 | + case "-": | ||
| 27 | + result = num1 - num2; | ||
| 28 | + break; | ||
| 29 | + | ||
| 30 | + case "/": | ||
| 31 | + result = num1 / num2; | ||
| 32 | + break; | ||
| 33 | + | ||
| 34 | + case "*": | ||
| 35 | + result = num1 * num2; | ||
| 36 | + break; | ||
| 37 | + | ||
| 38 | + default: | ||
| 39 | + break; | ||
| 40 | + } | ||
| 41 | + | ||
| 42 | + System.out.println("Result is " + result); | ||
| 43 | + scn.close(); | ||
| 44 | + } | ||
| 45 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | -""" | ||
| 2 | -Django settings for dcloud project. | ||
| 3 | - | ||
| 4 | -Generated by 'django-admin startproject' using Django 2.0.4. | ||
| 5 | - | ||
| 6 | -For more information on this file, see | ||
| 7 | -https://docs.djangoproject.com/en/2.0/topics/settings/ | ||
| 8 | - | ||
| 9 | -For the full list of settings and their values, see | ||
| 10 | -https://docs.djangoproject.com/en/2.0/ref/settings/ | ||
| 11 | -""" | ||
| 12 | - | ||
| 13 | import os | 1 | import os |
| 2 | +from dcloud import aws_conf | ||
| 14 | 3 | ||
| 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) | 4 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) |
| 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 5 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| 17 | 6 | ||
| 18 | - | ||
| 19 | -# Quick-start development settings - unsuitable for production | ||
| 20 | -# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ | ||
| 21 | - | ||
| 22 | # SECURITY WARNING: keep the secret key used in production secret! | 7 | # SECURITY WARNING: keep the secret key used in production secret! |
| 23 | SECRET_KEY = '534f6m=i@*)=q3kuwlge1m3c+@^cabr3ttcx*omv^+dorydjfr' | 8 | SECRET_KEY = '534f6m=i@*)=q3kuwlge1m3c+@^cabr3ttcx*omv^+dorydjfr' |
| 24 | 9 | ||
| ... | @@ -27,9 +12,7 @@ DEBUG = True | ... | @@ -27,9 +12,7 @@ DEBUG = True |
| 27 | 12 | ||
| 28 | ALLOWED_HOSTS = [] | 13 | ALLOWED_HOSTS = [] |
| 29 | 14 | ||
| 30 | - | ||
| 31 | # Application definition | 15 | # Application definition |
| 32 | - | ||
| 33 | INSTALLED_APPS = [ | 16 | INSTALLED_APPS = [ |
| 34 | 'django.contrib.admin', | 17 | 'django.contrib.admin', |
| 35 | 'django.contrib.auth', | 18 | 'django.contrib.auth', |
| ... | @@ -39,7 +22,8 @@ INSTALLED_APPS = [ | ... | @@ -39,7 +22,8 @@ INSTALLED_APPS = [ |
| 39 | 'django.contrib.staticfiles', | 22 | 'django.contrib.staticfiles', |
| 40 | 'rest_framework', | 23 | 'rest_framework', |
| 41 | 'restful.apps.RestfulConfig', | 24 | 'restful.apps.RestfulConfig', |
| 42 | - 'website' | 25 | + 'website', |
| 26 | + 's3direct', | ||
| 43 | ] | 27 | ] |
| 44 | 28 | ||
| 45 | MIDDLEWARE = [ | 29 | MIDDLEWARE = [ |
| ... | @@ -122,7 +106,59 @@ USE_TZ = True | ... | @@ -122,7 +106,59 @@ USE_TZ = True |
| 122 | 106 | ||
| 123 | STATIC_URL = '/static/' | 107 | STATIC_URL = '/static/' |
| 124 | 108 | ||
| 109 | +MEDIA_URL = '/media/' | ||
| 110 | +MEDIA_ROOT = os.path.join(BASE_DIR, "media") | ||
| 125 | 111 | ||
| 126 | # Login redirect | 112 | # Login redirect |
| 127 | 113 | ||
| 128 | -LOGIN_REDIRECT_URL = '/' | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 114 | +LOGIN_REDIRECT_URL = '/' | ||
| 115 | + | ||
| 116 | +# AWS | ||
| 117 | + | ||
| 118 | +# If these are not defined, the EC2 instance profile and IAM role are used. | ||
| 119 | +# This requires you to add boto3 (or botocore, which is a dependency of boto3) | ||
| 120 | +# to your project dependencies. | ||
| 121 | +AWS_ACCESS_KEY_ID = aws_conf.AWS_ACCESS_KEY_ID | ||
| 122 | +AWS_SECRET_ACCESS_KEY = aws_conf.AWS_SECRET_ACCESS_KEY | ||
| 123 | + | ||
| 124 | +AWS_STORAGE_BUCKET_NAME = aws_conf.AWS_STORAGE_BUCKET_NAME | ||
| 125 | + | ||
| 126 | +# The region of your bucket, more info: | ||
| 127 | +# http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region | ||
| 128 | +S3DIRECT_REGION = 'ap-northeast-2' | ||
| 129 | + | ||
| 130 | +# Destinations, with the following keys: | ||
| 131 | +# | ||
| 132 | +# key [required] Where to upload the file to, can be either: | ||
| 133 | +# 1. '/' = Upload to root with the original filename. | ||
| 134 | +# 2. 'some/path' = Upload to some/path with the original filename. | ||
| 135 | +# 3. functionName = Pass a function and create your own path/filename. | ||
| 136 | +# key_args [optional] Arguments to be passed to 'key' if it's a function. | ||
| 137 | +# auth [optional] An ACL function to whether the current Django user can perform this action. | ||
| 138 | +# allowed [optional] List of allowed MIME types. | ||
| 139 | +# acl [optional] Give the object another ACL rather than 'public-read'. | ||
| 140 | +# cache_control [optional] Cache control headers, eg 'max-age=2592000'. | ||
| 141 | +# content_disposition [optional] Useful for sending files as attachments. | ||
| 142 | +# bucket [optional] Specify a different bucket for this particular object. | ||
| 143 | +# server_side_encryption [optional] Encryption headers for buckets that require it. | ||
| 144 | + | ||
| 145 | +S3DIRECT_DESTINATIONS = { | ||
| 146 | + 'example_destination': { | ||
| 147 | + # REQUIRED | ||
| 148 | + 'key': '/', | ||
| 149 | + | ||
| 150 | + # OPTIONAL | ||
| 151 | + #'auth': lambda u: u.is_staff, # Default allow anybody to upload | ||
| 152 | + #'allowed': ['image/jpeg', 'image/png', 'video/mp4'], # Default allow all mime types | ||
| 153 | + #'bucket': 'pdf-bucket', # Default is 'AWS_STORAGE_BUCKET_NAME' | ||
| 154 | + 'acl': 'private', # Defaults to 'public-read' | ||
| 155 | + 'cache_control': 'max-age=2592000', # Default no cache-control | ||
| 156 | + #'content_disposition': 'attachment', # Default no content disposition | ||
| 157 | + #'content_length_range': (5000, 20000000), # Default allow any size | ||
| 158 | + #'server_side_encryption': 'AES256', # Default no encryption | ||
| 159 | + }, | ||
| 160 | + 'example_other': { | ||
| 161 | + 'key': lambda filename, args: args + '/' + filename, | ||
| 162 | + 'key_args': 'uploads/images', # Only if 'key' is a function | ||
| 163 | + } | ||
| 164 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -10,5 +10,6 @@ urlpatterns = [ | ... | @@ -10,5 +10,6 @@ urlpatterns = [ |
| 10 | url(r'^accounts/login/$', views.login, name='login'), | 10 | url(r'^accounts/login/$', views.login, name='login'), |
| 11 | url(r'^accounts/logout/$', views.logout, name='logout', kwargs={'next_page': '/'}), | 11 | url(r'^accounts/logout/$', views.logout, name='logout', kwargs={'next_page': '/'}), |
| 12 | 12 | ||
| 13 | + url(r'^s3direct/', include('s3direct.urls')), | ||
| 13 | ] | 14 | ] |
| 14 | 15 | ... | ... |
dcloud/media/calculator.java
0 → 100644
| 1 | +import java.util.Scanner; | ||
| 2 | + | ||
| 3 | +class calculator{ | ||
| 4 | + public static void main(String[] args) { | ||
| 5 | + | ||
| 6 | + Scanner scn = new Scanner(System.in); | ||
| 7 | + | ||
| 8 | + System.out.print("Input first args: "); | ||
| 9 | + | ||
| 10 | + float num1 = scn.nextFloat(); | ||
| 11 | + | ||
| 12 | + System.out.print("Input second args: "); | ||
| 13 | + float num2 = scn.nextFloat(); | ||
| 14 | + | ||
| 15 | + System.out.print("Input Operator(+,-,/,*): "); | ||
| 16 | + | ||
| 17 | + String oper = scn.next(); | ||
| 18 | + | ||
| 19 | + float result = 0.0f; | ||
| 20 | + | ||
| 21 | + switch (oper) { | ||
| 22 | + case "+": | ||
| 23 | + result = num1 + num2; | ||
| 24 | + break; | ||
| 25 | + | ||
| 26 | + case "-": | ||
| 27 | + result = num1 - num2; | ||
| 28 | + break; | ||
| 29 | + | ||
| 30 | + case "/": | ||
| 31 | + result = num1 / num2; | ||
| 32 | + break; | ||
| 33 | + | ||
| 34 | + case "*": | ||
| 35 | + result = num1 * num2; | ||
| 36 | + break; | ||
| 37 | + | ||
| 38 | + default: | ||
| 39 | + break; | ||
| 40 | + } | ||
| 41 | + | ||
| 42 | + System.out.println("Result is " + result); | ||
| 43 | + scn.close(); | ||
| 44 | + } | ||
| 45 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -2,12 +2,13 @@ from django.db import models | ... | @@ -2,12 +2,13 @@ from django.db import models |
| 2 | 2 | ||
| 3 | # Create your models here. | 3 | # Create your models here. |
| 4 | class File(models.Model): | 4 | class File(models.Model): |
| 5 | + file = models.FileField(blank=False, null=False) | ||
| 6 | + # title = models.CharField(max_length=100) | ||
| 5 | created = models.DateTimeField(auto_now_add=True) | 7 | created = models.DateTimeField(auto_now_add=True) |
| 6 | - modified = models.DateTimeField(auto_now=True) | 8 | + |
| 7 | - title = models.CharField(max_length=100) | 9 | + # modified = models.DateTimeField(auto_now=True) |
| 8 | # file_name = models.CharField(max_length=100, primary_key=True) | 10 | # file_name = models.CharField(max_length=100, primary_key=True) |
| 9 | - | 11 | + # object_key = models.CharField(max_length=1025) |
| 10 | - object_key = models.CharField(max_length=1025) | ||
| 11 | # owner = models.ForeignKey('auth.User', related_name='snippets', on_delete=models.CASCADE) | 12 | # owner = models.ForeignKey('auth.User', related_name='snippets', on_delete=models.CASCADE) |
| 12 | 13 | ||
| 13 | class Meta: | 14 | class Meta: | ... | ... |
| ... | @@ -27,4 +27,24 @@ def list_path(bucket, user, path): | ... | @@ -27,4 +27,24 @@ def list_path(bucket, user, path): |
| 27 | 27 | ||
| 28 | return {'files':files} | 28 | return {'files':files} |
| 29 | 29 | ||
| 30 | -# print(list_path(BUCKET, 'test1', '')) | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 30 | +def upload_file(bucket, user, local_path, key): | ||
| 31 | + return S3.upload_file(local_path, bucket, user+"/"+key) | ||
| 32 | + | ||
| 33 | +def download_file(bucket, user, local_path, key): | ||
| 34 | + return S3.download_file(bucket, user+"/"+key, local_path) | ||
| 35 | + | ||
| 36 | +def delete_path(bucket, user, path): | ||
| 37 | + return S3.delete_object(Bucket=bucket, Key=user+"/"+path) | ||
| 38 | + | ||
| 39 | +def make_directory(bucket, user, path): | ||
| 40 | + return S3.put_object(Bucket=BUCKET, Key=user+"/"+path) | ||
| 41 | + | ||
| 42 | +# | ||
| 43 | +def move_file(bucket, user, old_path, new_path): | ||
| 44 | + S3.copy_object(Bucket=bucket, CopySource=bucket+"/"+user+"/"+old_path, Key=user+"/"+new_path) | ||
| 45 | + S3.delete_object(Bucket=bucket, Key=user+"/"+old_path) | ||
| 46 | + return | ||
| 47 | + | ||
| 48 | +def copy_file(bucket, user, old_path, new_path): | ||
| 49 | + S3.copy_object(Bucket=bucket, CopySource=bucket+"/"+user+"/"+old_path, Key=user+"/"+new_path) | ||
| 50 | + return | ... | ... |
| ... | @@ -3,9 +3,12 @@ from django.shortcuts import redirect | ... | @@ -3,9 +3,12 @@ from django.shortcuts import redirect |
| 3 | from rest_framework.urlpatterns import format_suffix_patterns | 3 | from rest_framework.urlpatterns import format_suffix_patterns |
| 4 | from restful import views | 4 | from restful import views |
| 5 | 5 | ||
| 6 | +file_regex = '[\w\s가-힣.\`\'\˜\=\+\#\ˆ\@\$\&\-\.\(\)\{\}\;\[\]]' | ||
| 7 | + | ||
| 6 | urlpatterns = [ | 8 | urlpatterns = [ |
| 7 | - url(r'^files/(?P<path>([a-zA-z0-9가-힣._-]*/)*)$', views.FileList.as_view(), name='file-list'), | 9 | + url(r'^list/(?P<path>([\w\s가-힣.\`\'\˜\=\+\#\ˆ\@\$\&\-\.\(\)\{\}\;\[\]]*/)*)$', views.FileList.as_view(), name='file-list'), |
| 8 | - url(r'^files/(?P<pk>[0-9]+)/$', views.FileDetail.as_view()), | 10 | + url(r'^file/(?P<path>([\w\s가-힣.\`\'\˜\=\+\#\ˆ\@\$\&\-\.\(\)\{\}\;\[\]]*/*)*)$', views.FileDetail.as_view(), name='file-detail'), |
| 11 | + url(r'^file-mod/(?P<old_path>([\w\s가-힣.\`\'\˜\=\+\#\ˆ\@\$\&\-\.\(\)\{\}\;\[\]]*/*)*)&(?P<new_path>([\w\s가-힣.\`\'\˜\=\+\#\ˆ\@\$\&\-\.\(\)\{\}\;\[\]]]*/*)*)$', views.FileCopyMove.as_view(), name='file-copy-move') | ||
| 9 | ] | 12 | ] |
| 10 | 13 | ||
| 11 | urlpatterns = format_suffix_patterns(urlpatterns) | 14 | urlpatterns = format_suffix_patterns(urlpatterns) |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -13,48 +13,74 @@ class FileList(APIView): | ... | @@ -13,48 +13,74 @@ class FileList(APIView): |
| 13 | List all file, or create a new snippet. | 13 | List all file, or create a new snippet. |
| 14 | """ | 14 | """ |
| 15 | 15 | ||
| 16 | - def get(self, request, path='/', format=None): | 16 | + """ |
| 17 | - # file = File.objects.all() | 17 | + list files or view detail |
| 18 | - # serializer = FileSerializer(file, many=True) | 18 | + """ |
| 19 | - # print(serializer.data) | 19 | + def get(self, request, path="/", format=None): |
| 20 | - # return Response(serializer.data) | 20 | + user = request.user |
| 21 | - data = s3_interface.list_path(s3_interface.BUCKET, 'test1', path) | 21 | + data = s3_interface.list_path(s3_interface.BUCKET, user.username, path) |
| 22 | return Response(data) | 22 | return Response(data) |
| 23 | 23 | ||
| 24 | + """ | ||
| 25 | + upload file | ||
| 26 | + """ | ||
| 27 | + def post(self, request, path="/", format=None): | ||
| 28 | + # file upload | ||
| 29 | + # upload to server | ||
| 30 | + file_serializer = FileSerializer(data=request.data) | ||
| 31 | + if file_serializer.is_valid(): | ||
| 32 | + file_serializer.save() | ||
| 33 | + # upload to s3 | ||
| 34 | + file_path = '.' + file_serializer.data.get('file') | ||
| 35 | + user = request.user | ||
| 36 | + data = s3_interface.upload_file(s3_interface.BUCKET, user.username, file_path, path+file_path.split('/')[-1]) | ||
| 37 | + # TODO upload check | ||
| 38 | + # TODO remove local file | ||
| 39 | + return Response(file_serializer.data, status=status.HTTP_201_CREATED) | ||
| 40 | + else: | ||
| 41 | + return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST) | ||
| 42 | + return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST) | ||
| 43 | + | ||
| 44 | + """ | ||
| 45 | + make directory | ||
| 46 | + """ | ||
| 47 | + def put(self, request, path="/", format=None): | ||
| 48 | + user = request.user | ||
| 49 | + data = s3_interface.make_directory(s3_interface.BUCKET, user.username, path) | ||
| 50 | + return Response(data, status=status.HTTP_201_CREATED) | ||
| 24 | 51 | ||
| 25 | - def post(self, request, format=None): | 52 | +class FileDetail(APIView): |
| 26 | - serializer = FileSerializer(data=request.data) | 53 | + """ |
| 27 | - if serializer.is_valid(): | 54 | + Download or delete a file instance. |
| 28 | - serializer.save() | 55 | + """ |
| 29 | - return Response(serializer.data, status=status.HTTP_201_CREATED) | ||
| 30 | - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) | ||
| 31 | 56 | ||
| 57 | + def get(self, request, path="/", format=None): | ||
| 58 | + # download file from s3 | ||
| 59 | + file = 'media/'+path.split('/')[-1] | ||
| 60 | + user = request.user | ||
| 61 | + s3_interface.download_file(s3_interface.BUCKET, user.username, file, path) | ||
| 62 | + # TODO error | ||
| 63 | + return Response({'file': file}) | ||
| 32 | 64 | ||
| 33 | -class FileDetail(APIView): | 65 | + def delete(self, request, path="/", format=None): |
| 66 | + user = request.user | ||
| 67 | + result = s3_interface.delete_path(s3_interface.BUCKET, user.username, path) | ||
| 68 | + return Response(result) | ||
| 69 | + | ||
| 70 | +class FileCopyMove(APIView): | ||
| 71 | + """ | ||
| 72 | + Download or delete a file instance. | ||
| 34 | """ | 73 | """ |
| 35 | - Retrieve, update or delete a file instance. | 74 | + #TODO is folder move, copy well? |
| 36 | - """ | 75 | + # move |
| 37 | - def get_object(self, pk): | 76 | + def post(self, request, old_path, new_path, format=None): |
| 38 | - try: | 77 | + user = request.user |
| 39 | - return File.objects.get(pk=pk) | 78 | + if request.data.get('method') == 'mv': |
| 40 | - except File.DoesNotExist: | 79 | + s3_interface.move_file(s3_interface.BUCKET, user.username, old_path, new_path) |
| 41 | - raise Http404 | 80 | + elif request.data.get('method') == 'cp': |
| 42 | - | 81 | + s3_interface.copy_file(s3_interface.BUCKET, user.username, old_path, new_path) |
| 43 | - def get(self, request, pk, format=None): | 82 | + else: |
| 44 | - file = self.get_object(pk) | 83 | + return Response({'stats': 'bad_request'}, status=status.HTTP_400_BAD_REQUEST) |
| 45 | - serializer = FileSerializer(file) | 84 | + return Response({'old_path': old_path, 'new_path': new_path}) |
| 46 | - return Response(serializer.data, status=status.HTTP_200_OK) | 85 | + |
| 47 | - | ||
| 48 | - def put(self, request, pk, format=None): | ||
| 49 | - file = self.get_object(pk) | ||
| 50 | - serializer = FileSerializer(file, data=request.data) | ||
| 51 | - if serializer.is_valid(): | ||
| 52 | - serializer.save() | ||
| 53 | - return Response(serializer.data, status=status.HTTP_204_NO_CONTENT) | ||
| 54 | - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) | ||
| 55 | - | ||
| 56 | - def delete(self, request, pk, format=None): | ||
| 57 | - file = self.get_object(pk) | ||
| 58 | - file.delete() | ||
| 59 | - return Response(status=status.HTTP_204_NO_CONTENT) | ||
| 60 | 86 | ... | ... |
| ... | @@ -2,6 +2,7 @@ from django.contrib.auth import login, authenticate, logout | ... | @@ -2,6 +2,7 @@ from django.contrib.auth import login, authenticate, logout |
| 2 | from django.contrib.auth.forms import UserCreationForm | 2 | from django.contrib.auth.forms import UserCreationForm |
| 3 | from django.shortcuts import render, redirect | 3 | from django.shortcuts import render, redirect |
| 4 | from django.contrib.auth.decorators import login_required | 4 | from django.contrib.auth.decorators import login_required |
| 5 | +from django.contrib.auth.models import User | ||
| 5 | 6 | ||
| 6 | def signup(request): | 7 | def signup(request): |
| 7 | if request.method == 'POST': | 8 | if request.method == 'POST': |
| ... | @@ -31,7 +32,10 @@ def delete_account(request): | ... | @@ -31,7 +32,10 @@ def delete_account(request): |
| 31 | @login_required | 32 | @login_required |
| 32 | def delete_account_success(request): | 33 | def delete_account_success(request): |
| 33 | if request.method == 'GET': | 34 | if request.method == 'GET': |
| 34 | - # TODO Add delete account | 35 | + # delete account |
| 36 | + u = User.objects.get(username = request.user.username) | ||
| 37 | + u.delete() | ||
| 38 | + # logout | ||
| 35 | logout(request) | 39 | logout(request) |
| 36 | return render(request, 'registration/delete_account_success.html') | 40 | return render(request, 'registration/delete_account_success.html') |
| 37 | 41 | ... | ... |
| 1 | from django import forms | 1 | from django import forms |
| 2 | +from s3direct.widgets import S3DirectWidget | ||
| 2 | 3 | ||
| 3 | -# class PostForm(forms.ModelForm): | ||
| 4 | -# class Meta: | ||
| 5 | -# model = Post | ||
| 6 | -# fields = ('title', 'text') | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 4 | +class S3DirectUploadForm(forms.Form): | ||
| 5 | + images = forms.URLField(widget=S3DirectWidget(dest='example_destination')) | ... | ... |
| 1 | from django.db import models | 1 | from django.db import models |
| 2 | -from django.utils import timezone | 2 | +from s3direct.fields import S3DirectField |
| 3 | 3 | ||
| 4 | +class Example(models.Model): | ||
| 5 | + video = S3DirectField(dest='example_destination') | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| 1 | from django.shortcuts import render, get_object_or_404, redirect, Http404 | 1 | from django.shortcuts import render, get_object_or_404, redirect, Http404 |
| 2 | from django.utils import timezone | 2 | from django.utils import timezone |
| 3 | from django.contrib.auth.decorators import login_required | 3 | from django.contrib.auth.decorators import login_required |
| 4 | +from django.views.generic import FormView | ||
| 5 | +from website.forms import S3DirectUploadForm | ||
| 4 | from restful.models import File | 6 | from restful.models import File |
| 5 | import requests | 7 | import requests |
| 6 | 8 | ||
| ... | @@ -11,6 +13,6 @@ def home(request): | ... | @@ -11,6 +13,6 @@ def home(request): |
| 11 | 13 | ||
| 12 | @login_required | 14 | @login_required |
| 13 | def file_list(request): | 15 | def file_list(request): |
| 14 | - files = requests.get('http://localhost:8000/restapi/files') | 16 | + files = requests.get('http://localhost:8000/restapi/list') |
| 15 | files = files.json() | 17 | files = files.json() |
| 16 | return render(request, 'website/file_list.html', files) | 18 | return render(request, 'website/file_list.html', files) | ... | ... |
-
Please register or login to post a comment