허진호

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
...@@ -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>
......