def _parse_result(self, transaction: Transaction, result):
        if "success" in result and not result["success"]:
            transaction.fail(fail_reason=str(result["message"]))
            transaction.save()
            return False

        transaction.data['longurl'] = result['payment_request']['longurl']
        return True
    def handle_transaction_response(self, transaction: Transaction, request):
        try:
            if request.GET.get('payment_id', None):
                transaction.data['payment_id'] = request.GET['payment_id']
                self.handle_transaction_response_inner(
                    transaction, transaction.data['payment_id'])
            else:
                error = request.GET.get('err', None) or 'Unknown error'
                transaction.fail(fail_reason=error)
        except TransitionNotAllowed:
            pass

        transaction.save()
Exemplo n.º 3
0
    def validate(self, attrs):
        attrs = super(TransactionSerializer, self).validate(attrs)

        if not attrs:
            return attrs

        if self.instance:
            if self.instance.state != Transaction.States.Initial:
                message = "The transaction cannot be modified once it is in {}"\
                          " state.".format(self.instance.state)
                raise serializers.ValidationError(message)

        # Run model clean and handle ValidationErrors
        try:
            # Use the existing instance to avoid unique field errors
            if self.instance:
                transaction = self.instance
                transaction_dict = transaction.__dict__.copy()

                errors = {}
                for attribute, value in attrs.items():
                    if attribute in self.Meta.updateable_fields:
                        continue

                    if getattr(transaction, attribute) != value:
                        errors[attribute] = "This field may not be modified."
                    setattr(transaction, attribute, value)

                if errors:
                    raise serializers.ValidationError(errors)

                transaction.full_clean()

                # Revert changes to existing instance
                transaction.__dict__ = transaction_dict
            else:
                transaction = Transaction(**attrs)
                transaction.full_clean()
        except ValidationError as e:
            errors = e.error_dict
            non_field_errors = errors.pop(NON_FIELD_ERRORS, None)
            if non_field_errors:
                errors['non_field_errors'] = [
                    error for sublist in non_field_errors for error in sublist
                ]
            raise serializers.ValidationError(errors)

        return attrs
Exemplo n.º 4
0
    def validate(self, attrs):
        attrs = super(TransactionSerializer, self).validate(attrs)

        if not attrs:
            return attrs

        if self.instance:
            if self.instance.state != Transaction.States.Initial:
                message = "The transaction cannot be modified once it is in {}"\
                          " state.".format(self.instance.state)
                raise serializers.ValidationError(message)

        # Run model clean and handle ValidationErrors
        try:
            # Use the existing instance to avoid unique field errors
            if self.instance:
                transaction = self.instance
                transaction_dict = transaction.__dict__.copy()

                errors = {}
                for attribute, value in attrs.items():
                    if attribute in self.Meta.updateable_fields:
                        continue

                    if getattr(transaction, attribute) != value:
                        errors[attribute] = "This field may not be modified."
                    setattr(transaction, attribute, value)

                if errors:
                    raise serializers.ValidationError(errors)

                transaction.full_clean()

                # Revert changes to existing instance
                transaction.__dict__ = transaction_dict
            else:
                transaction = Transaction(**attrs)
                transaction.full_clean()
        except ValidationError as e:
            errors = e.error_dict
            non_field_errors = errors.pop(NON_FIELD_ERRORS, None)
            if non_field_errors:
                errors['non_field_errors'] = [
                    error for sublist in non_field_errors for error in sublist
                ]
            raise serializers.ValidationError(errors)

        return attrs
    def handle_transaction_response_inner(self, transaction: Transaction,
                                          payment_id):
        response = self.instamojo_wrapper.payment_detail(payment_id)

        print(response)
        if 'success' in response and not response['success']:
            logger.info("Failed to load payment info %r", response['message'])
            transaction.fail(fail_reason=response['message'])
            return

        payment_info = response['payment']
        if payment_info['status'] == 'Credit':
            logger.info("Payment success %r", payment_info)
            transaction.settle()
        else:
            logger.info("Payment failed %r", payment_info)
            transaction.fail()