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'])
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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))
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)
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)