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