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