예제 #1
0
    def process_transaction(self, session, quote, trigger):
        # Calculate real price of stock purchase based on current quote
        user = trigger.user
        quantity = amount_to_quantity(quote, trigger.amount)
        real_amount = quote * quantity

        log.debug('Trigger %d: Buying %d units of %s (%s total) for %s', 
                trigger.id, quantity, trigger.stock_symbol, real_amount, user.username)

        # Use reserve balance to buy stock
        user.reserve_balance -= trigger.amount

        # Put extra money back in users account
        extra = trigger.amount - real_amount
        log.debug('Trigger %d: Extra money left over after purchase: %s', trigger.id, extra)
        user.account_balance += extra

        # create or update the StockPurchase for this stock symbol
        stock = session.query(StockPurchase).filter_by(
            user=user, stock_symbol=trigger.stock_symbol
        ).first()
        if not stock:
            stock = StockPurchase(user=user,
                    stock_symbol=trigger.stock_symbol,
                    quantity=quantity)
        else:
            stock.quantity = stock.quantity + quantity

        session.delete(trigger)

        session.commit()

        xml.log_trigger('SET_BUY_TRIGGER', trigger, status_message='Trigger item bought')
예제 #2
0
    def run(self, username, stock_symbol, quantity):
        self.session = get_session()
        user = self.session.query(User).filter_by(username=username).first()
        if not user:
            raise UserNotFoundError(username)

        quantity = int(quantity)

        # see if the user owns the requested stock and has enough for request
        records = self.session.query(StockPurchase).filter_by(
                username=user.username, stock_symbol=stock_symbol).all()

        if(len(records) > 1):
            raise UnknownCommandError('Multiple StockPurchase for user %s: %d', 
                    username, len(records))
        if len(records) == 0 or records[0].quantity < quantity:
            raise InsufficientStockError()

        # Create inactive Trigger
        set_transaction = Trigger(user=user, quantity=quantity,
                operation='SELL', stock_symbol=stock_symbol, state=Trigger.State.INACTIVE)
        self.session.add(set_transaction)

        self.session.commit()

        xml.log_trigger('SET_SELL_AMOUNT', set_transaction, status_message='success')

        return xml.ResultResponse('success')
예제 #3
0
    def run(self, username, stock_symbol):
        self.session = get_session()
        user = self.session.query(User).filter_by(username=username).first()
        if not user:
            raise UserNotFoundError(username)

        trigger = self.session.query(Trigger).filter_by(
            username=user.username, operation='SELL', stock_symbol=stock_symbol,
        ).filter(
            Trigger.state != Trigger.State.CANCELLED,
        ).first()

        if not trigger:
            raise NoTriggerError(username, stock_symbol)

        trigger.state = Trigger.State.CANCELLED
        self.session.commit()

        xml.log_trigger('CANCEL_SET_SELL', trigger, status_message='success')
        return xml.ResultResponse('trigger cancelled')
예제 #4
0
    def process_transaction(self, session, quote, trigger):
        # Calculate real price of stock purchase based on current quote
        user = trigger.user
        price = quote * trigger.quantity

        log.debug('Trigger %d: Selling %d units of %s (%s total) for %s', 
                trigger.id, trigger.quantity, trigger.stock_symbol, price, user.username)

        user.account_balance += price

        # update the StockPurchase for this stock symbol
        stock = session.query(StockPurchase).filter_by(
            user=user, stock_symbol=trigger.stock_symbol
        ).one()
        stock.quantity = stock.quantity - trigger.quantity

        session.delete(trigger)

        session.commit()

        xml.log_trigger('SET_SELL_TRIGGER', trigger, status_message='Trigger item sold')
예제 #5
0
    def run(self, username, stock_symbol, amount):
        self.session = get_session()
        user = self.session.query(User).filter_by(username=username).first()
        if not user:
            raise UserNotFoundError(username)

        amount = Money.from_string(amount)

        trigger = self.session.query(Trigger).filter_by(
            username=user.username, operation='SELL', stock_symbol=stock_symbol,
            state=Trigger.State.INACTIVE
        ).first()
        if not trigger:
            raise NoTriggerError(username, stock_symbol)

        trigger.state = Trigger.State.RUNNING
        trigger.trigger_value = amount
        self.session.commit()

        eventlet.spawn(self.check_trigger, trigger.id)

        xml.log_trigger('SET_SELL_TRIGGER', trigger, status_message='trigger set')
        self.session.close()
        return xml.ResultResponse('trigger activated')
예제 #6
0
    def run(self, username, stock_symbol, amount):
        self.session = get_session()
        user = self.session.query(User).filter_by(username=username).first()
        if not user:
            raise UserNotFoundError(username)

        # Work out quantity of stock to buy, fail if user has insufficient funds
        amount = Money.from_string(amount)
        if user.account_balance < amount:
            raise InsufficientFundsError()

        # Create inactive Trigger
        set_transaction = Trigger(user=user, amount=amount,
                operation='BUY', stock_symbol=stock_symbol, state=Trigger.State.INACTIVE)
        self.session.add(set_transaction)

        user.account_balance = user.account_balance - amount
        user.reserve_balance += amount

        self.session.commit()

        xml.log_trigger('SET_BUY_AMOUNT', set_transaction, status_message='success')

        return xml.ResultResponse('success')