def show_pool(request, pool_id=None): ''' Show contents of pool <pool_id>. ''' notify = None splits = None missing_prices = None missing_channels = None pool = None if pool_id == 'new' else Pool.objects.get(id=pool_id) if request.method == 'POST' and request.POST.get('action'): daterangeform = DateRangeForm(request.POST) if not daterangeform.is_valid(): notify = Notify('Invalid date(s)') else: startdate = daterangeform.cleaned_data['fromdate'] enddate = daterangeform.cleaned_data['todate'] if request.POST.get('action') == 'Download latest prices': # dl_latest_prices(pool) pool.download_latest_prices() elif request.POST.get('action') == 'Download index': pool.index.download_history(startdate, enddate) elif request.POST.get('action') == 'Calculate index channels': Channel.calculate(pool.index, startdate, enddate) elif request.POST.get('action') == 'Download all stock prices': #CONSIDER: run separate process? # dl_prices(pool, startdate, enddate) pool.download_prices(startdate, enddate) elif request.POST.get('action') == 'Check for missing prices': missing_prices = pool.missing_prices(startdate, enddate) elif request.POST.get('action') == 'Check for stock splits': splits = pool.check_splits() elif request.POST.get('action') == 'Check for missing channels': missing_channels = pool.missing_channels(startdate, enddate) elif request.POST.get('action') == 'Calculate all stock channels': pool.calculate_channels(startdate, enddate) elif pool: enddate = datetime.date.today() if not pool.enddate else pool.enddate daterangeform = DateRangeForm(initial={ 'fromdate':pool.startdate, 'todate': enddate}) else: daterangeform = None if request.method == 'POST' and request.POST.get('save'): poolform = PoolForm(request.POST, instance=pool) memberform = MemberForm(request.POST, prefix='stock') if poolform.is_valid(): pool = poolform.save() if memberform.is_valid(): obj = memberform.save(commit=False) obj.pool = pool obj.save() else: # first entry - no POST data poolform = PoolForm(instance=pool) memberform = MemberForm(prefix='stock') if request.method == 'POST' and request.POST.get('action'): stock_list = request.POST.getlist('id') if request.POST.get('action') == 'Delete': if not len(stock_list): notify = Notify('Delete failed, select stock(s) to delete') else: notify = Notify('Delete stocks(s) {}?'.format(', '.join( StockPoolDates.objects.get(id=s).stock.name for s in stock_list))) notify.set_replies(request, ('Yes', 'No')) request.session['stock_delete_list'] = stock_list elif request.method == 'POST' and request.POST.get('reply'): stock_list = request.session.get('stock_delete_list') if not stock_list: raise AttributeError('session has no valid stock_delete_list') del request.session['stock_delete_list'] if request.POST.get('reply') == 'Yes': stocks = [StockPoolDates.objects.get(id=s).stock.name for s in stock_list] StockPoolDates.objects.filter(id__in=stock_list).delete() notify = Notify('Stock(s) {} deleted'.format(', '.join(stocks))) elif request.POST.get('reply') == 'No': notify = Notify('Delete cancelled') members = StockPoolDates.objects.filter(pool=pool).order_by('stock__name',) stocks_table = MembersTable(members, exclude=['pool',]) RequestConfig(request, paginate={'per_page': 100}).configure(stocks_table) return render(request, 'show_pool.html', { 'pool': pool, 'poolform': poolform, 'memberform': memberform, 'stocks_table': stocks_table, 'daterangeform': daterangeform, 'notify': notify, 'splits': splits, 'missing_prices': missing_prices, 'missing_channels': missing_channels, })
def show_stock(request, stock_id=None, symbol=None): ''' Show stock chart and metrics. ''' #CONSIDER: add indicators that can dynamically be selected/changed if stock_id: stock = Stock.objects.get(id=stock_id) elif symbol: stock = Stock.objects.get(name=symbol.upper()) else: raise SystemExit('Fatal Error: no stock_id or symbol specified.') missing_prices = stock.missing_prices() if not missing_prices: missing_channels = stock.missing_channels() splits = stock.check_splits() else: missing_channels = [] splits = [] #set default date range and lookback period: lookback = request.session.get('channel_lookback_period', Channel.YEAR) enddate = datetime.date.today() startdate = enddate - datetime.timedelta(days=365) if request.method == 'POST': reload_ = False if request.POST.get('todo') == 'Download missing prices': fromdate = min(missing_prices) todate = max(missing_prices) stock.download_history(fromdate, todate) reload_ = True if request.POST.get('todo') == 'Calculate missing channels': fromdate = min(missing_channels) todate = max(missing_channels) Channel.calculate(stock, fromdate, todate) reload_ = True if request.POST.get('todo') == 'Correct prices for split': stock.correct_splits() reload_ = True if reload_: if symbol: return redirect('show_symbol', symbol=symbol) else: return redirect('show_stock', stock_id=stock_id) if request.POST.get('todo') == 'Save settings': stockchartform = StockChartForm(request.POST) if stockchartform.is_valid(): sd = stockchartform.cleaned_data['startdate'] ed = stockchartform.cleaned_data['enddate'] if sd: startdate = sd if ed: enddate = ed lookback = int(stockchartform.cleaned_data['lookback_period']) request.session['channel_lookback_period'] = lookback else: stockchartform = StockChartForm(initial={'startdate': startdate, 'enddate': enddate, 'lookback_period': lookback}) else: stockchartform = StockChartForm(initial={'startdate': startdate, 'enddate': enddate, 'lookback_period': lookback}) stockchart = reverse('show_stock_chart_from_to', kwargs={ 'symbol': stock.name, 'startdate_str': date2datestr(startdate), 'enddate_str': date2datestr(enddate),}) return render(request, 'show_stock.html', {'stock': stock, 'data': stock.data_summary(enddate, lookback), 'missing_prices': missing_prices, 'missing_channels': missing_channels, 'splits': splits, 'stockchart': stockchart, 'stockchartform': stockchartform})