11from typing import Callable
22from apps .stocks .fetcher .marketstack import (
3- fetch_price_with_marketstack_fetcher ,
4- fetch_prices_with_marketstack_fetchers ,
3+ MarketstackFetcher ,
54)
65from apps .stocks .fetcher .selenium import (
7- fetch_price_with_selenium_fetcher ,
8- fetch_prices_with_selenium_fetchers ,
6+ SeleniumFetcher ,
97)
108from apps .stocks .fetcher .website import (
119 WebsiteFetcher ,
1614from typing import Callable
1715from django .utils import timezone
1816from apps .stocks .models import Price , PriceFetcher , Stock
17+ from django .utils import timezone
18+ from apps .stocks .models import Stock
19+ from apps .stocks .forms import PriceForm
20+
21+
22+ def save_price (price : float , stock : Stock ) -> None :
23+ price = PriceForm (
24+ {
25+ "ticker" : stock .ticker ,
26+ "exchange" : stock .exchange ,
27+ "date" : timezone .now (),
28+ "price" : price ,
29+ }
30+ )
31+ if price .is_valid ():
32+ price .save ()
1933
2034
2135FETCHER_FUNCTION = Callable [[PriceFetcher ], tuple [bool , str ]]
@@ -32,25 +46,47 @@ def get_stocks_to_be_fetched() -> list[Stock]:
3246 return stocks_to_be_fetched
3347
3448
35- def get_fetchers_to_be_run (type : str ) -> list [ PriceFetcher ]:
49+ def get_fetchers_to_be_run (type : str ) -> dict [ str , dict [ str , int | str ] ]:
3650 fetchers_to_be_run = []
3751 for fetcher in list (PriceFetcher .objects .filter (type = type )):
3852 if Price .objects .filter (
3953 ticker = fetcher .stock .ticker , date__gt = timezone .now () - timedelta (days = 1 )
4054 ).exists ():
4155 continue
4256 fetchers_to_be_run .append (fetcher )
43- return fetchers_to_be_run
57+ return {str (fetcher .pk ): fetcher .data for fetcher in fetchers_to_be_run }
58+
59+
60+ def turn_fetchers_to_data (fetchers : list [PriceFetcher ]) -> dict [str , dict ]:
61+ data = {}
62+ for fetcher in fetchers :
63+ data [str (fetcher .pk )] = fetcher .data
64+ return data
65+
66+
67+ def save_prices (results : dict [str , tuple [bool , str | float ]]):
68+ for fetcher , result in results :
69+ fetcher = PriceFetcher .objects .get (pk = fetcher )
70+ if result [0 ]:
71+ save_price (fetcher .stock , result [1 ])
4472
4573
4674FETCHERS : dict [str , FETCHER_FUNCTION ] = {
4775 "WEBSITE" : WebsiteFetcher .fetch_single ,
48- "SELENIUM" : fetch_price_with_selenium_fetcher ,
49- "MARKETSTACK" : fetch_price_with_marketstack_fetcher ,
76+ "SELENIUM" : SeleniumFetcher . fetch_single ,
77+ "MARKETSTACK" : MarketstackFetcher . fetch_single ,
5078}
5179
5280
5381def fetch_prices ():
54- WebsiteFetcher .fetch_multiple (get_fetchers_to_be_run ("WEBSITE" ))
55- fetch_prices_with_selenium_fetchers (get_stocks_to_be_fetched ())
56- fetch_prices_with_marketstack_fetchers (get_stocks_to_be_fetched ())
82+ fetchers = get_fetchers_to_be_run ("WEBSITE" )
83+ results = WebsiteFetcher .fetch_multiple (fetchers )
84+ save_prices (results )
85+
86+ fetchers = get_fetchers_to_be_run ("SELENIUM" )
87+ results = SeleniumFetcher .fetch_multiple (fetchers )
88+ save_prices (results )
89+
90+ fetchers = get_fetchers_to_be_run ("MARKETSTACK" )
91+ results = MarketstackFetcher .fetch_multiple (fetchers )
92+ save_prices (results )
0 commit comments