Skip to content
Snippets Groups Projects
controller.py 36.1 KiB
Newer Older
  • Learn to ignore specific revisions
  •     def get_voucher(self, number):
            return self.incorporate_transient_state(
                self.store.get(number),
            )
    
    
        def incorporate_transient_state(self, voucher):
            """
            Create a new ``Voucher`` which represents the given voucher but which also
            incorporates relevant transient state known to the controller.  For
            example, if a redemption attempt is current in progress, this is
            incorporated.
            """
    
            if isinstance(voucher.state, model_Pending):
                if voucher.number in self._active:
                    return attr.evolve(
                        voucher,
    
                        state=self._active[voucher.number],
    
                    )
                if voucher.number in self._unpaid:
                    return attr.evolve(
                        voucher,
                        state=model_Unpaid(finished=self._unpaid[voucher.number]),
                    )
    
                if voucher.number in self._error:
                    return attr.evolve(
                        voucher,
                        state=self._error[voucher.number],
                    )
    
    
    def get_redeemer(plugin_name, node_config, announcement, reactor):
        section_name = u"storageclient.plugins.{}".format(plugin_name)
        redeemer_kind = node_config.get_config(
            section=section_name,
            option=u"redeemer",
            default=u"ristretto",
        )
        return _REDEEMERS[redeemer_kind](section_name, node_config, announcement, reactor)
    
    
    _REDEEMERS = {
    
        u"non": NonRedeemer.make,
    
        u"double-spend": DoubleSpendRedeemer.make,
    
        u"unpaid": UnpaidRedeemer.make,
    
        u"error": ErrorRedeemer.make,
    
    
    
    @inlineCallbacks
    def bracket(first, last, between):
        """
        Invoke an action between two other actions.
    
        :param first: A no-argument function that may return a Deferred.  It is
            called first.
    
        :param last: A no-argument function that may return a Deferred.  It is
            called last.
    
        :param between: A no-argument function that may return a Deferred.  It is
            called after ``first`` is done and completes before ``last`` is called.
    
        :return Deferred: A ``Deferred`` which fires with the result of
            ``between``.
        """
        yield first()
        try:
            result = yield between()
        except GeneratorExit:
            raise
        except:
            info = exc_info()
            yield last()
    
            raise info[0], info[1], info[2]
    
        else:
            yield last()
            returnValue(result)