def to_process_written_code(pageNum, problemIndex):
    memberId = session[SessionResources().const.MEMBER_ID]
    memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]
    problemName = remove_space_in_problemName(problemIndex)
    filePath, tempPath = make_path(PATH, memberIdIndex, memberId, problemName)
    try:
        os.mkdir(tempPath)
        usedLanguageName, usedLanguageVersion, fileName = write_code_in_file(tempPath)
        fileSize = os.stat(os.path.join(tempPath, fileName)).st_size
        fileIndex = 1
        submissionIndex = get_submission_index(memberIdIndex, problemIndex)
        delete_submitted_files_data(submissionIndex)
        insert_submitted_files(submissionIndex, fileIndex, fileName, filePath, fileSize)
        send_to_celery(memberIdIndex, problemIndex, submissionIndex, usedLanguageName, usedLanguageVersion, fileSize, problemName, filePath, tempPath)
        Log.info(OtherResources().const.WRITED_CODE_SUBMITTED)
    except OSError as e:
        Log.error(str(e))
        submit_error(tempPath, pageNum, OtherResources().const.FILE_ERROR)
    except Exception as e:
        dao.rollback()
        Log.error(str(e))
        print e
        submit_error(tempPath, pageNum, OtherResources().const.DB_ERROR)
        
    time.sleep(0.4)
    
    return page_move(pageNum)
def insert_invitee_id(teamName, inviteeId):
    
    # Update or Insert
    # if not exist then Insert
    if not dao.query(TeamInvitations).\
               filter(TeamInvitations.teamName == teamName,
                      TeamInvitations.inviteeId == inviteeId).\
               first():
        newInvitee = TeamInvitations(teamName = teamName,
                                     inviteeId = inviteeId)
        dao.add(newInvitee)
    # else then Update
    else :
        dao.query(TeamInvitations).\
            filter(TeamInvitations.teamName == teamName,
                   TeamInvitations.inviteeId == inviteeId).\
            update(dict(isDeleted = ENUMResources().const.FaLSE))
    # Commit Exception
    try:
        dao.commit()
        flash(inviteeId + get_message('inviteeSucceeded'))
    except Exception:
        dao.rollback()
        return get_message('updateFailed')
    
    return None
def to_process_uploaded_files(problemIndex, pageNum, browserName, browserVersion):
    memberId = session[SessionResources().const.MEMBER_ID]
    memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]
    problemName = remove_space_in_problemName(problemIndex)
    filePath, tempPath = make_path(PATH, memberIdIndex, memberId, problemName)

    try:
        os.mkdir(tempPath)
        uploadFiles = request.files.getlist(OtherResources().const.GET_FILES)
        usedLanguageName = request.form[OtherResources().const.USED_LANGUAGE_NAME]
        usedLanguageVersion = request.form[OtherResources().const.USED_LANGUAGE_VERSION]
        submissionIndex = get_submission_index(memberIdIndex, problemIndex)
        sumOfSubmittedFileSize = file_save(submissionIndex, uploadFiles, tempPath, filePath)
        send_to_celery(memberIdIndex, problemIndex, submissionIndex, usedLanguageName, usedLanguageVersion, sumOfSubmittedFileSize, problemName, filePath, tempPath)
        Log.info(OtherResources().const.FILE_SUBMITTED)
    except OSError as e:
        Log.error(str(e))
        submit_error(tempPath, pageNum, OtherResources().const.FILE_ERROR, browserName, browserVersion)
    except Exception as e:
        dao.rollback()
        Log.error(str(e))
        print e
        submit_error(tempPath, pageNum, OtherResources().const.DB_ERROR, browserName, browserVersion)
        
    time.sleep(0.4)
    
    return page_move(pageNum, browserName, browserVersion)
Esempio n. 4
0
def to_process_written_code(pageNum, problemIndex):
    memberId = session[SessionResources().const.MEMBER_ID]
    memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]
    problemName = remove_space_in_problemName(problemIndex)
    filePath, tempPath = make_path(PATH, memberIdIndex, memberId, problemName)
    try:
        os.mkdir(tempPath)
        usedLanguageName, usedLanguageVersion, fileName = write_code_in_file(
            tempPath)
        fileSize = os.stat(os.path.join(tempPath, fileName)).st_size
        fileIndex = 1
        submissionIndex = get_submission_index(memberIdIndex, problemIndex)
        delete_submitted_files_data(submissionIndex)
        insert_submitted_files(submissionIndex, fileIndex, fileName, filePath,
                               fileSize)
        send_to_celery(memberIdIndex, problemIndex, submissionIndex,
                       usedLanguageName, usedLanguageVersion, fileSize,
                       problemName, filePath, tempPath)
        Log.info(OtherResources().const.WRITED_CODE_SUBMITTED)
    except OSError as e:
        Log.error(str(e))
        submit_error(tempPath, pageNum, OtherResources().const.FILE_ERROR)
    except Exception as e:
        dao.rollback()
        Log.error(str(e))
        print e
        submit_error(tempPath, pageNum, OtherResources().const.DB_ERROR)

    time.sleep(0.4)

    return page_move(pageNum)
Esempio n. 5
0
def code_reply_like_click(submissionReplyIndex):
    # 댓글 좋아요
    # 내가 Reply에 누른 좋아요 정보
    try:
        isReplyLike = select_replies_on_code_is_like(submissionReplyIndex,
                                                     memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]).first().\
                                                                                                                                         isLikeCancelled
    except Exception:
        # Non-Exist Case
        isReplyLike = None

        # 좋아요를 누른적 없을 때
    if not isReplyLike:
        # Insert Like
        dao.add(
            insert_likes_on_reply_of_code(
                submissionReplyIndex,
                memberIdIndex=session[
                    SessionResources().const.MEMBER_ID_INDEX]))
        # Counting +1
        LIKE_INCREASE = 1
    else:
        # 다시 좋아요 누를 때
        if isReplyLike == ENUMResources().const.TRUE:
            # Counting +1
            LIKE_INCREASE = 1
            isLikeCancelled = ENUMResources().const.FALSE
            # 좋아요 취소 할 때
        else:  # if it's already exist then change the value of 'pushedLike'
            # Counting -1
            LIKE_INCREASE = -1
            isLikeCancelled = ENUMResources().const.TRUE

        # Update Like
        update_replies_on_code_is_like(
            submissionReplyIndex,
            memberIdIndex=session[SessionResources().const.MEMBER_ID_INDEX],
            isLikeCancelled=isLikeCancelled)

    # Like or UnLIke
    update_replies_on_code_like_counting(submissionReplyIndex,
                                         LIKE_INCREASE=LIKE_INCREASE)
    try:
        dao.commit()

        # return like count
        try:
            count = select_replies_on_code(submissionIndex = None,
                                           submissionReplyIndex = submissionReplyIndex).first().\
                                                                                        sumOfLikeCount
        except Exception:
            count = 0

        return Response(str(count))
    except Exception:
        dao.rollback()

    return Response()
def article_like_click(articleIndex):
    # 게시글 좋아요  Push
    # 내가 게시글에 누른 좋아요 정보
    try:
        isLikeCancelled = select_article_is_like(articleIndex,
                                                 memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]).first().\
                                                                                                                    isLikeCancelled
    except Exception:
        # Non-Exist Case
        isLikeCancelled = None

        # 좋아요를 누른적 없을 때
    if not isLikeCancelled:
        # Insert Like
        dao.add(
            insert_likes_on_board(
                articleIndex,
                memberIdIndex=session[
                    SessionResources().const.MEMBER_ID_INDEX]))
        # Counting +1
        LIKE_INCREASE = 1
    else:
        # 다시 좋아요 누를 때
        if isLikeCancelled == ENUMResources().const.TRUE:
            # Counting +1
            LIKE_INCREASE = 1
            isLikeCancelled = ENUMResources().const.FALSE
            # 좋아요 취소 할 때
        else:  # if it's already exist then change the value of 'pushedLike'
            # Counting -1
            LIKE_INCREASE = -1
            isLikeCancelled = ENUMResources().const.TRUE

        # Update Like
        update_article_is_like(
            articleIndex,
            memberIdIndex=session[SessionResources().const.MEMBER_ID_INDEX],
            isLikeCancelled=isLikeCancelled)
    # Article 좋아요 갯수 올리기
    update_article_like_counting(articleIndex, LIKE_INCREASE=LIKE_INCREASE)

    try:
        dao.commit()
        # return like count
        try:
            count =  select_article(articleIndex = articleIndex).first().\
                                                                 sumOfLikeCount
        except Exception:
            count = 0

        return Response(str(count))
    except Exception:
        dao.rollback()

    return Response()
def code_reply_like_click(submissionReplyIndex):
        # 댓글 좋아요
        # 내가 Reply에 누른 좋아요 정보
    try:
        isReplyLike = select_replies_on_code_is_like(submissionReplyIndex,
                                                     memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]).first().\
                                                                                                                                         isLikeCancelled
    except Exception:
        # Non-Exist Case
        isReplyLike = None
        
                        # 좋아요를 누른적 없을 때
    if not isReplyLike:
        # Insert Like
        dao.add(insert_likes_on_reply_of_code(submissionReplyIndex,
                                              memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]))
        # Counting +1
        LIKE_INCREASE = 1
    else:
                                # 다시 좋아요 누를 때
        if isReplyLike == ENUMResources().const.TRUE:
            # Counting +1
            LIKE_INCREASE = 1
            isLikeCancelled = ENUMResources().const.FALSE
                                # 좋아요 취소 할 때
        else:  # if it's already exist then change the value of 'pushedLike'
            # Counting -1
            LIKE_INCREASE = -1
            isLikeCancelled = ENUMResources().const.TRUE
            
        # Update Like
        update_replies_on_code_is_like(submissionReplyIndex,
                                       memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX],
                                       isLikeCancelled = isLikeCancelled)
            
    # Like or UnLIke
    update_replies_on_code_like_counting(submissionReplyIndex,
                                         LIKE_INCREASE = LIKE_INCREASE)
    try:
        dao.commit()
        
        # return like count
        try:
            count = select_replies_on_code(submissionIndex = None,
                                           submissionReplyIndex = submissionReplyIndex).first().\
                                                                                        sumOfLikeCount
        except Exception:
            count = 0
        
        return Response(str(count))
    except Exception:
        dao.rollback()
        
    return Response()
def article_like_click(articleIndex):
        # 게시글 좋아요  Push
        # 내가 게시글에 누른 좋아요 정보
    try:
        isLikeCancelled = select_article_is_like(articleIndex,
                                                 memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]).first().\
                                                                                                                    isLikeCancelled
    except Exception:
        # Non-Exist Case
        isLikeCancelled = None
            
        # 좋아요를 누른적 없을 때
    if not isLikeCancelled:
        # Insert Like
        dao.add(insert_likes_on_board(articleIndex,
                                      memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]))
        # Counting +1
        LIKE_INCREASE = 1
    else:
                                # 다시 좋아요 누를 때
        if isLikeCancelled == ENUMResources().const.TRUE:
            # Counting +1
            LIKE_INCREASE = 1
            isLikeCancelled = ENUMResources().const.FALSE
                                # 좋아요 취소 할 때
        else:  # if it's already exist then change the value of 'pushedLike'
            # Counting -1
            LIKE_INCREASE = -1
            isLikeCancelled = ENUMResources().const.TRUE
            
        # Update Like
        update_article_is_like(articleIndex,
                               memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX],
                               isLikeCancelled = isLikeCancelled)
    # Article 좋아요 갯수 올리기
    update_article_like_counting(articleIndex,
                                 LIKE_INCREASE = LIKE_INCREASE)
    
    
    try:
        dao.commit()
        # return like count
        try:
            count =  select_article(articleIndex = articleIndex).first().\
                                                                 sumOfLikeCount
        except Exception:
            count = 0
        
        return Response(str(count))
    except Exception:
        dao.rollback()
        
    return Response()
def insert_into_departmentDetailsOfMembers(memberId, collegeIndex, departmentIndex):
    departmentInformation = DepartmentsDetailsOfMembers(memberId = memberId,
                                                        collegeIndex = int(collegeIndex),
                                                        departmentIndex = int(departmentIndex))
    dao.add(departmentInformation)

    try:
        dao.commit()
    except:
        dao.rollback()
        return False
            
    return True
Esempio n. 10
0
def check_user_info(request_form, error = None):
    checker = True
    language = {'kr':0, # default
                'en':1}
        
    for form in request_form:
            if "language" in form:
                checker = False
                lang = get_request_value(form = request.form,
                                         name = 'language')
                session['language'] = language[lang]
                
    if checker: 
        try:
            """ DB Password check """
            memberId = get_request_value(form = request.form,
                                         name = 'memberId')
            password = get_request_value(form = request.form,
                                         name = 'password')
            
            check = select_match_member_id(memberId = memberId).first()
            
            #Checking Success
            if memberId == memberId\
               and check_password_hash(check.password,
                                       TripleDES.encrypt(str(password))):
                #push Session Cache 
                session[SessionResources().const.MEMBER_ID_INDEX] = check.memberIdIndex
                session[SessionResources().const.MEMBER_ID] = memberId
                session[SessionResources().const.MEMBER_NAME] = check.memberName
                session[SessionResources().const.AUTHORITY] = list(check.authority)
                session[SessionResources().const.LAST_ACCESS_DATE] = datetime.now()
                
                # set default language
                session['language'] = language['kr']
                                            
                # Commit Exception
                try:
                    update_recent_access_date(session[SessionResources().const.MEMBER_ID_INDEX],
                                              datetime.now())
                    dao.commit()
                except Exception:
                    dao.rollback()
                    error = LanguageResources().const.DBFailed
            else:
                error = LanguageResources().const.WrongPassword
        # Not Exist MemberId
        except Exception:
            error = LanguageResources().const.WrongPassword
        # Return Login Page
        return error
def to_process_uploaded_files(courseId, problemId, problemName, pageNum, browserName, browserVersion):
    memberId = session[SessionResources.const.MEMBER_ID]
    filePath, tempPath = make_path(PATH, memberId, courseId, problemId, problemName)
    try:
        os.mkdir(tempPath)
        uploadFiles = request.files.getlist(OtherResources.const.GET_FILES)
        usedLanguageName = request.form[OtherResources.const.USED_LANGUAGE_NAME]
        sumOfSubmittedFileSize = file_save(memberId, courseId, problemId, uploadFiles, tempPath, filePath)
        send_to_celery(memberId, courseId, problemId, usedLanguageName, sumOfSubmittedFileSize, problemName, filePath, tempPath)
    except OSError as e:
        submit_error(tempPath, courseId, pageNum, 'fileError', browserName, browserVersion)
    except Exception as e:
        dao.rollback()
        submit_error(tempPath, courseId, pageNum, 'dbError', browserName, browserVersion)
        
    time.sleep(0.4)
    return page_move(courseId, pageNum, browserName, browserVersion)
def to_process_written_code(courseId, pageNum, problemId, problemName):
    memberId = session[SessionResources.const.MEMBER_ID]
    filePath, tempPath = make_path(PATH, memberId, courseId, problemId, problemName)
    try:
        os.mkdir(tempPath)
        usedLanguageName, fileName = write_code_in_file(tempPath)
        fileSize = os.stat(os.path.join(tempPath, fileName)).st_size
        fileIndex = 1
        delete_submitted_files_data(memberId, problemId, courseId)
        insert_submitted_files(memberId, courseId, problemId, fileIndex, fileName, filePath, fileSize)
        send_to_celery(memberId, courseId, problemId, usedLanguageName, fileSize, problemName, filePath, tempPath)
    except OSError as e:
        submit_error(tempPath, courseId, pageNum, 'fileError')
    except Exception as e:
        dao.rollback()
        submit_error(tempPath, courseId, pageNum, 'dbError')
        
    time.sleep(0.4)
    return page_move(courseId, pageNum)
def insert_into_Members(memberId, password, memberName, authority, signedInDate, comment):
    '''
    @@ TODO
    
    Default authority is USER.
    So if you want to make an account for server administrator,
    you change the authority in database terminal.
    '''
    newMember = Members(memberId = memberId,
                        password = password,
                        memberName = memberName,
                        authority = authority,
                        signedInDate = signedInDate,
                        comment = comment)
    dao.add(newMember)
    try:
        dao.commit()
    except:
        dao.rollback()
        return False
    
    return True
Esempio n. 14
0
def team_invitation(teamName, accept, error = None):
    """
    팀 초대 수락 & 거절
    """
    try:
        # Delete Invitee
        dao.query(TeamInvitations).\
            filter(TeamInvitations.teamName == teamName,
                   TeamInvitations.inviteeId == session[SessionResources().const.MEMBER_ID]).\
            update(dict(isDeleted = ENUMResources().const.TRUE))
        
        # 초대 수락
        if accept == OtherResources().const.ACCEPT:
            insert_team_member_id(teamName,
                                  session[SessionResources().const.MEMBER_ID])
            # Commit Exception
            try:
                dao.commit()
                flash(teamName + get_message('acceptInvitee'))
            except Exception:
                dao.rollback()
                error = get_message('updateFailed')
        # 초대 걱절    
        else: # elif == REJECT:
            # Commit Exception
            try:
                dao.commit()
                flash(teamName + get_message('rejectInvitee'))
            except Exception:
                dao.rollback()
                error = get_message('updateFailed')
            
        return redirect(url_for(RouteResources().const.TEAM,
                                pageNum = 1,
                                error = error))   
    except Exception:
        # Unknown Error
        return unknown_error()
Esempio n. 15
0
def to_process_uploaded_files(problemIndex, pageNum, browserName,
                              browserVersion):
    memberId = session[SessionResources().const.MEMBER_ID]
    memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]
    problemName = remove_space_in_problemName(problemIndex)
    filePath, tempPath = make_path(PATH, memberIdIndex, memberId, problemName)

    try:
        os.mkdir(tempPath)
        uploadFiles = request.files.getlist(OtherResources().const.GET_FILES)
        usedLanguageName = request.form[
            OtherResources().const.USED_LANGUAGE_NAME]
        usedLanguageVersion = request.form[
            OtherResources().const.USED_LANGUAGE_VERSION]
        submissionIndex = get_submission_index(memberIdIndex, problemIndex)
        sumOfSubmittedFileSize = file_save(submissionIndex, uploadFiles,
                                           tempPath, filePath)
        send_to_celery(memberIdIndex, problemIndex, submissionIndex,
                       usedLanguageName, usedLanguageVersion,
                       sumOfSubmittedFileSize, problemName, filePath, tempPath)
        Log.info(OtherResources().const.FILE_SUBMITTED)
    except OSError as e:
        Log.error(str(e))
        submit_error(tempPath, pageNum,
                     OtherResources().const.FILE_ERROR, browserName,
                     browserVersion)
    except Exception as e:
        dao.rollback()
        Log.error(str(e))
        print e
        submit_error(tempPath, pageNum,
                     OtherResources().const.DB_ERROR, browserName,
                     browserVersion)

    time.sleep(0.4)

    return page_move(pageNum, browserName, browserVersion)
Esempio n. 16
0
def sign_in():
    '''
    @@ Success sign in flash
    
    When the page redirected from sign up page,
    It display flash message.    
    '''
    if '?' in request.url:
        flash('Signed up successfully')
        
    ''' main page before sign in'''
    from GradeServer.utils.utilMessages import get_message
    
    from GradeServer.utils.memberCourseProblemParameter import MemberCourseProblemParameter
    
    from GradeServer.utils.utilArticleQuery import select_notices
    from GradeServer.utils.utilQuery import select_accept_courses, select_past_courses, select_current_courses, select_match_member
    from GradeServer.utils.utilRankQuery import select_top_coder
    
    from GradeServer.resource.setResources import SETResources
    from GradeServer.resource.htmlResources import HTMLResources
    from GradeServer.resource.sessionResources import SessionResources
    from GradeServer.resource.languageResources import LanguageResources

    error = None
    
    if request.method == 'POST':
        checker = True
        language = {'kr':0, # default
                    'en':1}
        
        for form in request.form:
            if "language" in form:
                checker = False
                lang = request.form['language']
                session['language'] = language[lang]
                
        if checker:        
            if not request.form['memberId']:
                error = '아이디'  + get_message('fillData')
            elif not request.form['password']:
                error = '암호'  + get_message('fillData')
            else:
                try:
                    """ DB Password check """
                    memberId = request.form['memberId'].split()[0]
                    password = request.form['password']
                    
                    check = select_match_member(memberCourseProblemParameter = MemberCourseProblemParameter(memberId = memberId)).first()
                    
                    from werkzeug.security import check_password_hash
                    
                    from GradeServer.resource.otherResources import OtherResources
                    from GradeServer.py3Des.pyDes import *
                    
                    tripleDes = triple_des(OtherResources().const.TRIPLE_DES_KEY,
                                           mode = ECB,
                                           IV = "\0\0\0\0\0\0\0\0",
                                           pad = None,
                                           padmode = PAD_PKCS5)
                    #Checking Success
                    if check_password_hash (check.password,
                                            tripleDes.encrypt(str(password))):
                        flash(get_message('login'))
                        #push Session Cache 
                        session[SessionResources().const.MEMBER_ID] = memberId
                        session[SessionResources().const.AUTHORITY] = list(check.authority)
                        session[SessionResources().const.LAST_ACCESS_DATE] = datetime.now()
                        
                        # set default language
                        session['language'] = language['kr']
                                                    
                        ownCourses = select_accept_courses().subquery()
                        # Get My Accept Courses
                        try:
                            session[SessionResources().const.OWN_CURRENT_COURSES] = select_current_courses(ownCourses).all()
                        except Exception:
                            session[SessionResources().const.OWN_CURRENT_COURSES] = []
                        try:
                            session[SessionResources().const.OWN_PAST_COURSES] = select_past_courses(ownCourses).all()
                        except Exception:
                            session[SessionResources().const.OWN_PAST_COURSES] = []
                        update_recent_access_date(memberId)
                        # Commit Exception
                        try:
                            dao.commit()
                        except Exception:
                            dao.rollback()
                            error = get_message('updateFailed')
                    else:
                        error = get_message('tryAgain')
                # Not Exist MemberId
                except Exception:
                    error = get_message('notExists')
            
    return render_template(HTMLResources().const.MAIN_HTML,
                           SETResources = SETResources,
                           SessionResources = SessionResources,
                           LanguageResources = LanguageResources,
                           noticeRecords = select_notices(),
                           topCoderId = select_top_coder(),
                           error = error)
Esempio n. 17
0
def submission_code(memberIdIndex, status, problemIndex, error=None):
    try:
        # Get endDateOfSubmission of Problem
        # are Not Access. conditions is an Administrator and endOfSubmission ago
        if SETResources().const.ADMINISTRATOR in session[SessionResources().const.AUTHORITY]\
           or memberIdIndex == session[SessionResources().const.MEMBER_ID_INDEX]:

            # Get SubmissionIndex
            dataOfSubmissionBoard = select_data_of_submission_board(
                None, memberIdIndex, problemIndex)
            if dataOfSubmissionBoard.first():
                submissionIndex = dataOfSubmissionBoard.first().submissionIndex
                # 내가 Code에 누른 좋아요 정보
                try:
                    isLikeCancelled = select_code_is_like(submissionIndex,
                                                          memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]).first().\
                                                          isLikeCancelled
                except Exception:
                    # Non-Exist Case
                    isLikeCancelled = None

                if request.method == 'POST':
                    authorityCheck = is_authority(
                        session[SessionResources().const.AUTHORITY])

                    for form in request.form:
                        # 댓글 달기
                        if form == 'writeCodeReply':
                            # 새로운 댓글 정보articleParameter
                            codeReplyContent = get_request_value(
                                form=request.form, name='writeCodeReply')

                            if codeReplyContent:
                                dao.add(
                                    insert_replies_on_code(
                                        submissionIndex,
                                        memberIdIndex=session[SessionResources(
                                        ).const.MEMBER_ID_INDEX],
                                        articleParameter=ArticleParameter(
                                            title=None,
                                            content=codeReplyContent,
                                            updateIp=socket.gethostbyname(
                                                socket.gethostname()),
                                            updateDate=datetime.now())))
                                # remove duplicated read count
                                update_code_view_reply_counting(
                                    submissionIndex,
                                    VIEW_INCREASE=-1,
                                    REPLY_INCREASE=1)

                            break
                            # 댓글 삭제
                        elif 'deleteCodeReply' in form:
                            # Get Reply Index
                            replyIndex = len('deleteCodeReply')
                            submissionReplyIndex = int(form[replyIndex:])

                            try:
                                writerIndex = select_replies_on_code(
                                    submissionIndex=None,
                                    submissionReplyIndex=submissionReplyIndex
                                ).first()
                            except Exception:
                                writerIndex = None
                            if (authorityCheck[0] or authorityCheck[1])\
                               or writerIndex.codeReplierIdIndex == session['memberIdIndex']:

                                update_replies_on_code_delete(
                                    submissionReplyIndex,
                                    isDeleted=ENUMResources().const.TRUE)
                                # remove duplicated read count
                                update_code_view_reply_counting(
                                    submissionIndex,
                                    VIEW_INCREASE=-1,
                                    REPLY_INCREASE=-1)
                            else:
                                error = LanguageResources().const.GetOutHere

                            break
                        # Commit Modify
                        elif 'modifyCodeReplyContent' in form:
                            replyIndex = len('modifyCodeReplyContent')
                            submissionReplyIndex = int(form[replyIndex:])
                            try:
                                writerIndex = select_replies_on_code(
                                    submissionIndex=None,
                                    submissionReplyIndex=submissionReplyIndex
                                ).first()
                            except Exception:
                                writerIndex = None
                            if writerIndex.codeReplierIdIndex == session[
                                    'memberIdIndex']:
                                submissionReplyContent = get_request_value(
                                    form=request.form,
                                    name='modifyCodeReplyContent{0}'.format(
                                        form[replyIndex:]))

                                if submissionReplyContent:
                                    #update comment
                                    update_replies_on_code_modify(
                                        submissionReplyIndex,
                                        ArticleParameter(
                                            title=None,
                                            content=submissionReplyContent,
                                            updateIp=socket.gethostbyname(
                                                socket.gethostname()),
                                            updateDate=datetime.now()))
                                    # remove duplicated read count
                                    update_code_view_reply_counting(
                                        submissionIndex, VIEW_INCREASE=-1)
                            else:
                                error = LanguageResources().const.GetOutHere

                            break
                    # end Loop
                    # Commit Exception
                    try:
                        dao.commit()
                    except Exception:
                        dao.rollback()
                        error = LanguageResources().const.DBFailed

                try:
                    # replies 정보
                    repliesOnSubmissionRecords = select_replies_on_code(
                        submissionIndex).subquery()
                    repliesOnSubmissionRecords = join_member_id(
                        repliesOnSubmissionRecords,
                        repliesOnSubmissionRecords.c.codeReplierIdIndex)
                    # 내가 게시글 리플에 누른 좋아요 정보
                    repliesOnSubmissionIsLikeRecords = select_replies_on_code_like(
                        repliesOnSubmissionRecords.subquery(), session[
                            SessionResources().const.MEMBER_ID_INDEX]).all()
                    repliesOnSubmissionRecords = repliesOnSubmissionRecords.all(
                    )
                except Exception:
                    repliesOnSubmissionIsLikeRecords = []
                    repliesOnSubmissionRecords = []

                    # 읽은 횟수 카운팅
                update_code_view_reply_counting(submissionIndex,
                                                VIEW_INCREASE=1)

                # Commit Exception
                try:
                    dao.commit()
                except Exception:
                    dao.rollback()

                # Problem Information (LimitedTime, LimitedMemory
                try:
                    problemName = select_problem(problemIndex = problemIndex).first().\
                                                                              problemName
                except Exception:
                    problemName = None

                # Problem Solved Users
                try:
                    # last Submissions Info
                    lastSubmission = select_last_submissions(
                        memberIdIndex=memberIdIndex,
                        problemIndex=problemIndex).subquery()
                    problemSolvedMemberRecords = select_all_submissions(
                        memberIdIndex=memberIdIndex,
                        problemIndex=problemIndex,
                        lastSubmission=lastSubmission).first()
                except Exception:
                    problemSolvedMemberRecords = []

                # Submitted Files Information
                import codecs
                try:
                    submittedFileRecords = select_submitted_files(
                        dataOfSubmissionBoard.subquery()).all()
                    fileData = []

                    for raw in submittedFileRecords:
                        # Open
                        filePath = '{0}/{1}'.format(raw.filePath, raw.fileName)
                        # EUC_KR type
                        try:
                            with codecs.open(filePath, 'r',
                                             encoding='cp949') as f:
                                # Read
                                data = f.read()
                                fileData.append(data)
                        # UTF-8 Type
                        except Exception:
                            with codecs.open(filePath, 'r',
                                             encoding='utf8') as f:
                                # Read
                                data = f.read()
                                fileData.append(data)
                except Exception:
                    submittedFileRecords = []
                    fileData = []

                return render_template(HTMLResources().const.SUBMISSION_CODE_HTML,
                                       memberIdIndex = memberIdIndex,
                                       submissionIndex = submissionIndex,
                                       submittedFileRecords = submittedFileRecords,
                                       fileData = fileData,
                                       problemName = problemName,
                                       problemSolvedMemberRecords = problemSolvedMemberRecords,
                                       isLikeCancelled = isLikeCancelled,
                                       sumOfLikeCount = dataOfSubmissionBoard.first().\
                                                                              sumOfLikeCount,
                                       repliesOnSubmissionIsLikeRecords = repliesOnSubmissionIsLikeRecords,
                                       repliesOnSubmissionRecords = repliesOnSubmissionRecords,
                                       browserName = request.user_agent.browser,
                                       browserVersion = request.user_agent.version,
                                       error = error)
        #Access Rejection
        else:
            return redirect(
                url_for(
                    RouteResources().const.PROBLEM_RECORD,
                    status=status,
                    problemIndex=problemIndex,
                    sortCondition=LanguageResources().const.SubmissionDate[1]))
    except Exception as e:
        return unknown_error(e)
Esempio n. 18
0
def write(articleIndex, error=None):
    articleType, problemIndex, title, content, articlesOnBoard = None, None, None, None, None
    try:
        # Modify Case
        if articleIndex:
            try:
                articlesOnBoard = select_article(articleIndex).subquery()
                articlesOnBoard = join_problems_name(
                    subquery=articlesOnBoard,
                    subProblemIndex=articlesOnBoard.c.problemIndex).first()
            except Exception:
                articlesOnBoard = []

                # 작성시 빈칸 검사
        if request.method == 'POST':
            if not articleIndex\
               or articlesOnBoard.writerIdIndex == session[SessionResources().const.MEMBER_ID_INDEX]:
                # Get ProblemIndex
                problemIndex = get_request_value(form=request.form,
                                                 name='problemIndex')
                # Get ArticleType
                articleType = get_request_value(form=request.form,
                                                name='articleType')
                # 타이틀 가져오기
                title = get_request_value(form=request.form, name='title')
                # Get Exist Content
                content = get_request_value(form=request.form, name='content')

                # Success Post
                if title and len(title) <= 100\
                   and content:
                    updateDate = datetime.now()
                    updateIp = socket.gethostbyname(socket.gethostname())
                    # 새로 작성
                    if not articleIndex:
                        newPost = insert_articles_on_board(
                            problemIndex=problemIndex,
                            memberIdIndex=session[
                                SessionResources().const.MEMBER_ID_INDEX],
                            articleType=articleType,
                            articleParameter=ArticleParameter(
                                title=title,
                                content=content,
                                updateDate=updateDate,
                                updateIp=updateIp))
                        dao.add(newPost)
                        # Commit Exception
                        try:
                            dao.commit()
                        except exc.SQLAlchemyError:
                            dao.rollback()
                            error = LanguageResources().const.DBFailed

                        return redirect(
                            url_for(RouteResources().const.ARTICLE_BOARD,
                                    filterCondition=' ',
                                    keyWord=' ',
                                    pageNum=1))
                        # 게시물 수정
                    else:
                        # 수정 할 글 정보
                        update_article_modify(
                            articleIndex,
                            problemIndex=problemIndex,
                            articleType=articleType,
                            articleParameter=ArticleParameter(
                                title=title,
                                content=content,
                                updateIp=updateIp,
                                updateDate=updateDate))

                        # Commit Exception
                        try:
                            dao.commit()
                        except exc.SQLAlchemyError:
                            dao.rollback()
                            error = LanguageResources().const.DBFailed

                        return redirect(
                            url_for(RouteResources().const.ARTICLE_READ,
                                    articleIndex=articleIndex))
            else:
                error = LanguageResources().const.GetOutHere

        return render_template(HTMLResources().const.ARTICLE_WRITE_HTML,
                               articlesOnBoard=articlesOnBoard,
                               articleTypes=[
                                   ENUMResources().const.NOTICE,
                                   ENUMResources().const.QUESTION,
                                   ENUMResources().const.NORMAL
                               ],
                               articleType=articleType,
                               problemIndex=problemIndex,
                               title=title,
                               content=content,
                               error=error)
    except Exception as e:
        # Unknown Error
        return unknown_error(e)
Esempio n. 19
0
def read(articleIndex, error=None):
    ''' when you push a title of board content '''
    try:
        # 내가 게시글에 누른 좋아요 정보
        try:
            isLikeCancelled = select_article_is_like(articleIndex,
                                                     memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]).first().\
                                                                                                                        isLikeCancelled
        except Exception:
            # Non-Exist Case
            isLikeCancelled = None

        if request.method == 'POST':
            authorityCheck = is_authority(
                session[SessionResources().const.AUTHORITY])
            for form in request.form:

                # 댓글 달기
                if form == 'writeArticleReply':
                    # 새로운 댓글 정보articleParameter
                    boardReplyContent = get_request_value(
                        form=request.form, name='writeArticleReply')

                    if boardReplyContent:
                        dao.add(
                            insert_replies_on_board(
                                articleIndex, session[
                                    SessionResources().const.MEMBER_ID_INDEX],
                                ArticleParameter(title=None,
                                                 content=boardReplyContent,
                                                 updateIp=socket.gethostbyname(
                                                     socket.gethostname()),
                                                 updateDate=datetime.now())))
                        # remove duplicated read count
                        update_view_reply_counting(articleIndex,
                                                   VIEW_INCREASE=-1,
                                                   REPLY_INCREASE=1)

                    break
                    # 댓글 삭제
                elif 'deleteArticleReply' in form:
                    # Get Reply Index
                    replyIndex = len('deleteArticleReply')
                    boardReplyIndex = int(form[replyIndex:])

                    try:
                        writerIndex = select_replies_on_board(
                            articleIndex=None,
                            boardReplyIndex=boardReplyIndex).first()
                    except Exception:
                        writerIndex = None
                    if authorityCheck[0]\
                       or writerIndex.boardReplierIdIndex == session[SessionResources().const.MEMBER_ID_INDEX]:

                        update_replies_on_board_delete(
                            boardReplyIndex,
                            isDeleted=ENUMResources().const.TRUE)
                        # remove duplicated read count
                        update_view_reply_counting(articleIndex,
                                                   VIEW_INCREASE=-1,
                                                   REPLY_INCREASE=-1)
                    else:
                        error = LanguageResources().const.GetOutHere

                    break
                # Commit Modify
                elif 'modifyArticleReplyContent' in form:
                    replyIndex = len('modifyArticleReplyContent')
                    boardReplyIndex = int(form[replyIndex:])
                    try:
                        writerIndex = select_replies_on_board(
                            articleIndex=None,
                            boardReplyIndex=boardReplyIndex).first()
                    except Exception:
                        writerIndex = None
                    if writerIndex.boardReplierIdIndex == session[
                            SessionResources().const.MEMBER_ID_INDEX]:
                        boardReplyContent = get_request_value(
                            form=request.form,
                            name='modifyArticleReplyContent{0}'.format(
                                form[replyIndex:]))

                        if boardReplyContent:
                            #update comment
                            update_replies_on_board_modify(
                                boardReplyIndex,
                                ArticleParameter(title=None,
                                                 content=boardReplyContent,
                                                 updateIp=socket.gethostbyname(
                                                     socket.gethostname()),
                                                 updateDate=datetime.now()))
                            # remove duplicated read count
                            update_view_reply_counting(articleIndex,
                                                       VIEW_INCREASE=-1)
                    else:
                        error = LanguageResources().const.GetOutHere

                    break

                    # 게시물 삭제
                elif form == 'deleteArticle':
                    try:
                        writerIndex = select_article(
                            articleIndex=articleIndex).first()
                    except Exception:
                        writerIndex = None
                    if authorityCheck[0]\
                       or writerIndex.writerIdIndex == session[SessionResources().const.MEMBER_ID_INDEX]:
                        update_article_delete(
                            articleIndex, isDeleted=ENUMResources().const.TRUE)
                        # Commit Exception
                        try:
                            dao.commit()
                        except Exception:
                            dao.rollback()
                            error = LanguageResources().const.DBFailed

                        return redirect(
                            url_for(RouteResources().const.ARTICLE_BOARD,
                                    filterCondition=' ',
                                    keyWord=' ',
                                    pageNum=1))
                    else:
                        error = LanguageResources().const.GetOutHere
            # end Loop
            # Commit Exception
            try:
                dao.commit()
            except Exception:
                dao.rollback()
                error = LanguageResources().const.DBFailed

        # Get or Post
        # 게시글 정보
        try:
            articlesOnBoard = select_article(articleIndex).subquery()

            #Get ProblemName
            articlesOnBoard = join_problems_name(
                subquery=articlesOnBoard,
                subProblemIndex=articlesOnBoard.c.problemIndex).subquery()
            # Get MemberId
            articlesOnBoard = join_member_id(articlesOnBoard,
                                             subMemberIdIndex = articlesOnBoard.c.\
                                                                                 writerIdIndex).first()
        except Exception:
            articlesOnBoard = []

        try:
            # replies 정보
            repliesOnBoardRecords = select_replies_on_board(
                articleIndex).subquery()
            # Get MemberId
            repliesOnBoardRecords = join_member_id(repliesOnBoardRecords,
                                                   subMemberIdIndex = repliesOnBoardRecords.c.\
                                                                                            boardReplierIdIndex)
            # 내가 게시글 리플에 누른 좋아요 정보
            repliesOnBoardIsLikeRecords = select_replies_on_board_like(
                repliesOnBoardRecords.subquery(),
                memberIdIndex=session[
                    SessionResources().const.MEMBER_ID_INDEX]).all()
            repliesOnBoardRecords = repliesOnBoardRecords.all()
        except Exception:
            repliesOnBoardIsLikeRecords = []
            repliesOnBoardRecords = []

            # 읽은 횟수 카운팅
        update_view_reply_counting(articleIndex, VIEW_INCREASE=1)

        # Commit Exception
        try:
            dao.commit()
        except Exception:
            dao.rollback()

        return render_template(
            HTMLResources().const.ARTICLE_READ_HTML,
            articlesOnBoard=articlesOnBoard,
            repliesOnBoardRecords=repliesOnBoardRecords,
            repliesOnBoardIsLikeRecords=repliesOnBoardIsLikeRecords,
            isLikeCancelled=isLikeCancelled,
            error=error)
    except Exception:
        # Exception View
        return redirect(
            url_for(RouteResources().const.ARTICLE_BOARD, pageNum=1))
def class_add_user():
    global newUsers
    error = None
    targetUserIdToDelete = []
    authorities = ['Course Admin','User']
    keys = {'memberId':0,
            'memberName':1,
            'authority':2,
            'collegeIndex':3,
            'collegeName':4,
            'departmentIndex':5,
            'departmentName':6,
            'courseId':7}
    
    ownCourses = get_own_courses(session[SessionResources().const.MEMBER_ID])

    if error:
        return render_template('/class_add_user.html',
                               error = error, 
                               SETResources = SETResources,
                               SessionResources = SessionResources,
                               LanguageResources = LanguageResources,
                               ownCourses = [],
                               allUsers = [],
                               allColleges = [],
                               allDepartments = [],
                               authorities = authorities,
                               newUsers = newUsers)
        
    try:
        allUsers = (dao.query(Members,
                              Colleges,
                              Departments).\
                        join(DepartmentsDetailsOfMembers,
                             Members.memberId == DepartmentsDetailsOfMembers.memberId).\
                        join(Colleges,
                             DepartmentsDetailsOfMembers.collegeIndex == Colleges.collegeIndex).\
                        join(Departments,
                             DepartmentsDetailsOfMembers.departmentIndex == Departments.departmentIndex).\
                        filter(or_(Members.authority == SETResources().const.USER,
                                   Members.authority == SETResources().const.COURSE_ADMINISTRATOR)).\
                        group_by(Members.memberId)).\
                   all()
    except:
        error = 'Error has been occurred while searching all users'
        return render_template('/class_add_user.html',
                               error = error, 
                               SETResources = SETResources,
                               SessionResources = SessionResources,
                               LanguageResources = LanguageResources,
                               ownCourses = ownCourses,
                               allUsers = [],
                               allColleges = [],
                               allDepartments = [],
                               authorities = authorities,
                               newUsers = newUsers)
    
    allColleges = get_colleges()
    
    
    try:
        allDepartments = (dao.query(DepartmentsOfColleges,
                                    Colleges,
                                    Departments).\
                              join(Colleges,
                                   Colleges.collegeIndex == DepartmentsOfColleges.collegeIndex).\
                              join(Departments,
                                   Departments.departmentIndex == DepartmentsOfColleges.departmentIndex).\
                              filter(Colleges.isAbolished == SETResources().const.FALSE).\
                              filter(Departments.isAbolished == SETResources().const.FALSE)).\
                         all()
    except:
        error = 'Error has been occurred while searching all departments'
        return render_template('/class_add_user.html',
                               error = error, 
                               SETResources = SETResources,
                               SessionResources = SessionResources,
                               LanguageResources = LanguageResources,
                               ownCourses = ownCourses,
                               allUsers = allUsers,
                               allColleges = allColleges,
                               allDepartments = allDepartments,
                               authorities = authorities,
                               newUsers = newUsers)
    
    if request.method == 'POST':
        if 'addIndivisualUser' in request.form:
            # ( number of all form data - 'addIndivisualUser' form ) / forms for each person(id,name,college,department,authority)
            numberOfUsers = (len(request.form) - 1) / 5
            newUser = [['' for _ in range(len(keys.keys()))] for __ in range(numberOfUsers + 1)]
            
            error, newUser = set_form_value_into_array(keys, request.form, newUser)
                
            if error:
                return render_template('/class_add_user.html',
                                       error = error, 
                                       SETResources = SETResources,
                                       SessionResources = SessionResources,
                                       LanguageResources = LanguageResources,
                                       ownCourses = ownCourses,
                                       allUsers = allUsers,
                                       allColleges = allColleges,
                                       allDepartments = allDepartments,
                                       authorities = authorities,
                                       newUsers = newUsers)
                            
            for index in range(numberOfUsers):
                if check_validation(newUser[index]):
                    newUsers.append(newUser[index])
                
        elif 'addUserGroup' in request.form:
            files = request.files.getlist('files')
            courseId = request.form['courseId'].split()[0]
            
            error = set_array_from_file(files, keys, courseId)
            
            if error:
                return render_template('/class_add_user.html',
                                       error = error, 
                                       SETResources = SETResources,
                                       SessionResources = SessionResources,
                                       LanguageResources = LanguageResources,
                                       ownCourses = ownCourses,
                                       allUsers = allUsers,
                                       allColleges = allColleges,
                                       allDepartments = allDepartments,
                                       authorities = authorities,
                                       newUsers = newUsers)
                        
        elif 'addUser' in request.form:
            for newUser in newUsers:
                isExist = dao.query(Members).filter(Members.memberId == newUser[0]).first() 
                if not isExist:
                
                    if newUser[keys['authority']] == 'Course Admin':
                        newUser[keys['authority']] = SETResources().const.COURSE_ADMINISTRATOR
                            
                    tripleDes = initialize_tripleDes_class()
                    password = generate_password_hash(tripleDes.encrypt(str(newUser[keys['memberId']])))
                
                    # at first insert to 'Members'. Duplicated tuple will be ignored.
                    freshman = Members(memberId = newUser[keys['memberId']],
                                       password = password,
                                       memberName = newUser[keys['memberName']],
                                       authority = newUser[keys['authority']],
                                       signedInDate = datetime.now())
                    dao.add(freshman)
                    
                    try:
                        dao.commit()
                    except exc.SQLAlchemyError:
                        dao.rollback()
                        error = 'Error has been occurred while adding new users'
                        return render_template('/class_add_user.html',
                                               error = error, 
                                               SETResources = SETResources,
                                               SessionResources = SessionResources,
                                               LanguageResources = LanguageResources,
                                               ownCourses = ownCourses,
                                               allUsers = allUsers,
                                               allColleges = allColleges,
                                               allDepartments = allDepartments,
                                               authorities = authorities,
                                               newUsers = newUsers)
                        
                isExist = dao.query(Registrations).\
                              filter(and_(Registrations.memberId == newUser[keys['memberId']],
                                          Registrations.courseId == newUser[keys['courseId']].split()[0])).\
                              first()
                # new member
                if not isExist:
                    # then insert to 'Registrations'.
                    freshman = Registrations(memberId = newUser[keys['memberId']],
                                             courseId = newUser[keys['courseId']].split()[0])
                    dao.add(freshman)
                    
                    try:
                        dao.commit()
                    except exc.SQLAlchemyError:
                        dao.rollback()
                        error = 'Error has been occurred while registering new users'
                        return render_template('/class_add_user.html',
                                               error = error, 
                                               SETResources = SETResources,
                                               SessionResources = SessionResources,
                                               LanguageResources = LanguageResources,
                                               ownCourses = ownCourses,
                                               allUsers = allUsers,
                                               allColleges = allColleges,
                                               allDepartments = allDepartments,
                                               authorities = authorities,
                                               newUsers = newUsers)
                    
                    
                    departmentInformation = DepartmentsDetailsOfMembers(memberId = newUser[keys['memberId']],
                                                                        collegeIndex = newUser[keys['collegeIndex']],
                                                                        departmentIndex = newUser[keys['departmentIndex']])
                    dao.add(departmentInformation)
                    
                    try:
                        dao.commit()
                    except exc.SQLAlchemyError:
                        dao.rollback()
                # old member
                else:
                    # suppose the user's department is different with his registered information    
                    departmentInformation = DepartmentsDetailsOfMembers(memberId = newUser[keys['memberId']],
                                                                        collegeIndex = newUser[keys['collegeIndex']],
                                                                        departmentIndex = newUser[keys['departmentIndex']])
                    dao.add(departmentInformation)
                    try:
                        dao.commit()
                    except exc.SQLAlchemyError:
                        dao.rollback()
                        
                courseName = dao.query(RegisteredCourses).\
                                 filter(RegisteredCourses.courseId == newUser[keys['courseId']].split()[0]).\
                                 first().\
                                 courseName

                memberPath = '%s/%s/%s_%s/%s_%s' % (projectPath,
                                                    coursesPath,
                                                    newUser[keys['courseId']].split()[0],
                                                    courseName.replace(' ', ''),
                                                    newUser[keys['memberId']],
                                                    newUser[keys['memberName']].replace(' ', ''))
                
                if not os.path.exists(memberPath):
                    os.makedirs(memberPath)
                
            newUsers = [] # initialize add user list
            return redirect(url_for('.class_manage_user'))
            
        elif 'deleteUser' in request.form:
            for form in request.form:
                if not form is 'deleteUser':
                    targetUserIdToDelete.append(form)
                                    
        # if id list is not empty
        if len(targetUserIdToDelete) != 0:
            # each target user id
            for targetUser in targetUserIdToDelete:
                index = 0
                # each new user id
                for newUser in newUsers:
                    # if target id and new user id are same
                    if targetUser == newUser[keys['memberId']]:
                        del newUsers[index]
                        break
                    index += 1
    
    return render_template('/class_add_user.html',
                           error = error, 
                           SETResources = SETResources,
                           SessionResources = SessionResources,
                           LanguageResources = LanguageResources,
                           ownCourses = ownCourses,
                           allUsers = allUsers,
                           allColleges = allColleges,
                           allDepartments = allDepartments,
                           authorities = authorities,
                           newUsers = newUsers)
def write(articleIndex, error = None):
    articleType, problemIndex, title, content, articlesOnBoard = None, None, None, None, None
    try:
        # Modify Case
        if articleIndex: 
            try:
                articlesOnBoard = select_article(articleIndex).subquery()
                articlesOnBoard = join_problems_name(subquery = articlesOnBoard,
                                                     subProblemIndex = articlesOnBoard.c.problemIndex).first()
            except Exception:
                articlesOnBoard = []
                        
                # 작성시 빈칸 검사
        if request.method == 'POST':
            if not articleIndex\
               or articlesOnBoard.writerIdIndex == session[SessionResources().const.MEMBER_ID_INDEX]:
                # Get ProblemIndex
                problemIndex = get_request_value(form = request.form,
                                                 name = 'problemIndex')
                # Get ArticleType
                articleType = get_request_value(form = request.form,
                                                name = 'articleType')
                                # 타이틀 가져오기
                title = get_request_value(form = request.form,
                                          name = 'title')
                # Get Exist Content
                content = get_request_value(form = request.form,
                                            name = 'content')
                
                # Success Post
                if title and len(title) <= 100\
                   and content:
                    updateDate = datetime.now()
                    updateIp = socket.gethostbyname(socket.gethostname())
                                    # 새로 작성
                    if not articleIndex:
                        newPost = insert_articles_on_board(problemIndex = problemIndex,
                                                           memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX],
                                                           articleType = articleType,
                                                           articleParameter = ArticleParameter(title = title,
                                                                                               content = content,
                                                                                               updateDate = updateDate,
                                                                                               updateIp = updateIp))
                        dao.add(newPost)
                        # Commit Exception
                        try:
                            dao.commit()
                        except exc.SQLAlchemyError:
                            dao.rollback()
                            error = LanguageResources().const.DBFailed
                            
                        return redirect(url_for(RouteResources().const.ARTICLE_BOARD,
                                                filterCondition = ' ',
                                                keyWord = ' ',
                                                pageNum = 1))
                                        # 게시물 수정    
                    else:
                                                # 수정 할 글 정보
                        update_article_modify(articleIndex,
                                              problemIndex = problemIndex,
                                              articleType = articleType,
                                              articleParameter = ArticleParameter(title = title,
                                                                                  content = content,
                                                                                  updateIp = updateIp,
                                                                                  updateDate = updateDate))
                        
                        # Commit Exception
                        try:
                            dao.commit()
                        except exc.SQLAlchemyError:
                            dao.rollback()
                            error = LanguageResources().const.DBFailed
                        
                        return redirect(url_for(RouteResources().const.ARTICLE_READ,
                                                articleIndex = articleIndex))
            else:
                error = LanguageResources().const.GetOutHere
                
        return render_template(HTMLResources().const.ARTICLE_WRITE_HTML,
                               articlesOnBoard = articlesOnBoard,
                               articleTypes = [ENUMResources().const.NOTICE,
                                               ENUMResources().const.QUESTION,
                                               ENUMResources().const.NORMAL],
                               articleType = articleType,
                               problemIndex = problemIndex,
                               title = title,
                               content = content,
                               error = error)
    except Exception as e:
        # Unknown Error
        return unknown_error(e)
Esempio n. 22
0
def post_problem(request, error=None):
    if 'upload' in request.form:
        files = request.files.getlist('files')
        # Get Fle Failed
        if not list(files)[0].filename:
            return LanguageResources().const.UploadingFileError

        # read each uploaded file(zip)
        for fileData in files:
            # create temporary path to store new problem before moving into 'Problems' folder
            tmpPath = '%s/tmp' % projectPath
            '''
            @@ Check and Delete temporary folder
            
            If temporary folder 'tmp' is exist, then it means it had an error at past request.
            So, remove the temporary folder 'tmp' first.
            '''
            if os.path.exists(tmpPath):
                try:
                    subprocess.call('rm -rf %s' % tmpPath, shell=True)
                except OSError:
                    return LanguageResources().const.DeleteFolderError

            # unzip file
            with zipfile.ZipFile(fileData, 'r') as z:
                z.extractall(tmpPath)

            try:
                rowProblemName = re.split('_|\.',
                                          os.listdir(tmpPath)[0])[0].\
                                             replace(' ', '\ ')
            except OSError:
                return LangaugeResources().const.ListingFilesError
            '''
            @@ Decode problem name
            
            If the problem zip's made on window environment, problem name's broken
            So it needs to be decoded by cp949
            '''
            problemName = str(rowProblemName.decode('cp949'))
            # if decoded name is the same with before decoding,
            # it means the file is not created on window environment
            isFromWindow = True if rowProblemName != problemName\
                           else False

            if isFromWindow:
                error = handle_file_came_from_window(rowProblemName,
                                                     problemName)
                if error: return error

            problemInformationPath = ('%s/%s.txt' %
                                      (tmpPath, problemName)).replace(
                                          '\ ', ' ')
            try:
                # 'open' command can handle space character without '\' mark,
                # Replace '\ ' to just space ' '
                problemInfoFile = open(problemInformationPath, 'r')
                problemInformation = problemInfoFile.read()

                try:
                    problemInfoFile.close()
                except IOError:
                    return LanguageResources().const.ClosingFileError

            except IOError:
                return LanguageResources().const.ReadingFileError
            '''
            @@ Decode problem meta information
            
            Problem meta information(.txt) file needs to be decoded as well as problem folder name
            '''
            if isFromWindow:
                problemInformation = problemInformation.decode('cp949')
            # slice and make key, value pairs from csv form
            problemInformation = problemInformation.replace(' ', '').split(',')
            if len(problemInformation) != 5:
                return LanguageResources().const.NotEnoughInfoError
            # re-slice and make information from 'key=value'
            for eachInformation in problemInformation:
                key, value = eachInformation.split('=')
                if key == 'Name':
                    # 'value' doesn't have a space character because of 'replace(' ', '')' command above
                    # Don't use 'value' for problem name
                    problemName = problemName.replace('\ ', ' ')
                elif key == 'Difficulty':
                    try:
                        problemDifficulty = int(value)
                    except ValueError:
                        return LanguageResources().const.DifficultyCharError
                elif key == 'SolutionCheckType':
                    solutionCheckType = ENUMResources().const.SOLUTION if value == 'Solution'\
                                        else ENUMResources().const.CHECKER
                elif key == 'LimitedTime':
                    limitedTime = int(value)
                elif key == 'LimitedMemory':
                    limitedMemory = int(value)
            # Insert new problem
            problemPath = '%s/%s' % (problemsPath, problemName.replace(
                ' ', ''))
            if not select_problem(
                    problemIndex=None,
                    problemName=problemName,
                    isDeleted=ENUMResources().const.TRUE).first():
                dao.add(
                    insert_problem(problemName, problemDifficulty,
                                   solutionCheckType, limitedTime,
                                   limitedMemory, problemPath))
            else:
                # Duplication Case
                update_problem_deleted(select_problem(problemIndex = None,
                                                      problemName = problemName,
                                                      isDeleted = ENUMResources().const.TRUE).first().\
                                                                                 problemIndex,
                                       isDeleted = ENUMResources().const.FALSE)

            newProblemPath='%s/%s_%s' %\
                           (tmpPath, problemName, solutionCheckType)
            if change_directory_to(newProblemPath): return

            try:
                # current path : ../tmp/problemName_solutionCheckType
                inOutCases=\
                    [filename for filename in os.listdir(os.getcwd())]
            except OSError:
                return LanguageResources().const.ListingFilesError

            for filename in inOutCases:
                rowFileName = filename
                fileName='%s_%s' %\
                         (problemName, rowFileName.split('_', 1)[1])

                if rename_file(rowFileName, str(fileName)): return
            '''
            @@ Changing directory/file name
            
            work flow
            1. Remove space on its name
                from> Hello World 
                to> HelloWorld
                
            2. Attach problem ID ahead of the name
                from> HelloWorld
                to> 12345_HelloWorld
                * 12345 is created problem id
            '''
            currentPath, error = get_current_path()
            if error: return error

            # inside of SOLUTION or CHECKER folder
            error = remove_space_from_names_in(currentPath)
            if error: return error

            # move to outside of the folder
            if change_directory_to(tmpPath): return error

            currentPath, error = get_current_path()
            if error: return error

            # inside of Problem folder
            error = remove_space_from_names_in(currentPath)
            if error: return error

            # create final goal path
            if not os.path.exists(problemPath):
                os.makedirs(problemPath)

            problemName = problemName.replace(' ', '')
            problemDescriptionPath = '%s/%s' % (problemDescriptionsPath,
                                                problemName)
            if not os.path.exists(problemDescriptionPath):
                os.makedirs(problemDescriptionPath)

            error = rename_file('%s/*' % tmpPath, '%s/' % problemPath)
            if error: return error

            try:
                subprocess.call('cp %s/%s.pdf %s/' %\
                                (problemPath, problemName,\
                                problemDescriptionPath), shell=True)
            except:
                return LanguageResources().const.NotExistPDF

            error = remove_carriage_return(problemPath + '/' + problemName +
                                           '_' + solutionCheckType)
            if error: return error

    # Modify or Deleted Case
    else:
        if 'problemModify' in request.form:
            # Seach ProblemIndex
            updateProblemCount, updateCount = len(request.form) / 5, 0

            for form in request.form:
                if updateProblemCount == updateCount:
                    break
                elif 'problem' not in form\
                      and 'limited' not in form:
                    updateCount = updateCount + 1
                    update_problem(
                        problemIndex=form,
                        problemDifficulty=request.form['problemDifficulty' +
                                                       form],
                        solutionCheckType=request.form['problemType' + form],
                        limitedTime=request.form['limitedTime' + form],
                        limitedMemory=request.form['limitedMemory' + form])
        elif 'problemDeleted' in request.form:
            # Get ProblemIndex
            for form in request.form:
                if 'problem' not in form:
                    update_problem_deleted(problemIndex=form)

    try:
        dao.commit()
        if 'upload' in request.form:
            # update numberOfTestCase
            problem = select_problem(problemIndex=None,
                                     problemName=problemName).first()
            testCasePath = '{0}/Problems/{1}/{2}_SOLUTION/'.format(
                projectPath, problem.problemName, problem.problemName)

            numberOfTestCase = len(
                fnmatch.filter(os.listdir(testCasePath), '*.txt')) / 2
            update_number_of_test_case(problem.problemIndex, numberOfTestCase)

            try:
                dao.add(
                    insert_submitted_records_of_problems(problem.problemIndex))

                dao.commit()
            except Exception:
                dao.rollback()
        elif 'problemDeleted' in request.form:
            # Get ProblemIndex
            for form in request.form:
                if 'problem' not in form:
                    # Delete Folder
                    problem = select_problem(
                        int(form),
                        isDeleted=ENUMResources().const.TRUE).first()
                    problemPath = '{0}/Problems/{1}/'.format(
                        projectPath, problem.problemName)
                    if os.path.exists(problemPath):
                        shutil.rmtree(problemPath)

    except exc.SQLAlchemyError:
        dao.rollback()
        error = LanguageResources().const.DBFailed

    return error
def read(articleIndex, error = None):
    ''' when you push a title of board content '''
    try:
                # 내가 게시글에 누른 좋아요 정보
        try:
            isLikeCancelled = select_article_is_like(articleIndex,
                                                     memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]).first().\
                                                                                                                        isLikeCancelled
        except Exception:
            # Non-Exist Case
            isLikeCancelled = None
            
        if request.method == 'POST':
            authorityCheck = is_authority(session[SessionResources().const.AUTHORITY])
            for form in request.form:
                
                                # 댓글 달기
                if form == 'writeArticleReply':
                                        # 새로운 댓글 정보articleParameter
                    boardReplyContent = get_request_value(form = request.form,
                                                          name = 'writeArticleReply')
                    
                    if boardReplyContent:
                        dao.add(insert_replies_on_board(articleIndex,
                                                        session[SessionResources().const.MEMBER_ID_INDEX],
                                                        ArticleParameter(title = None,
                                                                         content = boardReplyContent,
                                                                         updateIp = socket.gethostbyname(socket.gethostname()),
                                                                         updateDate = datetime.now())))
                        # remove duplicated read count
                        update_view_reply_counting(articleIndex,
                                                   VIEW_INCREASE = -1,
                                                   REPLY_INCREASE = 1)
                        
                    break 
                                # 댓글 삭제   
                elif 'deleteArticleReply' in form:
                    # Get Reply Index
                    replyIndex = len('deleteArticleReply')
                    boardReplyIndex = int(form[replyIndex:])
                                          
                    try:
                        writerIndex = select_replies_on_board(articleIndex = None,
                                                              boardReplyIndex = boardReplyIndex).first()
                    except Exception:
                        writerIndex = None
                    if authorityCheck[0]\
                       or writerIndex.boardReplierIdIndex == session[SessionResources().const.MEMBER_ID_INDEX]:
                            
                        update_replies_on_board_delete(boardReplyIndex,
                                                       isDeleted = ENUMResources().const.TRUE)
                        # remove duplicated read count
                        update_view_reply_counting(articleIndex,
                                                   VIEW_INCREASE = -1,
                                                   REPLY_INCREASE = -1)
                    else:
                        error = LanguageResources().const.GetOutHere
                    
                    break 
                # Commit Modify
                elif 'modifyArticleReplyContent' in form:
                    replyIndex = len('modifyArticleReplyContent')
                    boardReplyIndex = int(form[replyIndex:])
                    try:
                        writerIndex = select_replies_on_board(articleIndex = None,
                                                              boardReplyIndex = boardReplyIndex).first()
                    except Exception:
                        writerIndex = None
                    if writerIndex.boardReplierIdIndex == session[SessionResources().const.MEMBER_ID_INDEX]:
                        boardReplyContent = get_request_value(form = request.form,
                                                              name = 'modifyArticleReplyContent{0}'.format(form[replyIndex:]))
                        
                        if boardReplyContent:
                            #update comment
                            update_replies_on_board_modify(boardReplyIndex,
                                                           ArticleParameter(title = None,
                                                                            content = boardReplyContent,
                                                                            updateIp = socket.gethostbyname(socket.gethostname()),
                                                                            updateDate = datetime.now()))
                            # remove duplicated read count
                            update_view_reply_counting(articleIndex,
                                                       VIEW_INCREASE = -1)
                    else:
                        error = LanguageResources().const.GetOutHere
                        
                    break
                
                            # 게시물 삭제
                elif form == 'deleteArticle':
                    try:
                        writerIndex = select_article(articleIndex = articleIndex).first()
                    except Exception:
                        writerIndex = None
                    if authorityCheck[0]\
                       or writerIndex.writerIdIndex == session[SessionResources().const.MEMBER_ID_INDEX]:
                        update_article_delete(articleIndex,
                                              isDeleted = ENUMResources().const.TRUE)                    
                        # Commit Exception
                        try:
                            dao.commit()
                        except Exception:
                            dao.rollback()
                            error = LanguageResources().const.DBFailed
                            
                        return redirect(url_for(RouteResources().const.ARTICLE_BOARD,
                                                filterCondition = ' ',
                                                keyWord = ' ',
                                                pageNum = 1))
                    else:
                        error = LanguageResources().const.GetOutHere
            # end Loop
            # Commit Exception
            try:
                dao.commit()
            except Exception:
                dao.rollback()
                error = LanguageResources().const.DBFailed
            
        # Get or Post
                # 게시글 정보
        try:
            articlesOnBoard = select_article(articleIndex).subquery()
                
            #Get ProblemName
            articlesOnBoard = join_problems_name(subquery = articlesOnBoard,
                                                 subProblemIndex = articlesOnBoard.c.problemIndex).subquery()
            # Get MemberId
            articlesOnBoard = join_member_id(articlesOnBoard,
                                             subMemberIdIndex = articlesOnBoard.c.\
                                                                                 writerIdIndex).first()
        except Exception:
            articlesOnBoard = []
            
        try:
            # replies 정보
            repliesOnBoardRecords = select_replies_on_board(articleIndex).subquery()
            # Get MemberId
            repliesOnBoardRecords = join_member_id(repliesOnBoardRecords,
                                                   subMemberIdIndex = repliesOnBoardRecords.c.\
                                                                                            boardReplierIdIndex)
                        # 내가 게시글 리플에 누른 좋아요 정보
            repliesOnBoardIsLikeRecords = select_replies_on_board_like(repliesOnBoardRecords.subquery(),
                                                                       memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]).all()
            repliesOnBoardRecords = repliesOnBoardRecords.all()  
        except Exception:
            repliesOnBoardIsLikeRecords = []
            repliesOnBoardRecords = []
            
                # 읽은 횟수 카운팅
        update_view_reply_counting(articleIndex,
                                   VIEW_INCREASE = 1)
        
        # Commit Exception
        try:
            dao.commit()
        except Exception:
            dao.rollback()
            
        return render_template(HTMLResources().const.ARTICLE_READ_HTML,
                               articlesOnBoard = articlesOnBoard,
                               repliesOnBoardRecords = repliesOnBoardRecords,
                               repliesOnBoardIsLikeRecords = repliesOnBoardIsLikeRecords,
                               isLikeCancelled = isLikeCancelled,
                               error = error)
    except Exception:
        # Exception View    
        return redirect(url_for(RouteResources().const.ARTICLE_BOARD,
                                pageNum = 1))
Esempio n. 24
0
def read(activeTabCourseId, articleIndex, error = None):
    ''' when you push a title of board content '''
        
    try:
            # 내가 게시글에 누른 좋아요 정보
        try:
            isLikeCancelled = select_article_is_like(articleParameter = ArticleParameter(articleIndex = articleIndex,
                                                                                    boardLikerId = session[SessionResources().const.MEMBER_ID])).first().\
                                                                                                                                                 isLikeCancelled
        except Exception:
            # Non-Exist Case
            isLikeCancelled = None
            
        if request.method == 'POST':
            # flash message Init
            flashMsg =None
            for form in request.form:
                
                            # 게시글 좋아요  Push
                if form == 'articleLike':
                                    # 좋아요를 누른적 없을 때
                    if not isLikeCancelled:
                        # Counting +1
                        LIKE_INCREASE = 1
                    else:
                                        # 다시 좋아요 누를 때
                        if isLikeCancelled == ENUMResources().const.TRUE:
                            # Counting +1
                            LIKE_INCREASE = 1
                            isLikeCancelled = ENUMResources().const.FALSE
                                            # 좋아요 취소 할 때
                        else:  # if it's already exist then change the value of 'pushedLike'
                            # Counting -1
                            LIKE_INCREASE = -1
                            isLikeCancelled = ENUMResources().const.TRUE
                        
                    update_article_like_counting(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                                 LIKE_INCREASE = LIKE_INCREASE)
                    if not isLikeCancelled:
                        # Insert Like
                        dao.add(LikesOnBoard(articleIndex = articleIndex,
                                             boardLikerId = session[SessionResources().const.MEMBER_ID]))
                    else:
                        # Update Like
                        update_article_is_like(articleParameter = ArticleParameter(articleIndex = articleIndex,
                                                                                   boardLikerId = session[SessionResources().const.MEMBER_ID]),
                                               isLikeCancelled = isLikeCancelled)
                    # remove duplicated read count
                    update_view_reply_counting(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                               VIEW_INCREASE = -1)
                    
                    break 
                            # 댓글 달기
                elif form == 'writeArticleReply':
                                    # 새로운 댓글 정보
                    boardReplyContent = request.form['writeArticleReply']
                    
                    if boardReplyContent:
                        dao.add(RepliesOnBoard(articleIndex = articleIndex,
                                               boardReplierId = session[SessionResources().const.MEMBER_ID],
                                               boardReplyContent = boardReplyContent,
                                               boardReplierIp = socket.gethostbyname(socket.gethostname()),
                                               boardRepliedDate = datetime.now()))
                        # remove duplicated read count
                        update_view_reply_counting(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                                   VIEW_INCREASE = -1,
                                                   REPLY_INCREASE = 1)
                        
                        flashMsg =get_message('writtenComment')
                    else:
                        error = 'data' + get_message('fillData')
                        
                    break 
                            # 댓글 좋아요
                elif 'articleReplyLike' in form:  # the name starts with 'articleReplyLike' and it has its unique number
                    idIndex = len('articleReplyLike')
                                    # 내가 게시글에 누른 좋아요 정보
                    try:
                        isReplyLike = select_replies_on_board_is_like(replyParameter = ReplyParameter(boardReplyIndex = int(form[idIndex:]),
                                                                                                      boardReplyLikerId = session[SessionResources().const.MEMBER_ID])).first().\
                                                                                                                                                                        isLikeCancelled
                    except Exception:
                        # Non-Exist Case
                        isReplyLike = None
                                    # 좋아요를 누른적 없을 때
                    if not isReplyLike:
                        # Counting +1
                        LIKE_INCREASE = 1
                    else:
                                        # 다시 좋아요 누를 때
                        if isReplyLike == ENUMResources().const.TRUE:
                            # Counting +1
                            LIKE_INCREASE = 1
                            isLikeCancelled = ENUMResources().const.FALSE
                                            # 좋아요 취소 할 때
                        else:  # if it's already exist then change the value of 'pushedLike'
                            # Counting -1
                            LIKE_INCREASE = -1
                            isLikeCancelled = ENUMResources().const.TRUE
                            
                    # Like or UnLIke
                    update_replies_on_board_like_counting(replyParameter = ReplyParameter(boardReplyIndex = int(form[idIndex:])),
                                                          LIKE_INCREASE = LIKE_INCREASE)
                    if not isReplyLike:
                        # Insert Like
                        dao.add(LikesOnReplyOfBoard(boardReplyIndex = int(form[idIndex:]),
                                                    boardReplyLikerId = session[SessionResources().const.MEMBER_ID]))
                    else:
                        # Update Like
                        update_replies_on_board_is_like(replyParameter = ReplyParameter(boardReplyIndex = int(form[idIndex:]),
                                                                                        boardReplyLikerId = session[SessionResources().const.MEMBER_ID]),
                                                        isLikeCancelled = isLikeCancelled)
                    # remove duplicated read count
                    update_view_reply_counting(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                               VIEW_INCREASE = -1)
                    
                    break 
                            # 댓글 삭제   
                elif 'deleteArticleReply' in form:
                    idIndex = len('deleteArticleReply')
                    
                    update_replies_on_board_delete(replyParameter = ReplyParameter(boardReplyIndex = int(form[idIndex:])),
                                                   isDeleted = ENUMResources().const.TRUE)
                    # remove duplicated read count
                    update_view_reply_counting(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                               VIEW_INCREASE = -1,
                                               REPLY_INCREASE = -1)
                    
                    flashMsg = get_message('deletedComment')
                    
                    break 
                # Commit Modify
                elif 'modifyArticleReplyContent' in form:
                    idIndex = len('modifyArticleReplyContent')
                    boardReplyContent = request.form['modifyArticleReplyContent' + form[idIndex:]]
                    
                    if boardReplyContent:
                        #update comment
                        update_replies_on_board_modify(replyParameter = ReplyParameter(boardReplyIndex = int(form[idIndex:]),
                                                                                       boardReplyLikerId = None,
                                                                                       boardReplyContent = boardReplyContent))
                        # remove duplicated read count
                        update_view_reply_counting(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                                   VIEW_INCREASE = -1)
                        
                       
                        flashMsg =get_message('modifiedComment')
                    else:
                        error = 'data' + get_message('fillData')
                        
                    break
                
                            # 게시물 삭제
                elif form == 'deleteArticle':
    
                        update_article_delete(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                              isDeleted = ENUMResources().const.TRUE)                    
                        # Commit Exception
                        try:
                            dao.commit()
                            flash(get_message('deletedPost'))
                        except Exception:
                            dao.rollback()
                            error = get_message('updateFailed')
                            
                        return redirect(url_for(RouteResources().const.BOARD,
                                                activeTabCourseId = OtherResources().const.ALL,
                                                pageNum = 1))
            # end Loop
            # Commit Exception
            try:
                dao.commit()
                # if flash Message exist
                if flashMsg:
                    flash(flashMsg)
            except Exception:
                dao.rollback()
                error = get_message('updateFailed')
            
            # 게시글 정보
        try:
            articlesOnBoard = select_article(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                             isDeleted = ENUMResources().const.FALSE)
                
            articlesOnBoard = join_courses_names(articlesOnBoard.subquery(), 
                                                 select_current_courses(select_accept_courses().subquery()).subquery()).first()
        except Exception:
            articlesOnBoard = []
            
        try:
            # replies 정보
            repliesOnBoardRecords = select_replies_on_board(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                                            isDeleted = ENUMResources().const.FALSE)
                    # 내가 게시글 리플에 누른 좋아요 정보
            repliesOnBoardIsLikeRecords = select_replies_on_board_like(repliesOnBoardRecords.subquery(),
                                                                       memberCourseProblemParameter = MemberCourseProblemParameter(memberId = session[SessionResources().const.MEMBER_ID])).all()
        except Exception:
            repliesOnBoardIsLikeRecords = []
            
        try:
            repliesOnBoardRecords = repliesOnBoardRecords.all()
        except Exception:
            repliesOnBoardRecords = []
            
                # 나의 댓글 좋아요 여부 적용
        subIndex = 0
        isLikeRecords = []
        
        for i in range(0, len(repliesOnBoardRecords)):
                # 나의 댓글 좋아요 정보 비교
            isLikeRecords.append(ENUMResources().const.TRUE)
            for j in range(subIndex, len(repliesOnBoardIsLikeRecords)):
                if repliesOnBoardRecords[i].boardReplyIndex == repliesOnBoardIsLikeRecords[j].boardReplyIndex:
                    isLikeRecords[i] = repliesOnBoardIsLikeRecords[j].isLikeCancelled
                                        # 다음 시작 루프 인덱스 변경
                    subIndex = j
                    
                    break 
            
            # 읽은 횟수 카운팅
        update_view_reply_counting(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                   VIEW_INCREASE = 1)
        
        # Commit Exception
        try:
            dao.commit()
        except Exception:
            dao.rollback()
            
        return render_template(HTMLResources().const.ARTICLE_READ_HTML,
                               SETResources = SETResources,
                               SessionResources = SessionResources,
                               LanguageResources = LanguageResources,
                               articlesOnBoard = articlesOnBoard,
                               activeTabCourseId = activeTabCourseId,
                               repliesOnBoardRecords = repliesOnBoardRecords,
                               isLikeRecords = isLikeRecords,
                               isLikeCancelled = isLikeCancelled,
                               error = error)
    except Exception:
        # Exception View    
        return redirect(url_for(RouteResources().const.BOARD,
                                activeTabCourseId = OtherResources().const.ALL,
                                pageNum = 1))
Esempio n. 25
0
def submission_code(memberId, courseId, problemId, error = None):
    
    try:
        # Get endDateOfSubmission of Problem
        try:
            endDateOfSubmission = select_problems_of_course(memberCourseProblemParameter = MemberCourseProblemParameter(memberId = None,
                                                                                                                        courseId = courseId,
                                                                                                                        problemId = problemId)).first().\
                                                            endDateOfSubmission
        except Exception:
            endDateOfSubmission = None
            
        # are Not Access. conditions is an Administrator and endOfSubmission ago
        if SETResources().const.SERVER_ADMINISTRATOR in session[SessionResources().const.AUTHORITY]\
           or SETResources().const.COURSE_ADMINISTRATOR in session[SessionResources().const.AUTHORITY]\
           or endDateOfSubmission <= datetime.now():
            
            # last Submissions Info
            lastSubmission = select_last_submissions(memberCourseProblemParameter = MemberCourseProblemParameter(memberId = memberId,
                                                                                                                 courseId = courseId,
                                                                                                                 problemId = problemId)).subquery()
            # Code View Count Up
            update_submission_code_view_count(lastSubmission,
                                              memberCourseProblemParameter = MemberCourseProblemParameter(memberId = memberId,
                                                                                                          courseId = courseId,
                                                                                                          problemId = problemId))
            # Commit Exception
            try:
                dao.commit()
            except Exception:
                dao.rollback()
                error = get_message('updateFailed')
                
            # Problem Information (LimitedTime, LimitedMemory
            try:
                problemName = select_problem_informations(memberCourseProblemParameter = MemberCourseProblemParameter(memberId = None,
                                                                                                                      courseId = None,
                                                                                                                      problemId = problemId)).first().\
                                                                     problemName
            except Exception:
                problemName = None
                
            # Problem Solved Users
            try:
                # last Submissions Info
                submissions = select_all_submissions(lastSubmission,
                                                     memberCourseProblemParameter = MemberCourseProblemParameter(memberId = memberId,
                                                                                                                 courseId = courseId,
                                                                                                                 problemId = problemId)).subquery()
                problemSolvedMemberRecords = select_solved_submissions(submissions).first()
            except Exception:
                problemSolvedMemberRecords = []
                
            # Submitted Files Information
            try:
                submittedFileRecords = select_submitted_files(memberCourseProblemParameter = MemberCourseProblemParameter(memberId = memberId, 
                                                                                                                          courseId = courseId,
                                                                                                                          problemId = problemId)).all()
                fileData = []
                for raw in submittedFileRecords:
                    # Open
                    filePath = raw.filePath + '/' +raw.fileName
                    file = open(filePath)
                    # Read
                    data = file.read()
                    
                    # Close
                    file.close()
                    fileData.append(data)
            except Exception:
                submittedFileRecords = []
                fileData = []
                
            return render_template(HTMLResources().const.SUBMISSION_CODE_HTML,
                                   SETResources = SETResources,
                                   SessionResources = SessionResources,
                                   LanguageResources = LanguageResources,
                                   submittedFileRecords = submittedFileRecords,
                                   fileData = fileData,
                                   problemName = problemName,
                                   problemSolvedMemberRecords = problemSolvedMemberRecords,
                                   error = error)
        #Access Rejection
        else:
            flash('코드를 볼 권한이 없습니다!!!')
            return redirect(url_for(RouteResources().const.PROBLEM_RECORD,
                                    courseId = courseId,
                                    problemId = problemId,
                                    sortCondition = OtherResources().const.RUN_TIME))
    except Exception:
        return unknown_error()
Esempio n. 26
0
def edit_personal(error=None):
    contactNumber, emailAddress, comment = None, None, None
    try:
        #Get User Information
        try:
            members = select_member(memberIdIndex=session[
                SessionResources().const.MEMBER_ID_INDEX]).subquery()
            memberInformation = select_member(
                memberIdIndex=members.c.memberIdIndex).first()
        except Exception:
            memberInformation = []

        #Get Post
        if request.method == 'POST':
            password = get_request_value(form=request.form, name='password')
            passwordConfirm = get_request_value(form=request.form,
                                                name='passwordConfirm')
            #Get Updating Data
            contactNumber = get_request_value(form=request.form,
                                              name='contactNumber')
            emailAddress = get_request_value(form=request.form,
                                             name='emailAddress')
            comment = get_request_value(form=request.form, name='comment')
            #Password Same
            if (password and passwordConfirm) and password == passwordConfirm:
                #Generate Password
                encryPassword = TripleDES.encrypt(str(password))
                passwordConfirm = None

                password = generate_password_hash(encryPassword)
                #Update DB
                update_members(
                    select_member(memberIdIndex=session[
                        SessionResources().const.MEMBER_ID_INDEX]), password,
                    contactNumber, emailAddress, comment)
            #Password Different
            elif not password and not passwordConfirm:
                #Update DB
                update_members(members=select_member(memberIdIndex=session[
                    SessionResources().const.MEMBER_ID_INDEX]),
                               password=None,
                               contactNumber=contactNumber,
                               emailAddress=emailAddress,
                               comment=comment)
            # Commit Exception
            try:
                dao.commit()

                return redirect(url_for(RouteResources().const.SIGN_IN))
            except Exception:
                dao.rollback()
                error = LanguageResources().const.DBFailed

        return render_template(HTMLResources().const.EDIT_PERSONAL_HTML,
                               memberInformation=memberInformation,
                               contactNumber=contactNumber,
                               emailAddress=emailAddress,
                               comment=comment,
                               error=error)
    except Exception as e:
        return unknown_error(e)
Esempio n. 27
0
def make_team(error = None):
    """ 
    doesn't have any application of button. 
    you need to make the button app. 
    """
    try:
        global gTeamMembersId, gTeamName, gTeamDescription
                # 자동 완성을 위한 모든 유저기록
        try :
            memberRecords = select_all_users().all()
        except Exception:
            memberRecords = []
        
        print "?", memberRecords
        for k in memberRecords:
            print k.memberId
                
        if request.method == 'GET':
            del gTeamMembersId[:]
            gTeamName, gTeamDescription = None, None
            
            return render_template(HTMLResources().const.TEAM_MAKE_HTML,
                                   SETResources = SETResources,
                                   SessionResources = SessionResources,
                                   LanguageResources = LanguageResources,
                                   memberRecords = memberRecords)
              
        elif request.method == 'POST':
                # 뷰를 인벨리 데이트 하기전에 인풋값 저장
            gTeamName = request.form['teamName']
            gTeamDescription = request.form['teamDescription'] if request.form['teamDescription'] else None
            
            for form in request.form:
                # Making Team
                if form == 'makeTeam':
                    
                                        # 인풋 확인
                    if not gTeamName:
                        return render_template(HTMLResources().const.TEAM_MAKE_HTML,
                                               SETResources = SETResources,
                                               SessionResources = SessionResources,
                                               LanguageResources = LanguageResources,
                                               memberRecords = memberRecords,
                                               gTeamMembersId = gTeamMembersId,
                                               gTeamDescription = gTeamDescription,
                                               error = '팀 명'  + get_message('fillData'))
                                        # 중복 팀명 확인
                    try:
                        if check_team_name(gTeamName).first().\
                                                      isDeleted == ENUMResources().const.FALSE:
                            # don't Exception
                            return render_template(HTMLResources().const.TEAM_MAKE_HTML,
                                                   SETResources = SETResources,
                                                   SessionResources = SessionResources,
                                                   LanguageResources = LanguageResources,
                                                   memberRecords = memberRecords,
                                                   gTeamMembersId = gTeamMembersId,
                                                   gTeamDescription = gTeamDescription,
                                                   error = get_message('existTeamName'))
                        # Deleted Teams
                        else:
                            # Update Team
                            dao.query(Teams).\
                                filter(Teams.teamName == gTeamName).\
                                update(dict(isDeleted = ENUMResources().const.FALSE))
                    except Exception:
                        # Insert Team
                        newTeam = Teams(teamName = gTeamName,
                                        teamDescription = gTeamDescription)
                        dao.add(newTeam)
                        
                    
                    # Commit Exception
                    try:
                        # this Commit Succeeded Go Next Step
                        dao.commit()
                                                # 마스터 정보first().teamName
                        insert_team_member_id(gTeamName,
                                              session[SessionResources().const.MEMBER_ID],
                                              ENUMResources().const.TRUE)
                        # this Commit Succeeded Go Next Step
                        try:
                            dao.commit()
                            for inviteeId in gTeamMembersId:
                                error = insert_invitee_id(gTeamName,
                                                          inviteeId)
                                # Exception Check
                                if error:
                                    break
                            #init
                            del gTeamMembersId[:]
                            gTeamName, gTeamDescription = None, None
                            flash(get_message('makeTeamSucceeded'))

                            return redirect(url_for(RouteResources().const.TEAM,
                                                    pageNum = 1))
                        except Exception:
                            dao.rollback()
                            error = get_message('updateFailed')
                    except Exception:
                        dao.rollback()
                        error = get_message('updateFailed')
                    
                # Add Members
                elif form == 'inviteeMember':
                    try:
                        inviteeId = request.form['inviteeId'].split()[0]
                    except Exception:
                        inviteeId = None
                    # teamMember Invitee
                    error = check_invitee_member(inviteeId)
                        
                    break
                # Delete Members
                elif 'deleteInviteeMember' in form:
                    # form의 name이 deleteMemberi -> i=Index이므로 해당 인덱스 값 제거
                    gTeamMembersId.pop(int(form[-1]))
                    
                    break
                
            return render_template(HTMLResources().const.TEAM_MAKE_HTML,
                                   SETResources = SETResources,
                                   SessionResources = SessionResources,
                                   LanguageResources = LanguageResources,
                                   memberRecords = memberRecords,
                                   gTeamMembersId = gTeamMembersId,
                                   gTeamName = gTeamName,
                                   gTeamDescription = gTeamDescription,
                                   error = error)
    except Exception:
        # Unknown Error
        del gTeamMembersId[:]
        gTeamName, gTeamDescription = None, None
        
        return unknown_error()
Esempio n. 28
0
def team_manage(teamName, error = None):
    """
    팀 관리 페이지
    """
    try:
        global gTeamMembersId, gTeamName, gTeamDescription
        try:
            # 자동 완성을 위한 모든 유저기록
            memberRecords = dao.query(select_all_user().subqeury()).\
                                all()
        except Exception:
            memberRecords = []
        # 팀 정보
        try:
            teamInformation = dao.query(Teams).\
                                    filter(Teams.teamName == teamName,
                                           Teams.isDeleted == ENUMResources().const.FALSE).first()
        except Exception:
            # None Type Exception
            teamInformation = []
        # 팀 멤버 정보
        try:
            teamMemberRecords = dao.query(RegisteredTeamMembers.teamMemberId).\
                                    filter(RegisteredTeamMembers.teamName == teamName,
                                           RegisteredTeamMembers.isDeleted == ENUMResources().const.FALSE).\
                                    order_by(RegisteredTeamMembers.isTeamMaster.asc(),
                                             RegisteredTeamMembers.teamMemberId.asc()).all()
        except Exception:
            # None Type Exception
            teamMemberRecords = []
        
        # 팀장이 아닌 애가 왔을 때
        if session[SessionResources().const.MEMBER_ID] != teamMemberRecords[0].teamMemberId:
            return unknown_error(error = get_message('accessFailed'))
            
        if request.method == 'GET':
            # init
            gTeamMembersId = copy.deepcopy(teamMemberRecords)
            gTeamName, gTeamDescription =None, None
            
            return render_template(HTMLResources().const.TEAM_MANAGE_HTML,
                                   SETResources = SETResources,
                                   SessionResources = SessionResources,
                                   LanguageResources = LanguageResources,
                                   memberRecords = memberRecords,
                                   teamInformation =teamInformation, 
                                   gTeamMembersId = gTeamMembersId,
                                   gTeamName = gTeamName,
                                   gTeamDescription = gTeamDescription)
              
        elif request.method == 'POST':
            # 인풋이 없다면 기존 이름 가져옴
            gTeamName =request.form['teamName'] if request.form['teamName'] else teamInformation.teamName
            gTeamDescription = request.form['teamDescription'] if request.form['teamDescription'] else teamInformation.teamDescription
            for form in request.form:
                
                # Saving Team
                if form == 'saveTeam':
                    # 팀과 팀 멤버 변경은 동시에 업데이트
                    # Update Team
                                        # 중복 팀명 확인
                    if gTeamName != teamName and\
                       not dao.query(check_team_name(gTeamName).subquery()).\
                               first():
                        dao.query(Teams).\
                            filter(Teams.teamName == teamName).\
                            update(dict(teamName = gTeamName,
                                        teamDescription = gTeamDescription))
                    
                    # Update TeamMembers
                    index = 0
                    for raw in teamMemberRecords:
                        if index < len(gTeamMembersId) and\
                           raw.teamMemberId == gTeamMembersId[index].teamMemberId:
                            index += 1
                        # 삭제 팀원 적용
                        else:
                            dao.query(RegisteredTeamMembers).\
                                filter(RegisteredTeamMembers.teamName == teamName,
                                       RegisteredTeamMembers.teamMemberId == raw.teamMemberId).\
                                update(dict(isDeleted = ENUMResources().const.TRUE))
                    # Commit Exception
                    try:
                        dao.commit()
                        #init
                        del gTeamMembersId[:]
                        gTeamName, gTeamDescription = None, None
                        flash(get_message('updateSucceeded'))
                    except Exception:
                        dao.rollback()
                        error =get_message('updateFailed')
                    
                    return redirect(url_for(RouteResources().const.TEAM,
                                            pageNum = 1,
                                            error = error))
                        
                # Invitee Members
                elif form == 'inviteeMember':
                    try:
                        inviteeId = request.form['inviteeId'].split()[0]
                    except Exception:
                        inviteeId = None
                    # teamMember Invitee
                    error = check_invitee_member(inviteeId,
                                                 teamName)
                    
                    return render_template(HTMLResources().const.TEAM_MANAGE_HTML,
                                           SETResources = SETResources,
                                           SessionResources = SessionResources,
                                           LanguageResources = LanguageResources,
                                           memberRecords = memberRecords,
                                           teamInformation = teamInformation, 
                                           gTeamMembersId = gTeamMembersId,
                                           gTeamName = gTeamName,
                                           gTeamDescription = gTeamDescription,
                                           error = error)
                # Delete Members
                elif 'deleteMember' in form:
                    # form의 name이 deleteMemberi -> i=Index이므로 해당 인덱스 값 제거
                    gTeamMembersId.pop(int(form[-1]))
                    
                    return render_template(HTMLResources().const.TEAM_MANAGE_HTML,
                                           SETResources = SETResources,
                                           SessionResources = SessionResources,
                                           LanguageResources = LanguageResources,
                                           memberRecords = memberRecords,
                                           teamInformation = teamInformation, 
                                           gTeamMembersId = gTeamMembersId,
                                           gTeamName = gTeamName,
                                           gTeamDescription = gTeamDescription)
                # Delete Team
                elif form == 'deleteTeam':
                    dao.query(Teams).\
                        filter(Teams.teamName == teamName).\
                        update(dict(isDeleted = ENUMResources().const.TRUE))
                    dao.query(RegisteredTeamMembers).\
                        filter(RegisteredTeamMembers.teamName == teamName).\
                        update(dict(isDeleted = ENUMResources().const.TRUE))
                    dao.query(TeamInvitations).\
                        filter(TeamInvitations.teamName == teamName).\
                        update(dict(isDeleted = ENUMResources().const.TRUE))
                    # Commit Exception
                    try:
                        dao.commit()
                        #init
                        del gTeamMembersId[:]
                        gTeamName, gTeamDescription = None, None
                        flash(get_message('removeTeamSucceeded'))
                    except Exception:
                        dao.rollback()
                        error = get_message('updateFailed')
                        
                    return redirect(url_for(RouteResources().const.TEAM,
                                            pageNum = 1,
                                            error =error))
    except Exception:
        # Unknown Error
        del gTeamMembersId[:]
        gTeamName, gTeamDescription = None, None
        
        return unknown_error()
Esempio n. 29
0
def edit_personal(error = None):
    contactNumber, emailAddress, comment = None, None, None
    try:
        #Get User Information
        try:
            memberInformation = join_member_informations(select_match_member(memberCourseProblemParameter = MemberCourseProblemParameter(memberId = session[SessionResources().const.MEMBER_ID])).subquery()).first()
        except Exception:
            #None Type Exception
            memberInformation = []
        
        #Get Post
        if request.method == 'POST':
            password = request.form['password']
            passwordConfirm = request.form['passwordConfirm'] 
            #Get Updating Data
            contactNumber = request.form['contactNumber']
            emailAddress = request.form['emailAddress'] 
            comment = request.form['comment'] 
            #Password Same
            if(password and passwordConfirm) and password == passwordConfirm:
                #Generate Password
                tripleDes = triple_des(OtherResources().const.TRIPLE_DES_KEY,
                                       mode = ECB,
                                       IV = "\0\0\0\0\0\0\0\0",
                                       pad = None,
                                       padmode = PAD_PKCS5)
                
                # ID, Password NO
                if password == memberInformation.password\
                   or password == memberInformation.memberId:
                    error = get_message('pattenFailed')
                else:
                    
                    password = generate_password_hash(tripleDes.encrypt(str(password)))
                    passwordConfirm = None
                    #Update DB
                    update_member_informations(select_match_member(memberCourseProblemParameter = MemberCourseProblemParameter(memberId = session[SessionResources().const.MEMBER_ID])),
                                               password,
                                               contactNumber,
                                               emailAddress,
                                               comment)
                    # Commit Exception
                    try:
                        dao.commit()
                        flash(get_message('updateSucceeded'))
                        
                        return redirect(url_for(RouteResources().const.SIGN_IN))
                    except Exception:
                        dao.rollback()
                        error = get_message('upateFailed')
                
            #Password Different
            elif not password and not passwordConfirm:
                #Update DB
                update_member_informations(members = select_match_member(memberCourseProblemParameter = MemberCourseProblemParameter(memberId = session[SessionResources().const.MEMBER_ID])),
                                           password = None,
                                           contactNumber = contactNumber,
                                           emailAddress = emailAddress,
                                           comment = comment)
                # Commit Exception
                try:
                    dao.commit()
                    flash(get_message('updateSucceeded'))
                    
                    return redirect(url_for(RouteResources().const.SIGN_IN))
                except Exception:
                    dao.rollback()
                    error = get_message('upateFailed')
            else:
                error = get_message('wrongPassword')
        
        return render_template(HTMLResources().const.EDIT_PERSONAL_HTML,
                               memberInformation = memberInformation,
                               contactNumber = contactNumber,
                               emailAddress = emailAddress,
                               comment = comment,
                               error = error)
    except Exception:
        return unknown_error()
def sign_in():
    '''
    @@ Success sign in flash
    
    When the page redirected from sign up page,
    It display flash message.    
    '''
    if '?' in request.url:
        flash('Signed up successfully')
        
    """ main page before sign in"""
    from GradeServer.utils.utilMessages import get_message
    
    from GradeServer.utils.memberCourseProblemParameter import MemberCourseProblemParameter
    
    from GradeServer.utils.utilArticleQuery import select_notices
    from GradeServer.utils.utilUserQuery import select_match_member
    from GradeServer.utils.utilRankQuery import select_top_coder
    
    from GradeServer.resource.htmlResources import HTMLResources
    from GradeServer.resource.sessionResources import SessionResources

    error = None
    if request.method == 'POST':
        checker = True
        language = {'kr':0, # default
                    'en':1}
        
        for form in request.form:
            if "language" in form:
                checker = False
                lang = request.form['language']
                session['language'] = language[lang]
                
        if checker:        
            if not request.form['memberId']:
                error = '아이디'  + get_message('fillData')
            elif not request.form['password']:
                error = '암호'  + get_message('fillData')
            else:
                try:
                    """ DB Password check """
                    memberId = request.form['memberId'].split()[0]
                    password = request.form['password']
                    
                    check = select_match_member(memberCourseProblemParameter = MemberCourseProblemParameter(memberId = memberId)).first()
                    
                    from werkzeug.security import check_password_hash
                    
                    from GradeServer.GradeServer_py3des import TripleDES
                    
                    #Checking Success
                    if check_password_hash (check.password,
                                            TripleDES.encrypt(str(password))):
                        flash(get_message('login'))
                        #push Session Cache 
                        session[SessionResources().const.MEMBER_ID] = memberId
                        session[SessionResources().const.MEMBER_NAME] = check.memberName
                        session[SessionResources().const.AUTHORITY] = list(check.authority)
                        session[SessionResources().const.LAST_ACCESS_DATE] = datetime.now()
                        
                        # set default language
                        session['language'] = language['kr']
                                                    
                        update_recent_access_date(memberId)
                        # Commit Exception
                        try:
                            dao.commit()
                        except Exception:
                            dao.rollback()
                            error = get_message('updateFailed')
                    else:
                        error = get_message('tryAgain')
                # Not Exist MemberId
                except Exception:
                    error = get_message('notExists')
        
    return render_template(HTMLResources().const.MAIN_HTML,
                           noticeRecords = select_notices(),
                           topCoderId = select_top_coder(),
                           error = error)
def class_manage_problem():
    global projectPath
    global newProblems
    
    modalError = None

    error, allProblems = get_all_problems()
    if error:
        return render_template('/class_manage_problem.html',
                               error = error, 
                               SETResources = SETResources,
                               SessionResources = SessionResources,
                               LanguageResources = LanguageResources,
                               modalError = error,
                               allProblems = [],
                               ownCourses = [],
                               ownProblems = [])
    
    ownCourses = get_own_courses(session[SessionResources().const.MEMBER_ID])
    ownProblems = get_own_problems(session[SessionResources().const.MEMBER_ID])
        
    if request.method == 'POST':
        isNewProblem = True
        numberOfNewProblems = (len(request.form)-1)/7
        keys = {'courseId':0,
                'courseName':1,
                'problemId':2,
                'problemName':3,
                'isAllInputCaseInOneFile':4,
                'startDate':5,
                'endDate':6,
                'openDate':7,
                'closeDate':8}
        
        # courseId,courseName,problemId,problemName,isAllInputCaseInOneFile,startDate,endDate,openDate,closeDate
        newProblem = [['' for _ in range(len(keys.keys()))] for __ in range(numberOfNewProblems+1)]
        for form in request.form:
            if DELETE in form:
                isNewProblem = False
                courseId,problemId = form.split('_')[1:]
                if delete_registered_problem(courseId, problemId):
                    break
                                    
            elif EDIT in form:
                isNewProblem = False
                editTarget,courseId,problemId,targetData = form[5:].split('_')
                targetData = request.form[form]

                # actually editTarget is 'id' value of tag. 
                # That's why it may have 'Tab' at the last of id to clarify whether it's 'all' tab or any tab of each course.
                # so when user pushes one of tab and modify the data,then we need to re-make the editTarget 
                if TAB in editTarget:
                    editTarget = editTarget[:-3]
                for registeredProblem, registeredCourse, problemName in ownProblems:
                    if registeredCourse.courseId == courseId and\
                       registeredProblem.problemId == int(problemId):
                        kwargs = { editTarget : targetData }
                        if update_registered_problem_info(courseId, problemId, dict(**kwargs)):
                            break
                                                
            # addition problem
            else:
                value,index = re.findall('\d+|\D+',form)
                index = int(index)
                data = request.form[form]
                newProblem[index-1][keys[value]] = data
        
        if error:
            return render_template('/class_manage_problem.html',
                                   error = error, 
                                   SETResources = SETResources,
                                   SessionResources = SessionResources,
                                   LanguageResources = LanguageResources,
                                   modalError = modalError,
                                   allProblems = allProblems,
                                   ownCourses = ownCourses,
                                   ownProblems = ownProblems)
            
        # when 'add' button is pushed,insert new problem into RegisteredProblems table
        if isNewProblem:
            for index in range(numberOfNewProblems+1):
                newProblems.append(newProblem[index])
            for problem in newProblems:
                # if openDate,closeDate are empty then same with startDate,endDate
                
                if not problem[keys['openDate']]:
                    problem[keys['openDate']] = problem[keys['startDate']]
                    
                if not problem[keys['closeDate']]:
                    problem[keys['closeDate']] = problem[keys['endDate']]
                    
                if not problem[keys['isAllInputCaseInOneFile']]:
                    problem[keys['isAllInputCaseInOneFile']] = ENUMResources().const.FALSE
                else:
                    problem[keys['isAllInputCaseInOneFile']] = ENUMResources().const.TRUE
                    
                if problem[keys['courseId']]:
                    problem[keys['courseId']],problem[keys['courseName']] = problem[keys['courseId']].split(' ',1)
                    
                if problem[keys['problemId']]:
                    problem[keys['problemId']],problem[keys['problemName']] = problem[keys['problemId']].split(' ',1)
                    try:
                        solutionCheckType = dao.query(Problems).\
                                                filter(Problems.problemId == problem[keys['problemId']]).\
                                                first().solutionCheckType
                    except:
                        error = 'error has been occurred while getting solution check type'
                        return render_template('/class_manage_problem.html',
                                               error = error, 
                                               SETResources = SETResources,
                                               SessionResources = SessionResources,
                                               LanguageResources = LanguageResources,
                                               modalError = modalError,
                                               allProblems = allProblems,
                                               ownCourses = ownCourses,
                                               ownProblems = ownProblems)
                    
                    pathOfTestCase = '%s/%s_%s/%s_%s_%s' % (problemsPath,
                                                            problem[keys['problemId']],
                                                            problem[keys['problemName']],
                                                            problem[keys['problemId']],
                                                            problem[keys['problemName']],
                                                            solutionCheckType)

                    numberOfTestCase = get_case_count(pathOfTestCase, problem[keys['isAllInputCaseInOneFile']])
                                    
                # validation check before insert new problem
                isValid = True
                for key in problem:
                    if not key:
                        isValid = False
                        break
                    
                if not isValid:
                    continue

                newProblem = RegisteredProblems(problemId = problem[keys['problemId']],
                                                courseId = problem[keys['courseId']],
                                                isAllInputCaseInOneFile = problem[keys['isAllInputCaseInOneFile']],
                                                limittedFileSize = limitedFileSize,
                                                numberOfTestCase = numberOfTestCase,
                                                startDateOfSubmission = problem[keys['startDate']],
                                                endDateOfSubmission = problem[keys['endDate']],
                                                openDate = problem[keys['openDate']],
                                                closeDate = problem[keys['closeDate']])
                
                dao.add(newProblem)
                
                try:
                    dao.commit()
                except exc.SQLAlchemyError:
                    dao.rollback()
                    error = 'Error has been occurred while making a new problem'
                    return render_template('/class_manage_problem.html',
                                           error = error, 
                                           SETResources = SETResources,
                                           SessionResources = SessionResources,
                                           LanguageResources = LanguageResources,
                                           modalError = modalError,
                                           allProblems = allProblems,
                                           ownCourses = ownCourses,
                                           ownProblems = ownProblems)

                
                newProblemRecord = SubmittedRecordsOfProblems(problemId = problem[keys['problemId']],
                                                              courseId = problem[keys['courseId']])
                dao.add(newProblemRecord)
                
                try:
                    dao.commit()
                except exc.SQLAlchemyError:
                    dao.rollback()
                    error = 'Error has been occurred while creating new record'
                    return render_template('/class_manage_problem.html',
                                           error = error, 
                                           SETResources = SETResources,
                                           SessionResources = SessionResources,
                                           LanguageResources = LanguageResources,
                                           modalError = modalError,
                                           allProblems = allProblems,
                                           ownCourses = ownCourses,
                                           ownProblems = ownProblems)
                
            newProblems = []
                
            return redirect(url_for('.class_manage_problem'))
        
    ownProblems = get_own_problems(session[SessionResources().const.MEMBER_ID])
    
    return render_template('/class_manage_problem.html',
                           error = error, 
                           SETResources = SETResources,
                           SessionResources = SessionResources,
                           LanguageResources = LanguageResources,
                           modalError = modalError,
                           allProblems = allProblems,
                           ownCourses = ownCourses,
                           ownProblems = ownProblems)
def edit_personal(error = None):
    contactNumber, emailAddress, comment = None, None, None
    try:
        #Get User Information
        try:
            members = select_member(memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]).subquery()
            memberInformation = select_member(memberIdIndex = members.c.memberIdIndex).first()
        except Exception:
            memberInformation = []
        
        #Get Post
        if request.method == 'POST':
            password = get_request_value(form = request.form,
                                         name = 'password')
            passwordConfirm = get_request_value(form = request.form,
                                                name = 'passwordConfirm')
            #Get Updating Data
            contactNumber = get_request_value(form = request.form,
                                              name = 'contactNumber')
            emailAddress = get_request_value(form = request.form,
                                             name = 'emailAddress') 
            comment = get_request_value(form = request.form,
                                        name = 'comment')
            #Password Same
            if(password and passwordConfirm) and password == passwordConfirm:
                #Generate Password
                encryPassword = TripleDES.encrypt(str(password))
                passwordConfirm = None

                password = generate_password_hash(encryPassword)
                #Update DB
                update_members(select_member(memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]),
                               password,
                               contactNumber,
                               emailAddress,
                               comment)
            #Password Different
            elif not password and not passwordConfirm:
                #Update DB
                update_members(members = select_member(memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]),
                               password = None,
                               contactNumber = contactNumber,
                               emailAddress = emailAddress,
                               comment = comment)
            # Commit Exception
            try:
                dao.commit()
                
                return redirect(url_for(RouteResources().const.SIGN_IN))
            except Exception:
                dao.rollback()
                error = LanguageResources().const.DBFailed
        
        return render_template(HTMLResources().const.EDIT_PERSONAL_HTML,
                               memberInformation = memberInformation,
                               contactNumber = contactNumber,
                               emailAddress = emailAddress,
                               comment = comment,
                               error = error)
    except Exception as e:
        return unknown_error(e)
def submission_code(memberIdIndex, status, problemIndex, error = None):
    try:
        # Get endDateOfSubmission of Problem
        # are Not Access. conditions is an Administrator and endOfSubmission ago
        if SETResources().const.ADMINISTRATOR in session[SessionResources().const.AUTHORITY]\
           or memberIdIndex == session[SessionResources().const.MEMBER_ID_INDEX]:
            
            # Get SubmissionIndex
            dataOfSubmissionBoard = select_data_of_submission_board(None,
                                                                    memberIdIndex,
                                                                    problemIndex)
            if dataOfSubmissionBoard.first():
                submissionIndex = dataOfSubmissionBoard.first().submissionIndex
                                # 내가 Code에 누른 좋아요 정보
                try:
                    isLikeCancelled = select_code_is_like(submissionIndex,
                                                          memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX]).first().\
                                                          isLikeCancelled
                except Exception:
                    # Non-Exist Case
                    isLikeCancelled = None
            
                if request.method == 'POST':
                    authorityCheck = is_authority(session[SessionResources().const.AUTHORITY])
                    
                    for form in request.form:
                                        # 댓글 달기
                        if form == 'writeCodeReply':
                                                # 새로운 댓글 정보articleParameter
                            codeReplyContent = get_request_value(form = request.form,
                                                                 name = 'writeCodeReply')
                            
                            if codeReplyContent:
                                dao.add(insert_replies_on_code(submissionIndex,
                                                               memberIdIndex = session[SessionResources().const.MEMBER_ID_INDEX],
                                                               articleParameter = ArticleParameter(title = None,
                                                                                                   content = codeReplyContent,
                                                                                                   updateIp = socket.gethostbyname(socket.gethostname()),
                                                                                                   updateDate = datetime.now())))
                                # remove duplicated read count
                                update_code_view_reply_counting(submissionIndex,
                                                                VIEW_INCREASE = -1,
                                                                REPLY_INCREASE = 1)
                                
                            break 
                                                # 댓글 삭제   
                        elif 'deleteCodeReply' in form:
                            # Get Reply Index
                            replyIndex = len('deleteCodeReply')
                            submissionReplyIndex = int(form[replyIndex:])
                                                  
                            try:
                                writerIndex = select_replies_on_code(submissionIndex = None,
                                                                     submissionReplyIndex = submissionReplyIndex).first()
                            except Exception:
                                writerIndex = None
                            if (authorityCheck[0] or authorityCheck[1])\
                               or writerIndex.codeReplierIdIndex == session['memberIdIndex']:
                                    
                                update_replies_on_code_delete(submissionReplyIndex,
                                                              isDeleted = ENUMResources().const.TRUE)
                                # remove duplicated read count
                                update_code_view_reply_counting(submissionIndex,
                                                                VIEW_INCREASE = -1,
                                                                REPLY_INCREASE = -1)
                            else:
                                error = LanguageResources().const.GetOutHere
                            
                            break 
                        # Commit Modify
                        elif 'modifyCodeReplyContent' in form:
                            replyIndex = len('modifyCodeReplyContent')
                            submissionReplyIndex = int(form[replyIndex:])
                            try:
                                writerIndex = select_replies_on_code(submissionIndex = None,
                                                                     submissionReplyIndex = submissionReplyIndex).first()
                            except Exception:
                                writerIndex = None
                            if writerIndex.codeReplierIdIndex == session['memberIdIndex']:
                                submissionReplyContent = get_request_value(form = request.form,
                                                                           name = 'modifyCodeReplyContent{0}'.format(form[replyIndex:]))
                                
                                if submissionReplyContent:
                                    #update comment
                                    update_replies_on_code_modify(submissionReplyIndex,
                                                                  ArticleParameter(title = None,
                                                                                   content = submissionReplyContent,
                                                                                   updateIp = socket.gethostbyname(socket.gethostname()),
                                                                                   updateDate = datetime.now()))
                                    # remove duplicated read count
                                    update_code_view_reply_counting(submissionIndex,
                                                                    VIEW_INCREASE = -1)
                            else:
                                error = LanguageResources().const.GetOutHere
                                
                            break
                    # end Loop
                    # Commit Exception
                    try:
                        dao.commit()
                    except Exception:
                        dao.rollback()
                        error = LanguageResources().const.DBFailed
                
                try:
                    # replies 정보
                    repliesOnSubmissionRecords = select_replies_on_code(submissionIndex).subquery()
                    repliesOnSubmissionRecords = join_member_id(repliesOnSubmissionRecords,
                                                                repliesOnSubmissionRecords.c.codeReplierIdIndex)
                                        # 내가 게시글 리플에 누른 좋아요 정보
                    repliesOnSubmissionIsLikeRecords = select_replies_on_code_like(repliesOnSubmissionRecords.subquery(),
                                                                                   session[SessionResources().const.MEMBER_ID_INDEX]).all()
                    repliesOnSubmissionRecords = repliesOnSubmissionRecords.all()  
                except Exception:
                    repliesOnSubmissionIsLikeRecords = []
                    repliesOnSubmissionRecords = []
                    
                                # 읽은 횟수 카운팅
                update_code_view_reply_counting(submissionIndex,
                                                VIEW_INCREASE = 1)
                
                # Commit Exception
                try:
                    dao.commit()
                except Exception:
                    dao.rollback()
                    
                # Problem Information (LimitedTime, LimitedMemory
                try:
                    problemName = select_problem(problemIndex = problemIndex).first().\
                                                                              problemName
                except Exception:
                    problemName = None
                    
                # Problem Solved Users
                try:
                    # last Submissions Info
                    lastSubmission = select_last_submissions(memberIdIndex = memberIdIndex,
                                                             problemIndex = problemIndex).subquery()
                    problemSolvedMemberRecords = select_all_submissions(memberIdIndex = memberIdIndex,
                                                                        problemIndex = problemIndex,
                                                                        lastSubmission = lastSubmission).first()
                except Exception:
                    problemSolvedMemberRecords = []
                    
                # Submitted Files Information
                import codecs
                try:
                    submittedFileRecords = select_submitted_files(dataOfSubmissionBoard.subquery()).all()
                    fileData = []
                    
                    for raw in submittedFileRecords:
                        # Open
                        filePath = '{0}/{1}'.format(raw.filePath,
                                                    raw.fileName)
                        # EUC_KR type
                        try:
                            with codecs.open(filePath,
                                             'r',
                                             encoding = 'cp949') as f:
                                # Read
                                data = f.read()
                                fileData.append(data)
                        # UTF-8 Type
                        except Exception:
                            with codecs.open(filePath,
                                             'r',
                                             encoding = 'utf8') as f:
                                # Read
                                data = f.read()
                                fileData.append(data)
                except Exception:
                    submittedFileRecords = []
                    fileData = []
                    
                return render_template(HTMLResources().const.SUBMISSION_CODE_HTML,
                                       memberIdIndex = memberIdIndex,
                                       submissionIndex = submissionIndex,
                                       submittedFileRecords = submittedFileRecords,
                                       fileData = fileData,
                                       problemName = problemName,
                                       problemSolvedMemberRecords = problemSolvedMemberRecords,
                                       isLikeCancelled = isLikeCancelled,
                                       sumOfLikeCount = dataOfSubmissionBoard.first().\
                                                                              sumOfLikeCount,
                                       repliesOnSubmissionIsLikeRecords = repliesOnSubmissionIsLikeRecords,
                                       repliesOnSubmissionRecords = repliesOnSubmissionRecords,
                                       browserName = request.user_agent.browser,
                                       browserVersion = request.user_agent.version,
                                       error = error)
        #Access Rejection
        else:
            return redirect(url_for(RouteResources().const.PROBLEM_RECORD,
                                    status = status,
                                    problemIndex = problemIndex,
                                    sortCondition = LanguageResources().const.SubmissionDate[1]))
    except Exception as e:
        return unknown_error(e)
Esempio n. 34
0
def write(activeTabCourseId, articleIndex, error =None):
    title, content, articlesOnBoard = None, None, None
    try:
        # 수강  과목 정보
        myCourses = select_current_courses(select_accept_courses().subquery()).subquery()
        
        # Modify Case
        if articleIndex > 0: 
            try:
                articlesOnBoard = join_courses_names(select_article(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                                                    isDeleted = ENUMResources().const.FALSE).subquery(),
                                                     myCourses).first()
            except Exception:
                articlesOnBoard = []
                        
        try:
            myCourses = dao.query(myCourses).all()
        except Exception:
            myCourses = []
                # 작성시 빈칸 검사
        if request.method == 'POST':
            # Not None
            try:
                courseId = request.form['courseId']
                # request.form['courseId']가 ex)2015100101 전산학 실습 일경우 중간의 공백을 기준으로 나눔
                courseId = courseId.split()[0]
                if courseId == OtherResources().const.ALL:
                    courseId = None
                    
                                # 타이틀 가져오기
                title = request.form['title']
                # Get Exist Content
                content = request.form['content']
            
                if not title:
                    error ='제목' +get_message('fillData')
                elif not request.form['content']:
                    error ='내용' +get_message('fillData')
                elif len(title) > 50:
                    error = 'Title is too long. please write less than 50 letters'
                # All Fill InputText
                else:
                    isNotice = ENUMResources().const.TRUE
                    currentDate = datetime.now()
                    currentIP = socket.gethostbyname(socket.gethostname())
                                        # 새로 작성
                    if articleIndex == 0:
                        # Set isNotice
                        if SETResources().const.USER in session['authority']: 
                            isNotice = ENUMResources().const.FALSE
                            # user None courseId reject 
                            
                        newPost = ArticlesOnBoard(problemId = None,
                                                  courseId = courseId,
                                                  writerId = session[SessionResources().const.MEMBER_ID],
                                                  isNotice = isNotice,
                                                  title = title,
                                                  content = content,
                                                  writtenDate = currentDate,
                                                  writerIp = currentIP)
                        dao.add(newPost)
                        # Commit Exception
                        try:
                            dao.commit()
                            flash(get_message('writtenPost'))
                        except Exception:
                            dao.rollback()
                            error =get_message('updateFailed')
                            
                        return redirect(url_for(RouteResources().const.BOARD,
                                                activeTabCourseId = activeTabCourseId,
                                                pageNum = 1))
                                        # 게시물 수정    
                    else:
                                                # 수정 할 글 정보
                        articlesOnBoard = select_article(articleParameter = ArticleParameter(articleIndex = articleIndex),
                                                         isDeleted = ENUMResources().const.FALSE).update(dict(courseId = courseId,
                                                                                                              title = title,
                                                                                                              content = content,
                                                                                                              writtenDate = currentDate,
                                                                                                              writerIp = currentIP))
                        
                        # Commit Exception
                        try:
                            dao.commit()
                            flash(get_message('modifiedPost'))
                        except Exception:
                            dao.rollback()
                            error =get_message('updateFailed')
                        
                        return redirect(url_for(RouteResources().const.ARTICLE_READ,
                                                activeTabCourseId = activeTabCourseId,
                                                articleIndex = articleIndex))
            except Exception:
                # User None Course Posting Rejection
                if SETResources().const.USER in session['authority']:
                    error = get_message('banPosting')
                else:
                    error = get_message()
            
                
        return render_template(HTMLResources().const.ARTICLE_WRITE_HTML,
                               SETResources = SETResources,
                               SessionResources = SessionResources,
                               LanguageResources = LanguageResources,
                               myCourses = myCourses,
                               articlesOnBoard = articlesOnBoard,
                               title = title,
                               content = content,
                               error = error)
    except Exception:
        # Unknown Error
        return unknown_error()
Esempio n. 35
0
def manage_user(filterCondition, keyWord, sortCondition, pageNum, error=None):
    # Not Accept URL Check

    if sortCondition not in (LanguageResources().const.ID[1],
                             LanguageResources().const.Name[1]):
        return page_not_found()

    try:
        # Request Post
        if request.method == 'POST':
            # Search Event
            # FilterCondition
            if len(request.form) <= 2 and 'keyWord' in request.form:
                for form in request.form:
                    if 'keyWord' != form:
                        filterCondition = form
                        keyWord = get_request_value(form=request.form,
                                                    name='keyWord')
                        pageNum = 1

                        break
            elif is_authority(session[SessionResources().const.AUTHORITY])[0]:
                if 'memberDeleted' in request.form:
                    for form in request.form:
                        if 'member' not in form and 'keyWord' not in form:
                            memberIdIndex = form
                            # Get Folder Path
                            member = select_member(
                                memberIdIndex=memberIdIndex).first()

                            try:
                                update_member_deleted(memberIdIndex)
                                dao.commit()

                                userPath = '{0}/Current/{1}_{2}'.format(
                                    projectPath, member.memberId,
                                    member.memberName)
                                # Delete Folder
                                if os.path.exists(userPath):
                                    shutil.rmtree(userPath)
                            except Exception:
                                dao.rollback()
                                error = LanguageResources().const.DBFailed
                else:
                    for form in request.form:
                        # Insert Indivisual
                        if 'memberInsert' in form:
                            insertCount = int(form[len('memberInsert'):]) + 1

                            for i in range(1, insertCount):
                                # Get Input Data
                                detailInformation = get_request_value(
                                    form=request.form,
                                    name='detailInformation{0}'.format(i))
                                memberId = get_request_value(
                                    form=request.form,
                                    name='memberId{0}'.format(i))
                                memberName = get_request_value(
                                    form=request.form,
                                    name='memberName{0}'.format(i))

                                if memberId\
                                   and memberName:
                                    try:
                                        memberIdIndex = select_match_member_id(memberId).first().\
                                                                                         memberIdIndex
                                    except Exception:
                                        memberIdIndex = None
                                    try:
                                        error = insert_member_registration(
                                            memberIdIndex=memberIdIndex,
                                            memberId=memberId,
                                            memberName=memberName,
                                            password=generate_password_hash(
                                                TripleDES.encrypt(
                                                    str(memberId))),
                                            detailInformation=detailInformation
                                        )
                                        dao.commit()

                                        # Get Folder Path
                                        userPath = '{0}/Current/{1}_{2}'.format(
                                            projectPath, memberId, memberName)
                                        # make Folders
                                        if not os.path.exists(userPath):
                                            os.makedirs(userPath)
                                    except Exception:
                                        dao.rollback()
                                        error = LanguageResources(
                                        ).const.DBFailed
                                else:
                                    error = LanguageResources(
                                    ).const.FormValidation
            else:
                error = LanguageResources().const.GetOutHere

        # Get Users
        try:
            members = select_members().subquery()
            # Filter Case
            if filterCondition\
               and filterCondition != ' ':
                if not keyWord:
                    keyWord = ' '
                members = search_members(
                    members,
                    FilterFindParameter(filterCondition=filterCondition,
                                        keyWord=(keyWord if keyWord != ' ' else
                                                 ''))).subquery()
            count = select_count(members.c.memberIdIndex).first().\
                                                          count
            memberRecords = get_page_record(members_sorted(
                members, sortCondition),
                                            pageNum=pageNum)
        except Exception:
            count = 0
            memberRecords = []

        return render_template(
            '/manage_user.html',
            # 검색시 FilterCondition List
            Filters=[
                LanguageResources().const.All,
                LanguageResources().const.ID,
                LanguageResources().const.Name
            ],
            sortCondition=sortCondition,
            filterCondition=filterCondition,
            keyWord=keyWord,
            memberRecords=memberRecords,
            pages=get_page_pointed(pageNum, count),
            count=count,
            error=error)
    except Exception as e:
        return unknown_error(e)