update
This commit is contained in:
292
templates/404.html
Normal file
292
templates/404.html
Normal file
@@ -0,0 +1,292 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Страницата не е намерена - 404{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<style>
|
||||
.error-404-container {
|
||||
min-height: 70vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 3rem 1rem;
|
||||
}
|
||||
|
||||
.error-404-content {
|
||||
text-align: center;
|
||||
max-width: 700px;
|
||||
width: 100%;
|
||||
animation: fadeInUp 0.6s ease-out;
|
||||
}
|
||||
|
||||
@keyframes fadeInUp {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.error-404-number {
|
||||
font-family: 'Roboto Slab', serif;
|
||||
font-size: 12rem;
|
||||
font-weight: 700;
|
||||
background: linear-gradient(135deg, var(--gov-primary) 0%, var(--gov-secondary) 50%, var(--gov-accent) 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
line-height: 1;
|
||||
margin-bottom: 1rem;
|
||||
text-shadow: 0 4px 20px rgba(0, 51, 102, 0.2);
|
||||
animation: pulse 2s ease-in-out infinite;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%, 100% {
|
||||
transform: scale(1);
|
||||
}
|
||||
50% {
|
||||
transform: scale(1.02);
|
||||
}
|
||||
}
|
||||
|
||||
.error-404-number::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
background: radial-gradient(circle, rgba(0, 102, 204, 0.1) 0%, transparent 70%);
|
||||
border-radius: 50%;
|
||||
z-index: -1;
|
||||
animation: ripple 3s ease-out infinite;
|
||||
}
|
||||
|
||||
@keyframes ripple {
|
||||
0% {
|
||||
transform: translate(-50%, -50%) scale(0.8);
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
transform: translate(-50%, -50%) scale(1.5);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.error-404-title {
|
||||
font-family: 'Roboto Slab', serif;
|
||||
font-size: 2.5rem;
|
||||
color: var(--gov-primary);
|
||||
margin-bottom: 1rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.error-404-message {
|
||||
font-size: 1.2rem;
|
||||
color: var(--gov-gray);
|
||||
margin-bottom: 2.5rem;
|
||||
line-height: 1.8;
|
||||
}
|
||||
|
||||
.error-404-illustration {
|
||||
margin: 2rem 0;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.error-404-illustration svg {
|
||||
max-width: 300px;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
animation: float 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes float {
|
||||
0%, 100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
50% {
|
||||
transform: translateY(-20px);
|
||||
}
|
||||
}
|
||||
|
||||
.error-404-actions {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 2.5rem;
|
||||
}
|
||||
|
||||
.error-404-actions .btn {
|
||||
min-width: 180px;
|
||||
}
|
||||
|
||||
.error-404-helpful-links {
|
||||
margin-top: 3rem;
|
||||
padding-top: 2rem;
|
||||
border-top: 2px solid var(--gov-gray-light);
|
||||
}
|
||||
|
||||
.error-404-helpful-links h3 {
|
||||
font-family: 'Roboto Slab', serif;
|
||||
color: var(--gov-primary);
|
||||
font-size: 1.3rem;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.helpful-links-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
gap: 1rem;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.helpful-link {
|
||||
display: block;
|
||||
padding: 1rem;
|
||||
background: linear-gradient(135deg, var(--gov-light) 0%, var(--gov-white) 100%);
|
||||
border-radius: 8px;
|
||||
text-decoration: none;
|
||||
color: var(--gov-primary);
|
||||
font-weight: 500;
|
||||
transition: all 0.3s ease;
|
||||
border: 2px solid transparent;
|
||||
box-shadow: 0 2px 8px var(--gov-shadow);
|
||||
}
|
||||
|
||||
.helpful-link:hover {
|
||||
transform: translateY(-3px);
|
||||
box-shadow: 0 4px 16px var(--gov-shadow-lg);
|
||||
border-color: var(--gov-secondary);
|
||||
color: var(--gov-secondary);
|
||||
}
|
||||
|
||||
.helpful-link-icon {
|
||||
font-size: 1.5rem;
|
||||
display: block;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.error-404-number {
|
||||
font-size: 8rem;
|
||||
}
|
||||
|
||||
.error-404-title {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
|
||||
.error-404-message {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.error-404-actions {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.error-404-actions .btn {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.helpful-links-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.error-404-number {
|
||||
font-size: 6rem;
|
||||
}
|
||||
|
||||
.error-404-title {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.error-404-illustration svg {
|
||||
max-width: 200px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="error-404-container">
|
||||
<div class="error-404-content">
|
||||
<div class="error-404-number">404</div>
|
||||
|
||||
<div class="error-404-illustration">
|
||||
<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#003366;stop-opacity:1" />
|
||||
<stop offset="50%" style="stop-color:#0066cc;stop-opacity:1" />
|
||||
<stop offset="100%" style="stop-color:#ffd700;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<!-- Magnifying glass -->
|
||||
<circle cx="80" cy="80" r="50" fill="none" stroke="url(#grad1)" stroke-width="4" opacity="0.6"/>
|
||||
<line x1="120" y1="120" x2="160" y2="160" stroke="url(#grad1)" stroke-width="4" stroke-linecap="round" opacity="0.6"/>
|
||||
<!-- Question mark -->
|
||||
<path d="M 100 50 Q 100 40 110 40 Q 120 40 120 50 Q 120 60 110 60 L 110 80 Q 110 90 100 90"
|
||||
fill="none" stroke="url(#grad1)" stroke-width="4" stroke-linecap="round" opacity="0.8"/>
|
||||
<circle cx="100" cy="110" r="3" fill="url(#grad1)" opacity="0.8"/>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<h1 class="error-404-title">Страницата не е намерена</h1>
|
||||
|
||||
<p class="error-404-message">
|
||||
Съжаляваме, но страницата, която търсите, не съществува или е преместена.
|
||||
Моля, проверете адреса или използвайте навигацията по-долу, за да намерите това, което търсите.
|
||||
</p>
|
||||
|
||||
<div class="error-404-actions">
|
||||
<a href="{% url 'reports:home' %}" class="btn btn-primary">
|
||||
<span style="margin-right: 0.5rem;">🏠</span>
|
||||
Начална страница
|
||||
</a>
|
||||
<a href="javascript:history.back()" class="btn btn-secondary">
|
||||
<span style="margin-right: 0.5rem;">←</span>
|
||||
Назад
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="error-404-helpful-links">
|
||||
<h3>Полезни връзки</h3>
|
||||
<div class="helpful-links-grid">
|
||||
<a href="{% url 'reports:list' %}" class="helpful-link">
|
||||
<span class="helpful-link-icon">📋</span>
|
||||
Всички доклади
|
||||
</a>
|
||||
<a href="{% url 'reports:create' %}" class="helpful-link">
|
||||
<span class="helpful-link-icon">➕</span>
|
||||
Докладване на измама
|
||||
</a>
|
||||
<a href="{% url 'reports:search' %}" class="helpful-link">
|
||||
<span class="helpful-link-icon">🔍</span>
|
||||
Търсене
|
||||
</a>
|
||||
{% if user.is_authenticated %}
|
||||
<a href="{% url 'accounts:profile' %}" class="helpful-link">
|
||||
<span class="helpful-link-icon">👤</span>
|
||||
Моят профил
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="{% url 'accounts:login' %}" class="helpful-link">
|
||||
<span class="helpful-link-icon">🔐</span>
|
||||
Вход в системата
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
29
templates/accounts/login.html
Normal file
29
templates/accounts/login.html
Normal file
@@ -0,0 +1,29 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Вход - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-card">
|
||||
<h2>Вход в Системата</h2>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="id_username">Потребителско Име</label>
|
||||
<input type="text" name="username" id="id_username" class="form-control" required autofocus>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="id_password">Парола</label>
|
||||
<input type="password" name="password" id="id_password" class="form-control" required>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary btn-block">Вход</button>
|
||||
</form>
|
||||
<div class="auth-links">
|
||||
<a href="{% url 'accounts:password_reset' %}">Забравена парола?</a>
|
||||
<span>|</span>
|
||||
<a href="{% url 'accounts:register' %}">Създаване на акаунт</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
25
templates/accounts/mfa_disable.html
Normal file
25
templates/accounts/mfa_disable.html
Normal file
@@ -0,0 +1,25 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Деактивиране на Двуфакторна Автентификация - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Деактивиране на Двуфакторна Автентификация</h2>
|
||||
<div class="gov-alert gov-alert-warning">
|
||||
<div class="alert-icon">⚠</div>
|
||||
<div class="alert-content">
|
||||
<p><strong>Внимание:</strong> Деактивирането на ДА ще намали сигурността на вашия акаунт.</p>
|
||||
<p>Сигурни ли сте, че искате да деактивирате двуфакторната автентификация?</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post" data-loading>
|
||||
{% csrf_token %}
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-danger" data-tooltip="Това ще деактивира двуфакторната автентификация">Да, Деактивирам ДА</button>
|
||||
<a href="{% url 'accounts:profile' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
41
templates/accounts/mfa_enable.html
Normal file
41
templates/accounts/mfa_enable.html
Normal file
@@ -0,0 +1,41 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Активиране на Двуфакторна Автентификация - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-card">
|
||||
<h2>Активиране на Двуфакторна Автентификация</h2>
|
||||
<p>Въведете кода за потвърждение от вашето приложение за автентификация, за да активирате ДА.</p>
|
||||
|
||||
<form method="post" data-loading>
|
||||
{% csrf_token %}
|
||||
<div class="mfa-form-group">
|
||||
<label for="id_token">Код за Потвърждение</label>
|
||||
<input type="text"
|
||||
name="token"
|
||||
id="id_token"
|
||||
class="mfa-token-input"
|
||||
placeholder="000000"
|
||||
maxlength="6"
|
||||
pattern="[0-9]{6}"
|
||||
autofocus
|
||||
required
|
||||
inputmode="numeric">
|
||||
{% if form.token.errors %}
|
||||
<div class="error-message">{{ form.token.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="mfa-help-text">Въведете 6-цифрения код от вашето приложение за автентификация</small>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary btn-block">Активиране на ДА</button>
|
||||
</form>
|
||||
|
||||
<div class="auth-links">
|
||||
<a href="{% url 'accounts:mfa_setup' %}">Обратно към Настройка</a>
|
||||
<span>|</span>
|
||||
<a href="{% url 'accounts:profile' %}">Отказ</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
81
templates/accounts/mfa_setup.html
Normal file
81
templates/accounts/mfa_setup.html
Normal file
@@ -0,0 +1,81 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Настройка на Двуфакторна Автентификация - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Настройка на Двуфакторна Автентификация</h2>
|
||||
|
||||
{% if mfa_enabled %}
|
||||
<div class="gov-alert gov-alert-info">
|
||||
<div class="alert-icon">ℹ</div>
|
||||
<div class="alert-content">
|
||||
<p>Двуфакторната автентификация вече е активирана за вашия акаунт.</p>
|
||||
<a href="{% url 'accounts:mfa_disable' %}" class="btn btn-danger" style="margin-top: 1rem;">Деактивиране</a>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="mfa-setup-steps">
|
||||
<div class="step">
|
||||
<h3>Стъпка 1: Инсталиране на Приложение за Автентификация</h3>
|
||||
<p>Ако все още нямате такова, инсталирайте приложение за автентификация на вашето мобилно устройство:</p>
|
||||
<ul>
|
||||
<li><strong>Google Authenticator</strong> (iOS, Android)</li>
|
||||
<li><strong>Microsoft Authenticator</strong> (iOS, Android)</li>
|
||||
<li><strong>Authy</strong> (iOS, Android)</li>
|
||||
<li><strong>1Password</strong> (iOS, Android, Desktop)</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="step">
|
||||
<h3>Стъпка 2: Сканиране на QR Код</h3>
|
||||
<p>Отворете вашето приложение за автентификация и сканирайте този QR код:</p>
|
||||
{% if qr_code %}
|
||||
<div class="qr-code-container">
|
||||
<img src="{{ qr_code }}" alt="QR Code" class="qr-code">
|
||||
</div>
|
||||
<div class="secret-key">
|
||||
<p><strong>Или въведете този ключ ръчно:</strong></p>
|
||||
<div class="secret-code">{{ secret_key }}</div>
|
||||
<button type="button" class="btn btn-sm btn-secondary" onclick="copySecretKey('{{ secret_key }}')" style="margin-top: 1rem;" data-tooltip="Копиране на секретния ключ">
|
||||
Копиране на Ключ
|
||||
</button>
|
||||
</div>
|
||||
{% else %}
|
||||
<p>Генериране на QR код...</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="step">
|
||||
<h3>Стъпка 3: Потвърждаване на Настройката</h3>
|
||||
<p>Въведете 6-цифрения код от вашето приложение за автентификация, за да потвърдите настройката:</p>
|
||||
<div style="text-align: center; margin-top: 1.5rem;">
|
||||
<a href="{% url 'accounts:mfa_enable' %}" class="btn btn-primary" data-tooltip="Продължете към страницата за потвърждаване">Продължи към Потвърждаване</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="form-actions">
|
||||
<a href="{% url 'accounts:profile' %}" class="btn btn-secondary">Обратно към Профил</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function copySecretKey(key) {
|
||||
navigator.clipboard.writeText(key).then(function() {
|
||||
if (typeof Toast !== 'undefined') {
|
||||
Toast.success('Секретният ключ е копиран в клипборда!');
|
||||
} else {
|
||||
alert('Секретният ключ е копиран в клипборда!');
|
||||
}
|
||||
}, function(err) {
|
||||
console.error('Failed to copy: ', err);
|
||||
if (typeof Toast !== 'undefined') {
|
||||
Toast.error('Неуспешно копиране. Моля, копирайте ръчно.');
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
39
templates/accounts/mfa_verify.html
Normal file
39
templates/accounts/mfa_verify.html
Normal file
@@ -0,0 +1,39 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Двуфакторна Автентификация - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-card">
|
||||
<h2>Двуфакторна Автентификация</h2>
|
||||
<p>Моля, въведете кода за потвърждение от вашето приложение за автентификация, за да завършите входа.</p>
|
||||
|
||||
<form method="post" data-loading>
|
||||
{% csrf_token %}
|
||||
<div class="mfa-form-group">
|
||||
<label for="id_token">Код за Потвърждение</label>
|
||||
<input type="text"
|
||||
name="token"
|
||||
id="id_token"
|
||||
class="mfa-token-input"
|
||||
placeholder="000000"
|
||||
maxlength="6"
|
||||
pattern="[0-9]{6}"
|
||||
autofocus
|
||||
required
|
||||
inputmode="numeric">
|
||||
{% if form.token.errors %}
|
||||
<div class="error-message">{{ form.token.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="mfa-help-text">Въведете 6-цифрения код от вашето приложение за автентификация</small>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary btn-block">Потвърждаване</button>
|
||||
</form>
|
||||
|
||||
<div class="auth-links">
|
||||
<a href="{% url 'accounts:login' %}">Обратно към Вход</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
39
templates/accounts/password_change.html
Normal file
39
templates/accounts/password_change.html
Normal file
@@ -0,0 +1,39 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Смяна на Парола - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Смяна на Парола</h2>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="id_old_password">Текуща Парола</label>
|
||||
<input type="password" name="old_password" id="id_old_password" class="form-control" required autofocus>
|
||||
{% if form.old_password.errors %}
|
||||
<div class="error-message">{{ form.old_password.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="id_new_password1">Нова Парола</label>
|
||||
<input type="password" name="new_password1" id="id_new_password1" class="form-control" required>
|
||||
{% if form.new_password1.errors %}
|
||||
<div class="error-message">{{ form.new_password1.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">Минимум 12 символа</small>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="id_new_password2">Потвърждение на Новата Парола</label>
|
||||
<input type="password" name="new_password2" id="id_new_password2" class="form-control" required>
|
||||
{% if form.new_password2.errors %}
|
||||
<div class="error-message">{{ form.new_password2.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary">Смяна на Парола</button>
|
||||
<a href="{% url 'accounts:profile' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
27
templates/accounts/password_reset.html
Normal file
27
templates/accounts/password_reset.html
Normal file
@@ -0,0 +1,27 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Възстановяване на Парола - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-card">
|
||||
<h2>Възстановяване на Парола</h2>
|
||||
<p>Въведете вашия имейл адрес и ще ви изпратим връзка за възстановяване на паролата.</p>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="id_email">Имейл</label>
|
||||
<input type="email" name="email" id="id_email" class="form-control" required autofocus>
|
||||
{% if form.email.errors %}
|
||||
<div class="error-message">{{ form.email.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary btn-block">Изпращане на Връзка</button>
|
||||
</form>
|
||||
<div class="auth-links">
|
||||
<a href="{% url 'accounts:login' %}">Обратно към Вход</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
16
templates/accounts/password_reset_complete.html
Normal file
16
templates/accounts/password_reset_complete.html
Normal file
@@ -0,0 +1,16 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Възстановяване на Парола Завършено - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-card">
|
||||
<h2>Възстановяване на Парола Завършено</h2>
|
||||
<p>Вашата парола е зададена. Можете да влезете в системата сега.</p>
|
||||
<div class="auth-links">
|
||||
<a href="{% url 'accounts:login' %}" class="btn btn-primary btn-block">Вход</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
41
templates/accounts/password_reset_confirm.html
Normal file
41
templates/accounts/password_reset_confirm.html
Normal file
@@ -0,0 +1,41 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Задаване на Нова Парола - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-card">
|
||||
<h2>Задаване на Нова Парола</h2>
|
||||
{% if validlink %}
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="id_new_password1">Нова Парола</label>
|
||||
<input type="password" name="new_password1" id="id_new_password1" class="form-control" required autofocus>
|
||||
{% if form.new_password1.errors %}
|
||||
<div class="error-message">{{ form.new_password1.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">Минимум 12 символа</small>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="id_new_password2">Потвърждение на Новата Парола</label>
|
||||
<input type="password" name="new_password2" id="id_new_password2" class="form-control" required>
|
||||
{% if form.new_password2.errors %}
|
||||
<div class="error-message">{{ form.new_password2.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary btn-block">Смяна на Парола</button>
|
||||
</form>
|
||||
{% else %}
|
||||
<div class="gov-alert gov-alert-error">
|
||||
<div class="alert-icon">✕</div>
|
||||
<div class="alert-content">
|
||||
<p>Връзката за възстановяване на парола е невалидна или е изтекла. Моля, заявете нова.</p>
|
||||
<a href="{% url 'accounts:password_reset' %}" class="btn btn-primary" style="margin-top: 1rem;">Заявка за Нова Връзка</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
17
templates/accounts/password_reset_done.html
Normal file
17
templates/accounts/password_reset_done.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Имейл за Възстановяване Изпратен - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-card">
|
||||
<h2>Имейл за Възстановяване Изпратен</h2>
|
||||
<p>Изпратихме ви инструкции за задаване на вашата парола. Ако съществува акаунт с въведения имейл, трябва да ги получите скоро.</p>
|
||||
<p>Ако не получите имейл, моля, уверете се, че сте въвели адреса, с който сте се регистрирали, и проверете папката за спам.</p>
|
||||
<div class="auth-links">
|
||||
<a href="{% url 'accounts:login' %}">Обратно към Вход</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
22
templates/accounts/password_reset_email.html
Normal file
22
templates/accounts/password_reset_email.html
Normal file
@@ -0,0 +1,22 @@
|
||||
{% load i18n %}{% autoescape off %}
|
||||
Здравейте,
|
||||
|
||||
Получихте този имейл, защото заявихте възстановяване на парола за вашия акаунт в {{ site_name|default:"Портал за Докладване на Измами" }}.
|
||||
|
||||
Моля, кликнете на следната връзка, за да зададете нова парола:
|
||||
|
||||
{{ protocol }}://{{ domain }}{% url 'accounts:password_reset_confirm' uidb64=uid token=token %}
|
||||
|
||||
Ако връзката не работи, копирайте и поставете адреса в браузъра си.
|
||||
|
||||
Ако не сте заявили възстановяване на парола, моля, игнорирайте този имейл. Вашата парола няма да бъде променена.
|
||||
|
||||
Тази връзка е валидна за ограничен период от време за вашата сигурност.
|
||||
|
||||
С уважение,
|
||||
Екипът на {{ site_name|default:"Портал за Докладване на Измами" }}
|
||||
|
||||
---
|
||||
Това е автоматично генериран имейл. Моля, не отговаряйте на този имейл.
|
||||
{% endautoescape %}
|
||||
|
||||
2
templates/accounts/password_reset_email_subject.txt
Normal file
2
templates/accounts/password_reset_email_subject.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Възстановяване на Парола - {{ site_name|default:"Портал за Докладване на Измами" }}
|
||||
|
||||
96
templates/accounts/profile.html
Normal file
96
templates/accounts/profile.html
Normal file
@@ -0,0 +1,96 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Моят Профил - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="profile-container">
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Моят Профил</h2>
|
||||
<a href="{% url 'accounts:profile_edit' %}" class="btn btn-primary">Редактиране на Профил</a>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="info-section">
|
||||
<h3>Информация за Акаунта</h3>
|
||||
<div class="profile-info">
|
||||
<div class="info-row">
|
||||
<strong>Потребителско Име:</strong>
|
||||
<span>{{ user_obj.username }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<strong>Имейл:</strong>
|
||||
<span>{{ user_obj.email }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<strong>Роля:</strong>
|
||||
<span class="badge badge-{{ user_obj.role }}">{{ user_obj.get_role_display }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<strong>Потвърден Имейл:</strong>
|
||||
<span>{% if user_obj.is_verified %}Да{% else %}Не{% endif %}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<strong>Двуфакторна Автентификация:</strong>
|
||||
<span>{% if user_obj.mfa_enabled %}Активирана{% else %}Деактивирана{% endif %}</span>
|
||||
{% if user_obj.mfa_enabled %}
|
||||
<a href="{% url 'accounts:mfa_disable' %}"
|
||||
class="btn btn-sm btn-danger"
|
||||
data-confirm="Сигурни ли сте, че искате да деактивирате двуфакторната автентификация? Това ще намали сигурността на вашия акаунт."
|
||||
data-confirm-title="Деактивиране на MFA"
|
||||
data-tooltip="Деактивиране на двуфакторна автентификация">Деактивиране</a>
|
||||
{% else %}
|
||||
<a href="{% url 'accounts:mfa_setup' %}"
|
||||
class="btn btn-sm btn-primary"
|
||||
data-tooltip="Активиране на двуфакторна автентификация за по-голяма сигурност">Активиране</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<strong>Член от:</strong>
|
||||
<span>{{ user_obj.created_at|date:"d F Y" }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if user_obj.profile %}
|
||||
<div class="info-section">
|
||||
<h3>Лична Информация</h3>
|
||||
<div class="profile-info">
|
||||
{% if user_obj.profile.first_name %}
|
||||
<div class="info-row">
|
||||
<strong>Име:</strong>
|
||||
<span>{{ user_obj.profile.first_name }}</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if user_obj.profile.last_name %}
|
||||
<div class="info-row">
|
||||
<strong>Фамилия:</strong>
|
||||
<span>{{ user_obj.profile.last_name }}</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if user_obj.profile.phone %}
|
||||
<div class="info-row">
|
||||
<strong>Телефон:</strong>
|
||||
<span>{{ user_obj.profile.phone }}</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="info-row">
|
||||
<strong>Предпочитан Език:</strong>
|
||||
<span>{{ user_obj.profile.get_preferred_language_display }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-body">
|
||||
<div class="profile-actions">
|
||||
<a href="{% url 'accounts:password_change' %}" class="btn btn-secondary">Смяна на Парола</a>
|
||||
<a href="{% url 'legal:data_request' %}" class="btn btn-secondary">Заявка за Данни</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
37
templates/accounts/profile_edit.html
Normal file
37
templates/accounts/profile_edit.html
Normal file
@@ -0,0 +1,37 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Редактиране на Профил - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Редактиране на Профил</h2>
|
||||
<form method="post" data-loading>
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="id_first_name">Име</label>
|
||||
<input type="text" name="first_name" id="id_first_name" class="form-control" value="{{ form.first_name.value|default:'' }}" data-tooltip="Вашето първо име">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="id_last_name">Фамилия</label>
|
||||
<input type="text" name="last_name" id="id_last_name" class="form-control" value="{{ form.last_name.value|default:'' }}" data-tooltip="Вашата фамилия">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="id_phone">Телефон</label>
|
||||
<input type="text" name="phone" id="id_phone" class="form-control" value="{{ form.phone.value|default:'' }}" placeholder="+359..." data-tooltip="Телефонен номер в международен формат">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="id_preferred_language">Предпочитан Език</label>
|
||||
<select name="preferred_language" id="id_preferred_language" class="form-control" data-tooltip="Изберете предпочитания език за интерфейса">
|
||||
{% for value, label in form.preferred_language.field.choices %}
|
||||
<option value="{{ value }}" {% if form.preferred_language.value == value %}selected{% endif %}>{{ label }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary" data-tooltip="Промените ще бъдат запазени">Запазване на Промените</button>
|
||||
<a href="{% url 'accounts:profile' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
57
templates/accounts/register.html
Normal file
57
templates/accounts/register.html
Normal file
@@ -0,0 +1,57 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Регистрация - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-card">
|
||||
<h2>Създаване на Акаунт</h2>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="id_username">Потребителско Име</label>
|
||||
<input type="text" name="username" id="id_username" class="form-control" required autofocus>
|
||||
{% if form.username.errors %}
|
||||
<div class="error-message">{{ form.username.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="id_email">Имейл</label>
|
||||
<input type="email" name="email" id="id_email" class="form-control" required>
|
||||
{% if form.email.errors %}
|
||||
<div class="error-message">{{ form.email.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="id_password1">Парола</label>
|
||||
<input type="password" name="password1" id="id_password1" class="form-control" required>
|
||||
{% if form.password1.errors %}
|
||||
<div class="error-message">{{ form.password1.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">Минимум 12 символа</small>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="id_password2">Потвърждение на Парола</label>
|
||||
<input type="password" name="password2" id="id_password2" class="form-control" required>
|
||||
{% if form.password2.errors %}
|
||||
<div class="error-message">{{ form.password2.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="checkbox-label">
|
||||
<input type="checkbox" name="consent_given" id="id_consent_given" required>
|
||||
Съгласен съм с <a href="{% url 'legal:privacy' %}" target="_blank">Политиката за Поверителност</a> и <a href="{% url 'legal:terms' %}" target="_blank">Условията за Ползване</a>
|
||||
</label>
|
||||
{% if form.consent_given.errors %}
|
||||
<div class="error-message">{{ form.consent_given.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary btn-block">Регистрация</button>
|
||||
</form>
|
||||
<div class="auth-links">
|
||||
<a href="{% url 'accounts:login' %}">Вече имате акаунт? Вход</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
90
templates/admin/reports/sitesettings/change_form.html
Normal file
90
templates/admin/reports/sitesettings/change_form.html
Normal file
@@ -0,0 +1,90 @@
|
||||
{% extends "admin/change_form.html" %}
|
||||
{% load static %}
|
||||
|
||||
{% block submit_buttons_bottom %}
|
||||
{{ block.super }}
|
||||
|
||||
{% if show_test_email %}
|
||||
<div style="margin-top: 20px; padding: 15px; background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 4px;">
|
||||
<h3 style="margin-top: 0;">Тест на Имейл Сървър</h3>
|
||||
<p>Изпратете тестов имейл, за да проверите дали настройките на имейл сървъра са правилни.</p>
|
||||
<form method="post" style="display: flex; gap: 10px; align-items: flex-end;">
|
||||
{% csrf_token %}
|
||||
<div style="flex: 1;">
|
||||
<label for="test_email_address" style="display: block; margin-bottom: 5px; font-weight: 600;">Имейл адрес за тест:</label>
|
||||
<input type="email"
|
||||
id="test_email_address"
|
||||
name="test_email_address"
|
||||
value="{{ user.email }}"
|
||||
class="vTextField"
|
||||
style="width: 100%; padding: 8px;"
|
||||
placeholder="test@example.com"
|
||||
required>
|
||||
</div>
|
||||
<div>
|
||||
<button type="submit"
|
||||
name="_test_email"
|
||||
class="default"
|
||||
style="padding: 10px 20px; background: #417690; color: white; border: none; border-radius: 4px; cursor: pointer;">
|
||||
📧 Изпрати Тестов Имейл
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<p style="margin-top: 10px; font-size: 12px; color: #666;">
|
||||
<strong>Забележка:</strong> Уверете се, че сте запазили промените преди изпращане на тестов имейл.
|
||||
</p>
|
||||
{% if original.email_backend == 'django.core.mail.backends.smtp.EmailBackend' and not original.email_host %}
|
||||
<div style="margin-top: 15px; padding: 12px; background: #fff3cd; border: 1px solid #ffc107; border-radius: 4px;">
|
||||
<strong style="color: #856404;">⚠️ Внимание:</strong>
|
||||
<p style="margin: 5px 0 0 0; color: #856404;">
|
||||
SMTP сървърът не е конфигуриран. Моля, попълнете полето "Email Host" и запазете настройките преди изпращане на тестов имейл.
|
||||
Без конфигуриран SMTP сървър, имейлите ще се изпращат само в конзолата (за разработка).
|
||||
</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if original.email_use_tls and original.email_use_ssl %}
|
||||
<div style="margin-top: 15px; padding: 12px; background: #f8d7da; border: 1px solid #dc3545; border-radius: 4px;">
|
||||
<strong style="color: #721c24;">❌ Грешка:</strong>
|
||||
<p style="margin: 5px 0 0 0; color: #721c24;">
|
||||
TLS и SSL не могат да бъдат активирани едновременно! Моля, изберете само едно от двете.
|
||||
Обикновено използвайте TLS за порт 587 или SSL за порт 465.
|
||||
</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block admin_change_form_document_ready %}
|
||||
{{ block.super }}
|
||||
<script>
|
||||
(function($) {
|
||||
// Make TLS and SSL mutually exclusive
|
||||
var tlsField = $('#id_email_use_tls');
|
||||
var sslField = $('#id_email_use_ssl');
|
||||
|
||||
function updateMutualExclusivity() {
|
||||
if (tlsField.is(':checked') && sslField.is(':checked')) {
|
||||
// If both are checked, uncheck SSL (TLS is more common)
|
||||
sslField.prop('checked', false);
|
||||
}
|
||||
}
|
||||
|
||||
tlsField.on('change', function() {
|
||||
if ($(this).is(':checked')) {
|
||||
sslField.prop('checked', false);
|
||||
}
|
||||
});
|
||||
|
||||
sslField.on('change', function() {
|
||||
if ($(this).is(':checked')) {
|
||||
tlsField.prop('checked', false);
|
||||
}
|
||||
});
|
||||
|
||||
// Check on page load
|
||||
updateMutualExclusivity();
|
||||
})(django.jQuery);
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
80
templates/analytics/dashboard.html
Normal file
80
templates/analytics/dashboard.html
Normal file
@@ -0,0 +1,80 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Табло за Аналитика - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Табло за Аналитика</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<h3>{{ total_reports|default:0 }}</h3>
|
||||
<p>Общо Доклади</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ pending_reports|default:0 }}</h3>
|
||||
<p>Чакащи</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ verified_reports|default:0 }}</h3>
|
||||
<p>Потвърдени</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ rejected_reports|default:0 }}</h3>
|
||||
<p>Отхвърлени</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ total_users|default:0 }}</h3>
|
||||
<p>Общо Потребители</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ moderators|default:0 }}</h3>
|
||||
<p>Модератори</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if scam_types %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Разпределение по Видове Измами</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="scam-types-grid">
|
||||
{% for type in scam_types %}
|
||||
<div class="scam-type-card">
|
||||
<div class="scam-type-header">
|
||||
<span class="badge badge-{{ type.scam_type }}" style="font-size: 0.9rem; padding: 0.5rem 1rem;">
|
||||
{{ type.display_name }}
|
||||
</span>
|
||||
<div class="scam-type-count">
|
||||
<span class="count-number">{{ type.count }}</span>
|
||||
<span class="count-label">доклад{{ type.count|pluralize:"а,а" }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="scam-type-bar">
|
||||
<div class="scam-type-bar-fill" style="width: {{ type.percentage }}%"></div>
|
||||
</div>
|
||||
<div class="scam-type-percentage">
|
||||
{{ type.percentage }}% от общия брой
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-body">
|
||||
<div class="analytics-links">
|
||||
<a href="{% url 'analytics:reports' %}" class="btn btn-secondary">Аналитика на Докладите</a>
|
||||
<a href="{% url 'analytics:users' %}" class="btn btn-secondary">Аналитика на Потребителите</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
283
templates/analytics/reports.html
Normal file
283
templates/analytics/reports.html
Normal file
@@ -0,0 +1,283 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Аналитика на Докладите - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header">
|
||||
<h1>Аналитика на Докладите</h1>
|
||||
<p class="lead">Подробна статистика и аналитика за докладите за измами</p>
|
||||
</div>
|
||||
|
||||
<!-- Overall Statistics -->
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Обща Статистика</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<h3>{{ total_reports|default:0 }}</h3>
|
||||
<p>Общо Доклади</p>
|
||||
</div>
|
||||
<div class="stat-card stat-pending">
|
||||
<h3>{{ pending_reports|default:0 }}</h3>
|
||||
<p>В Очакване</p>
|
||||
</div>
|
||||
<div class="stat-card stat-verified">
|
||||
<h3>{{ verified_reports|default:0 }}</h3>
|
||||
<p>Потвърдени</p>
|
||||
</div>
|
||||
<div class="stat-card stat-rejected">
|
||||
<h3>{{ rejected_reports|default:0 }}</h3>
|
||||
<p>Отхвърлени</p>
|
||||
</div>
|
||||
<div class="stat-card stat-review">
|
||||
<h3>{{ under_review_reports|default:0 }}</h3>
|
||||
<p>В Преглед</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Time-based Statistics -->
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Статистика по Период</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<h3>{{ reports_last_7_days|default:0 }}</h3>
|
||||
<p>Последните 7 Дни</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ reports_last_30_days|default:0 }}</h3>
|
||||
<p>Последните 30 Дни</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ reports_last_90_days|default:0 }}</h3>
|
||||
<p>Последните 90 Дни</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Scam Type Distribution -->
|
||||
{% if scam_types %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Разпределение по Видове Измами</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="scam-types-grid">
|
||||
{% for type in scam_types %}
|
||||
<div class="scam-type-card">
|
||||
<div class="scam-type-header">
|
||||
<span class="badge badge-{{ type.scam_type }}" style="font-size: 0.9rem; padding: 0.5rem 1rem;">
|
||||
{{ type.display_name }}
|
||||
</span>
|
||||
<div class="scam-type-count">
|
||||
<span class="count-number">{{ type.count }}</span>
|
||||
<span class="count-label">доклад{{ type.count|pluralize:"а,а" }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="scam-type-bar">
|
||||
<div class="scam-type-bar-fill" style="width: {{ type.percentage }}%"></div>
|
||||
</div>
|
||||
<div class="scam-type-percentage">
|
||||
{{ type.percentage }}% от общия брой
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Moderation Statistics -->
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Статистика на Модерация</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<h3>{{ total_moderations|default:0 }}</h3>
|
||||
<p>Общо Модерации</p>
|
||||
</div>
|
||||
<div class="stat-card stat-verified">
|
||||
<h3>{{ approvals|default:0 }}</h3>
|
||||
<p>Одобрени</p>
|
||||
</div>
|
||||
<div class="stat-card stat-rejected">
|
||||
<h3>{{ rejections|default:0 }}</h3>
|
||||
<p>Отхвърлени</p>
|
||||
</div>
|
||||
</div>
|
||||
{% if avg_moderation_time_hours %}
|
||||
<div style="margin-top: 2rem; padding-top: 2rem; border-top: 1px solid #e0e0e0;">
|
||||
<h3>Време за Модерация</h3>
|
||||
<div class="stats-grid" style="margin-top: 1rem;">
|
||||
<div class="stat-card">
|
||||
<h3>{{ avg_moderation_time_hours }}ч</h3>
|
||||
<p>Средно Време</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ min_moderation_time_hours }}ч</h3>
|
||||
<p>Минимално Време</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ max_moderation_time_hours }}ч</h3>
|
||||
<p>Максимално Време</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Top Reporters -->
|
||||
{% if top_reporters %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Най-Активни Докладващи</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="gov-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Позиция</th>
|
||||
<th>Потребител</th>
|
||||
<th>Брой Доклади</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for reporter in top_reporters %}
|
||||
<tr>
|
||||
<td>{{ forloop.counter }}</td>
|
||||
<td>{{ reporter.reporter__username|default:"Анонимен" }}</td>
|
||||
<td><strong>{{ reporter.report_count }}</strong></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Daily Reports Chart -->
|
||||
{% if daily_reports %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Дневна Статистика (Последните 30 Дни)</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="chart-container">
|
||||
<canvas id="dailyReportsChart" style="max-height: 400px;"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Status Over Time -->
|
||||
{% if status_over_time %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Статуси по Време (Последните 7 Дни)</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="chart-container">
|
||||
<canvas id="statusChart" style="max-height: 400px;"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div style="margin-top: 2rem;">
|
||||
<a href="{% url 'analytics:dashboard' %}" class="btn btn-secondary">Обратно към Таблото</a>
|
||||
</div>
|
||||
|
||||
{% if daily_reports %}
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js"></script>
|
||||
<script>
|
||||
// Daily Reports Chart
|
||||
const dailyCtx = document.getElementById('dailyReportsChart');
|
||||
if (dailyCtx) {
|
||||
const dailyData = {{ daily_reports }};
|
||||
new Chart(dailyCtx, {
|
||||
type: 'line',
|
||||
data: {
|
||||
labels: dailyData.map(d => new Date(d.date).toLocaleDateString('bg-BG')),
|
||||
datasets: [{
|
||||
label: 'Доклади',
|
||||
data: dailyData.map(d => d.count),
|
||||
borderColor: '#1e3a8a',
|
||||
backgroundColor: 'rgba(30, 58, 138, 0.1)',
|
||||
tension: 0.4
|
||||
}]
|
||||
},
|
||||
options: {
|
||||
responsive: true,
|
||||
maintainAspectRatio: true,
|
||||
plugins: {
|
||||
legend: {
|
||||
display: true
|
||||
}
|
||||
},
|
||||
scales: {
|
||||
y: {
|
||||
beginAtZero: true
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Status Over Time Chart
|
||||
const statusCtx = document.getElementById('statusChart');
|
||||
if (statusCtx) {
|
||||
const statusData = {{ status_over_time }};
|
||||
new Chart(statusCtx, {
|
||||
type: 'bar',
|
||||
data: {
|
||||
labels: statusData.map(d => new Date(d.date).toLocaleDateString('bg-BG')),
|
||||
datasets: [
|
||||
{
|
||||
label: 'В Очакване',
|
||||
data: statusData.map(d => d.pending),
|
||||
backgroundColor: '#f59e0b'
|
||||
},
|
||||
{
|
||||
label: 'Потвърдени',
|
||||
data: statusData.map(d => d.verified),
|
||||
backgroundColor: '#10b981'
|
||||
},
|
||||
{
|
||||
label: 'Отхвърлени',
|
||||
data: statusData.map(d => d.rejected),
|
||||
backgroundColor: '#ef4444'
|
||||
}
|
||||
]
|
||||
},
|
||||
options: {
|
||||
responsive: true,
|
||||
maintainAspectRatio: true,
|
||||
plugins: {
|
||||
legend: {
|
||||
display: true
|
||||
}
|
||||
},
|
||||
scales: {
|
||||
y: {
|
||||
beginAtZero: true,
|
||||
stacked: false
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
18
templates/analytics/users.html
Normal file
18
templates/analytics/users.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Аналитика на Потребителите - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Аналитика на Потребителите</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<p>Подробна аналитика на потребителите ще бъде показана тук.</p>
|
||||
<div style="margin-top: 2rem;">
|
||||
<a href="{% url 'analytics:dashboard' %}" class="btn btn-secondary">Обратно към Таблото</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
291
templates/base.html
Normal file
291
templates/base.html
Normal file
@@ -0,0 +1,291 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="bg" prefix="og: http://ogp.me/ns#">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="csrf-token" content="{{ csrf_token }}">
|
||||
|
||||
<!-- Primary Meta Tags -->
|
||||
<title>{% block title %}{{ seo.full_title|default:"Портал за Докладване на Измами - България" }}{% endblock %}</title>
|
||||
<meta name="title" content="{% block meta_title %}{{ seo.full_title|default:"Официален Портал за Докладване на Измами - България" }}{% endblock %}">
|
||||
<meta name="description" content="{% block meta_description %}{{ seo.page_description|default:seo.site_description }}{% endblock %}">
|
||||
<meta name="keywords" content="{% block meta_keywords %}{{ seo.page_keywords|default:seo.site_keywords }}{% endblock %}">
|
||||
<meta name="author" content="{{ seo.site_author }}">
|
||||
<meta name="language" content="{{ seo.site_language }}">
|
||||
<meta name="robots" content="{% block meta_robots %}{{ request.meta_robots|default:"index, follow" }}{% endblock %}">
|
||||
<meta name="googlebot" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
|
||||
<meta name="bingbot" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
|
||||
|
||||
<!-- Canonical URL -->
|
||||
<link rel="canonical" href="{% block canonical_url %}{{ seo.canonical_url }}{% endblock %}">
|
||||
|
||||
<!-- Open Graph / Facebook -->
|
||||
<meta property="og:type" content="{% block og_type %}{{ seo.page_type|default:"website" }}{% endblock %}">
|
||||
<meta property="og:url" content="{% block og_url %}{{ seo.canonical_url }}{% endblock %}">
|
||||
<meta property="og:title" content="{% block og_title %}{{ seo.full_title }}{% endblock %}">
|
||||
<meta property="og:description" content="{% block og_description %}{{ seo.page_description|default:seo.site_description }}{% endblock %}">
|
||||
<meta property="og:image" content="{% block og_image %}{{ seo.og_image }}{% endblock %}">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:image:alt" content="{% block og_image_alt %}{{ seo.site_name }}{% endblock %}">
|
||||
<meta property="og:site_name" content="{{ seo.site_name }}">
|
||||
<meta property="og:locale" content="bg_BG">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:url" content="{% block twitter_url %}{{ seo.canonical_url }}{% endblock %}">
|
||||
<meta name="twitter:title" content="{% block twitter_title %}{{ seo.full_title }}{% endblock %}">
|
||||
<meta name="twitter:description" content="{% block twitter_description %}{{ seo.page_description|default:seo.site_description }}{% endblock %}">
|
||||
<meta name="twitter:image" content="{% block twitter_image %}{{ seo.og_image }}{% endblock %}">
|
||||
<meta name="twitter:image:alt" content="{% block twitter_image_alt %}{{ seo.site_name }}{% endblock %}">
|
||||
{% if seo.twitter_site %}<meta name="twitter:site" content="{{ seo.twitter_site }}">{% endif %}
|
||||
{% if seo.twitter_creator %}<meta name="twitter:creator" content="{{ seo.twitter_creator }}">{% endif %}
|
||||
|
||||
<!-- Additional Meta Tags -->
|
||||
<meta name="theme-color" content="#003366">
|
||||
<meta name="msapplication-TileColor" content="#003366">
|
||||
<meta name="application-name" content="{{ seo.site_name }}">
|
||||
|
||||
{% load static %}
|
||||
<!-- Favicon -->
|
||||
<link rel="icon" type="image/svg+xml" href="{% static 'images/favicon.svg' %}">
|
||||
<link rel="icon" type="image/x-icon" href="{% static 'favicon.ico' %}">
|
||||
<link rel="shortcut icon" href="{% static 'favicon.ico' %}">
|
||||
<link rel="apple-touch-icon" href="{% static 'images/logo-icon.svg' %}">
|
||||
|
||||
<!-- Stylesheets -->
|
||||
<link rel="stylesheet" href="{% static 'css/style.css' %}">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&family=Roboto+Slab:wght@400;700&display=swap" rel="stylesheet">
|
||||
|
||||
<!-- Structured Data (JSON-LD) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "{% block schema_type %}GovernmentOrganization{% endblock %}",
|
||||
"name": "{{ seo.site_name }}",
|
||||
"url": "{{ seo.site_url }}",
|
||||
"logo": "{{ seo.site_image }}",
|
||||
"description": "{{ seo.site_description }}",
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"addressCountry": "BG",
|
||||
"addressLocality": "София",
|
||||
"addressRegion": "София"
|
||||
},
|
||||
"contactPoint": {
|
||||
"@type": "ContactPoint",
|
||||
"email": "{{ site_settings.contact_email }}",
|
||||
{% if site_settings.contact_phone %}"telephone": "{{ site_settings.contact_phone }}",{% endif %}
|
||||
"contactType": "customer service",
|
||||
"availableLanguage": "bg"
|
||||
},
|
||||
"sameAs": [
|
||||
"{{ seo.site_url }}"
|
||||
],
|
||||
"inLanguage": "bg"
|
||||
}
|
||||
</script>
|
||||
|
||||
{% block extra_head %}{% endblock %}
|
||||
{% block extra_css %}{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
<!-- Government Header -->
|
||||
<header class="gov-header">
|
||||
<div class="gov-header-top">
|
||||
<div class="container">
|
||||
<div class="gov-header-content">
|
||||
<div class="gov-logo-section">
|
||||
<a href="{% url 'reports:home' %}" class="gov-logo-link">
|
||||
<div class="gov-logo">
|
||||
<img src="{% static 'images/logo-icon.svg' %}" alt="Анти-Измами Лого" class="logo-icon">
|
||||
</div>
|
||||
<div class="gov-title">
|
||||
<h1>Официален Портал</h1>
|
||||
<p class="gov-subtitle">за Докладване на Измами</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="gov-badge">
|
||||
<span class="badge-text">Официален</span>
|
||||
<span class="badge-subtext">Портал</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<nav class="gov-navbar">
|
||||
<div class="container">
|
||||
<button class="mobile-menu-toggle" aria-label="Toggle menu" id="mobileMenuToggle">
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
</button>
|
||||
<ul class="gov-nav" id="mainNav">
|
||||
<li class="nav-main-item"><a href="{% url 'reports:home' %}" class="{% if request.resolver_match.url_name == 'home' %}active{% endif %}">🏠 Начало</a></li>
|
||||
<li class="nav-main-item"><a href="{% url 'reports:list' %}" class="{% if 'reports' in request.path and 'list' in request.path %}active{% endif %}">📋 Доклади</a></li>
|
||||
<li class="nav-main-item"><a href="{% url 'reports:create' %}" class="{% if 'create' in request.path %}active{% endif %}">➕ Докладване</a></li>
|
||||
<li class="nav-main-item"><a href="{% url 'reports:contact' %}" class="{% if 'contact' in request.path %}active{% endif %}">📞 Контакти</a></li>
|
||||
{% if user.is_authenticated %}
|
||||
<li class="nav-main-item"><a href="{% url 'reports:my_reports' %}" class="{% if 'my-reports' in request.path %}active{% endif %}">📝 Моите Доклади</a></li>
|
||||
{% if user.is_moderator %}
|
||||
<li class="nav-main-item"><a href="{% url 'moderation:dashboard' %}" class="{% if 'moderation' in request.path %}active{% endif %}">⚖️ Модерация</a></li>
|
||||
{% endif %}
|
||||
{% if user.is_administrator %}
|
||||
<li class="nav-main-item"><a href="{% url 'analytics:dashboard' %}" class="{% if 'analytics' in request.path %}active{% endif %}">📊 Аналитика</a></li>
|
||||
<li class="nav-main-item"><a href="{% url 'osint:admin_dashboard' %}" class="{% if 'osint/admin-dashboard' in request.path %}active{% endif %}">🤖 OSINT Админ</a></li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<li class="nav-spacer"></li>
|
||||
{% if user.is_authenticated %}
|
||||
<li class="nav-auth-item nav-user">
|
||||
<a href="{% url 'accounts:profile' %}" class="user-link">
|
||||
<span class="user-icon">👤</span>
|
||||
<span>{{ user.username }}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-auth-item"><a href="{% url 'accounts:logout' %}"
|
||||
class="logout-link"
|
||||
data-confirm="Сигурни ли сте, че искате да излезете?"
|
||||
data-confirm-title="Изход от системата">🚪 Изход</a></li>
|
||||
{% else %}
|
||||
<li class="nav-auth-item"><a href="{% url 'accounts:login' %}" class="login-link">🔐 Вход</a></li>
|
||||
<li class="nav-auth-item"><a href="{% url 'accounts:register' %}" class="register-link">📝 Регистрация</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="gov-main">
|
||||
<div class="container">
|
||||
{% if messages %}
|
||||
<div class="gov-messages">
|
||||
{% for message in messages %}
|
||||
<div class="gov-alert gov-alert-{{ message.tags }}">
|
||||
<div class="alert-icon">
|
||||
{% if message.tags == 'success' %}✓{% elif message.tags == 'error' %}✕{% else %}ℹ{% endif %}
|
||||
</div>
|
||||
<div class="alert-content">
|
||||
<strong>{{ message.tags|title }}:</strong> {{ message }}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Government Footer -->
|
||||
<footer class="gov-footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-section">
|
||||
<a href="{% url 'reports:home' %}" class="footer-logo-link-small">
|
||||
<img src="{% static 'images/logo.svg' %}" alt="Анти-Измами Лого" class="footer-logo-small">
|
||||
</a>
|
||||
<p style="margin-top: 1rem;">За защита на гражданите от измами в българското интернет пространство</p>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Бързи Връзки</h4>
|
||||
<ul>
|
||||
<li><a href="{% url 'reports:home' %}">Начало</a></li>
|
||||
<li><a href="{% url 'reports:list' %}">Доклади</a></li>
|
||||
<li><a href="{% url 'reports:create' %}">Докладване</a></li>
|
||||
<li><a href="{% url 'reports:search' %}">Търсене</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Правна Информация</h4>
|
||||
<ul>
|
||||
<li><a href="{% url 'legal:privacy' %}">Политика за Поверителност</a></li>
|
||||
<li><a href="{% url 'legal:terms' %}">Условия за Ползване</a></li>
|
||||
<li><a href="{% url 'legal:data_request' %}">Заявка за Данни</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Контакти</h4>
|
||||
<p>Email: <a href="mailto:{{ site_settings.contact_email }}">{{ site_settings.contact_email }}</a></p>
|
||||
{% if site_settings.contact_phone %}
|
||||
<p>Телефон: <a href="tel:{{ site_settings.contact_phone }}">{{ site_settings.contact_phone }}</a></p>
|
||||
{% endif %}
|
||||
{% if site_settings.contact_address %}
|
||||
<p>Адрес: {{ site_settings.contact_address }}</p>
|
||||
{% endif %}
|
||||
<p style="margin-top: 1rem;"><a href="{% url 'reports:contact' %}" style="color: var(--gov-accent); font-weight: 600;">Свържете се с нас</a></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer-bottom">
|
||||
<div class="footer-seal">
|
||||
<a href="{% url 'reports:home' %}" class="footer-logo-link">
|
||||
<img src="{% static 'images/logo.svg' %}" alt="Анти-Измами Лого" class="footer-logo">
|
||||
</a>
|
||||
<div class="seal-text">
|
||||
<strong>Официален Портал</strong>
|
||||
<span>Република България</span>
|
||||
</div>
|
||||
</div>
|
||||
<p class="copyright">© 2024 Официален Портал за Докладване на Измами. Всички права запазени.</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Cookie Consent Banner -->
|
||||
<div id="cookie-consent-banner" role="dialog" aria-labelledby="cookie-consent-title" aria-live="polite">
|
||||
<div class="cookie-consent-container">
|
||||
<div class="cookie-consent-content">
|
||||
<h3 id="cookie-consent-title" class="cookie-consent-title">Управление на Бисквитки</h3>
|
||||
<p class="cookie-consent-text">
|
||||
Използваме <strong>само функционални бисквитки</strong>, необходими за правилната работа на платформата.
|
||||
Не събираме данни за проследяване, реклами или аналитика.
|
||||
Бисквитките се използват изключително за запазване на вашите настройки и сигурност на сесията.
|
||||
За повече информация вижте нашата <a href="{% url 'legal:privacy' %}" target="_blank">Политика за Поверителност</a>.
|
||||
</p>
|
||||
<div class="cookie-consent-info">
|
||||
Всички функционални бисквитки са необходими за работата на платформата и не могат да бъдат деактивирани.
|
||||
</div>
|
||||
</div>
|
||||
<div class="cookie-consent-actions">
|
||||
<button type="button" class="cookie-consent-btn cookie-consent-btn-accept" onclick="CookieConsent.accept()" aria-label="Приемам използването на функционални бисквитки">
|
||||
Приемам
|
||||
</button>
|
||||
<button type="button" class="cookie-consent-btn cookie-consent-btn-decline" onclick="CookieConsent.decline()" aria-label="Отказвам използването на бисквитки">
|
||||
Отказвам
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% block extra_js %}{% endblock %}
|
||||
<script src="{% static 'js/popups.js' %}"></script>
|
||||
<script src="{% static 'js/bot-protection.js' %}"></script>
|
||||
<script src="{% static 'js/cookie-consent.js' %}"></script>
|
||||
<script>
|
||||
// Mobile menu toggle
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const menuToggle = document.getElementById('mobileMenuToggle');
|
||||
const mainNav = document.getElementById('mainNav');
|
||||
|
||||
if (menuToggle && mainNav) {
|
||||
menuToggle.addEventListener('click', function() {
|
||||
mainNav.classList.toggle('mobile-open');
|
||||
menuToggle.classList.toggle('active');
|
||||
});
|
||||
|
||||
// Close menu when clicking outside
|
||||
document.addEventListener('click', function(event) {
|
||||
if (!menuToggle.contains(event.target) && !mainNav.contains(event.target)) {
|
||||
mainNav.classList.remove('mobile-open');
|
||||
menuToggle.classList.remove('active');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
48
templates/legal/data_request.html
Normal file
48
templates/legal/data_request.html
Normal file
@@ -0,0 +1,48 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Заявка за Данни - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>GDPR Заявка за Данни</h2>
|
||||
<p class="form-description">Съгласно GDPR, имате правото да получите достъп, да коригирате или да изтриете вашите лични данни. Изпратете заявка по-долу.</p>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="id_request_type">Тип Заявка *</label>
|
||||
{{ form.request_type }}
|
||||
{% if form.request_type.errors %}
|
||||
<div class="error-message">{{ form.request_type.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="id_description">Допълнителни Детайли</label>
|
||||
{{ form.description }}
|
||||
{% if form.description.errors %}
|
||||
<div class="error-message">{{ form.description.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">Предоставете допълнителна информация за вашата заявка</small>
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary">Изпращане на Заявка</button>
|
||||
<a href="{% url 'accounts:profile' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="info-box">
|
||||
<h3>Типове Заявки</h3>
|
||||
<ul>
|
||||
<li><strong>Достъп до Данни:</strong> Получете копие на всички ваши лични данни</li>
|
||||
<li><strong>Изтриване на Данни:</strong> Заявка за изтриване на вашите лични данни</li>
|
||||
<li><strong>Преносимост на Данни:</strong> Получете вашите данни в машиночетим формат</li>
|
||||
<li><strong>Коригиране на Данни:</strong> Заявка за корекция на неточни данни</li>
|
||||
<li><strong>Възражение:</strong> Възражение срещу обработката на вашите данни</li>
|
||||
<li><strong>Ограничаване:</strong> Заявка за ограничаване на обработката на данни</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
66
templates/legal/data_request_detail.html
Normal file
66
templates/legal/data_request_detail.html
Normal file
@@ -0,0 +1,66 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Статус на Заявка за Данни - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Статус на Заявка за Данни</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="info-section">
|
||||
<h3>Информация за Заявката</h3>
|
||||
<div class="info-grid">
|
||||
<div><strong>Тип Заявка:</strong> {{ data_request.get_request_type_display }}</div>
|
||||
<div><strong>Статус:</strong> <span class="badge badge-{{ data_request.status }}">{{ data_request.get_status_display }}</span></div>
|
||||
<div><strong>Изпратено:</strong> {{ data_request.requested_at|date:"d F Y, H:i" }}</div>
|
||||
{% if data_request.completed_at %}
|
||||
<div><strong>Завършено:</strong> {{ data_request.completed_at|date:"d F Y, H:i" }}</div>
|
||||
{% endif %}
|
||||
{% if data_request.handled_by %}
|
||||
<div><strong>Обработено от:</strong> {{ data_request.handled_by.username }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if data_request.description %}
|
||||
<div class="info-section">
|
||||
<h3>Описание</h3>
|
||||
<p style="line-height: 1.8;">{{ data_request.description|linebreaks }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if data_request.response_file %}
|
||||
<div class="info-section">
|
||||
<h3>Отговор</h3>
|
||||
<p>Вашата заявка е завършена. Изтеглете файла с отговора:</p>
|
||||
<a href="{{ data_request.response_file.url }}" class="btn btn-primary" download>Изтегляне на Отговор</a>
|
||||
</div>
|
||||
{% elif data_request.response_data %}
|
||||
<div class="info-section">
|
||||
<h3>Отговор</h3>
|
||||
<pre style="background: var(--gov-light); padding: 1rem; border-radius: 6px; overflow-x: auto;">{{ data_request.response_data|safe }}</pre>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if data_request.status == 'pending' or data_request.status == 'in_progress' %}
|
||||
<div class="info-section">
|
||||
<div class="gov-alert gov-alert-info">
|
||||
<div class="alert-icon">ℹ</div>
|
||||
<div class="alert-content">
|
||||
<p>Вашата заявка се обработва. Ще бъдете уведомени, когато бъде завършена.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="request-actions">
|
||||
<a href="{% url 'accounts:profile' %}" class="btn btn-secondary">Обратно към Профил</a>
|
||||
{% if data_request.status == 'pending' %}
|
||||
<a href="{% url 'legal:data_request' %}" class="btn btn-secondary">Изпращане на Нова Заявка</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
497
templates/legal/privacy_policy.html
Normal file
497
templates/legal/privacy_policy.html
Normal file
@@ -0,0 +1,497 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Политика за Поверителност - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="legal-page">
|
||||
<h1>Политика за Поверителност</h1>
|
||||
<p class="last-updated">Последна актуализация: {{ "now"|date:"d F Y" }}</p>
|
||||
<p class="version">Версия: 2.0</p>
|
||||
|
||||
<section>
|
||||
<h2>1. Въведение и Правна Основа</h2>
|
||||
<p>Тази Политика за Поверителност обяснява как събираме, използваме, съхраняваме и защитаваме вашата лична информация, когато използвате нашия Официален Портал за Докладване на Измами и Мошеничества.</p>
|
||||
<p>Тази политика е съставена в съответствие с:</p>
|
||||
<ul>
|
||||
<li><strong>Регламент (ЕС) 2016/679</strong> (Общ регламент за защита на данните - GDPR)</li>
|
||||
<li><strong>Закон за защита на личните данни</strong> (ЗЗЛД) - българската имплементация на GDPR</li>
|
||||
<li><strong>Закон за електронната търговия</strong></li>
|
||||
<li><strong>Закон за защита на потребителите</strong></li>
|
||||
<li><strong>Закон за киберпрестъпността</strong></li>
|
||||
</ul>
|
||||
<p>Чрез използването на нашата платформа, вие се съгласявате с условията на тази Политика за Поверителност.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>2. Администратор на Лични Данни (Data Controller)</h2>
|
||||
<p>Администраторът на личните данни е юридическото лице, което определя целите и средствата за обработка на личните данни:</p>
|
||||
<ul>
|
||||
<li><strong>Име:</strong> [Име на организацията]</li>
|
||||
<li><strong>Адрес:</strong> [Пълният адрес на организацията]</li>
|
||||
<li><strong>ЕИК/БУЛСТАТ:</strong> [ЕИК номер]</li>
|
||||
<li><strong>Имейл за контакт:</strong> [Имейл адрес]</li>
|
||||
<li><strong>Телефон:</strong> [Телефонен номер]</li>
|
||||
</ul>
|
||||
<p>Ако имате въпроси относно обработката на вашите лични данни, можете да се свържете с нас на посочения адрес или имейл.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>3. Длъжностно Лице по Защита на Данните (DPO)</h2>
|
||||
<p>В съответствие с чл. 37 от GDPR, ние сме назначили Длъжностно лице по защита на данните (Data Protection Officer - DPO), което можете да контактирате за всички въпроси, свързани с обработката на личните данни и упражняването на вашите права:</p>
|
||||
<ul>
|
||||
<li><strong>Имейл:</strong> dpo@[domain].bg</li>
|
||||
<li><strong>Адрес:</strong> [Адрес на DPO]</li>
|
||||
</ul>
|
||||
<p>Можете също да подадете жалба до Комисията за защита на личните данни (КПЗЛД):</p>
|
||||
<ul>
|
||||
<li><strong>Адрес:</strong> ул. "Проф. Цвятко Лазаров" № 2, София 1592</li>
|
||||
<li><strong>Телефон:</strong> 02/91-53-518</li>
|
||||
<li><strong>Имейл:</strong> kzld@cpdp.bg</li>
|
||||
<li><strong>Уебсайт:</strong> www.cpdp.bg</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>4. Категории Лични Данни, Които Събираме</h2>
|
||||
|
||||
<h3>4.1 Данни, Които Предоставяте Директно</h3>
|
||||
<ul>
|
||||
<li><strong>Данни за регистрация и акаунт:</strong>
|
||||
<ul>
|
||||
<li>Потребителско име</li>
|
||||
<li>Имейл адрес</li>
|
||||
<li>Парола (хеширана)</li>
|
||||
<li>Име и фамилия</li>
|
||||
<li>Телефонен номер (по избор)</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Данни в профила:</strong>
|
||||
<ul>
|
||||
<li>Предпочитания за комуникация</li>
|
||||
<li>Настройки за уведомления</li>
|
||||
<li>Други данни, които изберете да споделите</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Данни в докладите за измами:</strong>
|
||||
<ul>
|
||||
<li>Детайли за събитието/измамата</li>
|
||||
<li>Доказателства (документи, снимки, скрийншоти)</li>
|
||||
<li>Информация за трети страни (ако е приложимо)</li>
|
||||
<li>Дата, час и място на събитието</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Комуникационни данни:</strong>
|
||||
<ul>
|
||||
<li>Съдържание на съобщения, които изпращате до нас</li>
|
||||
<li>Отзиви и коментари</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>4.2 Данни, Събирани Автоматично</h3>
|
||||
<ul>
|
||||
<li><strong>Технически данни:</strong>
|
||||
<ul>
|
||||
<li>IP адрес</li>
|
||||
<li>Тип и версия на браузъра</li>
|
||||
<li>Операционна система</li>
|
||||
<li>Информация за устройството (модел, резолюция на екрана)</li>
|
||||
<li>Уникални идентификатори на устройството</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Данни за използване:</strong>
|
||||
<ul>
|
||||
<li>Логове на активност</li>
|
||||
<li>Страници, които посещавате</li>
|
||||
<li>Време на посещение</li>
|
||||
<li>Кликвания и взаимодействия</li>
|
||||
<li>Референтиращи URL адреси</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Данни от бисквитки (Cookies):</strong>
|
||||
<ul>
|
||||
<li>Сесийни бисквитки</li>
|
||||
<li>Бисквитки за функционалност</li>
|
||||
<li>Аналитични бисквитки (със съгласие)</li>
|
||||
<li>Маркетингови бисквитки (със съгласие)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>4.3 Специални Категории Данни</h3>
|
||||
<p>В определени случаи може да обработваме специални категории лични данни (чл. 9 от GDPR), като:</p>
|
||||
<ul>
|
||||
<li>Данни, разкрити от вас в докладите, които могат да съдържат информация за етнически произход, политически възгледи, религиозни убеждения и др.</li>
|
||||
</ul>
|
||||
<p>Такава обработка се извършва само с ваше изрично съгласие или когато е необходимо за установяване, упражняване или защита на правни претенции (чл. 9, параграф 2, буква "f" от GDPR).</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>5. Правни Основи за Обработка</h2>
|
||||
<p>Обработваме вашите лични данни на следните правни основания съгласно чл. 6 от GDPR:</p>
|
||||
<ul>
|
||||
<li><strong>Съгласие (чл. 6, параграф 1, буква "а"):</strong>
|
||||
<ul>
|
||||
<li>За маркетингови комуникации</li>
|
||||
<li>За аналитични бисквитки</li>
|
||||
<li>За обработка на специални категории данни</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Изпълнение на договор (чл. 6, параграф 1, буква "b"):</strong>
|
||||
<ul>
|
||||
<li>За предоставяне на услугите на платформата</li>
|
||||
<li>За обработка и преглед на доклади</li>
|
||||
<li>За управление на вашия акаунт</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Правно задължение (чл. 6, параграф 1, буква "c"):</strong>
|
||||
<ul>
|
||||
<li>За съответствие с българското законодателство</li>
|
||||
<li>За сътрудничество с компетентните органи</li>
|
||||
<li>За съхранение на данни според изискванията на закона</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Легитимен интерес (чл. 6, параграф 1, буква "f"):</strong>
|
||||
<ul>
|
||||
<li>За подобряване на услугите и функционалността</li>
|
||||
<li>За сигурност и предотвратяване на измами</li>
|
||||
<li>За техническа поддръжка и отстраняване на проблеми</li>
|
||||
<li>За защита на правата и интересите на платформата и потребителите</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>6. Цели на Обработката</h2>
|
||||
<p>Обработваме вашите лични данни за следните цели:</p>
|
||||
<ul>
|
||||
<li><strong>Предоставяне на услуги:</strong>
|
||||
<ul>
|
||||
<li>Регистрация и управление на акаунт</li>
|
||||
<li>Обработка и преглед на доклади за измами</li>
|
||||
<li>Комуникация с вас относно докладите</li>
|
||||
<li>Предоставяне на техническа поддръжка</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Съответствие с правни задължения:</strong>
|
||||
<ul>
|
||||
<li>Сътрудничество с компетентните органи при необходимост</li>
|
||||
<li>Съхранение на данни според изискванията на закона</li>
|
||||
<li>Отчитане и документиране на дейностите</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Подобряване на услугите:</strong>
|
||||
<ul>
|
||||
<li>Анализ на използването на платформата</li>
|
||||
<li>Разработване на нови функции</li>
|
||||
<li>Оптимизация на производителността</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Сигурност:</strong>
|
||||
<ul>
|
||||
<li>Предотвратяване на измами и злоупотреби</li>
|
||||
<li>Защита срещу неоторизиран достъп</li>
|
||||
<li>Мониторинг на подозрителна дейност</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Маркетинг (със съгласие):</strong>
|
||||
<ul>
|
||||
<li>Изпращане на информационни бюлетини</li>
|
||||
<li>Уведомления за нови функции</li>
|
||||
<li>Промоционални съобщения</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>7. Получатели на Личните Данни</h2>
|
||||
<p>Вашите лични данни могат да бъдат разкрити на следните категории получатели:</p>
|
||||
<ul>
|
||||
<li><strong>Вътрешни получатели:</strong>
|
||||
<ul>
|
||||
<li>Служители и администратори на платформата, които имат нужда от достъп за изпълнение на служебните си задължения</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Външни получатели:</strong>
|
||||
<ul>
|
||||
<li><strong>Обработващи на данни (Processors):</strong> Трети страни, които обработват данни от наше име:
|
||||
<ul>
|
||||
<li>Хостинг доставчици</li>
|
||||
<li>Доставчици на облачни услуги</li>
|
||||
<li>Доставчици на имейл услуги</li>
|
||||
<li>Доставчици на аналитични инструменти</li>
|
||||
<li>Доставчици на услуги за сигурност</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Компетентни органи:</strong> Когато е изискано от закона или при съдебно разпореждане:
|
||||
<ul>
|
||||
<li>Съдебни власти</li>
|
||||
<li>Правоохранителни органи</li>
|
||||
<li>Комисия за защита на личните данни</li>
|
||||
<li>Други държавни органи</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Всички обработващи на данни са задължени да спазват GDPR и да прилагат подходящи мерки за сигурност. С тях са сключени договори за обработка на данни (Data Processing Agreements) в съответствие с чл. 28 от GDPR.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>8. Прехвърляне на Данни извън ЕС/ЕИП</h2>
|
||||
<p>В определени случаи вашите лични данни могат да бъдат прехвърлени в държави извън Европейския съюз или Европейското икономическо пространство (ЕИП).</p>
|
||||
<p>При прехвърляне на данни извън ЕС/ЕИП, ние гарантираме адекватна защита чрез:</p>
|
||||
<ul>
|
||||
<li>Решения за адекватност на Европейската комисия (чл. 45 от GDPR)</li>
|
||||
<li>Стандартни договорни клаузи, одобрени от Европейската комисия (чл. 46, параграф 2, буква "c" от GDPR)</li>
|
||||
<li>Други подходящи гаранции в съответствие с GDPR</li>
|
||||
</ul>
|
||||
<p>Можете да поискате информация за конкретните гаранции, приложими при прехвърляне на вашите данни, като се свържете с нас или с DPO.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>9. Период на Съхранение на Данните</h2>
|
||||
<p>Съхраняваме вашите лични данни само толкова дълго, колкото е необходимо за постигане на целите, за които са събрани, или колкото е изискано от закона.</p>
|
||||
<ul>
|
||||
<li><strong>Данни за акаунт:</strong> Докато акаунтът ви е активен. След деактивиране, данните се съхраняват още 3 години за целите на съответствие с правните изисквания, след което се изтриват окончателно.</li>
|
||||
<li><strong>Доклади за измами:</strong> Минимум 5 години след последната активност по доклада, в съответствие с изискванията на Закона за киберпрестъпността и други приложими закони.</li>
|
||||
<li><strong>Логове и технически данни:</strong> До 12 месеца, освен ако по-дълъг период не е изискван за целите на сигурността или съответствие с закона.</li>
|
||||
<li><strong>Маркетингови данни:</strong> До оттегляне на съгласието или до 2 години след последната активност.</li>
|
||||
<li><strong>Данни за съгласие:</strong> До 5 години след оттегляне на съгласието, за целите на доказване на съгласието.</li>
|
||||
</ul>
|
||||
<p>След изтичане на периода на съхранение, данните се изтриват безопасно или се анонимизират, така че да не могат да бъдат свързани с вас.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>10. Вашите Права като Субект на Данни</h2>
|
||||
<p>Съгласно GDPR и българското законодателство, вие имате следните права:</p>
|
||||
|
||||
<h3>10.1 Право на достъп (чл. 15 от GDPR)</h3>
|
||||
<p>Имате право да получите потвърждение дали обработваме вашите лични данни и достъп до тези данни, включително информация за:</p>
|
||||
<ul>
|
||||
<li>Целите на обработката</li>
|
||||
<li>Категориите лични данни</li>
|
||||
<li>Получателите на данните</li>
|
||||
<li>Периода на съхранение</li>
|
||||
<li>Вашите права</li>
|
||||
</ul>
|
||||
|
||||
<h3>10.2 Право на коригиране (чл. 16 от GDPR)</h3>
|
||||
<p>Имате право да поискате коригиране на неточни или непълни лични данни без ненужно забавяне.</p>
|
||||
|
||||
<h3>10.3 Право на изтриване - "Право да бъдеш забравен" (чл. 17 от GDPR)</h3>
|
||||
<p>Имате право да поискате изтриване на вашите лични данни, когато:</p>
|
||||
<ul>
|
||||
<li>Данните вече не са необходими за целите, за които са събрани</li>
|
||||
<li>Оттеглите съгласието си и няма друга правна основа за обработка</li>
|
||||
<li>Възразите срещу обработката и няма преобладаващи легитимни основания</li>
|
||||
<li>Данните са обработвани незаконно</li>
|
||||
</ul>
|
||||
<p><strong>Важно:</strong> Правото на изтриване може да бъде ограничено, когато обработката е необходима за:</p>
|
||||
<ul>
|
||||
<li>Съответствие с правно задължение</li>
|
||||
<li>Установяване, упражняване или защита на правни претенции</li>
|
||||
<li>Изпълнение на задача от обществен интерес</li>
|
||||
</ul>
|
||||
|
||||
<h3>10.4 Право на ограничаване на обработката (чл. 18 от GDPR)</h3>
|
||||
<p>Имате право да поискате ограничаване на обработката на вашите данни, когато:</p>
|
||||
<ul>
|
||||
<li>Оспорвате точността на данните</li>
|
||||
<li>Обработката е незаконна, но не желаете изтриване</li>
|
||||
<li>Вече не са необходими данните, но са нужни за правни претенции</li>
|
||||
<li>Възразили сте срещу обработката</li>
|
||||
</ul>
|
||||
|
||||
<h3>10.5 Право на преносимост на данните (чл. 20 от GDPR)</h3>
|
||||
<p>Имате право да получите вашите лични данни в структуриран, широко използван и машиночетим формат и да ги прехвърлите на друг администратор, когато:</p>
|
||||
<ul>
|
||||
<li>Обработката се основава на съгласие или договор</li>
|
||||
<li>Обработката се извършва по автоматизиран начин</li>
|
||||
</ul>
|
||||
|
||||
<h3>10.6 Право на възражение (чл. 21 от GDPR)</h3>
|
||||
<p>Имате право да възразите срещу обработката на вашите лични данни, когато обработката се основава на легитимен интерес (чл. 6, параграф 1, буква "f" от GDPR).</p>
|
||||
<p>След получаване на възражение, ние ще спрем обработката, освен ако не докажем притежаване на преобладаващи легитимни основания за обработката.</p>
|
||||
|
||||
<h3>10.7 Право да не подлежите на автоматизирано вземане на решения, включително профилиране (чл. 22 от GDPR)</h3>
|
||||
<p>Имате право да не подлежите на решение, основано изключително на автоматизирана обработка, включително профилиране, което произвежда правни последици за вас или по подобен начин засяга значително вас.</p>
|
||||
<p>Това право не се прилага, ако решението:</p>
|
||||
<ul>
|
||||
<li>Е необходимо за сключване или изпълнение на договор</li>
|
||||
<li>Е разрешено от правото на ЕС или на държавата членка</li>
|
||||
<li>Се основава на вашето изрично съгласие</li>
|
||||
</ul>
|
||||
|
||||
<h3>10.8 Право на оттегляне на съгласието (чл. 7, параграф 3 от GDPR)</h3>
|
||||
<p>Когато обработката се основава на съгласие, имате право да оттеглите съгласието си по всяко време. Оттеглянето на съгласието не засяга законността на обработката, извършена преди оттеглянето.</p>
|
||||
|
||||
<h3>10.9 Право на жалба до надзорен орган</h3>
|
||||
<p>Имате право да подадете жалба до надзорния орган, особено в държавата членка, в която пребивавате, работите или на чиято територия е настъпило предполагаемо нарушение, ако смятате, че обработката на вашите лични данни нарушава GDPR.</p>
|
||||
<p>В България надзорният орган е:</p>
|
||||
<ul>
|
||||
<li><strong>Комисия за защита на личните данни (КПЗЛД)</strong></li>
|
||||
<li>ул. "Проф. Цвятко Лазаров" № 2, София 1592</li>
|
||||
<li>Телефон: 02/91-53-518</li>
|
||||
<li>Имейл: kzld@cpdp.bg</li>
|
||||
<li>Уебсайт: www.cpdp.bg</li>
|
||||
</ul>
|
||||
|
||||
<h3>10.10 Как да Упражните Вашите Права</h3>
|
||||
<p>За упражняване на някое от вашите права, моля:</p>
|
||||
<ul>
|
||||
<li>Използвайте формата за заявка за данни: <a href="{% url 'legal:data_request' %}">Заявка за упражняване на права</a></li>
|
||||
<li>Изпратете имейл на: dpo@[domain].bg</li>
|
||||
<li>Изпратете писмено заявление на адреса на администратора</li>
|
||||
</ul>
|
||||
<p>Ще отговорим на вашата заявка в срок от <strong>30 дни</strong> (чл. 12, параграф 3 от GDPR). В сложни случаи срокът може да бъде удължен с още 60 дни, като ще ви уведомим за това.</p>
|
||||
<p>Обикновено не се налага такса за упражняване на правата ви, освен ако заявката е явно неоснователна или прекомерна (чл. 12, параграф 5 от GDPR).</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>11. Бисквитки (Cookies) и Следящи Технологии</h2>
|
||||
<p>Нашата платформа използва бисквитки и подобни технологии за подобряване на функционалността и потребителското изживяване.</p>
|
||||
|
||||
<h3>11.1 Видове Бисквитки</h3>
|
||||
<ul>
|
||||
<li><strong>Необходими бисквитки:</strong> Необходими за основната функционалност на платформата. Не изискват съгласие.</li>
|
||||
<li><strong>Функционални бисквитки:</strong> Позволяват запомняне на вашите предпочитания. Изискват съгласие.</li>
|
||||
<li><strong>Аналитични бисквитки:</strong> Използват се за анализ на използването на платформата. Изискват съгласие.</li>
|
||||
<li><strong>Маркетингови бисквитки:</strong> Използват се за персонализирани реклами. Изискват съгласие.</li>
|
||||
</ul>
|
||||
|
||||
<h3>11.2 Управление на Бисквитки</h3>
|
||||
<p>Можете да управлявате или изтривате бисквитките по всяко време чрез настройките на вашия браузър. Можете да промените съгласието си за бисквитки по всяко време чрез настройките на платформата.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>12. Технически и Организационни Мерки за Защита</h2>
|
||||
<p>Прилагаме подходящи технически и организационни мерки за защита на вашите лични данни срещу неоторизиран достъп, промяна, разкриване или унищожаване, в съответствие с чл. 32 от GDPR:</p>
|
||||
<ul>
|
||||
<li><strong>Технически мерки:</strong>
|
||||
<ul>
|
||||
<li>Криптиране на данните при предаване (TLS/SSL)</li>
|
||||
<li>Криптиране на данните в покой</li>
|
||||
<li>Регулярни резервни копия</li>
|
||||
<li>Системи за откриване и предотвратяване на прониквания</li>
|
||||
<li>Регулярни актуализации на софтуера и сигурността</li>
|
||||
<li>Хеширане на пароли (bcrypt/Argon2)</li>
|
||||
<li>Многофакторна автентификация за администратори</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Организационни мерки:</strong>
|
||||
<ul>
|
||||
<li>Ограничаване на достъпа до данни само на оторизиран персонал</li>
|
||||
<li>Регулярно обучение на персонала за защита на данните</li>
|
||||
<li>Политики и процедури за сигурност</li>
|
||||
<li>Регулярни одити и оценки на риска</li>
|
||||
<li>Процедури за управление на инциденти</li>
|
||||
<li>Договори за поверителност със служителите</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>13. Уведомяване за Нарушения на Данните</h2>
|
||||
<p>В случай на нарушение на сигурността на личните данни, което вероятно ще доведе до висок риск за правата и свободите на физическите лица, ние ще уведомим:</p>
|
||||
<ul>
|
||||
<li><strong>Надзорния орган (КПЗЛД):</strong> В срок от 72 часа след като стане известно за нарушението (чл. 33 от GDPR)</li>
|
||||
<li><strong>Засегнатите субекти на данни:</strong> Без ненужно забавяне, когато нарушението вероятно ще доведе до висок риск (чл. 34 от GDPR)</li>
|
||||
</ul>
|
||||
<p>Уведомлението ще съдържа:</p>
|
||||
<ul>
|
||||
<li>Описание на характера на нарушението</li>
|
||||
<li>Име и контактни данни на DPO</li>
|
||||
<li>Възможните последствия</li>
|
||||
<li>Мерките, предприети или предложени за справяне с нарушението</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>14. Автоматизирано Вземане на Решения и Профилиране</h2>
|
||||
<p>В момента нашата платформа не използва автоматизирано вземане на решения или профилиране, което произвежда правни последици за вас или по подобен начин засяга значително вас.</p>
|
||||
<p>Ако в бъдеще започнем да използваме такива технологии, ще ви уведомим и ще ви предоставим възможност да възразите или да поискате човешка намеса в процеса на вземане на решения.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>15. Данни на Непълнолетни</h2>
|
||||
<p>Нашата платформа не е предназначена за лица под 18 години. Не събираме умишлено лични данни от непълнолетни без съгласието на родител или настойник.</p>
|
||||
<p>Ако установим, че сме събрали данни от непълнолетно лице без подходящо съгласие, ще предприемем стъпки за изтриване на тези данни незабавно.</p>
|
||||
<p>Ако сте родител или настойник и смятате, че вашето дете е предоставило лични данни, моля, свържете се с нас.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>16. Промени в Политиката за Поверителност</h2>
|
||||
<p>Може да актуализираме тази Политика за Поверителност от време на време, за да отразяваме промени в нашите практики или по други оперативни, правни или регулаторни причини.</p>
|
||||
<p>Ще ви уведомим за всяка значителна промяна чрез:</p>
|
||||
<ul>
|
||||
<li>Публикуване на новата версия на тази страница</li>
|
||||
<li>Имейл уведомление (ако имате регистриран акаунт)</li>
|
||||
<li>Известие в платформата</li>
|
||||
</ul>
|
||||
<p>Препоръчваме ви да преглеждате тази страница периодично, за да сте информирани за това как защитаваме вашите данни.</p>
|
||||
<p>Продължаването на използването на платформата след промените означава приемане на новата Политика за Поверителност.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>17. Връзки към Други Уебсайтове</h2>
|
||||
<p>Нашата платформа може да съдържа връзки към други уебсайтове, които не управляваме. Не носим отговорност за практиките за поверителност на тези уебсайтове.</p>
|
||||
<p>Препоръчваме ви да преглеждате политиките за поверителност на всеки уебсайт, който посещавате.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>18. Контакти</h2>
|
||||
<p>Ако имате въпроси, коментари или искате да упражните някое от вашите права относно тази Политика за Поверителност или обработката на вашите лични данни, моля, свържете се с нас:</p>
|
||||
<ul>
|
||||
<li><strong>Администратор на лични данни:</strong>
|
||||
<ul>
|
||||
<li>Имейл: [имейл адрес]</li>
|
||||
<li>Адрес: [адрес]</li>
|
||||
<li>Телефон: [телефон]</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Длъжностно лице по защита на данните (DPO):</strong>
|
||||
<ul>
|
||||
<li>Имейл: dpo@[domain].bg</li>
|
||||
<li>Адрес: [адрес на DPO]</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>За упражняване на права:</strong>
|
||||
<ul>
|
||||
<li>Форма за заявка: <a href="{% url 'legal:data_request' %}">Заявка за упражняване на права</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>19. Приложимо Право и Юрисдикция</h2>
|
||||
<p>Тази Политика за Поверителност се управлява и тълкува в съответствие с:</p>
|
||||
<ul>
|
||||
<li>Регламент (ЕС) 2016/679 (GDPR)</li>
|
||||
<li>Закон за защита на личните данни (ЗЗЛД)</li>
|
||||
<li>Други приложими български и европейски закони</li>
|
||||
</ul>
|
||||
<p>Всички спорове, произтичащи от или свързани с тази политика, ще бъдат решавани от компетентните български съдилища.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>20. Допълнителна Информация</h2>
|
||||
<p>За повече информация относно вашите права и как ги упражнявате, можете да посетите:</p>
|
||||
<ul>
|
||||
<li>Официалния уебсайт на Европейската комисия за GDPR: <a href="https://ec.europa.eu/info/law/law-topic/data-protection" target="_blank" rel="noopener noreferrer">https://ec.europa.eu/info/law/law-topic/data-protection</a></li>
|
||||
<li>Уебсайта на Комисията за защита на личните данни: <a href="https://www.cpdp.bg" target="_blank" rel="noopener noreferrer">https://www.cpdp.bg</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<footer class="legal-footer">
|
||||
<p><strong>Последна актуализация:</strong> {{ "now"|date:"d F Y" }}</p>
|
||||
<p><strong>Версия:</strong> 2.0</p>
|
||||
<p>Тази политика е съставена в съответствие с GDPR и българското законодателство.</p>
|
||||
</footer>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
78
templates/legal/terms_of_service.html
Normal file
78
templates/legal/terms_of_service.html
Normal file
@@ -0,0 +1,78 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Условия за Ползване - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="legal-page">
|
||||
<h1>Условия за Ползване</h1>
|
||||
<p class="last-updated">Последна актуализация: {{ "now"|date:"d F Y" }}</p>
|
||||
|
||||
<section>
|
||||
<h2>1. Приемане на Условията</h2>
|
||||
<p>Чрез достъп и използване на тази платформа, вие приемате и се съгласявате да бъдете обвързани с тези Условия за Ползване.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>2. Използване на Платформата</h2>
|
||||
<h3>2.1 Разрешено Използване</h3>
|
||||
<p>Можете да използвате платформата за:</p>
|
||||
<ul>
|
||||
<li>Докладване на измами и мошеничества</li>
|
||||
<li>Преглед на потвърдени доклади за измами</li>
|
||||
<li>Принос към усилията за предотвратяване на измами</li>
|
||||
</ul>
|
||||
|
||||
<h3>2.2 Забранени Действия</h3>
|
||||
<p>Вие се съгласявате да не:</p>
|
||||
<ul>
|
||||
<li>Изпращате неверни или подвеждащи доклади</li>
|
||||
<li>Притеснявате или клеветите други</li>
|
||||
<li>Нарушавате приложимите закони</li>
|
||||
<li>Опитвате се да получите неоторизиран достъп</li>
|
||||
<li>Препятствате работата на платформата</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>3. Изпращане на Доклади</h2>
|
||||
<p>При изпращане на доклади, вие се съгласявате, че:</p>
|
||||
<ul>
|
||||
<li>Всичката предоставена информация е точна според най-добрите ви знания</li>
|
||||
<li>Имате правото да изпратите информацията</li>
|
||||
<li>Докладите ще бъдат прегледани от модератори</li>
|
||||
<li>Запазваме си правото да отхвърлим или премахнем доклади</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>4. Потребителски Акаунти</h2>
|
||||
<p>Вие сте отговорни за:</p>
|
||||
<ul>
|
||||
<li>Поддържането на поверителността на вашия акаунт</li>
|
||||
<li>Всички дейности под вашия акаунт</li>
|
||||
<li>Уведомяването ни за неоторизиран достъп</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>5. Интелектуална Собственост</h2>
|
||||
<p>Платформата и нейното съдържание са защитени от авторско право и други закони за интелектуална собственост. Не можете да възпроизвеждате, разпространявате или създавате производни произведения без разрешение.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>6. Ограничение на Отговорността</h2>
|
||||
<p>Платформата се предоставя "както е" без гаранции. Не носим отговорност за каквито и да било щети, произтичащи от вашето използване на платформата.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>7. Модификации</h2>
|
||||
<p>Запазваме си правото да модифицираме тези условия по всяко време. Продължителното използване на платформата означава приемане на модифицираните условия.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>8. Контакт</h2>
|
||||
<p>За въпроси относно тези условия, моля, свържете се с нас чрез платформата.</p>
|
||||
</section>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
26
templates/moderation/approve.html
Normal file
26
templates/moderation/approve.html
Normal file
@@ -0,0 +1,26 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Одобряване на Доклад - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Одобряване на Доклад</h2>
|
||||
<div class="gov-alert gov-alert-info">
|
||||
<div class="alert-icon">ℹ</div>
|
||||
<div class="alert-content">
|
||||
<p>Сигурни ли сте, че искате да одобрите този доклад?</p>
|
||||
<p><strong>{{ object.title }}</strong></p>
|
||||
<p>Това ще маркира доклада като потвърден и ще го направи видим за обществеността.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post" data-loading>
|
||||
{% csrf_token %}
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-success" data-tooltip="Докладът ще бъде маркиран като потвърден">Да, Одобрявам</button>
|
||||
<a href="{% url 'moderation:report_detail' object.pk %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
65
templates/moderation/dashboard.html
Normal file
65
templates/moderation/dashboard.html
Normal file
@@ -0,0 +1,65 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Табло за Модерация - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Табло за Модерация</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<h3>{{ pending_count|default:0 }}</h3>
|
||||
<p>Чакащи Доклади</p>
|
||||
<a href="{% url 'moderation:queue' %}" class="btn btn-sm btn-primary" style="margin-top: 1rem;">Преглед на Опашката</a>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ under_review_count|default:0 }}</h3>
|
||||
<p>В Преглед</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ verified_count|default:0 }}</h3>
|
||||
<p>Потвърдени Доклади</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>🤖 OSINT</h3>
|
||||
<p>Автоматични Доклади</p>
|
||||
<a href="{% url 'osint:auto_report_list' %}" class="btn btn-sm btn-primary" style="margin-top: 1rem;">Преглед на OSINT</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Последни Доклади</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
{% if reports %}
|
||||
<div class="reports-list">
|
||||
{% for report in reports %}
|
||||
<div class="report-card">
|
||||
<div class="report-header">
|
||||
<h3><a href="{% url 'moderation:report_detail' report.pk %}">{{ report.title }}</a></h3>
|
||||
<span class="badge badge-{{ report.status }}">{{ report.get_status_display }}</span>
|
||||
</div>
|
||||
<div class="report-meta">
|
||||
<span>{{ report.created_at|date:"d F Y, H:i" }}</span>
|
||||
<span>{{ report.get_scam_type_display }}</span>
|
||||
</div>
|
||||
<div class="report-actions">
|
||||
<a href="{% url 'moderation:report_detail' report.pk %}" class="btn btn-sm btn-primary">Преглед</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty-state">
|
||||
<p>Няма доклади, чакащи преглед.</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
52
templates/moderation/queue.html
Normal file
52
templates/moderation/queue.html
Normal file
@@ -0,0 +1,52 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Опашка за Модерация - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Опашка за Модерация</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
{% if queue_items %}
|
||||
<div class="reports-list">
|
||||
{% for item in queue_items %}
|
||||
<div class="queue-item">
|
||||
<div class="queue-item-header">
|
||||
<h3><a href="{% url 'moderation:report_detail' item.report.pk %}">{{ item.report.title }}</a></h3>
|
||||
<span class="badge badge-priority-{{ item.priority }}">{{ item.get_priority_display }}</span>
|
||||
</div>
|
||||
<div class="queue-item-meta">
|
||||
<span>Изпратено: {{ item.report.created_at|date:"d F Y, H:i" }}</span>
|
||||
<span>Вид: {{ item.report.get_scam_type_display }}</span>
|
||||
{% if item.assigned_to %}
|
||||
<span>Назначено на: {{ item.assigned_to.username }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="queue-item-actions">
|
||||
<a href="{% url 'moderation:report_detail' item.report.pk %}" class="btn btn-primary">Преглед</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="pagination">
|
||||
{% if page_obj.has_previous %}
|
||||
<a href="?page=1" class="btn btn-secondary">Първа</a>
|
||||
<a href="?page={{ page_obj.previous_page_number }}" class="btn btn-secondary">Предишна</a>
|
||||
{% endif %}
|
||||
<span class="page-info">Страница {{ page_obj.number }} от {{ page_obj.paginator.num_pages }}</span>
|
||||
{% if page_obj.has_next %}
|
||||
<a href="?page={{ page_obj.next_page_number }}" class="btn btn-secondary">Следваща</a>
|
||||
<a href="?page={{ page_obj.paginator.num_pages }}" class="btn btn-secondary">Последна</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty-state">
|
||||
<p>Опашката за модерация е празна. Всички доклади са прегледани.</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
37
templates/moderation/reject.html
Normal file
37
templates/moderation/reject.html
Normal file
@@ -0,0 +1,37 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Отхвърляне на Доклад - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Отхвърляне на Доклад</h2>
|
||||
<div class="gov-alert gov-alert-warning">
|
||||
<div class="alert-icon">⚠</div>
|
||||
<div class="alert-content">
|
||||
<p>Сигурни ли сте, че искате да отхвърлите този доклад?</p>
|
||||
<p><strong>{{ object.title }}</strong></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post" data-loading>
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="id_reason">Причина за Отхвърляне <span style="color: var(--gov-danger);">*</span></label>
|
||||
<textarea name="reason" id="id_reason" class="form-control" rows="5" placeholder="Моля, предоставете ясна и конструктивна причина за отхвърляне на доклада. Тази информация ще бъде видима за автора на доклада и ще му помогне да разбере какво трябва да подобри." required data-tooltip="Причината ще бъде видима за автора на доклада"></textarea>
|
||||
<small class="form-text" style="color: var(--gov-gray); margin-top: 0.5rem;">
|
||||
<strong>Важно:</strong> Причината е задължителна и ще бъде показана на потребителя. Бъдете ясни и конструктивни, за да помогнете на потребителя да разбере какво трябва да подобри.
|
||||
</small>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="id_notes">Допълнителни Бележки (незадължително)</label>
|
||||
<textarea name="notes" id="id_notes" class="form-control" rows="3" placeholder="Вътрешни бележки, които няма да бъдат видими за потребителя"></textarea>
|
||||
<small class="form-text" style="color: var(--gov-gray);">Тези бележки са само за модератори и администратори и няма да бъдат видими за автора на доклада.</small>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-danger" data-tooltip="Докладът ще бъде отхвърлен">Да, Отхвърлям</button>
|
||||
<a href="{% url 'moderation:report_detail' object.pk %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
103
templates/moderation/report_detail.html
Normal file
103
templates/moderation/report_detail.html
Normal file
@@ -0,0 +1,103 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Преглед на Доклад - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>{{ report.title }}</h2>
|
||||
<div style="display: flex; gap: 1rem;">
|
||||
<a href="{% url 'moderation:approve' report.pk %}" class="btn btn-success">Одобряване</a>
|
||||
<a href="{% url 'moderation:reject' report.pk %}" class="btn btn-danger">Отхвърляне</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="info-section">
|
||||
<h3>Информация за Доклада</h3>
|
||||
<div class="info-grid">
|
||||
<div><strong>Статус:</strong> <span class="badge badge-{{ report.status }}">{{ report.get_status_display }}</span></div>
|
||||
<div><strong>Вид:</strong> {{ report.get_scam_type_display }}</div>
|
||||
<div><strong>Докладвано от:</strong> {{ report.get_reporter_display }}</div>
|
||||
<div><strong>Изпратено:</strong> {{ report.created_at|date:"d F Y, H:i" }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-section">
|
||||
<h3>Описание</h3>
|
||||
<p style="line-height: 1.8;">{{ report.description|linebreaks }}</p>
|
||||
</div>
|
||||
|
||||
<div class="info-section">
|
||||
<h3>Докладвани Обекти</h3>
|
||||
<ul style="list-style: none; padding: 0;">
|
||||
{% if report.reported_url %}
|
||||
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
|
||||
<strong>URL:</strong> <a href="{{ report.reported_url }}" target="_blank">{{ report.reported_url }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if report.reported_email %}
|
||||
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
|
||||
<strong>Имейл:</strong> {{ report.reported_email }}
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if report.reported_phone %}
|
||||
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
|
||||
<strong>Телефон:</strong> {{ report.reported_phone }}
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if report.reported_company %}
|
||||
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
|
||||
<strong>Фирма:</strong> {{ report.reported_company }}
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{% if osint_results %}
|
||||
<div class="info-section">
|
||||
<h3>OSINT Резултати</h3>
|
||||
{% for result in osint_results %}
|
||||
<div class="verification-item" style="padding: 1rem; background: var(--gov-light); margin-bottom: 1rem; border-radius: 8px; border-left: 4px solid var(--gov-info);">
|
||||
<strong>{{ result.get_data_type_display }} ({{ result.source }}):</strong>
|
||||
<span>Увереност: {{ result.confidence_level }}%</span>
|
||||
{% if result.is_verified %}
|
||||
<span class="badge badge-verified">Потвърдено</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if verifications %}
|
||||
<div class="info-section">
|
||||
<h3>Проверки</h3>
|
||||
{% for verification in verifications %}
|
||||
<div class="verification-item" style="padding: 1rem; background: var(--gov-light); margin-bottom: 1rem; border-radius: 8px; border-left: 4px solid var(--gov-secondary);">
|
||||
<strong>{{ verification.get_verification_method_display }}:</strong>
|
||||
<span>Увереност: {{ verification.confidence_score }}%</span>
|
||||
{% if verification.notes %}
|
||||
<p style="margin-top: 0.5rem; color: var(--gov-gray);">{{ verification.notes }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if moderation_actions %}
|
||||
<div class="info-section">
|
||||
<h3>История на Модерацията</h3>
|
||||
{% for action in moderation_actions %}
|
||||
<div class="moderation-action" style="padding: 1rem; background: var(--gov-light); margin-bottom: 1rem; border-radius: 8px;">
|
||||
<strong>{{ action.get_action_type_display }}</strong> от {{ action.moderator.username }}
|
||||
<span style="color: var(--gov-gray); font-size: 0.9rem;">{{ action.created_at|date:"d F Y, H:i" }}</span>
|
||||
{% if action.reason %}
|
||||
<p style="margin-top: 0.5rem; color: var(--gov-gray);">Причина: {{ action.reason }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
299
templates/osint/admin_dashboard.html
Normal file
299
templates/osint/admin_dashboard.html
Normal file
@@ -0,0 +1,299 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}OSINT Администраторски Табло{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<style>
|
||||
.dashboard-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||||
gap: 1.5rem;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.dashboard-card {
|
||||
background: var(--gov-white);
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 4px 16px var(--gov-shadow);
|
||||
padding: 1.5rem;
|
||||
border-left: 4px solid var(--gov-secondary);
|
||||
}
|
||||
|
||||
.dashboard-card h3 {
|
||||
font-family: 'Roboto Slab', serif;
|
||||
color: var(--gov-primary);
|
||||
margin-bottom: 1rem;
|
||||
font-size: 1.3rem;
|
||||
border-bottom: 2px solid var(--gov-gray-light);
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.stat-number {
|
||||
font-size: 2.5rem;
|
||||
font-weight: 700;
|
||||
color: var(--gov-secondary);
|
||||
margin: 0.5rem 0;
|
||||
}
|
||||
|
||||
.quick-actions {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.table-responsive {
|
||||
overflow-x: auto;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
display: inline-block;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border-radius: 12px;
|
||||
font-size: 0.85rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.status-active { background: #d4edda; color: #155724; }
|
||||
.status-inactive { background: #f8d7da; color: #721c24; }
|
||||
.status-pending { background: #fff3cd; color: #856404; }
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>🤖 OSINT Администраторски Табло</h2>
|
||||
<div class="quick-actions">
|
||||
<a href="{% url 'osint:seed_create' %}" class="btn btn-primary">➕ Добави Seed Website</a>
|
||||
<a href="{% url 'osint:keyword_create' %}" class="btn btn-primary">➕ Добави Ключова Дума</a>
|
||||
<a href="{% url 'osint:start_crawling' %}" class="btn btn-success">🚀 Стартирай Crawling</a>
|
||||
<a href="{% url 'osint:auto_report_list' %}" class="btn btn-secondary">📋 Преглед на Доклади</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Statistics Overview -->
|
||||
<div class="dashboard-grid">
|
||||
<div class="dashboard-card">
|
||||
<h3>📊 Seed Websites</h3>
|
||||
<div class="stat-number">{{ total_seeds }}</div>
|
||||
<p>Общо: {{ total_seeds }} | Активни: {{ active_seeds }}</p>
|
||||
<a href="{% url 'osint:seed_create' %}" class="btn btn-sm btn-primary" style="margin-top: 1rem;">Управление</a>
|
||||
</div>
|
||||
|
||||
<div class="dashboard-card">
|
||||
<h3>🔍 Ключови Думи</h3>
|
||||
<div class="stat-number">{{ total_keywords }}</div>
|
||||
<p>Общо: {{ total_keywords }} | Активни: {{ active_keywords }}</p>
|
||||
<a href="{% url 'osint:keyword_create' %}" class="btn btn-sm btn-primary" style="margin-top: 1rem;">Управление</a>
|
||||
</div>
|
||||
|
||||
<div class="dashboard-card">
|
||||
<h3>📄 Събрано Съдържание</h3>
|
||||
<div class="stat-number">{{ total_crawled }}</div>
|
||||
<p>Общо: {{ total_crawled }} | Потенциални измами: {{ potential_scams }}</p>
|
||||
</div>
|
||||
|
||||
<div class="dashboard-card">
|
||||
<h3>📋 Автоматични Доклади</h3>
|
||||
<div class="stat-number">{{ pending_reports }}</div>
|
||||
<p>Чакащи: {{ pending_reports }} | Публикувани: {{ published_reports }}</p>
|
||||
<a href="{% url 'osint:auto_report_list' %}" class="btn btn-sm btn-primary" style="margin-top: 1rem;">Преглед</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Seed Websites Management -->
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header" style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<h2>🌐 Seed Websites</h2>
|
||||
<a href="{% url 'osint:seed_create' %}" class="btn btn-primary">➕ Добави Нов</a>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
{% if seed_websites %}
|
||||
<div class="table-responsive">
|
||||
<table class="gov-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Име</th>
|
||||
<th>URL</th>
|
||||
<th>Статус</th>
|
||||
<th>Приоритет</th>
|
||||
<th>Последно Crawl</th>
|
||||
<th>Страници</th>
|
||||
<th>Съвпадения</th>
|
||||
<th>Действия</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for seed in seed_websites %}
|
||||
<tr>
|
||||
<td><strong>{{ seed.name }}</strong></td>
|
||||
<td><a href="{{ seed.url }}" target="_blank">{{ seed.url|truncatechars:40 }}</a></td>
|
||||
<td>
|
||||
{% if seed.is_active %}
|
||||
<span class="status-badge status-active">Активен</span>
|
||||
{% else %}
|
||||
<span class="status-badge status-inactive">Неактивен</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ seed.get_priority_display }}</td>
|
||||
<td>
|
||||
{% if seed.last_crawled_at %}
|
||||
{{ seed.last_crawled_at|date:"d.m.Y H:i" }}
|
||||
{% else %}
|
||||
<span style="color: orange;">Никога</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ seed.pages_crawled }}</td>
|
||||
<td>{{ seed.matches_found }}</td>
|
||||
<td>
|
||||
<a href="{% url 'osint:seed_edit' seed.pk %}" class="btn btn-sm btn-secondary">✏️ Редактирай</a>
|
||||
<a href="{% url 'osint:seed_delete' seed.pk %}" class="btn btn-sm btn-danger"
|
||||
onclick="return confirm('Сигурни ли сте?')">🗑️ Изтрий</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty-state">
|
||||
<p>Няма конфигурирани seed websites. <a href="{% url 'osint:seed_create' %}">Добавете първия</a></p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Keywords Management -->
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header" style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<h2>🔑 Ключови Думи</h2>
|
||||
<a href="{% url 'osint:keyword_create' %}" class="btn btn-primary">➕ Добави Нова</a>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
{% if keywords %}
|
||||
<div class="table-responsive">
|
||||
<table class="gov-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Име</th>
|
||||
<th>Ключова Дума</th>
|
||||
<th>Тип</th>
|
||||
<th>Статус</th>
|
||||
<th>Увереност</th>
|
||||
<th>Auto Approve</th>
|
||||
<th>Действия</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for keyword in keywords %}
|
||||
<tr>
|
||||
<td><strong>{{ keyword.name }}</strong></td>
|
||||
<td><code style="font-size: 0.85rem;">{{ keyword.keyword|truncatechars:50 }}</code></td>
|
||||
<td>{{ keyword.get_keyword_type_display }}</td>
|
||||
<td>
|
||||
{% if keyword.is_active %}
|
||||
<span class="status-badge status-active">Активна</span>
|
||||
{% else %}
|
||||
<span class="status-badge status-inactive">Неактивна</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ keyword.confidence_score }}%</td>
|
||||
<td>
|
||||
{% if keyword.auto_approve %}
|
||||
<span class="status-badge status-active">Да</span>
|
||||
{% else %}
|
||||
<span class="status-badge status-inactive">Не</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<a href="{% url 'osint:keyword_edit' keyword.pk %}" class="btn btn-sm btn-secondary">✏️ Редактирай</a>
|
||||
<a href="{% url 'osint:keyword_delete' keyword.pk %}" class="btn btn-sm btn-danger"
|
||||
onclick="return confirm('Сигурни ли сте?')">🗑️ Изтрий</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty-state">
|
||||
<p>Няма конфигурирани ключови думи. <a href="{% url 'osint:keyword_create' %}">Добавете първата</a></p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Recent Activity -->
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>📊 Последна Активност</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem;">
|
||||
<div>
|
||||
<h3>Последно Събрано Съдържание</h3>
|
||||
{% if recent_crawled %}
|
||||
<ul style="list-style: none; padding: 0;">
|
||||
{% for content in recent_crawled %}
|
||||
<li style="padding: 0.5rem; border-bottom: 1px solid var(--gov-gray-light);">
|
||||
<strong><a href="{{ content.url }}" target="_blank">{{ content.title|truncatechars:50 }}</a></strong><br>
|
||||
<small>{{ content.crawled_at|date:"d.m.Y H:i" }} | {{ content.match_count }} съвпадения</small>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p>Все още няма събрано съдържание.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h3>Последни Автоматични Доклади</h3>
|
||||
{% if recent_auto_reports %}
|
||||
<ul style="list-style: none; padding: 0;">
|
||||
{% for report in recent_auto_reports %}
|
||||
<li style="padding: 0.5rem; border-bottom: 1px solid var(--gov-gray-light);">
|
||||
<strong><a href="{% url 'osint:auto_report_detail' report.pk %}">{{ report.title|truncatechars:50 }}</a></strong><br>
|
||||
<small>
|
||||
{{ report.created_at|date:"d.m.Y H:i" }} |
|
||||
<span class="badge badge-{{ report.status }}">{{ report.get_status_display }}</span> |
|
||||
{{ report.confidence_score }}%
|
||||
</small>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p>Все още няма автоматично генерирани доклади.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Due for Crawling -->
|
||||
{% if due_for_crawling %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>⏰ Seed Websites за Crawling</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="gov-alert gov-alert-warning">
|
||||
<div class="alert-icon">⚠</div>
|
||||
<div class="alert-content">
|
||||
<strong>Следните seed websites са готови за crawling:</strong>
|
||||
<ul style="margin-top: 0.5rem;">
|
||||
{% for seed in due_for_crawling %}
|
||||
<li><strong>{{ seed.name }}</strong> - {{ seed.url }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<a href="{% url 'osint:start_crawling' %}" class="btn btn-primary" style="margin-top: 1rem;">Стартирай Crawling</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
34
templates/osint/approve_auto_report.html
Normal file
34
templates/osint/approve_auto_report.html
Normal file
@@ -0,0 +1,34 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Одобряване на Автоматичен Доклад{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Одобряване на Автоматичен Доклад</h2>
|
||||
|
||||
<div class="gov-card" style="margin-bottom: 2rem;">
|
||||
<h3>{{ object.title }}</h3>
|
||||
<p><strong>Източник:</strong> <a href="{{ object.source_url }}" target="_blank" rel="noopener">{{ object.source_url }}</a></p>
|
||||
<p><strong>Увереност:</strong> {{ object.confidence_score }}%</p>
|
||||
<div style="background: var(--gov-light); padding: 1rem; border-radius: 6px; margin-top: 1rem;">
|
||||
{{ object.description|truncatewords:100 }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<p class="form-description">
|
||||
Сигурни ли сте, че искате да одобрите този автоматично генериран доклад?
|
||||
Това ще създаде публичен доклад, който ще бъде видим в платформата.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-success">Да, Одобри</button>
|
||||
<a href="{% url 'osint:auto_report_detail' object.pk %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
110
templates/osint/auto_report_detail.html
Normal file
110
templates/osint/auto_report_detail.html
Normal file
@@ -0,0 +1,110 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Детайли на Автоматичен Доклад - OSINT{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Детайли на Автоматичен Доклад</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<!-- Status and Actions -->
|
||||
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 2rem; flex-wrap: wrap; gap: 1rem;">
|
||||
<div>
|
||||
<span class="badge badge-{{ auto_report.status }}" style="font-size: 1rem; padding: 0.5rem 1rem;">
|
||||
{{ auto_report.get_status_display }}
|
||||
</span>
|
||||
<span class="badge" style="background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); color: white; font-size: 1rem; padding: 0.5rem 1rem;">
|
||||
Увереност: {{ auto_report.confidence_score }}%
|
||||
</span>
|
||||
</div>
|
||||
{% if auto_report.status == 'pending' %}
|
||||
<div>
|
||||
<a href="{% url 'osint:approve_auto_report' auto_report.pk %}" class="btn btn-success">Одобри</a>
|
||||
<a href="{% url 'osint:reject_auto_report' auto_report.pk %}" class="btn btn-danger">Отхвърли</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Report Information -->
|
||||
<div class="info-section" style="margin-bottom: 2rem;">
|
||||
<h3>Информация за Доклада</h3>
|
||||
<div class="info-grid">
|
||||
<div><strong>Заглавие:</strong> {{ auto_report.title }}</div>
|
||||
<div><strong>Източник:</strong> <a href="{{ auto_report.source_url }}" target="_blank" rel="noopener">{{ auto_report.source_url }}</a></div>
|
||||
<div><strong>Създадено:</strong> {{ auto_report.created_at|date:"d F Y, H:i" }}</div>
|
||||
{% if auto_report.reviewed_by %}
|
||||
<div><strong>Прегледано от:</strong> {{ auto_report.reviewed_by.username }}</div>
|
||||
<div><strong>Прегледано на:</strong> {{ auto_report.reviewed_at|date:"d F Y, H:i" }}</div>
|
||||
{% endif %}
|
||||
{% if auto_report.published_at %}
|
||||
<div><strong>Публикувано на:</strong> {{ auto_report.published_at|date:"d F Y, H:i" }}</div>
|
||||
{% endif %}
|
||||
{% if auto_report.report %}
|
||||
<div><strong>Свързан Доклад:</strong> <a href="{% url 'reports:detail' auto_report.report.pk %}">Доклад #{{ auto_report.report.pk }}</a></div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Matched Keywords -->
|
||||
{% if auto_report.matched_keywords.all %}
|
||||
<div class="info-section" style="margin-bottom: 2rem;">
|
||||
<h3>Намерени Ключови Думи</h3>
|
||||
<div class="report-tags">
|
||||
{% for keyword in auto_report.matched_keywords.all %}
|
||||
<span class="badge badge-info" style="font-size: 1rem; padding: 0.5rem 1rem; margin: 0.25rem;">
|
||||
{{ keyword.name }} ({{ keyword.confidence_score }}%)
|
||||
</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Description -->
|
||||
<div class="info-section" style="margin-bottom: 2rem;">
|
||||
<h3>Описание</h3>
|
||||
<div style="background: var(--gov-light); padding: 1.5rem; border-radius: 8px; white-space: pre-wrap; line-height: 1.8;">
|
||||
{{ auto_report.description }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Crawled Content -->
|
||||
{% if auto_report.crawled_content %}
|
||||
<div class="info-section" style="margin-bottom: 2rem;">
|
||||
<h3>Съдържание от Източника</h3>
|
||||
<div style="margin-bottom: 1rem;">
|
||||
<strong>Seed Website:</strong> {{ auto_report.crawled_content.seed_website.name }}<br>
|
||||
<strong>URL:</strong> <a href="{{ auto_report.crawled_content.url }}" target="_blank" rel="noopener">{{ auto_report.crawled_content.url }}</a><br>
|
||||
<strong>Събрано на:</strong> {{ auto_report.crawled_content.crawled_at|date:"d F Y, H:i" }}<br>
|
||||
<strong>Брой Съвпадения:</strong> {{ auto_report.crawled_content.match_count }}
|
||||
</div>
|
||||
<div style="background: var(--gov-light); padding: 1.5rem; border-radius: 8px; max-height: 400px; overflow-y: auto;">
|
||||
<h4>Заглавие:</h4>
|
||||
<p>{{ auto_report.crawled_content.title }}</p>
|
||||
<h4>Съдържание:</h4>
|
||||
<p style="white-space: pre-wrap; line-height: 1.8;">{{ auto_report.crawled_content.content|truncatewords:500 }}</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Review Notes -->
|
||||
{% if auto_report.review_notes %}
|
||||
<div class="info-section" style="margin-bottom: 2rem;">
|
||||
<h3>Бележки от Прегледа</h3>
|
||||
<div style="background: var(--gov-light); padding: 1.5rem; border-radius: 8px; white-space: pre-wrap;">
|
||||
{{ auto_report.review_notes }}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Actions -->
|
||||
<div class="report-actions">
|
||||
<a href="{% url 'osint:auto_report_list' %}" class="btn btn-secondary">Обратно към Списъка</a>
|
||||
{% if auto_report.report %}
|
||||
<a href="{% url 'reports:detail' auto_report.report.pk %}" class="btn btn-primary">Виж Публикувания Доклад</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
109
templates/osint/auto_report_list.html
Normal file
109
templates/osint/auto_report_list.html
Normal file
@@ -0,0 +1,109 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Автоматично Генерирани Доклади - OSINT{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Автоматично Генерирани Доклади от OSINT</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<!-- Statistics -->
|
||||
<div class="stats-grid" style="margin-bottom: 2rem;">
|
||||
<div class="stat-card">
|
||||
<h3>{{ pending_count }}</h3>
|
||||
<p>Чакащи Преглед</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ approved_count }}</h3>
|
||||
<p>Одобрени</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ published_count }}</h3>
|
||||
<p>Публикувани</p>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>{{ rejected_count }}</h3>
|
||||
<p>Отхвърлени</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Filter Bar -->
|
||||
<div class="filter-bar" style="margin-bottom: 2rem;">
|
||||
<a href="?status=" class="btn btn-sm {% if not request.GET.status %}btn-primary{% else %}btn-secondary{% endif %}">Всички</a>
|
||||
<a href="?status=pending" class="btn btn-sm {% if request.GET.status == 'pending' %}btn-primary{% else %}btn-secondary{% endif %}">Чакащи</a>
|
||||
<a href="?status=approved" class="btn btn-sm {% if request.GET.status == 'approved' %}btn-primary{% else %}btn-secondary{% endif %}">Одобрени</a>
|
||||
<a href="?status=published" class="btn btn-sm {% if request.GET.status == 'published' %}btn-primary{% else %}btn-secondary{% endif %}">Публикувани</a>
|
||||
<a href="?status=rejected" class="btn btn-sm {% if request.GET.status == 'rejected' %}btn-primary{% else %}btn-secondary{% endif %}">Отхвърлени</a>
|
||||
</div>
|
||||
|
||||
{% if auto_reports %}
|
||||
<div class="reports-list">
|
||||
{% for auto_report in auto_reports %}
|
||||
<div class="report-card" style="border-left: 4px solid {% if auto_report.status == 'pending' %}#ffc107{% elif auto_report.status == 'approved' %}#28a745{% elif auto_report.status == 'published' %}#17a2b8{% else %}#dc3545{% endif %};">
|
||||
<div class="report-header">
|
||||
<h3>
|
||||
<a href="{% url 'osint:auto_report_detail' auto_report.pk %}">{{ auto_report.title }}</a>
|
||||
</h3>
|
||||
<div>
|
||||
<span class="badge badge-{{ auto_report.status }}">{{ auto_report.get_status_display }}</span>
|
||||
<span class="badge" style="background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); color: white;">
|
||||
Увереност: {{ auto_report.confidence_score }}%
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="report-meta">
|
||||
<span>🔗 <a href="{{ auto_report.source_url }}" target="_blank" rel="noopener">{{ auto_report.source_url|truncatechars:60 }}</a></span>
|
||||
<span>📅 Създадено: {{ auto_report.created_at|date:"d F Y, H:i" }}</span>
|
||||
{% if auto_report.reviewed_by %}
|
||||
<span>👤 Прегледано от: {{ auto_report.reviewed_by.username }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="report-description">
|
||||
{{ auto_report.description|truncatewords:50 }}
|
||||
</div>
|
||||
{% if auto_report.matched_keywords.all %}
|
||||
<div class="report-tags">
|
||||
<strong>Намерени Ключови Думи:</strong>
|
||||
{% for keyword in auto_report.matched_keywords.all %}
|
||||
<span class="badge badge-info">{{ keyword.name }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="report-actions">
|
||||
<a href="{% url 'osint:auto_report_detail' auto_report.pk %}" class="btn btn-sm btn-primary">Преглед</a>
|
||||
{% if auto_report.status == 'pending' %}
|
||||
<a href="{% url 'osint:approve_auto_report' auto_report.pk %}" class="btn btn-sm btn-success">Одобри</a>
|
||||
<a href="{% url 'osint:reject_auto_report' auto_report.pk %}" class="btn btn-sm btn-danger">Отхвърли</a>
|
||||
{% endif %}
|
||||
{% if auto_report.report %}
|
||||
<a href="{% url 'reports:detail' auto_report.report.pk %}" class="btn btn-sm btn-secondary">Виж Доклад</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<!-- Pagination -->
|
||||
{% if page_obj.has_other_pages %}
|
||||
<div class="pagination">
|
||||
{% if page_obj.has_previous %}
|
||||
<a href="?page=1{% if request.GET.status %}&status={{ request.GET.status }}{% endif %}" class="btn btn-secondary">Първа</a>
|
||||
<a href="?page={{ page_obj.previous_page_number }}{% if request.GET.status %}&status={{ request.GET.status }}{% endif %}" class="btn btn-secondary">Предишна</a>
|
||||
{% endif %}
|
||||
<span class="page-info">Страница {{ page_obj.number }} от {{ page_obj.paginator.num_pages }}</span>
|
||||
{% if page_obj.has_next %}
|
||||
<a href="?page={{ page_obj.next_page_number }}{% if request.GET.status %}&status={{ request.GET.status }}{% endif %}" class="btn btn-secondary">Следваща</a>
|
||||
<a href="?page={{ page_obj.paginator.num_pages }}{% if request.GET.status %}&status={{ request.GET.status }}{% endif %}" class="btn btn-secondary">Последна</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="empty-state">
|
||||
<p>Няма автоматично генерирани доклади.</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
33
templates/osint/keyword_confirm_delete.html
Normal file
33
templates/osint/keyword_confirm_delete.html
Normal file
@@ -0,0 +1,33 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Изтриване на Ключова Дума{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Изтриване на Ключова Дума</h2>
|
||||
|
||||
<div class="gov-alert gov-alert-warning">
|
||||
<div class="alert-icon">⚠</div>
|
||||
<div class="alert-content">
|
||||
<strong>Внимание!</strong> Сигурни ли сте, че искате да изтриете "{{ object.name }}"?
|
||||
Това действие не може да бъде отменено.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="gov-card" style="margin: 2rem 0;">
|
||||
<h3>{{ object.name }}</h3>
|
||||
<p><strong>Ключова Дума:</strong> <code>{{ object.keyword }}</code></p>
|
||||
<p><strong>Тип:</strong> {{ object.get_keyword_type_display }}</p>
|
||||
<p><strong>Увереност:</strong> {{ object.confidence_score }}%</p>
|
||||
</div>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-danger">Да, Изтрий</button>
|
||||
<a href="{% url 'osint:admin_dashboard' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
93
templates/osint/keyword_form.html
Normal file
93
templates/osint/keyword_form.html
Normal file
@@ -0,0 +1,93 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}{% if object %}Редактиране{% else %}Добавяне{% endif %} на Ключова Дума{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>{% if object %}Редактиране{% else %}Добавяне{% endif %} на Ключова Дума</h2>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.name.id_for_label }}">Име *</label>
|
||||
{{ form.name }}
|
||||
{% if form.name.errors %}
|
||||
<div class="error-message">{{ form.name.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.keyword.id_for_label }}">Ключова Дума/Патърн *</label>
|
||||
{{ form.keyword }}
|
||||
{% if form.keyword.errors %}
|
||||
<div class="error-message">{{ form.keyword.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">Текст, фраза или regex патърн за търсене</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.description.id_for_label }}">Описание</label>
|
||||
{{ form.description }}
|
||||
{% if form.description.errors %}
|
||||
<div class="error-message">{{ form.description.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="{{ form.keyword_type.id_for_label }}">Тип *</label>
|
||||
{{ form.keyword_type }}
|
||||
{% if form.keyword_type.errors %}
|
||||
<div class="error-message">{{ form.keyword_type.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">exact, regex, phrase, domain, email, phone</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.confidence_score.id_for_label }}">Увереност (0-100) *</label>
|
||||
{{ form.confidence_score }}
|
||||
{% if form.confidence_score.errors %}
|
||||
<div class="error-message">{{ form.confidence_score.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="{{ form.is_active.id_for_label }}">
|
||||
{{ form.is_active }} Активна
|
||||
</label>
|
||||
{% if form.is_active.errors %}
|
||||
<div class="error-message">{{ form.is_active.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.case_sensitive.id_for_label }}">
|
||||
{{ form.case_sensitive }} Case Sensitive
|
||||
</label>
|
||||
{% if form.case_sensitive.errors %}
|
||||
<div class="error-message">{{ form.case_sensitive.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.auto_approve.id_for_label }}">
|
||||
{{ form.auto_approve }} Auto Approve
|
||||
</label>
|
||||
{% if form.auto_approve.errors %}
|
||||
<div class="error-message">{{ form.auto_approve.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">Автоматично одобряване при увереност ≥ 80%</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary">Запази</button>
|
||||
<a href="{% url 'osint:admin_dashboard' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
33
templates/osint/reject_auto_report.html
Normal file
33
templates/osint/reject_auto_report.html
Normal file
@@ -0,0 +1,33 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Отхвърляне на Автоматичен Доклад{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Отхвърляне на Автоматичен Доклад</h2>
|
||||
|
||||
<div class="gov-card" style="margin-bottom: 2rem;">
|
||||
<h3>{{ object.title }}</h3>
|
||||
<p><strong>Източник:</strong> <a href="{{ object.source_url }}" target="_blank" rel="noopener">{{ object.source_url }}</a></p>
|
||||
<p><strong>Увереност:</strong> {{ object.confidence_score }}%</p>
|
||||
<div style="background: var(--gov-light); padding: 1rem; border-radius: 6px; margin-top: 1rem;">
|
||||
{{ object.description|truncatewords:100 }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="review_notes">Причина за Отхвърляне (по избор):</label>
|
||||
<textarea name="review_notes" id="review_notes" class="form-control" rows="4"
|
||||
placeholder="Обяснете защо отхвърляте този доклад..."></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-danger">Отхвърли</button>
|
||||
<a href="{% url 'osint:auto_report_detail' object.pk %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
49
templates/osint/result_list.html
Normal file
49
templates/osint/result_list.html
Normal file
@@ -0,0 +1,49 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}OSINT Резултати - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>OSINT Резултати за Доклад: {{ report.title }}</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
{% if results %}
|
||||
<div class="reports-list">
|
||||
{% for result in results %}
|
||||
<div class="result-card">
|
||||
<div class="result-header">
|
||||
<h3>{{ result.get_data_type_display }}</h3>
|
||||
<div class="result-badges">
|
||||
<span class="badge badge-source">{{ result.source }}</span>
|
||||
<span class="badge badge-confidence">Увереност: {{ result.confidence_level }}%</span>
|
||||
{% if result.is_verified %}
|
||||
<span class="badge badge-verified">Потвърдено</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="result-meta">
|
||||
<span>Събрано: {{ result.collected_at|date:"d F Y, H:i" }}</span>
|
||||
</div>
|
||||
{% if result.processed_data %}
|
||||
<div class="result-data">
|
||||
<h4>Обработени Данни</h4>
|
||||
<pre style="background: var(--gov-light); padding: 1rem; border-radius: 6px; overflow-x: auto;">{{ result.processed_data|safe }}</pre>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty-state">
|
||||
<p>Все още няма налични OSINT резултати за този доклад.</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="result-actions">
|
||||
<a href="{% url 'reports:detail' report.pk %}" class="btn btn-secondary">Обратно към Доклад</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
33
templates/osint/seed_website_confirm_delete.html
Normal file
33
templates/osint/seed_website_confirm_delete.html
Normal file
@@ -0,0 +1,33 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Изтриване на Seed Website{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Изтриване на Seed Website</h2>
|
||||
|
||||
<div class="gov-alert gov-alert-warning">
|
||||
<div class="alert-icon">⚠</div>
|
||||
<div class="alert-content">
|
||||
<strong>Внимание!</strong> Сигурни ли сте, че искате да изтриете "{{ object.name }}"?
|
||||
Това действие не може да бъде отменено.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="gov-card" style="margin: 2rem 0;">
|
||||
<h3>{{ object.name }}</h3>
|
||||
<p><strong>URL:</strong> {{ object.url }}</p>
|
||||
<p><strong>Страници събрани:</strong> {{ object.pages_crawled }}</p>
|
||||
<p><strong>Съвпадения:</strong> {{ object.matches_found }}</p>
|
||||
</div>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-danger">Да, Изтрий</button>
|
||||
<a href="{% url 'osint:admin_dashboard' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
100
templates/osint/seed_website_form.html
Normal file
100
templates/osint/seed_website_form.html
Normal file
@@ -0,0 +1,100 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}{% if object %}Редактиране{% else %}Добавяне{% endif %} на Seed Website{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>{% if object %}Редактиране{% else %}Добавяне{% endif %} на Seed Website</h2>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.name.id_for_label }}">Име *</label>
|
||||
{{ form.name }}
|
||||
{% if form.name.errors %}
|
||||
<div class="error-message">{{ form.name.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.url.id_for_label }}">URL *</label>
|
||||
{{ form.url }}
|
||||
{% if form.url.errors %}
|
||||
<div class="error-message">{{ form.url.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">Основният URL адрес за crawling</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.description.id_for_label }}">Описание</label>
|
||||
{{ form.description }}
|
||||
{% if form.description.errors %}
|
||||
<div class="error-message">{{ form.description.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="{{ form.is_active.id_for_label }}">
|
||||
{{ form.is_active }} Активен
|
||||
</label>
|
||||
{% if form.is_active.errors %}
|
||||
<div class="error-message">{{ form.is_active.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.priority.id_for_label }}">Приоритет *</label>
|
||||
{{ form.priority }}
|
||||
{% if form.priority.errors %}
|
||||
<div class="error-message">{{ form.priority.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="{{ form.crawl_depth.id_for_label }}">Crawl Depth *</label>
|
||||
{{ form.crawl_depth }}
|
||||
{% if form.crawl_depth.errors %}
|
||||
<div class="error-message">{{ form.crawl_depth.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">0 = само тази страница, 1 = + директни линкове, 2 = + 2 нива</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.crawl_interval_hours.id_for_label }}">Интервал (часове) *</label>
|
||||
{{ form.crawl_interval_hours }}
|
||||
{% if form.crawl_interval_hours.errors %}
|
||||
<div class="error-message">{{ form.crawl_interval_hours.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">Колко често да се crawl-ва</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.allowed_domains_text.id_for_label }}">Разрешени Домейни</label>
|
||||
{{ form.allowed_domains_text }}
|
||||
{% if form.allowed_domains_text.errors %}
|
||||
<div class="error-message">{{ form.allowed_domains_text.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">{{ form.allowed_domains_text.help_text }}</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.user_agent.id_for_label }}">User Agent</label>
|
||||
{{ form.user_agent }}
|
||||
{% if form.user_agent.errors %}
|
||||
<div class="error-message">{{ form.user_agent.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary">Запази</button>
|
||||
<a href="{% url 'osint:admin_dashboard' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
52
templates/osint/start_crawling.html
Normal file
52
templates/osint/start_crawling.html
Normal file
@@ -0,0 +1,52 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Стартиране на OSINT Crawling{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>🚀 Стартиране на OSINT Crawling</h2>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="seed_id">Seed Website (Оставете празно за всички активни)</label>
|
||||
<select name="seed_id" id="seed_id" class="form-control">
|
||||
<option value="">-- Всички активни Seed Websites --</option>
|
||||
{% for seed in seed_websites %}
|
||||
<option value="{{ seed.pk }}">{{ seed.name }} ({{ seed.url }})</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<small class="form-text">Изберете конкретен seed website или оставете празно за всички</small>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="max_pages">Максимум Страници</label>
|
||||
<input type="number" name="max_pages" id="max_pages" class="form-control" value="50" min="1" max="1000">
|
||||
<small class="form-text">Максимален брой страници за crawl на seed website</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="delay">Забавяне (секунди)</label>
|
||||
<input type="number" name="delay" id="delay" class="form-control" value="1.0" min="0.1" max="10" step="0.1">
|
||||
<small class="form-text">Забавяне между заявките</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="gov-alert gov-alert-info">
|
||||
<div class="alert-icon">ℹ</div>
|
||||
<div class="alert-content">
|
||||
<strong>Информация:</strong> Crawling-ът ще стартира в background. Резултатите ще се появят след няколко минути.
|
||||
Проверете "Crawled Content" и "Auto-Generated Reports" в админ таблото.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-success">🚀 Стартирай Crawling</button>
|
||||
<a href="{% url 'osint:admin_dashboard' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
59
templates/osint/task_detail.html
Normal file
59
templates/osint/task_detail.html
Normal file
@@ -0,0 +1,59 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Детайли на OSINT Задача - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Детайли на OSINT Задача</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="info-section">
|
||||
<h3>Информация за Задачата</h3>
|
||||
<div class="info-grid">
|
||||
<div><strong>Тип:</strong> {{ task.get_task_type_display }}</div>
|
||||
<div><strong>Статус:</strong> <span class="badge badge-{{ task.status }}">{{ task.get_status_display }}</span></div>
|
||||
<div><strong>Доклад:</strong> <a href="{% url 'reports:detail' task.report.pk %}">{{ task.report.title }}</a></div>
|
||||
<div><strong>Създадено:</strong> {{ task.created_at|date:"d F Y, H:i" }}</div>
|
||||
{% if task.started_at %}
|
||||
<div><strong>Започнато:</strong> {{ task.started_at|date:"d F Y, H:i" }}</div>
|
||||
{% endif %}
|
||||
{% if task.completed_at %}
|
||||
<div><strong>Завършено:</strong> {{ task.completed_at|date:"d F Y, H:i" }}</div>
|
||||
{% endif %}
|
||||
<div><strong>Брой Опити:</strong> {{ task.retry_count }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if task.parameters %}
|
||||
<div class="info-section">
|
||||
<h3>Параметри</h3>
|
||||
<pre style="background: var(--gov-light); padding: 1rem; border-radius: 6px; overflow-x: auto;">{{ task.parameters|safe }}</pre>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if task.result %}
|
||||
<div class="info-section">
|
||||
<h3>Резултат</h3>
|
||||
<pre style="background: var(--gov-light); padding: 1rem; border-radius: 6px; overflow-x: auto;">{{ task.result|safe }}</pre>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if task.error_message %}
|
||||
<div class="info-section">
|
||||
<h3>Грешка</h3>
|
||||
<div class="gov-alert gov-alert-error">
|
||||
<div class="alert-icon">✕</div>
|
||||
<div class="alert-content">{{ task.error_message }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="task-actions">
|
||||
<a href="{% url 'osint:result_list' task.report.pk %}" class="btn btn-secondary">Преглед на Резултати</a>
|
||||
<a href="{% url 'osint:task_list' %}" class="btn btn-secondary">Обратно към Задачи</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
62
templates/osint/task_list.html
Normal file
62
templates/osint/task_list.html
Normal file
@@ -0,0 +1,62 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}OSINT Задачи - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>OSINT Задачи</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="filter-bar" style="margin-bottom: 2rem;">
|
||||
<a href="?status=" class="btn btn-sm {% if not request.GET.status %}btn-primary{% else %}btn-secondary{% endif %}">Всички</a>
|
||||
<a href="?status=pending" class="btn btn-sm {% if request.GET.status == 'pending' %}btn-primary{% else %}btn-secondary{% endif %}">Чакащи</a>
|
||||
<a href="?status=running" class="btn btn-sm {% if request.GET.status == 'running' %}btn-primary{% else %}btn-secondary{% endif %}">В Изпълнение</a>
|
||||
<a href="?status=completed" class="btn btn-sm {% if request.GET.status == 'completed' %}btn-primary{% else %}btn-secondary{% endif %}">Завършени</a>
|
||||
<a href="?status=failed" class="btn btn-sm {% if request.GET.status == 'failed' %}btn-primary{% else %}btn-secondary{% endif %}">Неуспешни</a>
|
||||
</div>
|
||||
|
||||
{% if tasks %}
|
||||
<div class="reports-list">
|
||||
{% for task in tasks %}
|
||||
<div class="task-card">
|
||||
<div class="task-header">
|
||||
<h3><a href="{% url 'osint:task_detail' task.pk %}">{{ task.get_task_type_display }}</a></h3>
|
||||
<span class="badge badge-{{ task.status }}">{{ task.get_status_display }}</span>
|
||||
</div>
|
||||
<div class="task-meta">
|
||||
<span>Доклад: <a href="{% url 'reports:detail' task.report.pk %}">{{ task.report.title }}</a></span>
|
||||
<span>Създадено: {{ task.created_at|date:"d F Y, H:i" }}</span>
|
||||
{% if task.completed_at %}
|
||||
<span>Завършено: {{ task.completed_at|date:"d F Y, H:i" }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if task.error_message %}
|
||||
<div class="task-error">
|
||||
<strong>Грешка:</strong> {{ task.error_message }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="pagination">
|
||||
{% if page_obj.has_previous %}
|
||||
<a href="?page=1" class="btn btn-secondary">Първа</a>
|
||||
<a href="?page={{ page_obj.previous_page_number }}" class="btn btn-secondary">Предишна</a>
|
||||
{% endif %}
|
||||
<span class="page-info">Страница {{ page_obj.number }} от {{ page_obj.paginator.num_pages }}</span>
|
||||
{% if page_obj.has_next %}
|
||||
<a href="?page={{ page_obj.next_page_number }}" class="btn btn-secondary">Следваща</a>
|
||||
<a href="?page={{ page_obj.paginator.num_pages }}" class="btn btn-secondary">Последна</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty-state">
|
||||
<p>Не са намерени OSINT задачи.</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
355
templates/reports/contact.html
Normal file
355
templates/reports/contact.html
Normal file
@@ -0,0 +1,355 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Свържете се с нас - Контакти{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<style>
|
||||
.contact-hero {
|
||||
background: linear-gradient(135deg, var(--gov-primary) 0%, var(--gov-primary-dark) 100%);
|
||||
color: var(--gov-white);
|
||||
padding: 4rem 3rem;
|
||||
border-radius: 16px;
|
||||
margin-bottom: 3rem;
|
||||
text-align: center;
|
||||
box-shadow: 0 12px 48px rgba(0, 51, 102, 0.3);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.contact-hero::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: url("data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z' fill='%23ffffff' fill-opacity='0.03' fill-rule='evenodd'/%3E%3C/svg%3E");
|
||||
opacity: 0.4;
|
||||
}
|
||||
|
||||
.contact-hero > * {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.contact-hero h1 {
|
||||
font-family: 'Roboto Slab', serif;
|
||||
font-size: 3rem;
|
||||
margin-bottom: 1.5rem;
|
||||
text-shadow: 2px 2px 8px rgba(0, 0, 0, 0.3);
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
|
||||
.contact-hero p {
|
||||
font-size: 1.3rem;
|
||||
opacity: 0.95;
|
||||
line-height: 1.9;
|
||||
max-width: 700px;
|
||||
margin: 0 auto;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.contact-form-container {
|
||||
max-width: 900px;
|
||||
margin: 0 auto 3rem;
|
||||
}
|
||||
|
||||
.form-section-header {
|
||||
background: linear-gradient(135deg, var(--gov-primary) 0%, var(--gov-primary-dark) 100%);
|
||||
color: var(--gov-white);
|
||||
padding: 2rem 2.5rem;
|
||||
border-radius: 12px 12px 0 0;
|
||||
margin-bottom: 0;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.form-section-header::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -50%;
|
||||
right: -10%;
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
background: radial-gradient(circle, rgba(255, 215, 0, 0.1) 0%, transparent 70%);
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.form-section-header h2 {
|
||||
font-family: 'Roboto Slab', serif;
|
||||
margin: 0;
|
||||
font-size: 2rem;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.form-section-header h2::before {
|
||||
content: '✉️';
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
.contact-form-card {
|
||||
background: var(--gov-white);
|
||||
border-radius: 0 0 12px 12px;
|
||||
box-shadow: 0 8px 32px rgba(0, 51, 102, 0.15);
|
||||
border: 1px solid var(--gov-border);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.contact-form-body {
|
||||
padding: 3rem;
|
||||
background: linear-gradient(to bottom, #ffffff 0%, #f8f9fa 100%);
|
||||
}
|
||||
|
||||
.form-group label {
|
||||
font-weight: 600;
|
||||
color: var(--gov-primary);
|
||||
margin-bottom: 0.75rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.form-group label::before {
|
||||
content: '▸';
|
||||
color: var(--gov-secondary);
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
border: 2px solid var(--gov-border);
|
||||
border-radius: 8px;
|
||||
padding: 0.875rem 1.25rem;
|
||||
font-size: 1rem;
|
||||
transition: all 0.3s ease;
|
||||
background: var(--gov-white);
|
||||
}
|
||||
|
||||
.form-control:focus {
|
||||
border-color: var(--gov-secondary);
|
||||
box-shadow: 0 0 0 4px rgba(0, 102, 204, 0.1);
|
||||
outline: none;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
textarea.form-control {
|
||||
min-height: 150px;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
.form-actions {
|
||||
margin-top: 2.5rem;
|
||||
padding-top: 2rem;
|
||||
border-top: 2px solid var(--gov-gray-light);
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.form-actions .btn {
|
||||
padding: 1rem 2.5rem;
|
||||
font-size: 1.05rem;
|
||||
font-weight: 600;
|
||||
border-radius: 8px;
|
||||
min-width: 180px;
|
||||
}
|
||||
|
||||
.faq-section {
|
||||
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%);
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.faq-item {
|
||||
padding: 1.5rem;
|
||||
border-bottom: 1px solid var(--gov-gray-light);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.faq-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.faq-item:hover {
|
||||
background: rgba(0, 102, 204, 0.03);
|
||||
padding-left: 2rem;
|
||||
}
|
||||
|
||||
.faq-item h3 {
|
||||
color: var(--gov-primary);
|
||||
margin-bottom: 0.75rem;
|
||||
font-size: 1.2rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.faq-item h3::before {
|
||||
content: '❓';
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.faq-item p {
|
||||
color: var(--gov-gray);
|
||||
line-height: 1.8;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.faq-item a {
|
||||
color: var(--gov-secondary);
|
||||
font-weight: 600;
|
||||
text-decoration: none;
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
.faq-item a:hover {
|
||||
color: var(--gov-primary);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.contact-hero {
|
||||
padding: 2.5rem 1.5rem;
|
||||
}
|
||||
|
||||
.contact-hero h1 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
.contact-hero p {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.contact-form-body {
|
||||
padding: 2rem 1.5rem;
|
||||
}
|
||||
|
||||
.form-section-header {
|
||||
padding: 1.5rem;
|
||||
}
|
||||
|
||||
.form-section-header h2 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.form-actions {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.form-actions .btn {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<!-- Hero Section -->
|
||||
<div class="contact-hero">
|
||||
<h1>Свържете се с нас</h1>
|
||||
<p>Имате въпрос, предложение или нужда от помощ? Нашият екип е готов да ви помогне.</p>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Contact Form -->
|
||||
<div class="contact-form-container">
|
||||
<div class="contact-form-card">
|
||||
<div class="form-section-header">
|
||||
<h2>Изпратете ни съобщение</h2>
|
||||
</div>
|
||||
<div class="contact-form-body">
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
{# Hidden bot protection fields #}
|
||||
{% for field in form.hidden_fields %}
|
||||
{{ field }}
|
||||
{% endfor %}
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="{{ form.name.id_for_label }}">{{ form.name.label }}</label>
|
||||
{{ form.name }}
|
||||
{% if form.name.errors %}
|
||||
<div class="error-message">{{ form.name.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.email.id_for_label }}">{{ form.email.label }}</label>
|
||||
{{ form.email }}
|
||||
{% if form.email.errors %}
|
||||
<div class="error-message">{{ form.email.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.inquiry_type.id_for_label }}">{{ form.inquiry_type.label }}</label>
|
||||
{{ form.inquiry_type }}
|
||||
{% if form.inquiry_type.errors %}
|
||||
<div class="error-message">{{ form.inquiry_type.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.subject.id_for_label }}">{{ form.subject.label }}</label>
|
||||
{{ form.subject }}
|
||||
{% if form.subject.errors %}
|
||||
<div class="error-message">{{ form.subject.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.message.id_for_label }}">{{ form.message.label }}</label>
|
||||
{{ form.message }}
|
||||
{% if form.message.errors %}
|
||||
<div class="error-message">{{ form.message.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">Моля, опишете подробно вашия въпрос или проблем.</small>
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary">Изпрати Съобщение</button>
|
||||
<a href="{% url 'reports:home' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Additional Information -->
|
||||
<div class="gov-card faq-section" style="margin-top: 3rem;">
|
||||
<div class="gov-card-header">
|
||||
<h2>Често задавани въпроси</h2>
|
||||
<p style="color: var(--gov-gray); margin-top: 0.5rem; font-weight: normal;">Най-често задавани въпроси и отговори</p>
|
||||
</div>
|
||||
<div class="gov-card-body" style="padding: 0;">
|
||||
<div class="faq-item">
|
||||
<h3>Как да докладвам измама?</h3>
|
||||
<p>Можете да докладвате измама като използвате формата за <a href="{% url 'reports:create' %}">докладване</a>. Моля, предоставете всички налични детайли за да помогнем на другите граждани.</p>
|
||||
</div>
|
||||
|
||||
<div class="faq-item">
|
||||
<h3>Колко време отнема прегледът на доклад?</h3>
|
||||
<p>Нашият екип преглежда всички доклади в рамките на 2-5 работни дни. Ще получите уведомление по имейл когато докладът ви бъде прегледан.</p>
|
||||
</div>
|
||||
|
||||
<div class="faq-item">
|
||||
<h3>Мога ли да остана анонимен?</h3>
|
||||
<p>Да, можете да докладвате анонимно. Вашата лична информация ще бъде защитена и няма да бъде разкрита публично.</p>
|
||||
</div>
|
||||
|
||||
<div class="faq-item">
|
||||
<h3>Как да проверя статуса на моя доклад?</h3>
|
||||
<p>Ако сте регистриран потребител, можете да видите статуса на всички ваши доклади в секцията <a href="{% url 'reports:my_reports' %}">Моите Доклади</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
101
templates/reports/create.html
Normal file
101
templates/reports/create.html
Normal file
@@ -0,0 +1,101 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Докладване на Измама - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Докладване на Измама или Мошеничество</h2>
|
||||
<p class="form-description">Помогнете да защитим другите граждани, като докладвате измами. Всички доклади се преглеждат от модератори преди публикуване.</p>
|
||||
|
||||
<form method="post" enctype="multipart/form-data" data-loading>
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="id_title">Заглавие *</label>
|
||||
{{ form.title }}
|
||||
{% if form.title.errors %}
|
||||
<div class="error-message">{{ form.title.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text" data-tooltip="Кратко и описателно заглавие на измамата">Кратко и описателно заглавие</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="id_description">Описание *</label>
|
||||
{{ form.description }}
|
||||
{% if form.description.errors %}
|
||||
<div class="error-message">{{ form.description.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text" data-tooltip="Включете всички важни детайли: какво се е случило, кога, къде">Предоставете подробна информация за измамата</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="id_scam_type">Вид Измама *</label>
|
||||
{{ form.scam_type }}
|
||||
{% if form.scam_type.errors %}
|
||||
<div class="error-message">{{ form.scam_type.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="id_reported_url">Докладван URL</label>
|
||||
{{ form.reported_url }}
|
||||
{% if form.reported_url.errors %}
|
||||
<div class="error-message">{{ form.reported_url.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="id_reported_email">Докладван Имейл</label>
|
||||
{{ form.reported_email }}
|
||||
{% if form.reported_email.errors %}
|
||||
<div class="error-message">{{ form.reported_email.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="id_reported_phone">Докладван Телефон</label>
|
||||
{{ form.reported_phone }}
|
||||
{% if form.reported_phone.errors %}
|
||||
<div class="error-message">{{ form.reported_phone.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="id_reported_company">Докладвана Фирма</label>
|
||||
{{ form.reported_company }}
|
||||
{% if form.reported_company.errors %}
|
||||
<div class="error-message">{{ form.reported_company.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="id_tags">Етикети</label>
|
||||
{{ form.tags }}
|
||||
{% if form.tags.errors %}
|
||||
<div class="error-message">{{ form.tags.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">Задръжте Ctrl/Cmd за избор на множество етикети</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="checkbox-label">
|
||||
{{ form.is_anonymous }}
|
||||
Докладване анонимно
|
||||
<span data-tooltip="Вашият профил няма да бъде видим в публичния доклад">ℹ️</span>
|
||||
</label>
|
||||
{% if form.is_anonymous.errors %}
|
||||
<div class="error-message">{{ form.is_anonymous.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary" data-tooltip="Докладът ще бъде изпратен за преглед от модератор">Изпращане на Доклад</button>
|
||||
<a href="{% url 'reports:home' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
26
templates/reports/delete.html
Normal file
26
templates/reports/delete.html
Normal file
@@ -0,0 +1,26 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Изтриване на Доклад - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Изтриване на Доклад</h2>
|
||||
<div class="gov-alert gov-alert-warning">
|
||||
<div class="alert-icon">⚠</div>
|
||||
<div class="alert-content">
|
||||
<p>Сигурни ли сте, че искате да изтриете този доклад?</p>
|
||||
<p><strong>{{ object.title }}</strong></p>
|
||||
<p>Това действие не може да бъде отменено.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post" data-loading>
|
||||
{% csrf_token %}
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-danger" data-tooltip="Това действие е необратимо">Да, Изтривам</button>
|
||||
<a href="{% url 'reports:my_reports' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
193
templates/reports/detail.html
Normal file
193
templates/reports/detail.html
Normal file
@@ -0,0 +1,193 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}{{ report.title }} - Портал за Докладване на Измами{% endblock %}
|
||||
|
||||
{% block schema_type %}Article{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
<!-- Article Structured Data -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
"headline": "{{ report.title|escapejs }}",
|
||||
"description": "{{ report.description|truncatewords:30|escapejs }}",
|
||||
"datePublished": "{{ report.created_at|date:'c' }}",
|
||||
"dateModified": "{{ report.updated_at|date:'c'|default:report.created_at|date:'c' }}",
|
||||
"author": {
|
||||
"@type": "Organization",
|
||||
"name": "{{ seo.site_name }}"
|
||||
},
|
||||
"publisher": {
|
||||
"@type": "GovernmentOrganization",
|
||||
"name": "{{ seo.site_name }}",
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": "{{ seo.site_image }}"
|
||||
}
|
||||
},
|
||||
"mainEntityOfPage": {
|
||||
"@type": "WebPage",
|
||||
"@id": "{{ seo.canonical_url }}"
|
||||
},
|
||||
"articleSection": "{{ report.get_scam_type_display }}",
|
||||
"keywords": "{{ report.tags.all|join:', ' }}, измама, {{ report.get_scam_type_display }}"
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h1>{{ report.title }}</h1>
|
||||
<div class="report-badges">
|
||||
<span class="badge badge-{{ report.scam_type }}">{{ report.get_scam_type_display }}</span>
|
||||
{% if report.status == 'verified' %}
|
||||
<span class="badge badge-verified">Потвърдено</span>
|
||||
{% elif report.status == 'rejected' %}
|
||||
<span class="badge badge-rejected">Отхвърлено</span>
|
||||
{% elif report.status == 'pending' %}
|
||||
<span class="badge badge-pending">Чака Преглед</span>
|
||||
{% elif report.status == 'under_review' %}
|
||||
<span class="badge badge-under_review">В Преглед</span>
|
||||
{% endif %}
|
||||
{% if report.verification_score %}
|
||||
<span class="badge badge-score">Проверка: {{ report.verification_score }}%</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="gov-card-body">
|
||||
{% if report.status == 'rejected' and user.is_authenticated and report.reporter == user and rejection_action and rejection_action.reason %}
|
||||
<div class="gov-alert gov-alert-error" style="margin-bottom: 1.5rem;">
|
||||
<div class="alert-icon">✕</div>
|
||||
<div class="alert-content">
|
||||
<strong>Докладът е отхвърлен</strong>
|
||||
<p style="margin: 0.75rem 0 0 0; font-size: 1.05rem;"><strong>Причина за отхвърляне:</strong></p>
|
||||
<p style="margin: 0.5rem 0 0 0; padding: 0.75rem; background: rgba(220, 53, 69, 0.1); border-radius: 6px; border-left: 3px solid var(--gov-danger);">
|
||||
{{ rejection_action.reason }}
|
||||
</p>
|
||||
<p style="margin: 0.75rem 0 0 0; font-size: 0.9rem; color: var(--gov-gray);">
|
||||
<strong>Отхвърлен на:</strong> {{ rejection_action.created_at|date:"d.m.Y в H:i" }}<br>
|
||||
<strong>От:</strong> {{ rejection_action.moderator.username|default:"модератор" }}
|
||||
</p>
|
||||
<div style="margin-top: 1rem;">
|
||||
<a href="{% url 'reports:edit' report.pk %}" class="btn btn-primary btn-sm">Редактиране и Повторно Изпращане</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="info-grid" style="margin-bottom: 2rem;">
|
||||
<div class="info-item">
|
||||
<strong>Статус:</strong> <span class="badge badge-{{ report.status }}">{{ report.get_status_display }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Докладвано на:</strong> {{ report.created_at|date:"d F Y, H:i" }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Докладвано от:</strong> {{ report.get_reporter_display }}
|
||||
</div>
|
||||
{% if report.verified_at %}
|
||||
<div class="info-item">
|
||||
<strong>Потвърдено на:</strong> {{ report.verified_at|date:"d F Y, H:i" }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="info-section">
|
||||
<h3>Описание</h3>
|
||||
<p style="line-height: 1.8; color: var(--gov-dark);">{{ report.description|linebreaks }}</p>
|
||||
</div>
|
||||
|
||||
<div class="info-section">
|
||||
<h3>Докладвани Обекти</h3>
|
||||
<ul style="list-style: none; padding: 0;">
|
||||
{% if report.reported_url %}
|
||||
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
|
||||
<strong>URL:</strong> <a href="{{ report.reported_url }}" target="_blank" rel="noopener">{{ report.reported_url }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if report.reported_email %}
|
||||
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
|
||||
<strong>Имейл:</strong> {{ report.reported_email }}
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if report.reported_phone %}
|
||||
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
|
||||
<strong>Телефон:</strong> {{ report.reported_phone }}
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if report.reported_company %}
|
||||
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
|
||||
<strong>Фирма:</strong> {{ report.reported_company }}
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{% if report.tags.all %}
|
||||
<div class="info-section">
|
||||
<h3>Етикети</h3>
|
||||
<div class="report-tags">
|
||||
{% for tag in report.tags.all %}
|
||||
<span class="tag" style="background-color: {{ tag.color }}">{{ tag.name }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if report.verifications.all %}
|
||||
<div class="info-section">
|
||||
<h3>Детайли за Проверка</h3>
|
||||
{% for verification in report.verifications.all %}
|
||||
<div class="verification-item" style="padding: 1rem; background: var(--gov-light); margin-bottom: 1rem; border-radius: 8px; border-left: 4px solid var(--gov-secondary);">
|
||||
<strong>{{ verification.get_verification_method_display }}:</strong>
|
||||
<span>Увереност: {{ verification.confidence_score }}%</span>
|
||||
{% if verification.notes %}
|
||||
<p style="margin-top: 0.5rem; color: var(--gov-gray);">{{ verification.notes }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if user.is_authenticated and report.reporter == user %}
|
||||
<div class="report-actions">
|
||||
{% if report.status == 'pending' %}
|
||||
<a href="{% url 'reports:edit' report.pk %}" class="btn btn-secondary">Редактиране</a>
|
||||
<a href="{% url 'reports:delete' report.pk %}"
|
||||
class="btn btn-danger"
|
||||
data-confirm="Сигурни ли сте, че искате да изтриете този доклад? Това действие не може да бъде отменено."
|
||||
data-confirm-title="Изтриване на Доклад">Изтриване</a>
|
||||
{% elif report.status == 'rejected' %}
|
||||
<a href="{% url 'reports:edit' report.pk %}" class="btn btn-primary">Редактиране и Повторно Изпращане</a>
|
||||
<a href="{% url 'reports:delete' report.pk %}"
|
||||
class="btn btn-danger"
|
||||
data-confirm="Сигурни ли сте, че искате да изтриете този отхвърлен доклад? Това действие не може да бъде отменено."
|
||||
data-confirm-title="Изтриване на Доклад">Изтриване</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if report.status == 'verified' and report.is_public %}
|
||||
<div class="report-actions" style="margin-top: 2rem; padding-top: 2rem; border-top: 2px solid var(--gov-gray-light);">
|
||||
<div style="background: var(--gov-light); padding: 1.5rem; border-radius: 8px; border-left: 4px solid var(--gov-warning);">
|
||||
<h4 style="margin: 0 0 0.75rem 0; color: var(--gov-primary); display: flex; align-items: center; gap: 0.5rem;">
|
||||
<span>⚠️</span>
|
||||
<span>Смятате ли, че този доклад е несправедлив?</span>
|
||||
</h4>
|
||||
<p style="margin: 0 0 1rem 0; color: var(--gov-gray); line-height: 1.6;">
|
||||
Ако сте обект на този доклад и смятате, че информацията е невярна или несправедлива, можете да подадете заявка за премахване.
|
||||
</p>
|
||||
<a href="{% url 'reports:takedown_request' report.pk %}" class="btn btn-secondary">
|
||||
📝 Заявка за Премахване на Доклад
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
73
templates/reports/edit.html
Normal file
73
templates/reports/edit.html
Normal file
@@ -0,0 +1,73 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Редактиране на Доклад - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="form-container">
|
||||
<h2>Редактиране на Доклад</h2>
|
||||
{% if object.status == 'rejected' %}
|
||||
<div class="gov-alert gov-alert-warning" style="margin-bottom: 1.5rem;">
|
||||
<div class="alert-icon">⚠</div>
|
||||
<div class="alert-content">
|
||||
<strong>Този доклад е бил отхвърлен.</strong>
|
||||
<p style="margin: 0.5rem 0 0 0;">След като направите промените, докладът ще бъде изпратен отново за преглед.</p>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="form-description">Можете да редактирате доклади, които чакат преглед.</p>
|
||||
{% endif %}
|
||||
|
||||
<form method="post" data-loading>
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="id_title">Заглавие *</label>
|
||||
{{ form.title }}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="id_description">Описание *</label>
|
||||
{{ form.description }}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="id_scam_type">Вид Измама *</label>
|
||||
{{ form.scam_type }}
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="id_reported_url">Докладван URL</label>
|
||||
{{ form.reported_url }}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="id_reported_email">Докладван Имейл</label>
|
||||
{{ form.reported_email }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="id_reported_phone">Докладван Телефон</label>
|
||||
{{ form.reported_phone }}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="id_reported_company">Докладвана Фирма</label>
|
||||
{{ form.reported_company }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="id_tags">Етикети</label>
|
||||
{{ form.tags }}
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary" data-tooltip="Промените ще бъдат запазени">Запазване на Промените</button>
|
||||
<a href="{% url 'reports:my_reports' %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
126
templates/reports/home.html
Normal file
126
templates/reports/home.html
Normal file
@@ -0,0 +1,126 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Начало - Портал за Докладване на Измами{% endblock %}
|
||||
|
||||
{% block schema_type %}WebSite{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
<!-- Website Structured Data with SearchAction -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebSite",
|
||||
"name": "{{ seo.site_name }}",
|
||||
"url": "{{ seo.site_url }}",
|
||||
"description": "{{ seo.site_description }}",
|
||||
"inLanguage": "bg",
|
||||
"potentialAction": {
|
||||
"@type": "SearchAction",
|
||||
"target": {
|
||||
"@type": "EntryPoint",
|
||||
"urlTemplate": "{{ seo.site_url }}/search/?q={search_term_string}"
|
||||
},
|
||||
"query-input": "required name=search_term_string"
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- BreadcrumbList Structured Data -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Начало",
|
||||
"item": "{{ seo.site_url }}"
|
||||
}]
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="home-hero">
|
||||
<div class="home-hero-content">
|
||||
<div class="home-hero-text">
|
||||
<h1>Добре дошли в Портала за Докладване на Измами</h1>
|
||||
<p class="lead">Докладвайте измами, за да помогнете на другите граждани в българското интернет пространство.</p>
|
||||
<div class="home-hero-actions">
|
||||
<a href="{% url 'reports:create' %}" class="btn btn-primary">Докладване на Измама</a>
|
||||
<a href="{% url 'reports:list' %}" class="btn btn-secondary">Преглед на Докладите</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="home-hero-image">
|
||||
<img src="{% static 'images/home.jpg' %}" alt="Официален Портал за Докладване на Измами" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Статистика на Платформата</h2>
|
||||
</div>
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<h3>{{ total_reports|default:0 }}</h3>
|
||||
<p>Потвърдени Доклади</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if recent_reports %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Последни Доклади</h2>
|
||||
</div>
|
||||
<div class="reports-list">
|
||||
{% for report in recent_reports %}
|
||||
<div class="report-card">
|
||||
<div class="report-header">
|
||||
<h3><a href="{% url 'reports:detail' report.pk %}">{{ report.title }}</a></h3>
|
||||
<span class="badge badge-{{ report.scam_type }}">{{ report.get_scam_type_display }}</span>
|
||||
</div>
|
||||
<div class="report-meta">
|
||||
<span>{{ report.created_at|date:"d M Y" }}</span>
|
||||
<span>от {{ report.get_reporter_display }}</span>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if scam_types %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Разпределение по Видове Измами</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<div class="scam-types-grid">
|
||||
{% for type in scam_types %}
|
||||
<div class="scam-type-card">
|
||||
<div class="scam-type-header">
|
||||
<span class="badge badge-{{ type.scam_type }}" style="font-size: 0.9rem; padding: 0.5rem 1rem;">
|
||||
{{ type.display_name }}
|
||||
</span>
|
||||
<div class="scam-type-count">
|
||||
<span class="count-number">{{ type.count }}</span>
|
||||
<span class="count-label">доклад{{ type.count|pluralize:"а,а" }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="scam-type-bar">
|
||||
<div class="scam-type-bar-fill" style="width: {{ type.percentage }}%"></div>
|
||||
</div>
|
||||
<div class="scam-type-percentage">
|
||||
{{ type.percentage }}% от общия брой
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
78
templates/reports/list.html
Normal file
78
templates/reports/list.html
Normal file
@@ -0,0 +1,78 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Потвърдени Доклади - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Потвърдени Доклади за Измами</h2>
|
||||
<div style="display: flex; gap: 1rem; flex-wrap: wrap;">
|
||||
<a href="{% url 'reports:create' %}" class="btn btn-primary" data-tooltip="Докладвайте нова измама или мошеничество">Докладване на Измама</a>
|
||||
<a href="{% url 'reports:search' %}" class="btn btn-secondary" data-tooltip="Търсене в базата данни с доклади">Търсене</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
|
||||
{% if reports %}
|
||||
<div class="reports-list">
|
||||
{% for report in reports %}
|
||||
<div class="report-card">
|
||||
<div class="report-header">
|
||||
<h3><a href="{% url 'reports:detail' report.pk %}">{{ report.title }}</a></h3>
|
||||
<div style="display: flex; gap: 0.5rem; flex-wrap: wrap;">
|
||||
<span class="badge badge-{{ report.scam_type }}">{{ report.get_scam_type_display }}</span>
|
||||
{% if report.is_auto_discovered %}
|
||||
<span class="badge" style="background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); color: white;" title="Автоматично открит от OSINT системата">🤖 OSINT</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="report-meta">
|
||||
<span class="date">{{ report.created_at|date:"d F Y" }}</span>
|
||||
<span class="reporter">от {{ report.get_reporter_display }}</span>
|
||||
{% if report.verification_score %}
|
||||
<span class="verification-score">Проверка: {{ report.verification_score }}%</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<p class="report-description">{{ report.description|truncatewords:50 }}</p>
|
||||
{% if report.tags.all %}
|
||||
<div class="report-tags">
|
||||
{% for tag in report.tags.all %}
|
||||
<span class="tag" style="background-color: {{ tag.color }}">{{ tag.name }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="report-entities">
|
||||
{% if report.reported_url %}
|
||||
<span class="entity">URL: <a href="{{ report.reported_url }}" target="_blank" rel="noopener">{{ report.reported_url|truncatechars:50 }}</a></span>
|
||||
{% endif %}
|
||||
{% if report.reported_email %}
|
||||
<span class="entity">Имейл: {{ report.reported_email }}</span>
|
||||
{% endif %}
|
||||
{% if report.reported_phone %}
|
||||
<span class="entity">Телефон: {{ report.reported_phone }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="pagination">
|
||||
{% if page_obj.has_previous %}
|
||||
<a href="?page=1" class="btn btn-secondary">Първа</a>
|
||||
<a href="?page={{ page_obj.previous_page_number }}" class="btn btn-secondary">Предишна</a>
|
||||
{% endif %}
|
||||
<span class="page-info">Страница {{ page_obj.number }} от {{ page_obj.paginator.num_pages }}</span>
|
||||
{% if page_obj.has_next %}
|
||||
<a href="?page={{ page_obj.next_page_number }}" class="btn btn-secondary">Следваща</a>
|
||||
<a href="?page={{ page_obj.paginator.num_pages }}" class="btn btn-secondary">Последна</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty-state">
|
||||
<p>Все още няма потвърдени доклади. Бъдете първият, който <a href="{% url 'reports:create' %}">докладва измама</a>!</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
77
templates/reports/my_reports.html
Normal file
77
templates/reports/my_reports.html
Normal file
@@ -0,0 +1,77 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Моите Доклади - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Моите Доклади</h2>
|
||||
<a href="{% url 'reports:create' %}" class="btn btn-primary">Докладване на Измама</a>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
|
||||
{% if reports %}
|
||||
<div class="reports-list">
|
||||
{% for report in reports %}
|
||||
<div class="report-card">
|
||||
<div class="report-header">
|
||||
<h3><a href="{% url 'reports:detail' report.pk %}">{{ report.title }}</a></h3>
|
||||
<span class="badge badge-{{ report.status }}">{{ report.get_status_display }}</span>
|
||||
</div>
|
||||
<div class="report-meta">
|
||||
<span class="date">{{ report.created_at|date:"d F Y" }}</span>
|
||||
<span class="scam-type">{{ report.get_scam_type_display }}</span>
|
||||
</div>
|
||||
{% if report.status == 'rejected' and report.rejection_action and report.rejection_reason %}
|
||||
<div class="gov-alert gov-alert-error" style="margin-bottom: 1rem;">
|
||||
<div class="alert-icon">✕</div>
|
||||
<div class="alert-content">
|
||||
<strong>Докладът е отхвърлен</strong>
|
||||
<p style="margin: 0.5rem 0 0 0;"><strong>Причина:</strong> {{ report.rejection_reason }}</p>
|
||||
<p style="margin: 0.5rem 0 0 0; font-size: 0.9rem; color: var(--gov-gray);">
|
||||
Отхвърлен на {{ report.rejection_action.created_at|date:"d.m.Y в H:i" }} от {{ report.rejection_action.moderator.username|default:"модератор" }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<p class="report-description">{{ report.description|truncatewords:30 }}</p>
|
||||
<div class="report-actions">
|
||||
<a href="{% url 'reports:detail' report.pk %}" class="btn btn-sm btn-secondary" data-tooltip="Преглед на детайли">Преглед</a>
|
||||
{% if report.status == 'pending' %}
|
||||
<a href="{% url 'reports:edit' report.pk %}" class="btn btn-sm btn-secondary" data-tooltip="Редактиране на доклад">Редактиране</a>
|
||||
<a href="{% url 'reports:delete' report.pk %}"
|
||||
class="btn btn-sm btn-danger"
|
||||
data-confirm="Сигурни ли сте, че искате да изтриете този доклад? Това действие не може да бъде отменено."
|
||||
data-confirm-title="Изтриване на Доклад">Изтриване</a>
|
||||
{% elif report.status == 'rejected' %}
|
||||
<a href="{% url 'reports:edit' report.pk %}" class="btn btn-sm btn-primary" data-tooltip="Редактирайте доклада според обратната връзка и изпратете отново">Редактиране и Повторно Изпращане</a>
|
||||
<a href="{% url 'reports:delete' report.pk %}"
|
||||
class="btn btn-sm btn-danger"
|
||||
data-confirm="Сигурни ли сте, че искате да изтриете този отхвърлен доклад? Това действие не може да бъде отменено."
|
||||
data-confirm-title="Изтриване на Доклад">Изтриване</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="pagination">
|
||||
{% if page_obj.has_previous %}
|
||||
<a href="?page=1" class="btn btn-secondary">Първа</a>
|
||||
<a href="?page={{ page_obj.previous_page_number }}" class="btn btn-secondary">Предишна</a>
|
||||
{% endif %}
|
||||
<span class="page-info">Страница {{ page_obj.number }} от {{ page_obj.paginator.num_pages }}</span>
|
||||
{% if page_obj.has_next %}
|
||||
<a href="?page={{ page_obj.next_page_number }}" class="btn btn-secondary">Следваща</a>
|
||||
<a href="?page={{ page_obj.paginator.num_pages }}" class="btn btn-secondary">Последна</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty-state">
|
||||
<p>Все още не сте изпратили доклади. <a href="{% url 'reports:create' %}">Докладвайте първата си измама</a>!</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
54
templates/reports/search.html
Normal file
54
templates/reports/search.html
Normal file
@@ -0,0 +1,54 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Търсене на Доклади - Официален Портал{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="gov-card">
|
||||
<div class="gov-card-header">
|
||||
<h2>Търсене на Доклади за Измами</h2>
|
||||
</div>
|
||||
<div class="gov-card-body">
|
||||
<form method="get" class="search-form" style="margin-bottom: 2rem;">
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<input type="text" name="q" class="form-control" placeholder="Търсене по заглавие, описание, URL или имейл..." value="{{ request.GET.q }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<select name="type" class="form-control">
|
||||
<option value="">Всички Видове</option>
|
||||
{% for value, label in scam_type_choices %}
|
||||
<option value="{{ value }}" {% if request.GET.type == value %}selected{% endif %}>{{ label }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Търсене</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% if reports %}
|
||||
<div class="search-results">
|
||||
<p class="results-count" style="font-weight: 600; color: var(--gov-primary); margin-bottom: 1.5rem;">Намерени {{ reports.count }} резултат(а)</p>
|
||||
<div class="reports-list">
|
||||
{% for report in reports %}
|
||||
<div class="report-card">
|
||||
<div class="report-header">
|
||||
<h3><a href="{% url 'reports:detail' report.pk %}">{{ report.title }}</a></h3>
|
||||
<span class="badge badge-{{ report.scam_type }}">{{ report.get_scam_type_display }}</span>
|
||||
</div>
|
||||
<div class="report-meta">
|
||||
<span class="date">{{ report.created_at|date:"d F Y" }}</span>
|
||||
</div>
|
||||
<p class="report-description">{{ report.description|truncatewords:30 }}</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% elif request.GET.q %}
|
||||
<div class="empty-state">
|
||||
<p>Не са намерени резултати за "{{ request.GET.q }}". Опитайте с различни термини за търсене.</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
244
templates/reports/takedown_request.html
Normal file
244
templates/reports/takedown_request.html
Normal file
@@ -0,0 +1,244 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Заявка за Премахване - {{ report.title }}{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<style>
|
||||
.takedown-hero {
|
||||
background: linear-gradient(135deg, var(--gov-warning) 0%, #e0a800 100%);
|
||||
color: var(--gov-white);
|
||||
padding: 3rem 2.5rem;
|
||||
border-radius: 12px;
|
||||
margin-bottom: 2.5rem;
|
||||
text-align: center;
|
||||
box-shadow: 0 8px 24px rgba(255, 193, 7, 0.3);
|
||||
}
|
||||
|
||||
.takedown-hero h1 {
|
||||
font-family: 'Roboto Slab', serif;
|
||||
font-size: 2.5rem;
|
||||
margin-bottom: 1rem;
|
||||
text-shadow: 2px 2px 6px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.takedown-hero p {
|
||||
font-size: 1.1rem;
|
||||
opacity: 0.95;
|
||||
line-height: 1.7;
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.report-summary {
|
||||
background: var(--gov-light);
|
||||
padding: 1.5rem;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 2rem;
|
||||
border-left: 4px solid var(--gov-secondary);
|
||||
}
|
||||
|
||||
.report-summary h3 {
|
||||
color: var(--gov-primary);
|
||||
margin-bottom: 1rem;
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
.report-summary p {
|
||||
color: var(--gov-gray);
|
||||
margin: 0.5rem 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.form-section-header {
|
||||
background: linear-gradient(135deg, var(--gov-primary) 0%, var(--gov-primary-dark) 100%);
|
||||
color: var(--gov-white);
|
||||
padding: 2rem 2.5rem;
|
||||
border-radius: 12px 12px 0 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.form-section-header h2 {
|
||||
font-family: 'Roboto Slab', serif;
|
||||
margin: 0;
|
||||
font-size: 2rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.form-section-header h2::before {
|
||||
content: '📋';
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
.takedown-form-card {
|
||||
background: var(--gov-white);
|
||||
border-radius: 0 0 12px 12px;
|
||||
box-shadow: 0 8px 32px rgba(0, 51, 102, 0.15);
|
||||
border: 1px solid var(--gov-border);
|
||||
overflow: hidden;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.takedown-form-body {
|
||||
padding: 3rem;
|
||||
background: linear-gradient(to bottom, #ffffff 0%, #f8f9fa 100%);
|
||||
}
|
||||
|
||||
.info-box {
|
||||
background: #fff3cd;
|
||||
border: 1px solid #ffc107;
|
||||
border-radius: 8px;
|
||||
padding: 1.5rem;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.info-box h4 {
|
||||
color: #856404;
|
||||
margin: 0 0 0.75rem 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.info-box h4::before {
|
||||
content: 'ℹ️';
|
||||
}
|
||||
|
||||
.info-box ul {
|
||||
margin: 0.75rem 0 0 0;
|
||||
padding-left: 1.5rem;
|
||||
color: #856404;
|
||||
}
|
||||
|
||||
.info-box li {
|
||||
margin: 0.5rem 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.takedown-hero {
|
||||
padding: 2rem 1.5rem;
|
||||
}
|
||||
|
||||
.takedown-hero h1 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
|
||||
.takedown-form-body {
|
||||
padding: 2rem 1.5rem;
|
||||
}
|
||||
|
||||
.form-section-header {
|
||||
padding: 1.5rem;
|
||||
}
|
||||
|
||||
.form-section-header h2 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<!-- Hero Section -->
|
||||
<div class="takedown-hero">
|
||||
<h1>Заявка за Премахване на Доклад</h1>
|
||||
<p>Ако сте обект на този доклад и смятате, че информацията е невярна или несправедлива, моля попълнете формата по-долу.</p>
|
||||
</div>
|
||||
|
||||
<!-- Report Summary -->
|
||||
<div class="report-summary">
|
||||
<h3>📄 Доклад, за който се отнася заявката:</h3>
|
||||
<p><strong>Заглавие:</strong> <a href="{% url 'reports:detail' report.pk %}">{{ report.title }}</a></p>
|
||||
<p><strong>Вид измама:</strong> {{ report.get_scam_type_display }}</p>
|
||||
<p><strong>Докладван на:</strong> {{ report.created_at|date:"d F Y" }}</p>
|
||||
{% if report.reported_url %}
|
||||
<p><strong>URL:</strong> <a href="{{ report.reported_url }}" target="_blank" rel="noopener">{{ report.reported_url }}</a></p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Info Box -->
|
||||
<div class="info-box">
|
||||
<h4>Важна информация</h4>
|
||||
<ul>
|
||||
<li>Всички заявки се преглеждат внимателно от нашия екип</li>
|
||||
<li>Ще получите отговор по имейл в рамките на 2-5 работни дни</li>
|
||||
<li>Моля, предоставете всички налични доказателства, които подкрепят вашата заявка</li>
|
||||
<li>Лъжливи или злонамерени заявки могат да доведат до правни последици</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- Takedown Request Form -->
|
||||
<div class="takedown-form-card">
|
||||
<div class="form-section-header">
|
||||
<h2>Форма за Заявка</h2>
|
||||
</div>
|
||||
<div class="takedown-form-body">
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
{# Hidden bot protection fields #}
|
||||
{% for field in form.hidden_fields %}
|
||||
{{ field }}
|
||||
{% endfor %}
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="{{ form.requester_name.id_for_label }}">{{ form.requester_name.label }}</label>
|
||||
{{ form.requester_name }}
|
||||
{% if form.requester_name.errors %}
|
||||
<div class="error-message">{{ form.requester_name.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.requester_email.id_for_label }}">{{ form.requester_email.label }}</label>
|
||||
{{ form.requester_email }}
|
||||
{% if form.requester_email.errors %}
|
||||
<div class="error-message">{{ form.requester_email.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.requester_phone.id_for_label }}">{{ form.requester_phone.label }}</label>
|
||||
{{ form.requester_phone }}
|
||||
{% if form.requester_phone.errors %}
|
||||
<div class="error-message">{{ form.requester_phone.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="form-text">Незадължително поле</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.reason.id_for_label }}">{{ form.reason.label }}</label>
|
||||
{{ form.reason }}
|
||||
{% if form.reason.errors %}
|
||||
<div class="error-message">{{ form.reason.errors }}</div>
|
||||
{% endif %}
|
||||
{% if form.reason.help_text %}
|
||||
<small class="form-text">{{ form.reason.help_text }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="{{ form.evidence.id_for_label }}">{{ form.evidence.label }}</label>
|
||||
{{ form.evidence }}
|
||||
{% if form.evidence.errors %}
|
||||
<div class="error-message">{{ form.evidence.errors }}</div>
|
||||
{% endif %}
|
||||
{% if form.evidence.help_text %}
|
||||
<small class="form-text">{{ form.evidence.help_text }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary">Изпрати Заявка</button>
|
||||
<a href="{% url 'reports:detail' report.pk %}" class="btn btn-secondary">Отказ</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
Reference in New Issue
Block a user