Пример #1
0
def translate():
    client_ip = request.environ.get('REMOTE_ADDR')
    if client_ip not in ['52.196.144.144', '121.128.220.114']:
        return make_response(json.jsonify(message='Unauthorized'), 401)

    parameters = parse_request(request)
    user_email = parameters['user_email']
    sentence = parameters['sentence']
    source_lang_id = int(parameters['source_lang_id'])
    target_lang_id = int(parameters['target_lang_id'])
    where = parameters['where']

    # Check a user is member or not
    if user_email not in ['*****@*****.**']:
        print(user_email)
        return make_response(json.jsonify(message='Forbidden'), 403)

    # Real work
    is_ok, result = translator.doWork(source_lang_id, target_lang_id, sentence)
    if is_ok == False:
        return make_response(json.jsonify(message=""), 400)

    elif is_ok == True and where != 'web':
        return make_response(json.jsonify(**result), 200)

    elif is_ok == True and where == 'web':
        return render_template('layout.html', translatedText=result['google'])
Пример #2
0
    def adminKangarooTagUpdateImageBinary(self, tag_id, img_id, filename):
        """
        이미지 업데이트 API

        **Parameters**
          #. **"tag_id"**: URL에 직접 삽입, Tag ID
          #. **"img_id"**: URL에 직접 삽입. Image ID
          #. **"x"**: x 좌표
          #. **"y"**: y 좌표
          #. **"w"**: width
          #. **"h"**: height

        **Response**
          #. **200**: 업데이트 성공
          #. **410**: 실패
        """
        kangarooAdminObj = KangarooAdmin(g.db_kang)
        parameters = ciceron_lib.parse_request(request)
        x = parameters.get("x", None)
        y = parameters.get("y", None)
        w = parameters.get("w", None)
        h = parameters.get("h", None)
       
        location = [ float(value) for value in (x,y,w,h) ]
        if not location:
            return make_response(json.jsonify(message = "location not entered."), 400)

        is_updated = kangarooAdminObj.updateImageOfTag(img_id, location)
        if is_updated == True:
            g.db_kang.commit()
            return make_response(json.jsonify(message = "Change Image Successfully"), 200)
        else:
            g.db_kang.rollback()
            return make_response(json.jsonify(message = "Something Wrong"), 410)
    def translator(self):
        """
        CICERON 내부 번역기 API

        **Parameters**
          #. **"source_lang_id"**: Int, 원문의 언어 ID
          #. **"target_lang_id"**: Int, 번역문의 언어 ID
          #. **"sentence"**: String, 원어

        **Response**
          #. 200

            .. code-block:: json
               :linenos:

               {
                 "result": "Blahblah" // Request ID
               }

        """
        #client_ip = request.environ.get('REMOTE_ADDR')
        #if client_ip not in ['52.196.144.144', '121.128.220.114']:
        #    return make_response(json.jsonify(
        #        message='Unauthorized'), 401)

        translateObj = CiceronTranslator()
        parameters = ciceron_lib.parse_request(request)
        source_lang = parameters['source_lang_id']
        target_lang = parameters['target_lang_id']
        sentence = parameters['sentence']

        result = translateObj.ciceronTranslate(source_lang, target_lang, sentence)
        return make_response(json.jsonify(result=result), 200)
Пример #4
0
    def pretranslatedRateResult(self, project_id, resource_id):
        """
        번역물 평점 먹이기

        **Parameters**
          #. **"project_id"**: 프로젝트 ID (URL)
          #. **"resource_id"**: 리소스 ID (URL)
          #. **"score"**: 1-5점까지의 피드백 점수
        
        **Response**
          #. **200**: OK
          #. **405**: Fail

        """
        pretranslatedObj = Pretranslated(g.db)
        email = session['useremail']
        parameters = ciceron_lib.parse_request(request)
        score = parameters['score']

        is_rated = pretranslatedObj.rateTranslatedResult(
            resource_id, email, score)

        if is_rated == True:
            g.db.commit()
            return make_response(json.jsonify(message="OK"), 200)

        else:
            g.db.rollback()
            return make_response(json.jsonify(message="Fail"), 405)
Пример #5
0
    def addUserForDownload(self, project_id, resource_id):
        """
        다운로드 유저 추가

        **Parameters**
          #. **"email"**: 이메일. 프론트에서는 로그인되어 있다면 세션의 'useremail'을 따 와서 자동으로 입력했으면 하는 소망이 있음.
          #. **"project_id"**: 프로젝트 ID. URL에 직접 삽입
          #. **"resource_id"**: 구매한 번역물의 ID. URL에 직접 삽입

        **Response**
          **200**: 성공

          **410**: 똑같은 번역물 중복구매시도
          
          **411**: DB Error

        """
        pretranslatedObj = Pretranslated(g.db)
        parameters = ciceron_lib.parse_request(request)
        email = parameters['email']
        # 다운로드한 유저 목록에 추가
        is_added = pretranslatedObj.addUserAsDownloader(resource_id, email)
        if is_added == 2:
            g.db.rollback()
            return make_response(
                json.jsonify(message="Multiple request in one request_id"),
                410)
        elif is_added == 1:
            g.db.rollback()
            return make_response(json.jsonify(message="DB error"), 411)
        else:
            g.db.commit()
            return make_response("OK", 200)
Пример #6
0
    def pretranslatedCreateResource(self, project_id):
        """
        번역물 리소스 생성 API

        **Parameters**
          #. **"project_id"**: 프로젝트 ID (URL)
          #. **"target_language_id"**: 번역 타겟 언어 ID (원 언어일수도 있음)
          #. **"theme"**: 제목
          #. **"description"**: 번역물 설명
          #. **"tone_id"**: 번역물 톤 ID
          #. **"read_permission_level"**: 접근 레벨
          #. **"price"**: 가격 in USD
          #. **"is_original"**: Boolean

        **Response**
          #. **200**: 게시 성공

            .. code-block:: json
               :linenos:

               {
                 "resource_id": 1 // Request ID
               }

          #. **410**: 게시 실패 

        """
        pretranslatedObj = Pretranslated(g.db)
        parameters = ciceron_lib.parse_request(request)
        for key in parameters.keys():
            if key not in [
                    'target_language_id', 'theme', 'description', 'tone_id',
                    'read_permission_level', 'price', 'is_original'
            ]:
                return make_response("Bad request", 400)
        is_original = parameters['is_original']
        parameters['project_id'] = project_id
        parameters.pop('is_original')
        is_ok, resource_id = pretranslatedObj.createResource(**parameters)

        if is_ok == False:
            g.db.rollback()
            return make_response("Fail", 410)

        if ciceron_lib.parameter_to_bool(is_original) == True:
            is_linked = pretranslatedObj.linkResourceToProject(
                parameters['project_id'], resource_id)

            if is_linked == False:
                g.db.rollback()
                return make_response("Fail", 410)

        g.db.commit()
        return make_response(
            json.jsonify(resource_id=resource_id, message="OK"), 200)
Пример #7
0
    def translatorVote(self):
        voteTranslationResultObj = VoteTranslationResult(g.db)
        parameters = ciceron_lib.parse_request(request)

        result_id = parameters['result_id']
        versus = parameters['versus']
        vote_to = parameters['vote_to']

        is_ok = voteTranslationResultObj.vote(result_id, versus, vote_to)
        if is_ok == True:
            g.db.commit()
            return make_response("OK", 200)
        else:
            g.db.rollback()
            return make_response("Fail", 410)
Пример #8
0
    def pretranslatedCreateProject(self):
        """
        프로젝트 열기

        **Parameters**
          #. **"original_lang_id"**: 원 언어 ID
          #. **"format_id"**: 포맷 ID
          #. **"subject_id"**: 주제 ID
          #. **"author"**: 원작자
          #. **"cover_photo"**: 사진파일

        **Response**
          #. **200**: 추가 성공

            .. code-block:: json
               :linenos:

               {
                 "project_id": 1 // Request ID
               }

          #. **410**: 추가 실패 

        """
        pretranslatedObj = Pretranslated(g.db)
        parameters = ciceron_lib.parse_request(request)
        for key in parameters.keys():
            if key not in [
                    'original_lang_id', 'format_id', 'subject_id', 'author',
                    'cover_photo'
            ]:
                print(key)
                return make_response("Bad request", 400)

        cover_photo_obj = request.files['cover_photo']
        #parameters.pop('cover_photo')
        parameters['cover_photo_filename'] = cover_photo_obj.filename
        parameters['cover_photo_binary'] = cover_photo_obj.read()
        is_ok, project_id = pretranslatedObj.createProject(**parameters)
        if is_ok == True:
            g.db.commit()
            return make_response(
                json.jsonify(message="OK", project_id=project_id), 200)

        else:
            g.db.rollback()
            return make_response("Fail", 410)
Пример #9
0
    def adminKangarooTagUpdate(self):
        """
        태그에 정보 넣기

        **Parameters**
          #. **"tag_id"**: Int, Tag ID
          #. **"category_level_1"**: Int
            #. 1 - 장소
            #. 2 - 활동
            #. 3 - 요리
            #. 4 - 재료
            #. 5 - Others
          #. **"category_level_2"**: Int
            #. 1 - 장소
            #. 2 - 활동
            #. 3 - 한식
            #. 4 - 중식
            #. 5 - 일식
            #. 6 - 요리/Others
            #. 7 - 육류
            #. 8 - 어류
            #. 9 - 조류
            #. 10 - 채소
            #. 11 - 과일
            #. 12 - 공산품
            #. 13 - 동물
            #. 14 - 식물
            #. 15 - 물건
            #. 16 - 자연경관
        """
        kangarooAdminObj = KangarooAdmin(g.db_kang)
        parameters = ciceron_lib.parse_request(request)
        tag_id = parameters.get("tag_id", None)
        category1 = parameters.get("category_level_1", None)
        category2 = parameters.get("category_level_2", None)

        is_updated = kangarooAdminObj.updateTagInfo(tag_id, category1, category2)
        if is_updated == True:
            g.db_kang.commit()
            return make_response(json.jsonify(message = "Updated Successfully"), 200)
        else:
            g.db_kang.rollback()
            return make_response(json.jsonify(message = "Something Wrong"), 405)
Пример #10
0
    def translatorStore(self):
        voteTranslationResultObj = VoteTranslationResult(g.db)
        parameters = ciceron_lib.parse_request(request)

        source_lang = parameters['source_lang']
        target_lang = parameters['target_lang']
        original_text = parameters['original_text']
        google_result = parameters['google_result']
        bing_result = parameters['bing_result']
        ciceron_result= parameters['ciceron_result']
        papago_result= parameters['papago_result']
        
        is_ok, new_id = voteTranslationResultObj.write(source_lang, target_lang,
                                                       original_text, google_result, bing_result, ciceron_result, papago_result)
        if is_ok == True:
            g.db.commit()
            return make_response(flaskjson.jsonify(new_id=new_id), 200)

        else:
            g.db.rollback()
            return make_response("Fail", 410)
Пример #11
0
    def pretranslatedCreateFile(self, project_id, resource_id):
        """
        파일 업로드 API

        **Parameters**
          #. **"project_id"**: 프로젝트 ID (URL)
          #. **"resource_id"**: Resource ID (URL)
          #. **"preview_permission"**: 미리보기 권한
          #. **"file_list[]"**: 파일 목록

        **Response**
          #. **200**: 게시 성공

            .. code-block:: json
               :linenos:

               {
                 "resource_id": 1 // Request ID
               }

          #. **410**: 게시 실패 

        """
        pretranslatedObj = Pretranslated(g.db)
        parameters = ciceron_lib.parse_request(request)
        upload_files = request.files.getlist("file_list[]")
        parameters['project_id'] = project_id
        parameters['resource_id'] = resource_id

        for upload_file in upload_files:
            parameters['file_name'] = upload_file.filename
            parameters['file_binary'] = upload_file.read()
            is_ok, file_id = pretranslatedObj.createFile(**parameters)
            if is_ok == False:
                g.db.rollback()
                return make_response("Fail", 410)

        else:
            g.db.commit()
            return make_response("OK", 200)
Пример #12
0
    def pretranslatedUpdateFileInfo(self, project_id, resource_id, file_id):
        """
        파일 수정 API

        **Parameters**
          #. **"file_id"**: 파일 ID (URL)
          #. **"preview_permission"**: 미리보기 권한
          #. **"file"**: 파일

        **Response**
          #. **200**: 업데이트 성공

            .. code-block:: json
               :linenos:

               {
                 "message": "OK" // Request ID
               }

          #. **410**: 게시 실패 

        """
        pretranslatedObj = Pretranslated(g.db)
        parameters = ciceron_lib.parse_request(request)
        if "file" in request:
            file_obj = request.files['file']
            parameters['file_name'] = file_obj.filename
            parameters['file_binary'] = file_obj.read()
            parameters.pop('file')

        is_ok = pretranslatedObj.updateFile(file_id, **parameters)
        if is_ok == True:
            g.db.commit()
            return make_response("OK", 200)

        else:
            g.db.rollback()
            return make_response("Fail", 410)
Пример #13
0
    def pretranslatedUpdateProjectInfo(self, project_id):
        """
        프로젝트 정보 업데이트

        **Parameters (ALL OPTIONAL)**
          #. **"project_id"**: Project ID (URL)
          #. **"original_lang_id"**: 원문 언어
          #. **"format_id"**: 포맷 ID
          #. **"subject_id"**: 주제 ID
          #. **"author"**: 원작자명
          #. **"cover_photo"**: 커버 사진
          #. **"target_laguage_id"**: 번역문 언어
          #. **"theme"**: 제목
          #. **"description"**: 설명
          #. **"tone_id"**: 톤 ID
          #. **"read_permission_level"**: 권한 ID

        **Response**
          #. **200**: OK
          #. **410**: Fail
          
        """
        pretranslatedObj = Pretranslated(g.db)
        parameters = ciceron_lib.parse_request(request)
        if "cover_photo" in request:
            cover_photo_obj = request.files['cover_photo']
            parameters['cover_photo_filename'] = cover_photo_obj.filename
            parameters['cover_photo_binary'] = cover_photo_obj.read()
            parameters.pop('cover_photo')

        is_ok = pretranslatedObj.updateProjectInfo(project_id, **parameters)
        if is_ok == True:
            g.db.commit()
            return make_response("OK", 200)

        else:
            g.db.rollback()
            return make_response("Fail", 410)
Пример #14
0
    def pretranslatedUpdateResourceInfo(self, project_id, resource_id):
        """
        번역물 리소스 수정 API

        **Parameters** (All OPTIONAL)
          #. **"resource_id"**: 프로젝트 ID (URL)
          #. **"target_language_id"**: 번역 타겟 언어 ID (원 언어일수도 있음)
          #. **"theme"**: 제목
          #. **"description"**: 번역물 설명
          #. **"tone_id"**: 번역물 톤 ID
          #. **"read_permission_level"**: 접근 레벨
          #. **"price"**: 가격 in USD

        **Response**
          #. **200**: 업데이트 성공

            .. code-block:: json
               :linenos:

               {
                 "message": "OK" // Request ID
               }

          #. **410**: 업데이트 실패 

        """
        pretranslatedObj = Pretranslated(g.db)
        parameters = ciceron_lib.parse_request(request)
        is_ok = pretranslatedObj.updateResource(resource_id, **parameters)
        if is_ok == True:
            g.db.commit()
            return make_response("OK", 200)

        else:
            g.db.rollback()
            return make_response("Fail", 410)
Пример #15
0
    def localizer(self):
        """
        POST /api/v1/user/localizer
        POST /api/v2/user/localizer

        Parameters
          :'binary': 파일 binary
          :'target_lang': 프론트엔트의 언어 파일 ISO code (eg. 'en', 'ko', 'ja', ...)

        Response
          :200: ZIP 압축 파일
        """

        parameters = ciceron_lib.parse_request(request)
        file_binary = request.files['binary']
        file_name = file_binary.filename
        target_lang = parameters['target_lang']

        localizer = Localizer(file_name, file_binary)
        return_binary = localizer.run(target_lang)

        return send_file(
            io.BytesIO(return_binary),
            attachment_filename="{}_localized.zip".format(file_name))
Пример #16
0
    def dataImport(self):
        """
        데이터 입력
          #. **이 정보는 formdata로 넣기에는 구조가 매우 복잡하니 여기만은 Content-Type: application/json으로 넣도록 한다!**
          #. **Parameters**

            .. code-block:: json
               :linenos:

                 {
                   "original_language_id": 1,
                   "target_language_id": 2,
                   "subject_id": 3,
                   "format_id": 3,
                   "tone_id":2,
                   "data": [
                     {
                       "paragraph_id": 1,
                       "sentences": [
                         {
                           "sentence_id": 1,
                           "original_sentence": "우앙 ㅋ 굿 ㅋ",
                           "translated_sentence": "Wow, f**k yeh!"
                         },
                         {
                           "sentence_id": 2,
                           "original_sentence": "파싱이 잘 됩니다!~",
                           "translated_sentence": "Wow, f**k yeh!"
                         }
                       ]
                     },
                     {
                       "paragraph_id": 2,
                       "sentences": [
                         {
                           "sentence_id": 1,
                           "original_sentence": "그냥 그렇다",
                           "translated_sentence": "So so"
                         }
                       ]
                     }
                   ]
                 }

          #. **Response**
            #. **200**: OK
            #. **210**: Fail, pair missmatch

              .. code-block:: json
                 :linenos:

                 {
                   "paragraph_id": 2,
                   "sentence_id": 3
                 }

            #. **410**: Fail, DB Error

        """
        # SentenceExporter 인스턴스 생성
        sentenceExporter = SentenceExporter(g.db)

        # parse_request 함수로 request json 파싱
        jsonParameter = ciceron_lib.parse_request(request)

        resp_code = sentenceExporter.importSentences(jsonParameter)

        if resp_code == 200:
            g.db.commit()
            return make_response("OK", 200)

        elif resp_code == 210:
            return make_response("fail, pair missmatch", 210)

        elif resp_code == 410:
            return make_response("Fail DB error", 410)
Пример #17
0
    def pretranslatedSendToMail(self, project_id, resource_id):
        """
        구매한 번역 메일로 링크 전송

        **Parameters**
          #. **"project_id"**: Project ID. (URL)
          #. **"resource_id"**: 구매한 번역물의 ID. (URL)
          #. **"email"**: 이메일. 프론트에서는 로그인되어 있다면 세션의 'useremail'을 따 와서 자동으로 입력했으면 하는 소망이 있음.

        **Response**
          **200**: 성공

          **411**: 금액지불요함

          **412**: 주어진 Request_id인 번역물이 존재하지 않음

          **413**: 메일 전송 실패

        """
        pretranslatedObj = Pretranslated(g.db)
        parameters = ciceron_lib.parse_request(request)
        email = parameters['email']

        # 보안을 위하여 Token 제작
        is_issued, checksums_and_fileId = pretranslatedObj.calcChecksumForEmailParams(
            resource_id, email)
        if is_issued == False:
            g.db.rollback()
            return make_response(
                json.jsonify(
                    message="No pretranslated result by given request_id"),
                412)

        # 지불여부 체크
        is_paid = pretranslatedObj.checkIsPaid(resource_id, email)
        if is_paid > 0:
            return make_response(json.jsonify(message="Need payment"), 411)

        # 링크 제작하고 메일로 전송
        downloadable_links = []
        for item in checksums_and_fileId:
            file_id = item['file_id']
            checksum = item['checksum']
            downloadable_link = pretranslatedObj.generateDownloadableLink(
                self.endpoints[-1], resource_id, file_id, email, checksum)
            downloadable_links.append(downloadable_link)

        href_part = pretranslatedObj._hrefTagMaker(downloadable_links)

        f = open('templates/pretranslatedDownloadMail.html', 'r')
        mail_content = f.read().format(href_part='\n'.join(href_part))
        f.close()
        try:
            ciceron_lib.send_mail(
                email, "Here is the link of your download request!",
                mail_content)
        except:
            g.db.rollback()
            return make_response(json.jsonify(message="Mail send failure"),
                                 413)

        g.db.commit()
        return make_response(json.jsonify(message="OK"), 200)