#!/usr/bin/env python # -*- coding: utf-8 -*- """Bullish page views.""" # standard imports import datetime import logging # third-party imports import django_rq from rest_framework import generics from rest_framework.response import Response from rest_framework.decorators import api_view from django_redis import get_redis_connection # app imports from app.models import BhavCopyEquity from app.serializers import BhavCopyEquitySerializer from app.utils import ( fetch_bhav_copy_equity_data, stocks_csv_to_json, populate_bhav_copy_data_into_postgres, populate_bhav_copy_data_into_redis, verify_date ) cache = get_redis_connection("default") logger = logging.getLogger(__name__) # Create your views here. @api_view(['GET']) def bhavCopyEquityListPostgres(request): ret_message = "" req_date, ret_message = verify_date(request.query_params.get('date'), ret_message) queryset = BhavCopyEquity.objects.all().filter(date=req_date) serializer = BhavCopyEquitySerializer(queryset, many=True) # Fetch data if not present if len(serializer.data) == 0: logger.info('Data not available in DB, trying to fetch from BSE') try: data = fetch_bhav_copy_equity_data(date=req_date) except: return Response({ 'data': [], 'message': "Unable to fetch data from BSE" }) del data[0] # delete title row logger.info('Enqueue background task to populate Postgres DB') django_rq.enqueue(populate_bhav_copy_data_into_postgres, args=(data, req_date)) logger.info('Return quick response') stocks = stocks_csv_to_json(data) return Response({ "data": stocks, "message": 'Data was directly sourced from BSE!' }) return Response({ "data": serializer.data, "message": ret_message }) class EmptyRespoinseView(generics.RetrieveAPIView): def get(self, request, *args, **kwargs): return Response([]) @api_view(['GET']) def bhavCopyEquityListRedis(request): ret_message = "" date = request.query_params.get('date') req_date, ret_message = verify_date(date, ret_message) datestr = req_date.strftime("%d%m%y") # TODO: try stringified json stocks = cache.lrange(f"stocks:{datestr}", 0, -1) if len(stocks) == 0: logger.info('Data not available in Redis, trying to fetch from BSE') try: data = fetch_bhav_copy_equity_data(date=req_date) except: return Response({ 'data': [], 'message': "Unable to fetch data from BSE" }) del data[0] # delete title row logger.info('Enqueue background task to populate Redis') django_rq.enqueue(populate_bhav_copy_data_into_redis, args=(data, req_date)) logger.info('Return quick response') stocks = stocks_csv_to_json(data) return Response({ "data": stocks, "message": 'Data was directly sourced from BSE!' }) pipe = cache.pipeline() for stock in stocks: pipe.hgetall(f"stock:{datestr}:{stock}") return Response({ "data": pipe.execute(), "message": ret_message })