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()
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()