Пример #1
0
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)
Пример #2
0
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})
Пример #3
0
    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)
Пример #4
0
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)
Пример #5
0
    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)
Пример #6
0
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('')
Пример #7
0
 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)
Пример #8
0
    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
        )
Пример #9
0
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
    })
Пример #10
0
    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)
Пример #11
0
    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)
Пример #12
0
    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)
Пример #13
0
    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)
Пример #14
0
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('')