def resource_share_cancel(request): if request.method == 'GET': # Request Parameter : userID, ResourceKey userID = request.GET['userID'] # UserID : 사용 유저 ID resourceKey = request.GET['resourceID'] # resourceKey : 공유할 폴더/파일의 리소스 elif request.method == 'POST': userID = request.POST['userID'] resourceKey = request.POST['resourceID'] # 검증 작업 : userID, resourceKey가 데이터베이스에 존재하는지 확인 userCheck = Users.objects.get(userID=userID) resourceCheck = Resources.objects.get(userID=userID, resourceID=resourceKey) # 검증작업을 통과한 경우에만 코드를 실행 # with transaction.atomic(): # transaction start if userCheck and resourceCheck: methods = Methods() shareStatus = resourceCheck.shareStatus if shareStatus == 'True': shareData = resourceCheck.shareID try: with transaction.atomic(): # transaction start # shareUsers 테이블에서 해당 share번호를 가지고 있는 shareusers를 모두 지움 ShareUsers.objects.filter( shareID=shareData.shareID).delete() # share 테이블에서 해당 share 번호를 지움 shareData.delete() # resource에 데이터 업데이트 resourceCheck.shareStatus = 'False' resourceCheck.shareID = None resourceCheck.save() except: print("핵심 로직 실패 - roll back") return Response(404) elif shareStatus == 'False': print("이미 sharestatus가 false임") else: print("shareStatus가 잘못 입력되어있는 경우") timestamp = datetime.datetime.now() contents = '' fullURL = 'http://localhost:8001/logapi/log/?datetime={0}&type=rshrcc&userID={1}&parentDirID=0&contents={3}&resourceID={4}&shareID={2}&shareUsersID=0'.format( timestamp, userID, shareData.shareID, contents, resourceKey) requestQueue = Background._getInstance() requestQueue.put(fullURL) resultQuerySet = Resources.objects.filter( userID=userCheck, parentDirID=resourceCheck.parentDirID) serializer = DriveSerializer(resultQuerySet, many=True) return Response(serializer.data)
def resource_share_member_delete(request): if request.method == 'GET': # Request Parameter : userID, ResourceKey userID = request.GET['userID'] # UserID : 사용 유저 ID resourceKey = request.GET['resourceID'] # resourceKey : 공유할 폴더/파일의 리소스 shareUsersID = request.GET['shareUsersID'] # shareUsersID : 추가로 공유할 사람들의 ID // 공유할 사람들이 여러명일 경우 ','로 구분한다. elif request.method == 'POST': userID = request.POST['userID'] resourceKey = request.POST['resourceID'] shareUsersID = request.POST['shareUsersID'] # 검증 작업 : userID, resourceKey가 데이터베이스에 존재하는지 확인 userCheck = Users.objects.get(userID=userID) resourceCheck = Resources.objects.get(userID=userID, resourceID=resourceKey) shareUserList = shareUsersID.split(',') for shareUser in shareUserList: Users.objects.get(userID=shareUser) # with transaction.atomic(): # transaction start # 검증작업을 통과한 경우에만 코드를 실행 if userCheck and resourceCheck: methods = Methods() if resourceCheck.shareStatus == 'True': shareData = Shares.objects.get(shareID=resourceCheck.shareID.shareID) for i in range(len(shareUserList)): shareUserCheck = Users.objects.get(userID=shareUserList[i]) if ShareUsers.objects.filter(shareID=shareData, userID=shareUserCheck).exists(): try: with transaction.atomic(): shareUserData = ShareUsers.objects.filter(shareID=shareData, userID=shareUserCheck) shareUserData.delete() except: print("핵심로직 실패 - roll back") return Response(status=404) else: print("공유되지 않은 사용자") else: print("실행할 수 없음") shareData.save() timestamp = datetime.datetime.now() contents = '' fullURL = 'http://localhost:8001/logapi/log/?datetime={0}&type=rshrmd&userID={1}&parentDirID=0&contents={3}&resourceID={4}&shareID={2}&shareUsersID={5}'.format( timestamp, userID, shareData.shareID, contents, resourceKey, shareUsersID) requestQueue = Background._getInstance() requestQueue.put(fullURL) resultQuerySet = Resources.objects.filter(userID=userCheck, parentDirID=resourceCheck.parentDirID) serializer = DriveSerializer(resultQuerySet, many=True) return Response(serializer.data)
def resource_copy(request): # 상위폴더를 하위폴더에 복사하는지 check하는 flag checkingFlag: bool = False if request.method == 'GET': # Request Parameter : userID, ResourceKey, objectDirectoryKey userID = request.GET['userID'] # UserID : 사용 유저 ID resourceKey = request.GET[ 'resourceID'] # resourceKey : 복사할 원본 폴더/파일의 리소스 키 objectDirectoryKey = request.GET['parentDirID'] # 복사 대상 폴더의 리소스 키 elif request.method == 'POST': userID = request.POST['userID'] resourceKey = request.POST['resourceID'] objectDirectoryKey = request.POST['parentDirID'] # 검증 작업 : userID, resourceKey,objectDirectoryKey가 데이터베이스에 존재하는지 확인 userCheck = Users.objects.get(userID=userID) resourceCheck = Resources.objects.get(userID=userID, resourceID=resourceKey) dirCheck = Resources.objects.get(userID=userID, resourceID=objectDirectoryKey) # 검증작업을 통과한 경우에만 코드를 실행 # with transaction.atomic(): # Transaction Start if userCheck and resourceCheck and dirCheck: methods = Methods() memo = methods.copyMemo copyResourceName = resourceCheck.resourceName # 폴더 이름 중복확인 check logic # rList는 해당 parentDirID에서 child 리소스들의 resourceName을 QuerySet 형태로 가져온다. rList = Resources.objects.filter( userID=userCheck, parentDirID=dirCheck.resourceID).values('resourceName') for rName in rList: # 새로 생성할 폴더의 이름과, 기존에 있던 리소스의 이름이 같다면, if rName['resourceName'] == copyResourceName: # 새로 생성할 폴더의 이름을 바꾼다. copyResourceName = methods.changeResourceName( copyResourceName, rList) break # 대상 Resource에 대하여 copy 진행 try: with transaction.atomic(): # Transaction start copyResource = Resources(userID=userCheck, resourceName=copyResourceName, parentDirID=dirCheck.resourceID, fullPath=dirCheck.fullPath + '/' + copyResourceName, fileSize=resourceCheck.fileSize, fileType=resourceCheck.fileType, childCount=resourceCheck.childCount, shareID=resourceCheck.shareID, shareStatus=resourceCheck.shareStatus) copyResource.save() # 만약 copy 대상이 하위 폴더가 있는 폴더일 경우, 폴더 내 하위 폴더에 대해서도 복사를 진행해야한다. if copyResource.fileType == 'Directory' and copyResource.childCount > 0: # 상위 폴더를 하위폴더 내에 복사하는 것을 막기위해 dirCheck의 parentID를 추적하여 memo에 추가한다. memo.append(dirCheck.parentDirID) while True: checkingResourceID = memo[-1] if checkingResourceID == 'root': break elif checkingResourceID == str( resourceCheck.resourceID): print("상위 폴더를 하위폴더 내에 복사하는 행위") checkingFlag = True try: copyResource.delete() except: timestamp = datetime.datetime.now() methods.resourceDeleteRequest( 'del', copyResource.resourceID, timestamp) return JsonResponse({ 'message': 'Can not copy parent folder into subfolder.' }) else: parent = Resources.objects.get( userID=userID, resourceID=checkingResourceID) memo.append(parent.parentDirID) # 만약 상위 폴더를 하위폴더내에 복사하는 것이 아니라면, copysubResources를 실행한다. if checkingFlag == False: copySubResources(resourceCheck.resourceID, userCheck, copyResource.resourceID, copyResource.fullPath, methods) except: # methods.resourceCreateRequest('rcpy1',userID,copyResourceName,dirCheck.resourceID,dirCheck.fullPath + '/' + copyResourceName,resourceCheck.fileSize, # resourceCheck.fileType,resourceCheck.childCount,resourceCheck.shareStatus,resourceCheck.shareID) print("핵심로직 실패 - rollback") return Response(status=404) try: cursor = connection.cursor() cursor.execute( "UPDATE drive_resources SET fileSize=fileSize+{0} WHERE resourceID={1};" .format(copyResource.fileSize, copyResource.parentDirID)) except: methods.requestRawQuery( "UPDATE drive_resources SET fileSize=fileSize+{0} WHERE resourceID={1};" .format(copyResource.fileSize, copyResource.parentDirID)) try: # 리소스가 복사 된 부모 폴더에서의 child 수 업데이트 cursor = connection.cursor() cursor.execute( "UPDATE drive_resources SET childCount=childCount+1 WHERE resourceID={0};" .format(dirCheck.resourceID)) except: methods.requestRawQuery( "UPDATE drive_resources SET childCount=childCount+1 WHERE resourceID={0};" .format(dirCheck.resourceID)) timestamp = datetime.datetime.now() contents = '' fullURL = 'http://localhost:8001/logapi/log/?datetime={0}&type=rcpy&userID={1}&parentDirID={2}&contents={3}&resourceID={4}&shareID=0&shareUsersID=0'.format( timestamp, userID, objectDirectoryKey, contents, resourceKey) requestQueue = Background._getInstance() requestQueue.put(fullURL) queryset = Resources.objects.filter(userID=userCheck, parentDirID=dirCheck.resourceID) serializer = DriveSerializer(queryset, many=True) return Response(serializer.data)
def resource_delete(request): if request.method == 'GET': # Request Parameter : userID, ResourceKey userID = request.GET['userID'] # UserID : 사용 유저 ID resourceKey = request.GET[ 'resourceID'] # resourceKey : 삭제할 폴더/파일의 리소스 키 elif request.method == 'POST': userID = request.POST['userID'] resourceKey = request.POST['resourceID'] # 검증 작업 : userID, resourceKey가 데이터베이스에 존재하는지 확인 userCheck = Users.objects.get(userID=userID) resourceCheck = Resources.objects.get(userID=userID, resourceID=resourceKey) parentDirID = resourceCheck.parentDirID # with transaction.atomic(): # Transaction start # 검증작업을 통과한 경우에만 코드를 실행 if userCheck and resourceCheck: methods = Methods() memo = methods.delMemo try: with transaction.atomic(): # Transaction start # 만약 삭제 대상 리소스의 자식이 없을경우, 삭제 진행 if resourceCheck.childCount == 0: resourceCheck.delete() else: # 삭제의 경우, 상위 폴더를 먼저 삭제할 경우, 하위 리소스를 찾아갈 수 없으므로, memo라는 리스트에 모은 후 # 한번에 삭제하는 방식을 선택함. memo.append( resourceCheck) # memo의 0번째 index == 삭제 대상 폴더 ( 최상위 폴더) memo = collectSubResources(userCheck, resourceCheck.resourceID, memo) memo.pop(0).delete() # Transaction finished except: print("핵심 로직 실패 - roll back") return Response(status=404) # 나머지 subresource 삭제 (SQL) cursor = connection.cursor() for i in memo: try: cursor.execute( "DELETE FROM drive_resources WHERE resourceID={0}".format( i.resourceID)) except: methods.requestRawQuery( "DELETE FROM drive_resources WHERE resourceID={0}".format( i.resourceID)) # 만약 공유된 리소스 인 경우, 공유를 해제함 if resourceCheck.shareStatus == 'True': shareData = resourceCheck.shareID # shareUsers 테이블에서 해당 share번호를 가지고 있는 shareusers를 모두 지움 ShareUsers.objects.filter(shareID=shareData.shareID).delete() # share 테이블에서 해당 share 번호를 지움 shareData.delete() timestamp = datetime.datetime.now() methods.shareDeleteRequest('rdel_shareDelete', shareData.shareID) # 리소스가 삭제 된 부모 폴더에서의 child 수 업데이트 try: cursor = connection.cursor() cursor.execute( "UPDATE drive_resources SET childCount=childCount-1 WHERE resourceID={0};" .format(parentDirID)) except: methods.requestRawQuery( "UPDATE drive_resources SET childCount=childCount-1 WHERE resourceID={0};" .format(parentDirID)) # 파일 사이즈 업데이트 try: cursor = connection.cursor() cursor.execute( "UPDATE drive_resources SET fileSize=fileSize-{0} WHERE resourceID={1};" .format(resourceCheck.fileSize, parentDirID)) except: methods.requestRawQuery( "UPDATE drive_resources SET fileSize=fileSize-{0} WHERE resourceID={1};" .format(resourceCheck.fileSize, parentDirID)) timestamp = datetime.datetime.now() contents = '' fullURL = 'http://localhost:8001/logapi/log/?datetime={0}&type=rdel&userID={1}&parentDirID={2}&contents={3}&resourceID={4}&shareID=0&shareUsersID=0'.format( timestamp, userID, parentDirID, contents, resourceKey) requestQueue = Background._getInstance() requestQueue.put(fullURL) resultQuerySet = Resources.objects.filter(userID=userCheck, parentDirID=parentDirID) serializer = DriveSerializer(resultQuerySet, many=True) return Response(serializer.data)
def make_directory(request): if request.method == 'GET': # Request Parameter : userID, parentDirID(ResourceKey), folderName userID = request.GET['userID'] # UserID : 사용 유저 ID parentDirID = request.GET['parentDirID'] # parentDirID : 부모 폴더의 키 folderName = request.GET['folderName'] # folderName : 생성할 폴더의 이름 elif request.method == 'POST': userID = request.POST['userID'] parentDirID = request.POST['parentDirID'] folderName = request.POST['folderName'] # 검증 작업 : userID, parentDirID가 데이터베이스에 존재하는지 확인 userCheck = Users.objects.get(userID=userID) dirCheck = Resources.objects.get(userID=userID, resourceID=parentDirID) # 검증작업을 통과한 경우에만 코드를 실행 # with transaction.atomic(): # #Transaction start if dirCheck and userCheck: methods = Methods() # 폴더 이름 중복확인 check logic # dirList는 해당 parentDirID에서 child 리소스들의 resourceName을 QuerySet 형태로 가져온다. dirList = Resources.objects.filter( userID=userCheck, parentDirID=parentDirID).values('resourceName') for dirName in dirList: # 새로 생성할 폴더의 이름과, 기존에 있던 리소스의 이름이 같다면, if dirName['resourceName'] == folderName: # 새로 생성할 폴더의 이름을 바꾼다. folderName = methods.changeResourceName(folderName, dirList) break try: with transaction.atomic(): #Transaction start # 폴더 생성 newFolder = Resources(userID=userCheck, resourceName=folderName, parentDirID=parentDirID, fullPath=dirCheck.fullPath + '/' + folderName, fileSize=0, fileType='Directory', shareID=None, shareStatus='False') # 폴더 객체를 데이터베이스에 저장 newFolder.save() except: # methods.resourceCreateRequest('mkdir1',userID,folderName,parentDirID,dirCheck.fullPath + '/' + folderName,0,'Directory',0,'False',None) print("핵심 로직 실패 -> rollback") return Response(status=404) try: # 폴더 생성된 부모 폴더에서의 child 수 업데이트 # methods.addChildCount(parentDirID, userCheck) cursor = connection.cursor() cursor.execute( "UPDATE drive_resources SET childCount=childCount+1 WHERE resourceID={0};" .format(parentDirID)) except: methods.requestRawQuery( "UPDATE drive_resources SET childCount=childCount+1 WHERE resourceID={0};" .format(parentDirID)) else: print("newfolder 생성 안됨") return Response(status=404) timestamp = datetime.datetime.now() contents = 'foldername={0}'.format(folderName) fullURL = 'http://localhost:8001/logapi/log/?datetime={0}&type=mkdir&userID={1}&parentDirID={2}&contents={3}&resourceID=0&shareID=0&shareUsersID=0'.format( timestamp, userID, parentDirID, contents) requestQueue = Background._getInstance() requestQueue.put(fullURL) # Transaction finished queryset = Resources.objects.filter(userID=userCheck, parentDirID=parentDirID) serializer = DriveSerializer(queryset, many=True) return Response(serializer.data)
def resource_upload(request): if request.method == 'GET': # Request Parameter : userID, objectDirectoryKey, resourceName userID = request.GET['userID'] # UserID : 사용 유저 ID objectDirectoryKey = request.GET['parentDirID'] # 업로드 대상 폴더의 리소스 키 resourceName = request.GET['resourceName'] # 업로드 리소스의 이름 resourceType = request.GET['resourceType'] # 업로드 리소스의 타입(파일인지 폴더인지) fileSize = request.GET['fileSize'] # 업로드 리소스의 파일 사이즈 elif request.method == 'POST': userID = request.POST['userID'] objectDirectoryKey = request.POST['parentDirID'] resourceName = request.POST['resourceName'] resourceType = request.POST['resourceType'] fileSize = request.POST['fileSize'] # 검증 작업 : userID, resourceKey,objectDirectoryKey가 데이터베이스에 존재하는지 확인 userCheck = Users.objects.get(userID=userID) dirCheck = Resources.objects.get(userID=userID, resourceID=objectDirectoryKey) # with transaction.atomic(): # transaction start # 검증작업을 통과한 경우에만 코드를 실행 if userCheck and dirCheck: methods = Methods() # 폴더 이름 중복확인 check logic # rList는 해당 parentDirID에서 child 리소스들의 resourceName을 QuerySet 형태로 가져온다. rList = Resources.objects.filter( userID=userCheck, parentDirID=dirCheck.resourceID).values('resourceName') for rName in rList: # 새로 생성할 폴더의 이름과, 기존에 있던 리소스의 이름이 같다면, if rName['resourceName'] == resourceName: # 새로 생성할 폴더의 이름을 바꾼다. resourceName = methods.changeResourceName(resourceName, rList) break # 대상 Resource에 대하여 upload 진행 try: with transaction.atomic(): uploadResource = Resources(userID=userCheck, resourceName=resourceName, parentDirID=dirCheck.resourceID, fullPath=dirCheck.fullPath + '/' + resourceName, fileSize=fileSize, fileType=resourceType, childCount=0, shareID=None, shareStatus='False') uploadResource.save() except: print("핵심로직 실패 - roll back") return Response(status=404) try: # 리소스가 복사 된 부모 폴더에서의 child 수 업데이트 cursor = connection.cursor() cursor.execute( "UPDATE drive_resources SET childCount=childCount+1 WHERE resourceID={0};" .format(dirCheck.resourceID)) except: methods.requestRawQuery( "UPDATE drive_resources SET childCount=childCount+1 WHERE resourceID={0};" .format(dirCheck.resourceID)) try: cursor = connection.cursor() cursor.execute( "UPDATE drive_resources SET fileSize=fileSize+{0} WHERE resourceID={1};" .format(fileSize, dirCheck.resourceID)) except: methods.requestRawQuery( "UPDATE drive_resources SET fileSize=fileSize+{0} WHERE resourceID={1};" .format(fileSize, dirCheck.resourceID)) timestamp = datetime.datetime.now() contents = 'resourceName={0}|resourceType={1}|fileSize={2}'.format( resourceName, resourceType, fileSize) fullURL = 'http://localhost:8001/logapi/log/?datetime={0}&type=rupld&userID={1}&parentDirID={2}&contents={3}&resourceID={4}&shareID=0&shareUsersID=0'.format( timestamp, userID, objectDirectoryKey, contents, uploadResource.resourceID) requestQueue = Background._getInstance() requestQueue.put(fullURL) queryset = Resources.objects.filter(userID=userCheck, parentDirID=dirCheck.resourceID) serializer = DriveSerializer(queryset, many=True) return Response(serializer.data)