Source code for book.views.krx

"""KRX 데이터 파싱."""

import logging

from book import models
from book.nav import get_render_dict
from book.xml_helper import XmlDictConfig, get_xml_request
from django.core import exceptions
from django.shortcuts import render

logger = logging.getLogger(__name__)

krx_price_query_url = "http://asp1.krx.co.kr/servlet/krx.asp.XMLSise?code={}"
krx_statement_query_url = "http://asp1.krx.co.kr/servlet/krx.asp.XMLJemu?code={}"
balance_order = [
    "hangMok",
    "year1Money",
    "year1GuSungRate",
    "year1JungGamRate",
    "year2Money",
    "year2GuSungRate",
    "year2JungGamRate",
    "year3Money",
    "year3GuSungRate",
    "year3JungGamRate",
]
cash_order = [
    "hangMok",
    "year1Money",
    "year1JungGamRate",
    "year2Money",
    "year2JungGamRate",
    "year3Money",
    "year3JungGamRate",
]


[docs]def krx_realtime(realtime_result, query, render_dict): """실시간 데이터 분석.""" realtime_json = XmlDictConfig(realtime_result[1].find("stockInfo")) info_json = XmlDictConfig(realtime_result[1].find("TBL_StockInfo")) render_dict["market_close"] = ( realtime_json["myJangGubun"] == "장마감" or realtime_json["myJangGubun"] == "장개시전" ) render_dict["realtime_result"] = ( realtime_json, realtime_result[0], info_json, ) if "JongName" in info_json and info_json["JongName"]: try: models.Stock.objects.get(code=query) except exceptions.ObjectDoesNotExist: stock = models.Stock(code=query, name=info_json["JongName"]) stock.save()
[docs]def krx_statement(statement_result, render_dict): """회계정보 분석.""" balance_sheet = XmlDictConfig(statement_result[1].find("TBL_DaeCha")) if "TBL_DaeCha_data" in balance_sheet: hangmok_list = [] for item in balance_sheet["TBL_DaeCha_data"]: # 항목 이름 뒤에 숫자를 붙여 둬서 쓰기 어려우므로 제거 item = {k[:-1]: v for k, v in item.items()} hangmok_list.append([item[order] for order in balance_order]) balance_sheet["TBL_DaeCha_data"] = hangmok_list render_dict["balance_sheet"] = balance_sheet income_statement = XmlDictConfig(statement_result[1].find("TBL_SonIk")) if "TBL_SonIk_data" in income_statement: hangmok_list = [] for item in income_statement["TBL_SonIk_data"]: # 항목 이름 뒤에 숫자를 붙여 둬서 쓰기 어려우므로 제거 item = {k[:-1]: v for k, v in item.items()} hangmok_list.append([item[order] for order in balance_order]) income_statement["TBL_SonIk_data"] = hangmok_list render_dict["income_statement"] = income_statement cash_flow = XmlDictConfig(statement_result[1].find("TBL_CashFlow")) if "TBL_CashFlow_data" in cash_flow: hangmok_list = [] for item in cash_flow["TBL_CashFlow_data"]: # 항목 이름 뒤에 숫자를 붙여 둬서 쓰기 어려우므로 제거 item = {k[:-1]: v for k, v in item.items()} hangmok_list.append([item[order] for order in cash_order]) cash_flow["TBL_CashFlow_data"] = hangmok_list render_dict["cash_flow"] = cash_flow render_dict["statement_result"] = statement_result
[docs]def krx_price_query(request): """ 가격 정보. :param request: :return: """ render_dict = get_render_dict("krx_price_query") if request.POST: query = request.POST["query"] render_dict["query"] = query realtime_result = get_xml_request(krx_price_query_url.format(query)) if realtime_result: krx_realtime(realtime_result, query, render_dict) statement_result = get_xml_request(krx_statement_query_url.format(query)) if statement_result: krx_statement(statement_result, render_dict) stocks = models.Stock.objects.all().order_by("code") render_dict["stocks"] = stocks return render(request, "book/investment/krx_price_query.html", render_dict)