Exemplo n.º 1
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)
            xml.log_error('BUY', 'username not found')
        # Check for existing uncommitted transaction
        if self.session.query(Transaction).filter_by(
                user=user, operation='BUY', committed=False).count() > 0:
            raise BuyTransactionActiveError()
            xml.log_error('BUY', 'Outstanding Buy Exists')

        # Getting stock quote
        quote_client = get_quote_client()
        quote = quote_client.get_quote(stock_symbol, username)

        # Work out quantity of stock to buy, fail if not enough for one stock
        amount = Money.from_string(amount)
        quantity = amount_to_quantity(quote, amount)
        if quantity == 0:
            raise InsufficientFundsError()

        price = quote * quantity
        if user.account_balance < price:
            raise InsufficientFundsError()

        transaction = Transaction(user=user, quantity=quantity, operation='BUY', 
                stock_symbol=stock_symbol, stock_value=quote, committed=False)

        self.session.add(transaction)
        self.session.commit()

        xml.log_transaction('BUY', transaction) 
        return xml.QuoteResponse(quantity=quantity, price=price)
Exemplo n.º 2
0
    def run(self, username, stock_symbol, money_amount):

        # see if user exists
        self.session = get_session()
        user = self.session.query(User).filter_by(username=username).first()
        if not user:
            raise UserNotFoundError(username)

        # Check for existing uncommitted transaction
        if self.session.query(Transaction).filter_by(
                user=user, operation='SELL', committed=False).count() > 0:
            raise SellTransactionActiveError()

        #set up client to get quote
        quote_client = get_quote_client()
        quoted_stock_value = quote_client.get_quote(stock_symbol, username) 

        # Work out quantity of stock to sell, fail if not enough for one stock
        money_amount = Money.from_string(money_amount)
        quantity_to_sell = amount_to_quantity(quoted_stock_value, money_amount)
        if quantity_to_sell == 0:
            raise InsufficientFundsError()


        # 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) != 1 or records[0].quantity < quantity_to_sell:
            raise InsufficientStockError()

        price = quoted_stock_value * quantity_to_sell

        # make transaction
        self.trans = Transaction(username=user.username, 
                stock_symbol=stock_symbol, operation='SELL', committed=False, 
                quantity=quantity_to_sell, stock_value=quoted_stock_value)

        # commit transaction after all actions for atomicity
        self.session.add(self.trans)
        self.session.commit()


        xml.log_transaction('SELL', self.trans, status_message='success')
        return xml.QuoteResponse(quantity=quantity_to_sell, price=price)
Exemplo n.º 3
0
    def run(self, username, amount):
        self.session = get_session()
        user = self.session.query(User).filter_by(username=username).first()
        if not user:
            log.info('User does not exist, creating one first...')
            user = User(username=username, password='',
                account_balance=Money(0, 0), reserve_balance=Money(0, 0))
            self.session.add(user)

        amount = Money.from_string(amount)
        user.account_balance += amount
        self.session.commit()

        #log event
        xml.log_event('ADD', username, amount=str(amount)) 

        return xml.ResultResponse('success')
Exemplo n.º 4
0
    def get_quote(self, symbol, username):
        message = ','.join((symbol, username)) + '\n'

        # Create the socket
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # Connect the socket
        s.connect(self.address)
        # Send the user's query
        s.sendall(message)
        # Read and print up to 1k of data.
        data = s.recv(1024).rstrip()

        # message format: "Quote, Stock Symbol, USER NAME, CryptoKey"
        # '58.17,APP,robodwye,1330546050315,ZcwKUqtHPq/PaprbZRKrFSw+zuIQiYA5XlEfLUkxkUIsWaN0xSiiWw==\n'
        quotes, symbol2, username2, timestamp, cryptokey = data.split(',')
        response_time = datetime.fromtimestamp(int(timestamp) / 1000)

        quote = Money.from_string(quotes)
        return quote, response_time, cryptokey
Exemplo n.º 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')
Exemplo n.º 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')