Merge branch 'dev' of https://github.com/jh8579/fileshell_cloudcomputing into dev
# Conflicts: # fileshell/models.py # fileshell/settings.py # fileshell/urls.py # fileshell/views.py # templates/base.html
Showing
6 changed files
with
52 additions
and
25 deletions
| ... | @@ -10,6 +10,7 @@ class File(models.Model): | ... | @@ -10,6 +10,7 @@ class File(models.Model): |
| 10 | fileSize = models.IntegerField() | 10 | fileSize = models.IntegerField() |
| 11 | folder = models.ForeignKey('Folder', null=True, blank=True, related_name='datas', on_delete=models.CASCADE,) | 11 | folder = models.ForeignKey('Folder', null=True, blank=True, related_name='datas', on_delete=models.CASCADE,) |
| 12 | 12 | ||
| 13 | + | ||
| 13 | class Folder(models.Model): | 14 | class Folder(models.Model): |
| 14 | dir_name = models.CharField(max_length=30) | 15 | dir_name = models.CharField(max_length=30) |
| 15 | user = models.CharField(max_length=20, default='') | 16 | user = models.CharField(max_length=20, default='') | ... | ... |
| ... | @@ -39,7 +39,11 @@ class MediaStorage(S3Boto3Storage): | ... | @@ -39,7 +39,11 @@ class MediaStorage(S3Boto3Storage): |
| 39 | ExpiresIn=100) | 39 | ExpiresIn=100) |
| 40 | return url | 40 | return url |
| 41 | 41 | ||
| 42 | - def delete_file(file_name, dir): | 42 | + def delete_file(dir): |
| 43 | + client = boto3.resource('s3') | ||
| 44 | + client.Bucket(AWS_STORAGE_BUCKET_NAME).objects.filter(Prefix=dir).delete() | ||
| 45 | + | ||
| 46 | + def delete_folder(dir): | ||
| 43 | client = boto3.resource('s3') | 47 | client = boto3.resource('s3') |
| 44 | client.Bucket(AWS_STORAGE_BUCKET_NAME).objects.filter(Prefix=dir).delete() | 48 | client.Bucket(AWS_STORAGE_BUCKET_NAME).objects.filter(Prefix=dir).delete() |
| 45 | 49 | ... | ... |
| ... | @@ -29,6 +29,7 @@ urlpatterns = [ | ... | @@ -29,6 +29,7 @@ urlpatterns = [ |
| 29 | 29 | ||
| 30 | url(r'^download/(?P<bucketPath>.+)//(?P<filename>.+)//(?P<dir>.+)$', views.download, name='download'), ## 다운로드 기능 | 30 | url(r'^download/(?P<bucketPath>.+)//(?P<filename>.+)//(?P<dir>.+)$', views.download, name='download'), ## 다운로드 기능 |
| 31 | url(r'^delete/(?P<bucketPath>.+)//(?P<filename>.+)//(?P<dir>.+)$', views.delete, name='delete'), ## 삭제 기능 | 31 | url(r'^delete/(?P<bucketPath>.+)//(?P<filename>.+)//(?P<dir>.+)$', views.delete, name='delete'), ## 삭제 기능 |
| 32 | + url(r'^delete_folder/(?P<foldername>.+)$', views.delete_folder, name='delete_folder'), | ||
| 32 | url(r'^changeFavor/(?P<bucketPath>.+)/(?P<filename>.+)$', views.changeFavor, name='changeFavor'), ## 즐겨찾기 on/off 기능 | 33 | url(r'^changeFavor/(?P<bucketPath>.+)/(?P<filename>.+)$', views.changeFavor, name='changeFavor'), ## 즐겨찾기 on/off 기능 |
| 33 | url('add_folder/', views.add_folder, name='add_folder'), ## 폴더 추가 기능 | 34 | url('add_folder/', views.add_folder, name='add_folder'), ## 폴더 추가 기능 |
| 34 | url('signup/', views.signup, name='signup'), ## 회원가입 기능 | 35 | url('signup/', views.signup, name='signup'), ## 회원가입 기능 | ... | ... |
| ... | @@ -10,7 +10,6 @@ import datetime | ... | @@ -10,7 +10,6 @@ import datetime |
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | def home(request): | 12 | def home(request): |
| 13 | - | ||
| 14 | # user가 로그인 되어 있을 때 | 13 | # user가 로그인 되어 있을 때 |
| 15 | if request.user.is_authenticated: | 14 | if request.user.is_authenticated: |
| 16 | # user가 갖고 있는 파일 중 즐겨찾기 True인 파일 필터링 | 15 | # user가 갖고 있는 파일 중 즐겨찾기 True인 파일 필터링 |
| ... | @@ -18,7 +17,7 @@ def home(request): | ... | @@ -18,7 +17,7 @@ def home(request): |
| 18 | 17 | ||
| 19 | # user가 갖고 있는 파일 중 일주일 안에 다운로드 된 파일 필터링 | 18 | # user가 갖고 있는 파일 중 일주일 안에 다운로드 된 파일 필터링 |
| 20 | endTime = datetime.datetime.now() | 19 | endTime = datetime.datetime.now() |
| 21 | - startTime = endTime - datetime.timedelta(days=1) # 최근 날짜 기준 (현재: 3일) | 20 | + startTime = endTime - datetime.timedelta(days=1) # 최근 날짜 기준 (현재: 1일) |
| 22 | recentList = File.objects.filter(last_view_TM__range=[startTime, endTime], user=request.user.username) | 21 | recentList = File.objects.filter(last_view_TM__range=[startTime, endTime], user=request.user.username) |
| 23 | 22 | ||
| 24 | return render(request, 'home.html', {'favorList': favorList, 'recentList': recentList}) | 23 | return render(request, 'home.html', {'favorList': favorList, 'recentList': recentList}) |
| ... | @@ -26,8 +25,8 @@ def home(request): | ... | @@ -26,8 +25,8 @@ def home(request): |
| 26 | else: | 25 | else: |
| 27 | return render(request, 'login.html') | 26 | return render(request, 'login.html') |
| 28 | 27 | ||
| 29 | -def file(request): | ||
| 30 | 28 | ||
| 29 | +def file(request): | ||
| 31 | # user가 로그인 되어 있을 때 | 30 | # user가 로그인 되어 있을 때 |
| 32 | if request.user.is_authenticated: | 31 | if request.user.is_authenticated: |
| 33 | pass | 32 | pass |
| ... | @@ -35,7 +34,6 @@ def file(request): | ... | @@ -35,7 +34,6 @@ def file(request): |
| 35 | else: | 34 | else: |
| 36 | return redirect('/') | 35 | return redirect('/') |
| 37 | 36 | ||
| 38 | - | ||
| 39 | this_path = request.path | 37 | this_path = request.path |
| 40 | dir = this_path[1:] | 38 | dir = this_path[1:] |
| 41 | 39 | ||
| ... | @@ -50,8 +48,8 @@ def file(request): | ... | @@ -50,8 +48,8 @@ def file(request): |
| 50 | 48 | ||
| 51 | return render(request, 'file.html', {'folderList': folderList, 'fileList': fileList}) | 49 | return render(request, 'file.html', {'folderList': folderList, 'fileList': fileList}) |
| 52 | 50 | ||
| 53 | -def search(request, search_name): | ||
| 54 | 51 | ||
| 52 | +def search(request, search_name): | ||
| 55 | # user가 로그인 되어 있을 때 | 53 | # user가 로그인 되어 있을 때 |
| 56 | if request.user.is_authenticated: | 54 | if request.user.is_authenticated: |
| 57 | pass | 55 | pass |
| ... | @@ -59,7 +57,6 @@ def search(request, search_name): | ... | @@ -59,7 +57,6 @@ def search(request, search_name): |
| 59 | else: | 57 | else: |
| 60 | return redirect('/') | 58 | return redirect('/') |
| 61 | 59 | ||
| 62 | - | ||
| 63 | this_path = request.path | 60 | this_path = request.path |
| 64 | dir = this_path[1:] | 61 | dir = this_path[1:] |
| 65 | 62 | ||
| ... | @@ -68,7 +65,6 @@ def search(request, search_name): | ... | @@ -68,7 +65,6 @@ def search(request, search_name): |
| 68 | type = type.pop(0) | 65 | type = type.pop(0) |
| 69 | print(type) | 66 | print(type) |
| 70 | 67 | ||
| 71 | - | ||
| 72 | name = request | 68 | name = request |
| 73 | print(name) | 69 | print(name) |
| 74 | # user가 갖고 있는 폴더 중 현재 url을 parent로 갖는 폴더 필터링 | 70 | # user가 갖고 있는 폴더 중 현재 url을 parent로 갖는 폴더 필터링 |
| ... | @@ -78,18 +74,18 @@ def search(request, search_name): | ... | @@ -78,18 +74,18 @@ def search(request, search_name): |
| 78 | 74 | ||
| 79 | return render(request, 'search.html', {'folderList': folderList, 'fileList': fileList}) | 75 | return render(request, 'search.html', {'folderList': folderList, 'fileList': fileList}) |
| 80 | 76 | ||
| 81 | -def profile(request): | ||
| 82 | 77 | ||
| 78 | +def profile(request): | ||
| 83 | # 유저 정보 출력 | 79 | # 유저 정보 출력 |
| 84 | return render(request, 'profile.html') | 80 | return render(request, 'profile.html') |
| 85 | 81 | ||
| 86 | -def account_login(request): | ||
| 87 | 82 | ||
| 83 | +def account_login(request): | ||
| 88 | # 로그인 화면 출력 | 84 | # 로그인 화면 출력 |
| 89 | return render(request, 'login.html') | 85 | return render(request, 'login.html') |
| 90 | 86 | ||
| 91 | -def signup(request): | ||
| 92 | 87 | ||
| 88 | +def signup(request): | ||
| 93 | # requst가 POST일 때 | 89 | # requst가 POST일 때 |
| 94 | if request.method == "POST": | 90 | if request.method == "POST": |
| 95 | # user 폼 지정 | 91 | # user 폼 지정 |
| ... | @@ -120,11 +116,10 @@ def signup(request): | ... | @@ -120,11 +116,10 @@ def signup(request): |
| 120 | # home 화면으로 이동(로그인 화면) | 116 | # home 화면으로 이동(로그인 화면) |
| 121 | return redirect('/') | 117 | return redirect('/') |
| 122 | 118 | ||
| 123 | -def add_folder(request): | ||
| 124 | 119 | ||
| 120 | +def add_folder(request): | ||
| 125 | # requst가 POST일 때 | 121 | # requst가 POST일 때 |
| 126 | if request.method == 'POST': | 122 | if request.method == 'POST': |
| 127 | - | ||
| 128 | ## 파일 model 변수 초기화 | 123 | ## 파일 model 변수 초기화 |
| 129 | user = request.user.username | 124 | user = request.user.username |
| 130 | dir_name = request.POST.get('dir_name') | 125 | dir_name = request.POST.get('dir_name') |
| ... | @@ -133,12 +128,13 @@ def add_folder(request): | ... | @@ -133,12 +128,13 @@ def add_folder(request): |
| 133 | parent = Folder.objects.get(dir_name=dir, user=user) | 128 | parent = Folder.objects.get(dir_name=dir, user=user) |
| 134 | 129 | ||
| 135 | # 로컬 DB에 저장 | 130 | # 로컬 DB에 저장 |
| 136 | - Folder.objects.create(dir_name=dir+dir_name+'/', parent=parent, user=user) | 131 | + Folder.objects.create(dir_name=dir + dir_name + '/', parent=parent, user=user) |
| 137 | # s3 main bucket에 dir/ 디렉토리에 dir_name/ 디렉토리 생성 | 132 | # s3 main bucket에 dir/ 디렉토리에 dir_name/ 디렉토리 생성 |
| 138 | - MediaStorage.create_dir(user + '/' +dir + dir_name) | 133 | + MediaStorage.create_dir(user + '/' + dir + dir_name) |
| 139 | 134 | ||
| 140 | return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) | 135 | return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) |
| 141 | 136 | ||
| 137 | + | ||
| 142 | def upload(request): | 138 | def upload(request): |
| 143 | if request.method == 'POST': | 139 | if request.method == 'POST': |
| 144 | print(request.FILES) | 140 | print(request.FILES) |
| ... | @@ -156,7 +152,7 @@ def upload(request): | ... | @@ -156,7 +152,7 @@ def upload(request): |
| 156 | folder = Folder.objects.get(dir_name=dir, user=request.user.username) | 152 | folder = Folder.objects.get(dir_name=dir, user=request.user.username) |
| 157 | 153 | ||
| 158 | # 로컬 DB에 저장 | 154 | # 로컬 DB에 저장 |
| 159 | - File.objects.create(title=title, user=user, isFavor=False, bucketPath=user_name+'/'+dir, | 155 | + File.objects.create(title=title, user=user, isFavor=False, bucketPath=user_name + '/' + dir, |
| 160 | fileSize=filesize, folder=folder) | 156 | fileSize=filesize, folder=folder) |
| 161 | # s3 버킷에 저장 | 157 | # s3 버킷에 저장 |
| 162 | MediaStorage.upload_file(filedata, user, dir) | 158 | MediaStorage.upload_file(filedata, user, dir) |
| ... | @@ -164,8 +160,8 @@ def upload(request): | ... | @@ -164,8 +160,8 @@ def upload(request): |
| 164 | pass | 160 | pass |
| 165 | return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) | 161 | return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) |
| 166 | 162 | ||
| 167 | -def download(request, bucketPath, filename, dir): | ||
| 168 | 163 | ||
| 164 | +def download(request, bucketPath, filename, dir): | ||
| 169 | # 경로와 이름이 같은 파일을 필터링 | 165 | # 경로와 이름이 같은 파일을 필터링 |
| 170 | #### 같은 이름을 가진 파일에 경우 겹칠 수 있음 #### | 166 | #### 같은 이름을 가진 파일에 경우 겹칠 수 있음 #### |
| 171 | 167 | ||
| ... | @@ -180,8 +176,8 @@ def download(request, bucketPath, filename, dir): | ... | @@ -180,8 +176,8 @@ def download(request, bucketPath, filename, dir): |
| 180 | 176 | ||
| 181 | return HttpResponseRedirect(url) | 177 | return HttpResponseRedirect(url) |
| 182 | 178 | ||
| 183 | -def delete(request, bucketPath, filename, dir): | ||
| 184 | 179 | ||
| 180 | +def delete(request, bucketPath, filename, dir): | ||
| 185 | # 경로와 이름이 같은 파일을 필터링 | 181 | # 경로와 이름이 같은 파일을 필터링 |
| 186 | #### 같은 이름을 가진 파일에 경우 겹칠 수 있음 #### | 182 | #### 같은 이름을 가진 파일에 경우 겹칠 수 있음 #### |
| 187 | 183 | ||
| ... | @@ -189,12 +185,12 @@ def delete(request, bucketPath, filename, dir): | ... | @@ -189,12 +185,12 @@ def delete(request, bucketPath, filename, dir): |
| 189 | File.objects.filter(title=filename, bucketPath=dir).delete() | 185 | File.objects.filter(title=filename, bucketPath=dir).delete() |
| 190 | 186 | ||
| 191 | # s3에서 해당 파일을 정해진 경로로 삭제 | 187 | # s3에서 해당 파일을 정해진 경로로 삭제 |
| 192 | - MediaStorage.delete_file(filename, bucketPath) | 188 | + MediaStorage.delete_file(bucketPath) |
| 193 | 189 | ||
| 194 | return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) | 190 | return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) |
| 195 | 191 | ||
| 196 | -def changeFavor(request, bucketPath, filename): | ||
| 197 | 192 | ||
| 193 | +def changeFavor(request, bucketPath, filename): | ||
| 198 | # 경로와 이름이 같은 파일을 필터링 | 194 | # 경로와 이름이 같은 파일을 필터링 |
| 199 | #### 같은 이름을 가진 파일에 경우 겹칠 수 있음 #### | 195 | #### 같은 이름을 가진 파일에 경우 겹칠 수 있음 #### |
| 200 | 196 | ||
| ... | @@ -206,15 +202,38 @@ def changeFavor(request, bucketPath, filename): | ... | @@ -206,15 +202,38 @@ def changeFavor(request, bucketPath, filename): |
| 206 | 202 | ||
| 207 | return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) | 203 | return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) |
| 208 | 204 | ||
| 205 | + | ||
| 206 | +def delete_ff(foldername, username): | ||
| 207 | + if Folder.objects.filter(parent__dir_name=foldername, user=username).exists(): # 자식 폴더가 존재할 경우 | ||
| 208 | + folderList = Folder.objects.filter(parent__dir_name=foldername, user=username).all() | ||
| 209 | + for i in folderList: | ||
| 210 | + delete_ff(i.dir_name, username) # 자식 폴더 삭제 | ||
| 211 | + | ||
| 212 | + if File.objects.filter(folder__dir_name=foldername, user=username).exists(): # 해당 폴더에 파일이 존재하는 경우 | ||
| 213 | + File.objects.filter(folder__dir_name=foldername, user=username).delete() | ||
| 214 | + | ||
| 215 | + Folder.objects.filter(dir_name=foldername, user=username).delete() # 해당 폴더 삭제 | ||
| 216 | + return | ||
| 217 | + | ||
| 218 | + | ||
| 219 | +def delete_folder(request, foldername): | ||
| 220 | + username = request.user.username | ||
| 221 | + dir = username + '/' + foldername | ||
| 222 | + | ||
| 223 | + delete_ff(foldername, username) # 로컬 DB에서 폴더 삭제 | ||
| 224 | + MediaStorage.delete_folder(dir) # s3에서 폴더 삭제 | ||
| 225 | + | ||
| 226 | + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) | ||
| 227 | + | ||
| 209 | # url 원하는 형식으로 바꿔주기 위함 | 228 | # url 원하는 형식으로 바꿔주기 위함 |
| 210 | def url_convert(url): | 229 | def url_convert(url): |
| 211 | url = str(url) | 230 | url = str(url) |
| 212 | temp = url.split('/') | 231 | temp = url.split('/') |
| 213 | - temp.pop(0);temp.pop(0);temp.pop(0) | 232 | + temp.pop(0); |
| 233 | + temp.pop(0); | ||
| 234 | + temp.pop(0) | ||
| 214 | dir = '' | 235 | dir = '' |
| 215 | for i in temp: | 236 | for i in temp: |
| 216 | dir += i + '/' | 237 | dir += i + '/' |
| 217 | dir = dir[:-1] | 238 | dir = dir[:-1] |
| 218 | return dir | 239 | return dir |
| 219 | - | ||
| 220 | - | ... | ... |
| ... | @@ -50,7 +50,7 @@ | ... | @@ -50,7 +50,7 @@ |
| 50 | <td><p href="", >{{ folderRow.last_view_TM }}</p></td> | 50 | <td><p href="", >{{ folderRow.last_view_TM }}</p></td> |
| 51 | <td ><p href="",>{{ folderRow.isFavor }}</p></td> | 51 | <td ><p href="",>{{ folderRow.isFavor }}</p></td> |
| 52 | <td ><p href="",>{{ folderRow.fileSize }}</p></td> | 52 | <td ><p href="",>{{ folderRow.fileSize }}</p></td> |
| 53 | - <td ><p href="",></p></td> | 53 | + <td ><a href="/delete_folder/{{ folderRow.dir_name }}"><img class = 'trash_icon' src= "{% static 'resources/trashcan.png' %}" width="50" height="50"/></a></td> |
| 54 | </tr> | 54 | </tr> |
| 55 | {% endfor %} | 55 | {% endfor %} |
| 56 | </tbody> | 56 | </tbody> |
| ... | @@ -88,7 +88,7 @@ | ... | @@ -88,7 +88,7 @@ |
| 88 | <script src="{% static 'js/dropzone.js' %}"></script> | 88 | <script src="{% static 'js/dropzone.js' %}"></script> |
| 89 | <script type="text/javascript"> | 89 | <script type="text/javascript"> |
| 90 | Dropzone.options.dropzone = { | 90 | Dropzone.options.dropzone = { |
| 91 | - maxFilesize: 100000000, // Mb | 91 | + maxFilesize: 1024, // Mb |
| 92 | init: function() { | 92 | init: function() { |
| 93 | this.on('success', function(){ | 93 | this.on('success', function(){ |
| 94 | if (this.getQueuedFiles().length == 0 && this.getUploadingFiles().length == 0) { | 94 | if (this.getQueuedFiles().length == 0 && this.getUploadingFiles().length == 0) { | ... | ... |
| ... | @@ -26,6 +26,8 @@ | ... | @@ -26,6 +26,8 @@ |
| 26 | <td width=100><p href="",>{{ folderRow.last_view_TM }}</p></td> | 26 | <td width=100><p href="",>{{ folderRow.last_view_TM }}</p></td> |
| 27 | <td width=100><p href="",>{{ folderRow.isFavor }}</p></td> | 27 | <td width=100><p href="",>{{ folderRow.isFavor }}</p></td> |
| 28 | <td width=100><p href="",>{{ folderRow.fileSize }}</p></td> | 28 | <td width=100><p href="",>{{ folderRow.fileSize }}</p></td> |
| 29 | + <td ><a href="/delete_folder/{{ folderRow.dir_name }}"><img class = 'trash_icon' src= "{% static 'resources/trashcan.png' %}" width="50" height="50"/></a></td> | ||
| 30 | + | ||
| 29 | </tr> | 31 | </tr> |
| 30 | {% endfor %} | 32 | {% endfor %} |
| 31 | </tbody> | 33 | </tbody> | ... | ... |
-
Please register or login to post a comment