def form_for_transaction( self, transaction: Transaction, post_data: Optional[QueryDict] = None, amount: Optional[Decimal] = None, ) -> Optional[forms.Form]: """ .. _SEP-9: https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0009.md Same as ``DepositIntegration.form_for_transaction`` :param transaction: the ``Transaction`` database object :param post_data: the data included in the POST request body as a dictionary :param amount: a ``Decimal`` object the wallet may pass in the GET request. Use it to pre-populate your TransactionForm along with any SEP-9_ parameters. """ if transaction.amount_in: # we've collected transaction info # and don't implement KYC by default return elif post_data: return TransactionForm(transaction, post_data) else: return TransactionForm(transaction, initial={"amount": amount})
def form_for_transaction( self, transaction: Transaction, post_data: Optional[QueryDict] = None, amount: Optional[Decimal] = None, ) -> Optional[forms.Form]: """ This function should return the next form to render for the user given the state of the interactive flow. For example, this function could return an instance of a ``TransactionForm`` subclass. Once the form is submitted, Polaris will detect the form used is a ``TransactionForm`` subclass and update ``transaction.amount_in`` with the amount specified in form. If `post_data` is passed, it must be used to initialize the form returned so Polaris can validate the data submitted. If `amount` is passed, it can be used to pre-populate a ``TransactionForm`` amount field to improve the user experience. :: def form_for_transaction(self, transaction, post_data = None, amount = None): if transaction.amount_in: return elif post_data: return TransactionForm(transaction, post_data) else: return TransactionForm(transaction, initial={"amount": amount}) After a form is submitted and validated, Polaris will call ``DepositIntegration.after_form_validation`` with the populated form and transaction. This is where developers should update their own state-tracking constructs or do any processing with the data submitted in the form. Finally, Polaris will call this function again to check if there is another form that needs to be rendered to the user. If you are collecting KYC data, you can return a ``forms.Form`` with the fields you need. This loop of submitting a form, validating & processing it, and checking for the next form will continue until this function returns ``None``. When that happens, Polaris will check if ``content_for_template()`` also returns ``None``. If that is the case, Polaris assumes the anchor is finished collecting information and will update the Transaction status to ``pending_user_transfer_start``. If ``content_for_template()`` returns a dictionary, Polaris will serve a page `without` a form. Anchors should do this when the user needs to take some action in order to continue, such as confirming their email address. Once the user is confirmed, ``form_for_transaction()`` should return the next form. :param transaction: the ``Transaction`` database object :param post_data: the data sent in the POST request as a dictionary :param amount: a ``Decimal`` object the wallet may pass in the GET request. Use it to pre-populate your TransactionForm along with any SEP-9_ parameters. :return: a dictionary containing various pieces of information to use when rendering the next page. """ if transaction.amount_in: # we've collected transaction info # and don't implement KYC by default return if post_data: return TransactionForm(transaction, post_data) else: return TransactionForm(transaction, initial={"amount": amount})