Add privacy policy page and consent checkbox to both modals (152-FZ compliance)
This commit is contained in:
@@ -436,6 +436,11 @@ def yandex_verify():
|
||||
<body>Verification: b847b9b35f967fcc</body>
|
||||
</html>''')
|
||||
|
||||
|
||||
@app.get("/privacy", response_class=HTMLResponse, include_in_schema=False)
|
||||
def privacy_page(request: Request):
|
||||
return templates.TemplateResponse("privacy.html", {"request": request})
|
||||
|
||||
@app.get("/robots.txt", include_in_schema=False)
|
||||
def robots_txt():
|
||||
from fastapi.responses import FileResponse
|
||||
|
||||
@@ -1560,6 +1560,39 @@ button {
|
||||
}
|
||||
|
||||
/* Textarea in access modal */
|
||||
|
||||
/* Consent checkbox */
|
||||
.access-consent-field {
|
||||
margin-top: 12px;
|
||||
}
|
||||
.access-consent-label {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
cursor: pointer;
|
||||
font-size: 0.82rem;
|
||||
color: #7a9abd;
|
||||
line-height: 1.45;
|
||||
}
|
||||
.access-consent-label input[type=checkbox] {
|
||||
margin-top: 2px;
|
||||
flex-shrink: 0;
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
accent-color: #2d8cf0;
|
||||
cursor: pointer;
|
||||
}
|
||||
.access-consent-link {
|
||||
color: #5b9bd5;
|
||||
text-decoration: underline;
|
||||
}
|
||||
.access-consent-link:hover { color: #82baee; }
|
||||
.am-invalid-consent .access-consent-label {
|
||||
color: rgba(220, 70, 70, 0.85);
|
||||
}
|
||||
.am-invalid-consent .access-consent-link {
|
||||
color: rgba(220, 100, 100, 0.9);
|
||||
}
|
||||
.access-textarea {
|
||||
background: rgba(255,255,255,0.05);
|
||||
border: 1px solid rgba(255,255,255,0.12);
|
||||
|
||||
@@ -142,6 +142,12 @@
|
||||
<div class="access-products-loading">Загрузка...</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="access-consent-field">
|
||||
<label class="access-consent-label">
|
||||
<input type="checkbox" id="am-consent" />
|
||||
<span>Согласен на <a href="/privacy" target="_blank" class="access-consent-link">обработку персональных данных</a></span>
|
||||
</label>
|
||||
</div>
|
||||
<div id="am-error" class="access-modal-error" style="display:none"></div>
|
||||
</div>
|
||||
<div class="access-modal-footer">
|
||||
@@ -168,6 +174,7 @@
|
||||
<div class="access-field"><label>Телефон <span class="req">*</span></label><input id="am-phone" type="tel" placeholder="+7 (999) 000-00-00" /></div>
|
||||
<div class="access-field"><label>Ваш менеджер в MONT</label><input id="am-manager" type="text" placeholder="Если известно — укажите имя" /></div>
|
||||
<div class="access-field"><label>Интересующие продукты</label><div id="am-products" class="access-products-wrap"><div class="access-products-loading">Загрузка...</div></div></div>
|
||||
<div class="access-consent-field"><label class="access-consent-label"><input type="checkbox" id="am-consent" /><span>Согласен на <a href="/privacy" target="_blank" class="access-consent-link">обработку персональных данных</a></span></label></div>
|
||||
<div id="am-error" class="access-modal-error" style="display:none"></div>`;
|
||||
document.querySelector('.access-modal-footer').innerHTML = `<button type="button" class="access-btn-cancel" id="am-cancel">Отмена</button><button type="button" class="access-btn-submit" id="am-submit">Запросить доступ</button>`;
|
||||
document.getElementById('am-cancel').addEventListener('click', closeModal);
|
||||
@@ -241,6 +248,7 @@
|
||||
const emailRe = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
||||
const phoneRe = /^[\+\d][\d\s\-\(\)]{6,18}$/;
|
||||
|
||||
const consentEl = document.getElementById('am-consent');
|
||||
const fields = [
|
||||
{ el: nameEl, check: () => !!name, msg: 'Введите имя и фамилию' },
|
||||
{ el: companyEl, check: () => !!company, msg: 'Введите название компании' },
|
||||
@@ -253,6 +261,14 @@
|
||||
if (f.el && !f.check()) { f.el.classList.add('am-invalid'); errors.push(f.msg); }
|
||||
else if (f.el) f.el.classList.remove('am-invalid');
|
||||
});
|
||||
if (!consentEl || !consentEl.checked) {
|
||||
errors.push('Необходимо согласие на обработку персональных данных');
|
||||
const cf = document.querySelector('.access-consent-field');
|
||||
if (cf) cf.classList.add('am-invalid-consent');
|
||||
} else {
|
||||
const cf = document.querySelector('.access-consent-field');
|
||||
if (cf) cf.classList.remove('am-invalid-consent');
|
||||
}
|
||||
|
||||
if (errors.length) {
|
||||
if (errorEl) { errorEl.textContent = errors.join(' • '); errorEl.style.display = 'block'; }
|
||||
@@ -336,6 +352,12 @@
|
||||
<label>Сообщение <span class="req">*</span></label>
|
||||
<textarea id="cm-text" class="access-textarea" placeholder="Ваш вопрос или предложение..." rows="4"></textarea>
|
||||
</div>
|
||||
<div class="access-consent-field">
|
||||
<label class="access-consent-label">
|
||||
<input type="checkbox" id="cm-consent" />
|
||||
<span>Согласен на <a href="/privacy" target="_blank" class="access-consent-link">обработку персональных данных</a></span>
|
||||
</label>
|
||||
</div>
|
||||
<div id="cm-error" class="access-modal-error" style="display:none"></div>
|
||||
</div>
|
||||
<div class="access-modal-footer" id="cm-footer">
|
||||
@@ -359,6 +381,7 @@
|
||||
<div class="access-field"><label>Email <span class="req">*</span></label><input id="cm-email" type="email" placeholder="ivan@company.ru" /></div>
|
||||
<div class="access-field"><label>Телефон <span class="req">*</span></label><input id="cm-phone" type="tel" placeholder="+7 (999) 000-00-00" /></div>
|
||||
<div class="access-field"><label>Сообщение <span class="req">*</span></label><textarea id="cm-text" class="access-textarea" placeholder="Ваш вопрос или предложение..." rows="4"></textarea></div>
|
||||
<div class="access-consent-field"><label class="access-consent-label"><input type="checkbox" id="cm-consent" /><span>Согласен на <a href="/privacy" target="_blank" class="access-consent-link">обработку персональных данных</a></span></label></div>
|
||||
<div id="cm-error" class="access-modal-error" style="display:none"></div>`;
|
||||
document.getElementById('cm-footer').innerHTML = `<button type="button" class="access-btn-cancel" id="cm-cancel">Отмена</button><button type="button" class="access-btn-submit" id="cm-submit">Отправить</button>`;
|
||||
document.getElementById('cm-cancel').addEventListener('click', closeContact);
|
||||
@@ -401,6 +424,7 @@
|
||||
const emailRe = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
||||
const phoneRe = /^[\+\d][\d\s\-\(\)]{6,18}$/;
|
||||
|
||||
const consentEl = document.getElementById('cm-consent');
|
||||
const fields = [
|
||||
{ el: nameEl, check: () => !!name, msg: 'Введите имя' },
|
||||
{ el: emailEl, check: () => emailRe.test(email), msg: 'Введите корректный email' },
|
||||
@@ -413,6 +437,14 @@
|
||||
if (f.el && !f.check()) { f.el.classList.add('am-invalid'); errors.push(f.msg); }
|
||||
else if (f.el) f.el.classList.remove('am-invalid');
|
||||
});
|
||||
if (!consentEl || !consentEl.checked) {
|
||||
errors.push('Необходимо согласие на обработку персональных данных');
|
||||
const cf = document.querySelector('#contact-modal .access-consent-field');
|
||||
if (cf) cf.classList.add('am-invalid-consent');
|
||||
} else {
|
||||
const cf = document.querySelector('#contact-modal .access-consent-field');
|
||||
if (cf) cf.classList.remove('am-invalid-consent');
|
||||
}
|
||||
|
||||
if (errors.length) {
|
||||
if (errorEl) { errorEl.textContent = errors.join(' • '); errorEl.style.display = 'block'; }
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||
<title>Политика конфиденциальности — Полигон MONT</title>
|
||||
<meta name="robots" content="noindex"/>
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg"/>
|
||||
<link rel="icon" type="image/png" href="/static/favicon.png"/>
|
||||
<style>
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
body {
|
||||
background: linear-gradient(160deg, #070f1c 0%, #0a1f3a 100%);
|
||||
min-height: 100vh;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||
color: #c8d8ea;
|
||||
padding: 40px 20px 60px;
|
||||
}
|
||||
.wrap {
|
||||
max-width: 780px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.back-link {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
color: #5b9bd5;
|
||||
text-decoration: none;
|
||||
font-size: 0.9rem;
|
||||
margin-bottom: 32px;
|
||||
opacity: 0.85;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
.back-link:hover { opacity: 1; }
|
||||
h1 {
|
||||
font-size: 1.7rem;
|
||||
font-weight: 700;
|
||||
color: #e8f1fb;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.subtitle {
|
||||
font-size: 0.9rem;
|
||||
color: #6a8aaa;
|
||||
margin-bottom: 36px;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.05rem;
|
||||
font-weight: 600;
|
||||
color: #d0e4f7;
|
||||
margin: 28px 0 10px;
|
||||
}
|
||||
p, li {
|
||||
font-size: 0.95rem;
|
||||
line-height: 1.7;
|
||||
color: #a8bdd4;
|
||||
}
|
||||
ul {
|
||||
padding-left: 20px;
|
||||
margin-top: 6px;
|
||||
}
|
||||
li { margin-bottom: 4px; }
|
||||
a { color: #5b9bd5; }
|
||||
.divider {
|
||||
border: none;
|
||||
border-top: 1px solid rgba(255,255,255,0.07);
|
||||
margin: 32px 0;
|
||||
}
|
||||
.contact-box {
|
||||
background: rgba(255,255,255,0.04);
|
||||
border: 1px solid rgba(255,255,255,0.08);
|
||||
border-radius: 10px;
|
||||
padding: 20px 24px;
|
||||
margin-top: 28px;
|
||||
}
|
||||
.contact-box p { color: #a8bdd4; }
|
||||
.contact-box strong { color: #d0e4f7; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrap">
|
||||
<a class="back-link" href="/">← Вернуться на главную</a>
|
||||
|
||||
<h1>Политика конфиденциальности</h1>
|
||||
<p class="subtitle">Последнее обновление: 28 мая 2026 г.</p>
|
||||
|
||||
<p>Настоящая Политика конфиденциальности описывает, как ООО «МОНТ» (далее — «Оператор») осуществляет сбор, использование и хранение персональных данных пользователей, оставивших заявку на получение доступа к Инфраструктурному полигону MONT (<strong>stend.4mont.ru</strong>, <strong>stand.mont.ru</strong>).</p>
|
||||
|
||||
<h2>1. Оператор персональных данных</h2>
|
||||
<p>ООО «МОНТ»<br>
|
||||
Юридический адрес: г. Москва<br>
|
||||
Сайт: <a href="https://www.mont.com/" target="_blank">www.mont.com</a><br>
|
||||
Email для обращений по вопросам ПД: <a href="mailto:privacy@mont.com">privacy@mont.com</a></p>
|
||||
|
||||
<h2>2. Какие данные мы собираем</h2>
|
||||
<p>При заполнении формы запроса доступа мы получаем:</p>
|
||||
<ul>
|
||||
<li>Имя и фамилия</li>
|
||||
<li>Название компании</li>
|
||||
<li>Адрес электронной почты</li>
|
||||
<li>Номер телефона</li>
|
||||
<li>Имя вашего менеджера в MONT (необязательно)</li>
|
||||
<li>Список интересующих продуктов</li>
|
||||
</ul>
|
||||
|
||||
<h2>3. Цели обработки</h2>
|
||||
<p>Персональные данные обрабатываются исключительно для рассмотрения заявки на доступ к демостендам и последующей связи с вами по вопросам предоставления доступа.</p>
|
||||
|
||||
<h2>4. Правовое основание</h2>
|
||||
<p>Обработка персональных данных осуществляется на основании вашего явного согласия в соответствии со ст. 6, ч. 1, п. 1 и ст. 9 Федерального закона № 152-ФЗ «О персональных данных».</p>
|
||||
|
||||
<h2>5. Передача данных третьим лицам</h2>
|
||||
<p>Персональные данные не хранятся в базе данных портала. После отправки формы данные передаются ответственным сотрудникам MONT по защищённому каналу для обработки заявки. Данные не продаются и не передаются третьим лицам в коммерческих целях.</p>
|
||||
|
||||
<h2>6. Срок хранения</h2>
|
||||
<p>Данные хранятся в течение срока, необходимого для обработки заявки и предоставления доступа, но не более 1 года с момента подачи заявки, если иное не требуется законодательством РФ.</p>
|
||||
|
||||
<h2>7. Ваши права</h2>
|
||||
<p>В соответствии с 152-ФЗ вы вправе:</p>
|
||||
<ul>
|
||||
<li>получить информацию об обработке ваших персональных данных;</li>
|
||||
<li>потребовать уточнения, блокирования или уничтожения ваших данных;</li>
|
||||
<li>отозвать согласие на обработку персональных данных в любой момент.</li>
|
||||
</ul>
|
||||
<p>Для реализации любого из перечисленных прав направьте запрос на <a href="mailto:privacy@mont.com">privacy@mont.com</a>.</p>
|
||||
|
||||
<h2>8. Защита данных</h2>
|
||||
<p>Передача данных осуществляется по зашифрованному соединению (HTTPS). Доступ к данным имеют только уполномоченные сотрудники MONT.</p>
|
||||
|
||||
<hr class="divider"/>
|
||||
|
||||
<div class="contact-box">
|
||||
<p><strong>Вопросы по обработке персональных данных:</strong><br>
|
||||
<a href="mailto:privacy@mont.com">privacy@mont.com</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user