Programming
balans_and_portfel
import os
import io
import datetime
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
from django.shortcuts import render, redirect
from django.contrib import messages
from django.http import HttpResponse
from pathlib import Path
from . import forms
from . import queries
from functions import common_functions
from .functions import calculate_blockc_metrics, get_blockc_structure
BASE_DIR = Path(__file__).resolve().parent.parent
balans_svod_folder = BASE_DIR / "datasets" / "balans" / "svod"
def risk_home(request):
if request.method == 'POST':
form = forms.DateInputForm(request.POST)
if form.is_valid():
selected_date = form.cleaned_data['selected_date']
date_str = str(selected_date)
print(date_str)
request.session[f"balans_date_str_{request.user.id}"] = date_str
print("Done")
balans_filepath_svod = f"{balans_svod_folder}/svod_{date_str}.parquet"
if os.path.exists(balans_filepath_svod):
request.session[f"balans_filepath_svod_{request.user.id}"] = balans_filepath_svod
print("balans exist")
messages.success(request, "Data is already processed, you can see results!")
return redirect('risk-result')
else:
print("let's get")
return redirect('risk-get')
else:
form = forms.DateInputForm()
return render(request, 'risk/home.html', {'form':form})
def risk_get_data(request):
os.makedirs(balans_svod_folder, exist_ok = True)
conn = None
pq_writer = None
file_written = False
balans_date_str = request.session.get(f"balans_date_str_{request.user.id}")
balans_filepath_svod = request.session.get(f"balans_filepath_svod_{request.user.id}")
if balans_date_str:
try:
selected_date = datetime.datetime.strptime(balans_date_str, '%Y-%m-%d').date()
except ValueError:
messages.warning(request, f"The date selected {selected_date} did not meet requirements")
return redirect('risk-home')
else:
messages.warning(request, "No date found in this session")
return redirect('risk-home')
try:
print('Connecting')
conn = common_functions.get_oracle_connection()
print('executing query')
batch_generator = conn.fetch_df_batches(queries.balans_script,
parameters = {'pdate':selected_date}, size = 1000)
for odf in batch_generator:
arrow_table = pa.table(odf)
if pq_writer is None and arrow_table.num_rows == 0:
break
if pq_writer is None:
pq_writer = pq.ParquetWriter(balans_filepath_svod, arrow_table.schema)
pq_writer.write_table(arrow_table)
file_written = True
print(f"Wrote batch of {arrow_table.num_rows} rows directly to disk")
except Exception as e:
import traceback
traceback.print_exc()
print('Error happened for date on Balans query:', e)
messages.error(request, f"Database or extraction error for occured: {e}")
return redirect('risk-home')
finally:
if pq_writer:
pq_writer.close()
if conn:
conn.close()
if not file_written:
messages.warning(request, 'The data could not be fetched since it is not available yet')
return redirect('risk-home')
messages.success(request, f"{selected_date} date, and filepath is {balans_filepath_svod}")
return redirect('risk-result')
def risk_result(request):
selected_date = request.session.get(f"balans_date_str_{request.user.id}")
balans_filepath_svod = request.session.get(f"balans_filepath_svod_{request.user.id}")
if not selected_date or not balans_filepath_svod:
selected_date = str(common_functions.find_recent_date())
balans_filepath_svod = f"{balans_svod_folder}/svod_{selected_date}.parquet"
request.session[f"balans_date_str_{request.user.id}"] = selected_date
request.session[f"balans_filepath_svod_{request.user.id}"] = balans_filepath_svod
if not os.path.exists(balans_filepath_svod):
messages.warning(request, "Data file missing. Please query the date again.")
return redirect('risk-home')
try:
date_obj = datetime.datetime.strptime(selected_date, '%Y-%m-%d')
formatted_date = date_obj.strftime('%d.%m.%Y')
except:
formatted_date = selected_date
return render(request, 'risk/result.html', {'balans_date_str': formatted_date, 'balans_filepath_svod':balans_filepath_svod})
PO
powerty
Muallif
· Staff
Sen. 18, 2026
Sen. 18, 2026
3
Ko'rishlar
0
Yoqishlar
2m
O'qildi