6. changes
{% load static %}
{% load humanize %}
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="" />
<meta name="author" content="" />
<title>Панель управления - Капиталбанк</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
<link href="https://cdn.jsdelivr.net/npm/simple-datatables@7.1.2/dist/style.min.css" rel="stylesheet" />
<link href="{% static 'css/styles.css' %}" rel="stylesheet" />
<link href="https://use.fontawesome.com/releases/v6.3.0/css/all.css" rel="stylesheet" />
<script src="{% static 'js/plotly.min.js' %}"></script>
{% block extra_js %}
{% endblock extra_js %}
<link rel="icon" href="data:;base64,=">
<style>
body {
font-family: var(--font-sans);
background: linear-gradient(135deg, #e0f2fe 0%, #f1f5f9 100%);
color: var(--dark);
line-height: 1.7;
margin: 0;
overflow-x: hidden;
}
.currency-ticker-container {
overflow: hidden; /* Hides content outside the container */
white-space: nowrap; /* Keeps content on a single line */
width: 100%;
max-width: 500px; /* Adjust max-width as needed for navbar space */
}
.currency-ticker-wrap {
display: inline-block;
padding-left: 100%; /* Starts the animation off-screen to the right */
box-sizing: content-box;
animation: marquee 25s linear infinite; /* Adjust duration to control speed */
}
.currency-ticker-wrap:hover {
animation-play-state: paused; /* Pauses the animation on hover */
}
.ticker-item {
display: inline-block;
padding-right: 1rem; /* Space between items */
}
@keyframes marquee {
0% { transform: translateX(0); }
100% { transform: translateX(-100%); } /* Scrolls the entire content width to the left */
}
</style>
{% block extra_css %}
{% endblock extra_css %}
</head>
<body class="sb-nav-fixed">
<nav class="sb-topnav navbar navbar-expand navbar-dark bg-dark" id="alfa">
<!-- Navbar Brand-->
dynamic_report/:72 Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')
at dynamic_report/:72:8
at dynamic_report/:90:3
main.js?attr=F0JEnvjt9d5BkWD3xOPae2JERCoKbb5Zps2gNKYJORWudVjWad8j-iy2OmA8SMofyRkv5qnBa0v6YEbeUn8p3Q:270 [Violation] Permissions policy violation: unload is not allowed in this document.
AddEventListener @ main.js?attr=F0JEnvjt9d5BkWD3xOPae2JERCoKbb5Zps2gNKYJORWudVjWad8j-iy2OmA8SMofyRkv5qnBa0v6YEbeUn8p3Q:270
main.js?attr=F0JEnvjt9d5BkWD3xOPae2JERCoKbb5Zps2gNKYJORWudVjWad8j-iy2OmA8SMofyRkv5qnBa0v6YEbeUn8p3Q:270 [Violation] Permissions policy violation: unload is not allowed in this document.
AddEventListener @ main.js?attr=F0JEnvjt9d5BkWD3xOPae2JERCoKbb5Zps2gNKYJORWudVjWad8j-iy2OmA8SMofyRkv5qnBa0v6YEbeUn8p3Q:270
{% endblock %}
{% block extra_js %}
<script>
document.addEventListener("DOMContentLoaded",
(function () {
const form = document.getElementById('dr-form');
const go = document.getElementById('dr-go');
const panel = document.getElementById('dr-panel');
const step = document.getElementById('dr-step');
const bar = document.getElementById('dr-bar');
function csrf() {
const m = document.cookie.match(/csrftoken=([^;]+)/);
return m ? m[1] : '';
}
function show(text, isError) {
panel.classList.add('on');
panel.classList.toggle('err', !!isError);
bar.style.display = isError ? 'none' : 'block';
step.innerHTML = text;
}
// The run takes minutes, so the page polls instead of waiting on the POST.
async function poll(id) {
try {
const r = await fetch(`status/${id}/`);
const s = await r.json();
if (s.status === 'done') {
bar.style.display = 'none';
const st = s.stats || {};
show(`Готово за ${s.seconds} с — ${st.n_charts || ''} графиков, ` +
`${(st.n_periods || 0)} отчётных дат. ` +
`<a class="go" href="view/${id}/" target="_blank" rel="noopener">` +
`Открыть отчёт`);
window.open(`view/${id}/`, '_blank', 'noopener');
go.disabled = false;
setTimeout(() => window.location.reload(), 1500);
return;
}
if (s.status === 'failed') {
show('Ошибка: ' + (s.error || '').split('\n')[0], true);
go.disabled = false;
return;
}
show((s.step || 'выполняется') + ` … ${s.seconds} с`);
setTimeout(() => poll(id), 1200);
} catch (e) {
show('Потеряна связь с сервером: ' + e.message, true);
go.disabled = false;
}
}
form.addEventListener('submit', async (ev) => {
ev.preventDefault();
go.disabled = true;
show('Запуск…');
try {
const r = await fetch('start/', {
method: 'POST',
headers: {'X-CSRFToken': csrf()},
body: new FormData(form),
});
const s = await r.json();
if (!r.ok) { show('Ошибка: ' + (s.error || r.status), true); go.disabled = false; return; }
poll(s.id);
} catch (e) {
show('Не удалось запустить: ' + e.message, true);
go.disabled = false;
}
});
})());
</script>
{% endblock %}{"id": 2, "status": "pending"}
WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.
For more information on production servers see: https://docs.djangoproject.com/en/6.0/howto/deployment/
[08/Oct/2026 12:35:03] "GET /dynamic_report/ HTTP/1.1" 200 24608
[08/Oct/2026 12:35:28] "GET /dynamic_report/?csrfmiddlewaretoken=MYPphlKXHWJSvwTbfQmlJZ6uRy4vtWKQzet4D8ZvfkpxVJhOzk5xDVksJg8aWMJM&period_from=202402&period_to=&selected_period= HTTP/1.1" 200 24608
[08/Oct/2026 12:35:52] "GET /dynamic_report/?csrfmiddlewaretoken=YIhOjqJT1JnHxN6ZLZDvLVKmClbS1SEeLYVtFdYrz73mX0uC5tmHFRYku3fxuIDa&period_from=&period_to=&selected_period= HTTP/1.1" 200 24608
[08/Oct/2026 13:22:08] "GET / HTTP/1.1" 200 23636
[08/Oct/2026 13:22:09] "GET /dynamic_report/constructor/ HTTP/1.1" 200 3220557
[08/Oct/2026 13:22:13] "GET /dynamic_report/ HTTP/1.1" 200 24608
[08/Oct/2026 13:22:17] "GET /dynamic_report/?csrfmiddlewaretoken=acGa7ffLgQtCFLF7DxpzBVqo7bthY629XskPt2ujOe9h5Y3KX18LvREmZTxWrW15&period_from=202311&period_to=&selected_period= HTTP/1.1" 200 24608
[08/Oct/2026 13:29:44] "GET /dynamic_report/?csrfmiddlewaretoken=acGa7ffLgQtCFLF7DxpzBVqo7bthY629XskPt2ujOe9h5Y3KX18LvREmZTxWrW15&period_from=202311&period_to=&selected_period= HTTP/1.1" 200 24704
[08/Oct/2026 13:29:49] "GET /dynamic_report/constructor/ HTTP/1.1" 200 3220557
[08/Oct/2026 13:29:51] "GET /dynamic_report/ HTTP/1.1" 200 24704
[08/Oct/2026 13:29:52] "POST /dynamic_report/start/ HTTP/1.1" 200 30
Not Found: /.well-known/appspecific/com.chrome.devtools.json
[08/Oct/2026 13:30:38] "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 7522
[08/Oct/2026 13:33:32] "POST /dynamic_report/start/ HTTP/1.1" 200 30