This commit is contained in:
Iliyan Angelov
2025-11-26 22:32:20 +02:00
commit ed94dd22dd
150 changed files with 14058 additions and 0 deletions

292
templates/404.html Normal file
View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View File

@@ -0,0 +1,2 @@
Възстановяване на Парола - {{ site_name|default:"Портал за Докладване на Измами" }}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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
View 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">&copy; 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>

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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
View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}