def _process_removed_stocks(sheet, ssheet_id, symbols): """ Update database to reflect sheet's new stocks, changed bounds, or changed order. :param sheet: Instance of models.Sheet to modify. :param ssheet_id: Spreadsheet id. :param symbols: Iterable of symbols. :return: list of ndb Entities to put, list of ndb Entities to delete. """ to_put, to_delete = [], [] symbols_old = {k.id() for k in sheet.stock_keys} for symbol in symbols_old - set(symbols): stock = Stock.get_by_id(symbol) sheetstock_key = ndb.Key('SheetStock', '_'.join([ssheet_id, symbol])) to_delete.append(sheetstock_key) if stock and sheet.key in stock.sheet_keys: stock.sheet_keys.remove(sheet.key) if stock.sheet_keys: to_put.append(stock) else: to_delete.append(stock.key) return to_put, to_delete
def _update_stocks(symbols): """ Update models.Stock entities. :param symbols: Iterable of stock symbols to update. :return: dict mapping symbols to new prices, dict mapping symbols to (old price, new price) for changed symbols. """ to_put = [] symbol_price_updated_dict = {} if symbols is None: stocks_ = list(Stock.query()) symbols = [s.key.id() for s in stocks_] else: stocks_ = [Stock.get_by_id(s) for s in symbols] symbol_price_dict = stocks.get_stock_prices(symbols) for stock in stocks_: if stock is None: continue symbol = stock.key.id() price = symbol_price_dict.get(symbol, None) if stock.price != price: symbol_price_updated_dict[symbol] = (stock.price, price) stock.price = price to_put.append(stock) ndb.put_multi(to_put) return symbol_price_dict, symbol_price_updated_dict