示例#1
0
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)
示例#2
0
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)
示例#3
0
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)
示例#4
0
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)
示例#5
0
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)
示例#6
0
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)