def return_from_postfinance(request): """Client is returnting from postfinance""" # Get transaction pk orderId = request.GET.get('orderID') (who, pk) = orderId.split('-', 2) if who != 'polybanking': raise Http404 # Get transaction t = get_object_or_404(Transaction, pk=pk, config__active=True, config__admin_enable=True) if t.internal_status == 'cr': raise Http404 postFinance = buildPostFinance(t.config.test_mode) # Check sign args = {} for a in request.GET: if a != 'SHASIGN': val = request.GET.get(a) if val: args[a.upper()] = val if request.GET.get('SHASIGN').upper() != postFinance.computeOutSign( args).upper(): raise Http404 # Let's catch the ID if not t.postfinance_id: t.postfinance_id = request.GET.get('PAYID') TransactionLog(transaction=t, log_type='postfinanceId', extra_data=utils.get_client_ip(request)).save() t.internal_status = 'fb' t.last_user_back_from_postfinance_date = now() t.save(update_fields=[ 'internal_status', 'last_user_back_from_postfinance_date', 'postfinance_id' ]) TransactionLog(transaction=t, log_type='userBackFromPostfinance', extra_data=utils.get_client_ip(request)).save() # 9 or 5 are good signs if request.GET.get('STATUS') in ['9', '5']: return HttpResponseRedirect(t.config.url_back_ok) else: return HttpResponseRedirect(t.config.url_back_err)
def go(request, pk): """Redirect the user to the postfinance website""" # Get transaction t = get_object_or_404(Transaction, pk=pk, config__active=True, config__admin_enable=True) if t.internal_status == 'fb': raise Http404 postFinance = buildPostFinance(t.config.test_mode) fields = { 'AMOUNT': str(t.amount), 'ORDERID': 'polybanking-' + str(t.pk), 'PSPID': postFinance.getPspIp(), 'CURRENCY': 'CHF', } fields['SHASIGN'] = postFinance.computeInSign(fields) if t.config.test_mode: urlDest = settings.POSTFINANCE_TEST_URL else: urlDest = settings.POSTFINANCE_PROD_URL TransactionLog(transaction=t, log_type='userForwarded', extra_data=utils.get_client_ip(request)).save() t.internal_status = 'fw' t.last_userforwarded_date = now() t.save(update_fields=['internal_status', 'last_userforwarded_date']) return render(request, 'paiements/go.html', {'fields': fields, 'urlDest': urlDest})
def reports(self, request, pk=None): """ 리뷰 신고 --- 헤더 값 <br> IDREGISTER (필수) """ cuid = int(request.META.get('HTTP_IDREGISTER') or 0) params = ReviewReportForm(data=request.data) params.is_valid(raise_exception=True) client_ip = get_client_ip(request) report_type = params.validated_data.get('report_type') contents = params.validated_data.get('contents') review = get_object_or_404(Review, id=pk) if cuid == review.user_id: raise InvalidParameterException() if review_service.has_report(pk, cuid): raise ConflictException( _("이미 신고한 리뷰입니다.") ) review_service.create_report(pk, cuid, client_ip, report_type, contents, review.user_id) # 리뷰 신고 카운트 증가 review.report_count += 1 review.save() return Response({}, status=status.HTTP_201_CREATED)
def return_from_postfinance(request): """Client is returnting from postfinance""" # Get transaction pk orderId = request.GET.get('orderID') (who, pk) = orderId.split('-', 2) if who != 'polybanking': raise Http404 # Get transaction t = get_object_or_404(Transaction, pk=pk, config__active=True, config__admin_enable=True) if t.internal_status == 'cr': raise Http404 postFinance = buildPostFinance(t.config.test_mode) # Check sign args = {} for a in request.GET: if a != 'SHASIGN': val = request.GET.get(a) if val: args[a.upper()] = val if request.GET.get('SHASIGN').upper() != postFinance.computeOutSign(args).upper(): raise Http404 # Let's catch the ID if not t.postfinance_id: t.postfinance_id = request.GET.get('PAYID') TransactionLog(transaction=t, log_type='postfinanceId', extra_data=utils.get_client_ip(request)).save() t.internal_status = 'fb' t.last_user_back_from_postfinance_date = now() t.save(update_fields=['internal_status', 'last_user_back_from_postfinance_date', 'postfinance_id']) TransactionLog(transaction=t, log_type='userBackFromPostfinance', extra_data=utils.get_client_ip(request)).save() # 9 or 5 are good signs if request.GET.get('STATUS') in ['9', '5']: return HttpResponseRedirect(t.config.url_back_ok) else: return HttpResponseRedirect(t.config.url_back_err)
def join(self, request, pk=None): """ 이벤트 참여추가 --- <br> <b>헤더</b> - IDREGISTER: (필수) 회원 항번 <br> """ cuid = int(request.META.get('HTTP_IDREGISTER') or 0) event = get_object_or_raise_404(Event, id=pk) user = get_object_or_raise_404(User, id=cuid) if EventParticipants.objects.filter(user=user, event=event).exists(): raise ConflictException(_("이미 이벤트에 참여하셨습니다.")) if user.review_count < event._condition: raise FailedPreconditionException( _("{} 개 이상의 리뷰를 작성한 회원만 참여할 수 있는 이벤트 입니다.\n" "회원님께서는 {} 개의 리뷰를 더 작성하셔야 합니다.".format( event._condition, event._condition - user.review_count))) response = dict() user_ip = get_client_ip(request) now = local_now().strftime('%Y%m%d%H%M%S') try: with transaction.atomic(): # RDS EventComment(event=event, user=user, comment="참가신청 완료", ip_address=user_ip, create_date=now).save() EventParticipants(user=user, event=event, create_date=now).save() _count = event.users.count() + 1 # dynamo DB aws_dynamodb_etc_list.update_events_comment( seq=event.seq, comment_count=_count) aws_dynamodb_event_participants.update_event(event_id=event.id, user_id=user.id, created_at=now) aws_dynamodb_events.update_event_comments_count( event_id=event.id, _count=_count) response['is_success'] = True response['message'] = _("이벤트에 참여되었습니다.") except: response['is_success'] = False response['message'] = _("등록에 실패하였습니다.") return Response(SuccessMessageResponse(response).data, status=status.HTTP_201_CREATED)
def ipn(request): """Call by Postfinance website about status""" # Get transaction pk orderId = request.POST.get('orderID', '') if '-' in orderId: (who, pk) = orderId.split('-', 2) else: #should also raise an error return build_error('UNVALID_ ID') if who != 'polybanking': return build_error('UNVALID_BANK', error_code=404) # Get transaction t = get_object_or_404(Transaction, pk=pk, config__active=True, config__admin_enable=True) if t.internal_status == 'cr': return build_error('UNVALID_STATUS', error_code=404) postFinance = buildPostFinance(t.config.test_mode) # Check sign args = {} for a in request.POST: if a != 'SHASIGN': val = request.POST.get(a) if val: args[a.upper()] = val if request.POST.get('SHASIGN', '').upper() != postFinance.computeOutSign(args).upper(): return build_error('UNVALID_SHA', error_code=404) # Let's catch the ID if not t.postfinance_id: t.postfinance_id = request.POST.get('PAYID') TransactionLog(transaction=t, log_type='postfinanceId', extra_data=utils.get_client_ip(request)).save() t.internal_status = 'fb' t.last_postfinance_ipn_date = now() t.postfinance_status = request.POST.get('STATUS') t.ipn_needed = True t.card = request.POST.get('CARDNO', '') t.brand = request.POST.get('BRAND', '') t.save(update_fields=['internal_status', 'last_postfinance_ipn_date', 'postfinance_status', 'ipn_needed', 'postfinance_id', 'brand', 'card']) TransactionLog(transaction=t, log_type='postfinanceStatus', extra_data=request.POST.get('STATUS')).save() send_ipn.delay(t.pk) return HttpResponse('')
def launch(request) -> HttpResponse: body = request.data remote_address = get_client_ip(request) con_resp, resp_dict = PipelineController.launch( remote_address, request.user, body['input_stream'], body['input_type'], body['stream_processor']) status = ControllerResponse.controller_response_to_http_status( con_resp) resp_json = json.dumps(resp_dict) return HttpResponse(resp_json, content_type="application/json", status=status)
def create(self, request, pick_id=None): """ 픽 (캐스트) 댓글 추가 --- <br> <b>헤더</b> - IDREGISTER: (필수) 회원 항번 <br> """ cuid = int(request.META.get('HTTP_IDREGISTER') or 0) user = get_object_or_404(User, id=cuid) pick = get_object_or_404(Pick, pick_id=pick_id) params = PickCommentForm(data=request.data) params.is_valid(raise_exception=True) if not (user.gender and user.skin_type and user.birth_year): raise InvalidParameterException( _("프로필 편집에서 추가정보를 입력하셔야 참여가 가능합니다.") ) response = dict() try: with transaction.atomic(): PickComment( pick=pick, user=user, comment=params.validated_data.get('comment'), ip_address=get_client_ip(request), create_date=local_now().strftime('%Y%m%d%H%M%S') ).save() # 픽상세 뷰용 업데이트 aws_dynamodb_pick.update_comment_count( pick_id=pick_id, comment_count=PickComment.objects.filter(pick=pick_id, is_display=True).count() + 1 ) response['is_success'] = True response['message'] = _("댓글 등록 완료!") except: response['is_success'] = False response['message'] = _("등록에 실패하였습니다.") return Response( SuccessMessageResponse(response).data, status=status.HTTP_201_CREATED )
def go(request, pk): """Redirect the user to the postfinance website""" # Get transaction t = get_object_or_404(Transaction, pk=pk, config__active=True, config__admin_enable=True) if t.internal_status == 'fb': raise Http404 postFinance = buildPostFinance(t.config.test_mode) fields = { 'AMOUNT': str(t.amount), 'ORDERID': 'polybanking-' + str(t.pk), 'PSPID': postFinance.getPspIp(), 'CURRENCY': 'CHF', } fields['SHASIGN'] = postFinance.computeInSign(fields) if t.config.test_mode: urlDest = settings.POSTFINANCE_TEST_URL else: urlDest = settings.POSTFINANCE_PROD_URL TransactionLog(transaction=t, log_type='userForwarded', extra_data=utils.get_client_ip(request)).save() t.internal_status = 'fw' t.last_userforwarded_date = now() t.save(update_fields=['internal_status', 'last_userforwarded_date']) return render(request, 'paiements/go.html', { 'fields': fields, 'urlDest': urlDest })
def post(self, request): """ 회원 가입 --- - method: (필수) 로그인 방식 ( 'email', 'facebook', 'kakao' 중 하나) <br> - email: (필수) email <br> - password: (필수) 비밀번호 <br> - uid: (옵션) sns 인증 아이디 (*method 가 'facebook' or 'kakao' 일 경우 필수) <br> - image_url: (옵션) sns 추가 정보 <br> - regid: (안드로이드 필수) push token 갱신용 파라미터 <br> <br> <b>헤더</b> - UID: (필수) push token 갱신용 파라미터 <br> - TOKEN: (아이폰 필수) push token 갱신용 파라미터 <br> """ response = dict() # 유효성 검사 form = SignUpForm(data=request.data) form.is_valid(raise_exception=True) method = form.validated_data.get('method') uid = form.validated_data.get('uid') image_url = form.validated_data.get('image_url') uuid = request.META.get('HTTP_UID') os_info = request.META.get('HTTP_OS') token = request.META.get('HTTP_TOKEN') if os_info == 'aos' and not token: token = form.validated_data.get('regid') # 새 계정 instance 생성 user = User.objects.create_user( username=form.validated_data.get('email'), password=form.validated_data.get('password'), nickname=form.validated_data.get('nickname').strip(), date_joined=local_now(), ip_address=get_client_ip(request), uuid=uuid, last_login=local_now(), ) token_dict = {'aos': 'regid', 'ios': 'apns'} if token_dict.get(os_info) and token != 'NO': setattr(user, token_dict.get(os_info), token) user.save() # SNS 정보가 있다면 allauth socialaccount instance 생성 if method == 'facebook': provider = FacebookProvider(request) if not SocialAccount.objects.filter( user=user, provider=provider.id, uid=uid): SocialAccount(user=user, provider=provider.id, uid=uid, extra_data={}).save() elif method == 'kakao': provider = KakaoProvider(request) if not SocialAccount.objects.filter( user=user, provider=provider.id, uid=uid): SocialAccount(user=user, provider=provider.id, uid=uid, extra_data={}).save() # SNS extra_data 를 가지고 user field 갱신 if image_url: file_info = edit_profile_image_by_url(image_url, user.id) if file_info: user.file_name_orig = file_info.get('file_org_name') user.file_name_save = file_info.get('file_save_name') user.file_dir = file_info.get('file_dir') user.file_size = file_info.get('file_size') user.file_type = file_info.get('file_type') user.save() # push 토큰 업데이트 if token != 'NO': if token and uuid: compair_push_token(platform=os_info, user_id=user.id, uuid=uuid, token=token) # 알림함 메세지 생성 try: MessageBox(user_id=user.id, category=MessageCategory.objects.get(name='가입완료'), message='반갑습니다! 글로우픽 사용이 처음이라면 꼭 확인해주세요:)').save() except: pass # 프로필 정보 response['user'] = UserLoginResponse(user).data return Response(response, status=status.HTTP_201_CREATED)
def update(self, request, pk=None): """ 리뷰 수정 --- <br> <b>헤더</b> - IDREGISTER: (필수) 회원 항번 <br> """ # parameters cuid = int(request.META.get('HTTP_IDREGISTER') or 0) user = get_object_or_404(User, id=cuid) params = ReviewUpdateForm(data=request.data) params.is_valid(raise_exception=True) client_ip = get_client_ip(request) contents = params.validated_data.get('contents') new_rating = params.validated_data.get('rating') review = get_object_or_404(Review, id=pk, user=user, is_display=True) product = review.product with transaction.atomic(): # review update # 블라인드 상태인 리뷰는 사용자가 수정시 검수중 상태로 변경된다. if review.state == 'B': review.state = 'C' review.ip_address = client_ip if contents: review.contents = contents if new_rating: review.rating = new_rating review.save() # product info update update_product_info.delay(product.id) # tag update tags = extract_tags(contents) now = local_now().strftime('%Y%m%d%H%M%S') object_tags = TagObject.objects.filter(type='review', object_id=review.id) # tag count update for _obj in object_tags: _obj.tag.count -= 1 _obj.tag.modified_date = now _obj.tag.save() # delete tag mapping if object_tags.exists(): object_tags.delete() for tag_name in tags: tag, created = Tag.objects.get_or_create(name=tag_name) if created: TagObject(type='review', object_id=review.id, tag=tag).save() tag.create_date = now tag.save() else: if not TagObject.objects.filter(type='review', object_id=review.id, tag=tag).exists(): TagObject(type='review', object_id=review.id, tag=tag).save() tag.count += 1 tag.modified_date = now tag.save() review.tag = ",".join(tags) # review update review.save() # elastic update body = { "doc": {'rating': new_rating, 'reviewText': contents, 'tag': ",".join(tags)} } elasticsearch_reviews.update(_id=review.id, body=body) return Response({}, status=status.HTTP_200_OK)
def create(self, request): """ 새 리뷰 작성 --- <br> <b>헤더</b> - IDREGISTER: (필수) 회원 항번 <br> """ # parameters cuid = int(request.META.get('HTTP_IDREGISTER') or 0) user = get_object_or_404(User, id=cuid) review_service.reset_rank(cuid) params = ReviewWriteForm(data=request.data) params.is_valid(raise_exception=True) if user.gender is None or user.skin_type is None or user.birth_year is None: raise InvalidParameterException( _("내정보에서 추가정보를 입력하셔야 작성이 가능합니다.") ) client_ip = get_client_ip(request) contents = params.validated_data.get('contents') rating = params.validated_data.get('rating') product_id = params.validated_data.get('product_id') product = get_object_or_404(Product, id=product_id, is_display=True) if Review.objects.filter(user=cuid, product=product_id).exists(): raise ConflictException( _("이미 리뷰를 작성한 제품입니다.") ) with transaction.atomic(): # review insert now = local_now().strftime('%Y%m%d%H%M%S') review = Review(user=user, product=product, rating=rating, contents=contents, ip_address=client_ip, is_display=True, is_evaluation=False, _created_at=now) # 평가단 여부 확인 if EventPrizeMapping.objects.filter( user=user, product=product ).filter( event__activity_date__gte=local_now().strftime('%Y%m%d%H%M%S') ).exists(): review.is_evaluation = True review.save() # user info update user.review_count += 1 user.score += 1 user.save() # product info update update_product_info.delay(product_id) # tag update tags = extract_tags(contents) for tag_name in tags: tag, created = Tag.objects.get_or_create(name=tag_name) if created: TagObject(type='review', object_id=review.id, tag=tag).save() tag.create_date = now tag.save() else: if not TagObject.objects.filter(type='review', object_id=review.id, tag=tag).exists(): TagObject(type='review', object_id=review.id, tag=tag).save() tag.count += 1 tag.modified_date = now tag.save() review.tag = ",".join(tags) review.save() # elastic update body = dict() # review body['idreviewcomment'] = review.id body['reviewText'] = contents body['rating'] = rating body['likeCount'] = 0 body['isDisplay'] = 1 body['isEvaluation'] = 0 body['create_date'] = now body['tag'] = ",".join(tags) # user body['idRegister'] = user.id body['nickName'] = user.nickname body['birthYear'] = user.birth_year body['skinType'] = user._skin_type body['gender'] = user._gender body['registerScore'] = user.score body['registerRank'] = user.rank body['isBlind'] = user.is_blinded body['registerFileDir'] = user.file_dir body['registerFileSaveName'] = user.file_name_save # product body['idProduct'] = product.id body['productTitle'] = product.name body['idBrand'] = product.brand_id body['productFileDir'] = product.file_dir body['productFileSaveName'] = product.file_name body['brandTitle'] = product.brand.name body['productIsDisplay'] = int(product.is_display) categories = product.categories.all().values('id', 'main_category_id') body['firstCategoryList'] = "" body['secondCategoryList'] = "" for category in categories: body['firstCategoryList'] += "[" + str(category['main_category_id']) + "]" body['secondCategoryList'] += "[" + str(category['id']) + "]" try: goods_info = ProductGoods.objects.get(product_id=product_id, goods_count__gt=0) body['goods_info'] = { "goods_count": goods_info.goods_count, "min_price": goods_info.min_price, "max_price": goods_info.max_price } except ProductGoods.DoesNotExist: pass elasticsearch_reviews.add(body=body, _id=review.id) is_first = not Review.objects.filter(product=product_id).exists() response = dict() response['review_count'] = user.review_set.count() # redis 에 update 하는 쿼리 # 첫 번째 리뷰인지 확인한다. # 첫 리뷰시에 첫 리뷰 관리 테이블에 넣는다. if (is_first): try: Review_first_log(id=product_id, user=user, timestamp=kst_now().strftime("%Y%m%d%H%M%S") ).save(force_insert=True) except IntegrityError : # 테이블에 접근하는 순간 이미 product 가 존재해서 에러를 띄운다면 처음이 아님으로 is_first 를 False 로 변경한다. is_first = False review_create_cash = { 'is_first':is_first, 'written':True } # review count 에서 사용할 수 있도록 redis 에 set 해준다. set_review_is_written(user.id,review_create_cash) return Response(ReviewWriteResponse(response).data, status=status.HTTP_201_CREATED)
def create(self, request, event_id=None): """ 이벤트 댓글 추가 --- <br> <b>헤더</b> - IDREGISTER: (필수) 회원 항번 <br> """ cuid = int(request.META.get('HTTP_IDREGISTER') or 0) params = EventCommentForm(data=request.data) params.is_valid(raise_exception=True) comment = params.validated_data.get('comment') event = get_object_or_raise_404(Event, id=event_id) user = get_object_or_raise_404(User, id=cuid) if EventComment.objects.filter(user=user, event=event).exists(): raise ConflictException(_("이미 이벤트에 참여하셨습니다.")) if user.review_count < event._condition: raise FailedPreconditionException( _("{} 개 이상의 리뷰를 작성한 회원만 참여할 수 있는 이벤트 입니다.\n" "회원님께서는 {} 개의 리뷰를 더 작성하셔야 합니다.".format( event._condition, event._condition - user.review_count))) response = dict() user_ip = get_client_ip(request) now = local_now().strftime('%Y%m%d%H%M%S') try: with transaction.atomic(): # RDS EventComment(event=event, user=user, comment=comment, ip_address=user_ip, create_date=now).save() _count = event.users.count() + 1 # dynamo DB aws_dynamodb_etc_list.update_events_comment( seq=event.seq, comment_count=_count) aws_dynamodb_event_participants.update_event(event_id=event.id, user_id=user.id, created_at=now) aws_dynamodb_events.update_event_comments_count( event_id=event.id, _count=_count) response['is_success'] = True response['message'] = _("당첨을 기다리며, 지금 등록되어 있는 \n" "연락처와 주소를 한 번 더 확인해주세요!") if user.zipcode: response['user_address'] = _( "연락처 : {}\n" "주소 : ({}) {} {}".format(user.tel, user.zipcode, user.address, user.address_more)) else: response['user_address'] = _("연락처 : {}\n" "주소 : {} {}".format( user.tel, user.address, user.address_more)) except: response['is_success'] = False response['message'] = _("등록에 실패하였습니다.") return Response(EventCommentJoin(response).data, status=status.HTTP_201_CREATED)
def ipn(request): """Call by Postfinance website about status""" # Get transaction pk orderId = request.POST.get('orderID', '') if '-' in orderId: (who, pk) = orderId.split('-', 2) else: #should also raise an error return build_error('UNVALID_ ID') if who != 'polybanking': return build_error('UNVALID_BANK', error_code=404) # Get transaction t = get_object_or_404(Transaction, pk=pk, config__active=True, config__admin_enable=True) if t.internal_status == 'cr': return build_error('UNVALID_STATUS', error_code=404) postFinance = buildPostFinance(t.config.test_mode) # Check sign args = {} for a in request.POST: if a != 'SHASIGN': val = request.POST.get(a) if val: args[a.upper()] = val if request.POST.get( 'SHASIGN', '').upper() != postFinance.computeOutSign(args).upper(): return build_error('UNVALID_SHA', error_code=404) # Let's catch the ID if not t.postfinance_id: t.postfinance_id = request.POST.get('PAYID') TransactionLog(transaction=t, log_type='postfinanceId', extra_data=utils.get_client_ip(request)).save() t.internal_status = 'fb' t.last_postfinance_ipn_date = now() t.postfinance_status = request.POST.get('STATUS') t.ipn_needed = True t.card = request.POST.get('CARDNO', '') t.brand = request.POST.get('BRAND', '') t.save(update_fields=[ 'internal_status', 'last_postfinance_ipn_date', 'postfinance_status', 'ipn_needed', 'postfinance_id', 'brand', 'card' ]) TransactionLog(transaction=t, log_type='postfinanceStatus', extra_data=request.POST.get('STATUS')).save() send_ipn.delay(t.pk) return HttpResponse('')