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

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