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