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})
Foydali bo'ldimi? Yoqmadi 0 Baholash uchun kiring