Esempio n. 1
0
File: views.py Progetto: pgwthf/TSB
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,
            })
Esempio n. 2
0
File: views.py Progetto: pgwthf/TSB
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})